diff --git a/ITAM_RMM_Integration_Plan.md b/ITAM_RMM_Integration_Plan.md
new file mode 100644
index 0000000..9cb140e
--- /dev/null
+++ b/ITAM_RMM_Integration_Plan.md
@@ -0,0 +1,64 @@
+# [보고서] IT 자산 실시간 통합 관리 시스템(RMM) 도입 계획서
+
+## 1. 도입 배경 및 목적
+- **현황**: 현재 시스템은 수동 입력 기반의 정적 자산 대장으로 운영되어, 실제 장비의 가동 상태나 장애 여부를 실시간으로 파악하는 데 한계가 있음.
+- **목적**: 전산자산(서버, PC)의 실시간 상태 정보를 자동 수집하고 장애 징후를 사전에 탐지하여, 선제적 유지보수 체계를 구축하고 운영 효율성을 극대화함.
+
+## 2. 시스템 주요 기능
+### 2.1 실시간 가동 상태 모니터링
+- 주요 자원(CPU, Memory, Disk) 사용률 실시간 수집
+- 운영체제(OS) 및 주요 시스템 서비스의 정상 작동 여부 확인
+- 자산 리스트 내 상태 인디케이터(정상/주의/장애) 표시
+
+### 2.2 원격 제어 및 지원 통합
+- **기술적 구현 방식 (원클릭 자동 연결)**: 웹사이트에서 전화번호를 누르면 전화 앱이 켜지거나, 이메일 주소를 누르면 메일 창이 뜨는 것과 동일한 원리인 'URL 프로토콜 핸들러' 기술을 적용함.
+ - **자동화 프로세스**: 관리자가 화면의 [연결] 버튼을 클릭하면, 시스템이 팀뷰어나 애니데스크에 "A장비로 연결해줘"라는 신호를 직접 보냄.
+ - **편의성**: 관리자가 대상 장비의 ID나 비밀번호를 직접 복사해서 프로그램에 입력할 필요 없이, 클릭 한 번으로 내 PC에 설치된 원격 소프트웨어가 자동 실행되며 즉시 화면이 연결되도록 구현함.
+- **유연한 접속 모드 지원**:
+ - **무인 접속(Unattended Access)**: 서버 및 공용 장비의 경우, 사전에 등록된 자격 증명을 통해 관리자 승인만으로 즉시 접속하여 야간 또는 긴급 장애에 대응함.
+ - **사용자 승인 접속(Attended Access)**: 개인용 PC의 경우, 사용자의 화면에 접속 요청 팝업을 띄우고 승인 시에만 화면 공유를 시작하여 개인정보 보호 및 보안 규정을 준수함.
+- **보안 및 감사 로그 자동화**:
+ - 원격 접속이 시작되는 시점에 관리자 정보, 접속 목적, 대상 장비 정보를 DB에 자동 기록함.
+ - 세션 종료 후 총 작업 시간 및 조치 내역을 입력하도록 유도하여 투명한 유지보수 이력을 관리함.
+
+### 2.3 원격 지원 상세 워크플로우 (Remote Support Workflow)
+관리자가 장애를 인지하고 조치를 완료하기까지의 표준 프로세스는 다음과 같습니다.
+
+1. **지원 요청 및 대상 선택**: 관리자가 ITAM 대시보드 또는 리스트에서 장애가 발생한 자산을 선택하고 '원격 지원 시작' 버튼을 클릭함.
+2. **접속 모드 자동 판별**:
+ - **서버(무인)**: 시스템이 저장된 자격 증명을 확인하고 관리자에게 '즉시 연결' 팝업을 띄움.
+ - **PC(유인)**: 관리자가 '접속 요청' 버튼을 누르면, 대상 PC 화면에 "관리자가 원격 제어를 요청했습니다. 승인하시겠습니까?" 팝업이 전송됨.
+3. **세션 초기화 및 로그 생성**: 접속 시도가 승인되면 서버는 즉시 [접속 일시, 관리자 ID, 대상 자산 번호]를 포함한 '세션 로그'를 생성하고 상태를 '진행 중'으로 변경함.
+4. **프로토콜 핸들러 실행**: 브라우저가 관리자 PC의 원격 제어 앱(TeamViewer 등)을 자동으로 실행하며, 대상 장비의 ID와 패스워드 정보를 암호화된 인자로 전달하여 즉시 화면이 연결됨.
+5. **조치 및 지원 수행**: 관리자가 실시간으로 장비를 제어하여 장애를 복구함.
+6. **세션 종료 및 결과 기록**:
+ - 관리자가 원격 제어 앱을 종료하면, ITAM 웹 화면에 '조치 결과 입력' 창이 활성화됨.
+ - 관리자가 조치 내용(예: 서비스 재시작, 패치 적용 등)을 입력하고 저장하면 세션 로그가 최종 확정됨.
+7. **이력 보관**: 완료된 모든 이력은 '자산 상세 정보 > 유지보수 이력' 탭에서 언제든지 열람 및 보고서 출력이 가능함.
+
+### 3.3 장애 사전 탐지 및 알림
+- 설정된 임계치(예: 디스크 잔량 10% 미만) 초과 시 즉시 알림 발송
+- 장기 미접속 또는 점검 누락 장비의 실시간 식별
+
+## 3. 운영 프로세스 및 메커니즘
+1. **데이터 수집 (Collection)**: 각 자산에 배치된 에이전트가 시스템 정보를 주기적으로 추출함.
+2. **분석 및 판별 (Analysis)**: 수집된 데이터를 중앙 서버에서 분석하여 장비의 상태 등급을 판정함.
+3. **가시화 (Visualization)**: 통합 관리 대시보드를 통해 전체 자산의 헬스 상태를 실시간으로 출력함.
+4. **대응 (Action)**: 장애 감지 시 원격 제어 기능을 호출하여 즉각적인 기술 지원을 수행함.
+
+## 4. 핵심 기술 및 도구
+- **에이전트**: PowerShell 기반의 경량 스크립트를 활용하여 별도의 상용 소프트웨어 설치 없이 시스템 정보 수집.
+- **백엔드**: Node.js 환경에서 대용량 점검 데이터를 효율적으로 처리하고 데이터베이스화함.
+- **프론트엔드**: TypeScript를 활용하여 직관적이고 반응성이 뛰어난 관리자 대시보드 구현.
+- **원격 솔루션**: 보안성이 검증된 TeamViewer/AnyDesk의 프로토콜 연동을 통한 안전한 원격 접속 환경 구축.
+
+## 5. 기대 효과
+- **가용성 증대**: 장애 발생 전 사전 조치를 통해 시스템 다운타임을 최소화하고 업무 연속성 확보.
+- **비용 절감**: 현장 방문 점검 최소화 및 원격 조치를 통한 IT 운영 관리 비용 및 시간 절감.
+- **데이터 기반 의무**: 객관적인 성능 지표 및 점검 이력을 바탕으로 정밀한 자산 교체 주기 산정 및 감사 대응.
+- **관리 생산성 향상**: 자산 정보 조회와 실시간 관리를 단일 플랫폼으로 통합하여 업무 프로세스 간소화.
+
+## 6. 향후 계획
+- 1단계: 서버 자산 중심의 실시간 모니터링 및 대시보드 구축
+- 2단계: 전사 PC 대상 원격 지원 및 보안 점검 기능 확대 적용
+- 3단계: 누적 데이터를 활용한 성능 분석 및 월간 운영 보고서 자동화
diff --git a/IT_Asset_RMM_System_Report_Detailed.md b/IT_Asset_RMM_System_Report_Detailed.md
new file mode 100644
index 0000000..9fbcdf1
--- /dev/null
+++ b/IT_Asset_RMM_System_Report_Detailed.md
@@ -0,0 +1,318 @@
+# 전산자산 원격 점검 및 관리 시스템(RMM) 구축 조사 보고서 (상세판)
+
+## 1. RMM(Remote Monitoring & Management) 개요
+
+RMM(Remote Monitoring & Management)은 서버, 업무용 PC, 노트북 등 IT 자산에 에이전트를 설치하여
+중앙 관리 서버에서 상태를 자동 수집하고, 이상 발생 시 경고를 발송하며, 필요 시 원격 접속으로 문제를 해결하는
+기업용 IT 운영 관리 체계입니다.
+
+### 주요 기능
+- CPU, 메모리, 디스크 상태 모니터링
+- Windows 서비스 및 프로세스 상태 점검
+- OS 패치 및 백신 상태 확인
+- 자동 점검 스케줄링 (1일 1~2회 이상)
+- 이상 발생 시 이메일/메신저 알림
+- 원격 접속을 통한 장애 조치
+- 점검 이력 및 감사 로그 보관
+
+---
+
+## 2. 구축 목표
+
+### 서버 및 서버용 PC
+- 하루 1~2회 자동 점검
+- 주요 시스템 자원 및 서비스 상태 수집
+- 이상 발생 시 관리자 즉시 통보
+
+### 업무용 PC
+- 중앙 관리 서버에서 정기 점검
+- 패치 및 보안 상태 확인
+
+### 개인 PC
+- 사용자가 직접 점검 실행
+- 결과를 중앙 서버에 업로드
+
+### 관리자
+- 마지막 점검 일시 확인
+- 성공/실패 여부 확인
+- 미실행 장비 식별
+- 필요 시 즉시 원격 접속
+
+---
+
+## 3. 기대 효과
+
+- 장애 조기 탐지 및 사전 예방
+- 현장 방문 최소화
+- 점검 누락 방지
+- 감사 대응 자료 자동 확보
+- 자산 운영 현황 실시간 가시화
+- 사용자 점검 이행 여부 관리
+
+---
+
+## 4. 전체 시스템 아키텍처
+
+```text
+[관리자 웹 포털]
+ ├─ 대시보드
+ ├─ 점검 결과 조회
+ ├─ 원격 접속 버튼
+ ├─ 알림 관리
+ └─ 사용자 수행 현황
+
+ │
+ ▼
+
+[중앙 관리 서버]
+ ├─ 스케줄러
+ ├─ 데이터 수집 API
+ ├─ 분석 엔진
+ ├─ 알림 시스템
+ └─ 데이터베이스
+
+ │
+ ▼
+
+[에이전트 설치 대상]
+ ├─ 서버
+ ├─ 서버용 PC
+ ├─ 업무용 PC
+ └─ 개인 PC
+```
+
+---
+
+## 5. 주요 구성 요소
+
+### 5.1 중앙 관리 서버
+- 스케줄 실행
+- 상태 분석
+- 데이터 저장
+- 알림 전송
+- 웹 서비스 제공
+
+### 5.2 에이전트 프로그램
+- PowerShell 또는 Python 기반
+- 상태 수집
+- 중앙 서버 전송
+
+### 5.3 관리자 웹 대시보드
+- 실시간 현황 조회
+- 점검 이력 확인
+- 원격 접속 실행
+
+### 5.4 원격 접속 솔루션
+- TeamViewer Tensor
+- AnyDesk
+- Microsoft Remote Help
+
+### 5.5 데이터베이스
+- SQL Server 또는 PostgreSQL
+
+### 5.6 알림 시스템
+- 이메일
+- Microsoft Teams
+- Slack
+
+---
+
+## 6. 점검 항목
+
+### 공통 점검 항목
+- CPU 사용률
+- 메모리 사용률
+- 디스크 여유 공간
+- 네트워크 연결 상태
+- 시스템 부팅 시간
+- 재부팅 필요 여부
+
+### 서버 추가 항목
+- 주요 서비스 실행 여부
+- 이벤트 로그 오류
+- 백업 결과
+- DB 상태
+
+### PC 추가 항목
+- 백신 업데이트 여부
+- Windows Update 상태
+- BitLocker 상태
+
+### 개인 PC
+- 기본 시스템 상태
+- 점검 수행 여부 및 시간 기록
+
+---
+
+## 7. 운영 프로세스
+
+### 정상 운영
+1. 스케줄러가 하루 1~2회 자동 실행
+2. 에이전트가 점검 수행
+3. 결과를 중앙 서버로 전송
+4. 분석 엔진이 정상 여부 판정
+5. 대시보드에 저장
+
+### 이상 발생 시
+1. 임계치 초과 또는 서비스 중지 감지
+2. 관리자에게 알림 발송
+3. 관리자가 원격 접속
+4. 조치 내용 기록
+
+### 개인 PC
+1. 사용자가 '점검 실행' 버튼 클릭
+2. 스크립트 수행
+3. 결과 업로드
+4. 관리자가 이행 여부 확인
+
+---
+
+## 8. 개인 PC 자가 점검 기능
+
+### 사용자 화면
+- 점검 실행 버튼
+- 결과 요약 표시
+- 마지막 점검 시간 표시
+
+### 관리자 확인 항목
+- 마지막 점검 일시
+- 성공/실패 여부
+- 미실행 기간
+- 이상 발생 내역
+
+---
+
+## 9. 관리자 대시보드 구성
+
+- 전체 자산 현황
+- 정상/경고/장애 통계
+- 최근 점검 성공률
+- 미점검 장비 목록
+- 개인 PC 수행 현황
+- 원격 접속 바로가기
+- 월간 보고서
+
+---
+
+## 10. 솔루션 비교
+
+| 솔루션 | 특징 | 적합도 |
+|------|------|------|
+| Microsoft Intune | 엔드포인트 관리 및 규정 준수 | 매우 높음 |
+| TeamViewer Tensor | 기업용 원격 접속 및 RMM 연동 | 매우 높음 |
+| ManageEngine Endpoint Central | 자산, 패치, 원격 관리 통합 | 매우 높음 |
+| Zabbix | 오픈소스 모니터링 | 높음 |
+| Splashtop Remote Support | 원격 지원 + RMM | 높음 |
+| Power BI | 대시보드 및 보고 | 매우 높음 |
+
+---
+
+## 11. 권장 구축 방안
+
+### 권장 아키텍처
+- Microsoft Intune
+- TeamViewer Tensor
+- PowerShell 자동 점검 스크립트
+- Microsoft SQL Server
+- Power BI
+- Microsoft Teams 알림
+
+### 권장 이유
+- Windows 환경과 높은 호환성
+- 보안 및 감사 기능 우수
+- 사용자 PC까지 통합 관리 가능
+- 경영진 보고 자동화 가능
+
+---
+
+## 12. 보안 요구사항
+
+- MFA(다중 인증)
+- RBAC(역할 기반 권한 관리)
+- TLS 암호화
+- 감사 로그 저장
+- 승인된 관리자만 원격 접속
+- 사용자 동의 기반 개인 PC 점검
+
+---
+
+## 13. 구축 일정 (예시)
+
+| 단계 | 기간 |
+|------|------|
+| 요구사항 분석 | 2주 |
+| 솔루션 선정 | 2주 |
+| PoC | 4주 |
+| 설계 및 개발 | 6주 |
+| 시범 운영 | 4주 |
+| 전사 확대 | 4주 |
+
+총 예상 기간: 약 4~6개월
+
+---
+
+## 14. 예상 비용 (예시)
+
+| 항목 | 비용 수준 |
+|------|----------|
+| Intune 라이선스 | 사용자당 월 과금 |
+| TeamViewer Tensor | 동시 세션 기준 |
+| 개발 비용 | 중~고 |
+| 운영 비용 | 중간 |
+
+---
+
+## 15. 구축 우선순위
+
+### 1단계
+- 핵심 서버 모니터링
+- 관리자 대시보드
+
+### 2단계
+- 원격 접속 통합
+- 자동 알림
+
+### 3단계
+- 개인 PC 자가 점검
+
+### 4단계
+- Power BI 경영 보고
+
+---
+
+## 16. 최종 권장안
+
+> Microsoft Intune + TeamViewer Tensor + PowerShell + SQL Server + Power BI
+
+이 조합은 다음 요구사항을 모두 충족합니다.
+- 자동 점검
+- 이상 탐지
+- 원격 접속
+- 사용자 자가 점검
+- 이력 관리
+- 감사 대응
+- 경영진 보고
+
+---
+
+## 17. 공식 출처 및 링크
+
+- Microsoft Intune: https://intune.microsoft.com
+- TeamViewer Tensor: https://www.teamviewer.com/en/tensor/
+- TeamViewer RMM 소개: https://www.teamviewer.com/en/solutions/use-cases/rmm-remote-monitoring-management/
+- ManageEngine Endpoint Central: https://www.manageengine.com/products/endpoint-central/
+- Zabbix: https://www.zabbix.com
+- Power BI: https://powerbi.microsoft.com
+- Microsoft SQL Server: https://www.microsoft.com/sql-server
+- Splashtop RMM 설명: https://www.splashtop.com/blog/what-is-remote-monitoring-and-management
+
+---
+
+## 18. 결론
+
+본 시스템은 서버, 업무용 PC, 개인 PC를 통합 관리하여
+정기적인 자동 점검과 이상 탐지, 원격 접속, 사용자 자가 점검, 점검 이력 관리까지 지원하는
+기업용 IT 운영 플랫폼입니다.
+
+특히 개인 PC의 자가 점검 기능과 관리자 추적 기능을 포함함으로써
+규정 준수와 운영 효율성을 동시에 확보할 수 있습니다.
diff --git a/backup_atam_data.json b/backup_atam_data.json
deleted file mode 100644
index 90a0674..0000000
--- a/backup_atam_data.json
+++ /dev/null
@@ -1,3889 +0,0 @@
-{
- "server_assets": [
- {
- "id": "0yx8ear",
- "corp": "삼안",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "SATIS 01",
- "details": "구 SATIS 서버, 세금계산서 발행(회계)",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.228",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "satissg11707808",
- "model_name": "HPE ProLiant DL380p GEN8",
- "os": "Windows Server 2008 R2",
- "cpu": "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz",
- "ram": "20GB",
- "gpu": "",
- "storage1": "100GB",
- "storage2": "458GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "1k3qili",
- "corp": "",
- "asset_code": "SVR-201707-0003",
- "purchase_date": "201707",
- "type": "서버",
- "purpose": "XR WAS Server",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promise Vess R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "223pghb",
- "corp": "",
- "asset_code": "PC-202412-0002",
- "purchase_date": "202412",
- "type": "PC",
- "purpose": "Ai-Cell-A100-1",
- "details": "OCR, Local LLM 등 30여종",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "조립",
- "os": "Ubuntu 24.04",
- "cpu": "AMD Ryzen Threadripper PRO 7975WX",
- "ram": "256GB",
- "gpu": "",
- "storage1": "2 TB",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "2vyfpks",
- "corp": "",
- "asset_code": "SVR-202305-0001",
- "purchase_date": "202305",
- "type": "서버",
- "purpose": "HM MapService 2.0 서버",
- "details": "공간데이터 다운로드 서비스 등",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "172.16.42.127",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL380 Gen10",
- "os": "Windows Server 2019 Standard",
- "cpu": "Intel Xeon Silver 4208",
- "ram": "128 GB",
- "gpu": "",
- "storage1": "1.2 TB",
- "storage2": "40 TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "3fyng4l",
- "corp": "",
- "asset_code": "SVR-201908-0002",
- "purchase_date": "201908",
- "type": "서버",
- "purpose": "한맥 백업 서버",
- "details": "한라 웹 소스 및 Miso DB 백업 서버",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "SuperMicro IR5019P-Series",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "3t8595f",
- "corp": "",
- "asset_code": "SVR-201707-0001",
- "purchase_date": "201707",
- "type": "서버",
- "purpose": "구)스마트건설 서버",
- "details": "XR 가상화 메인 서버 → IDC 산하ERP서버",
- "current_org": "산하",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "172.16.10.226",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "ProLiant DL360 Gen10",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "46pa6q9",
- "corp": "",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "GSIM 서버",
- "details": "Basemap 데이터 저장",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2019 Standard",
- "cpu": "Intel(R) Xeon(R) Silver 4214R",
- "ram": "32GB",
- "gpu": "",
- "storage1": "300GB",
- "storage2": "4TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "5b7er5d",
- "corp": "",
- "asset_code": "PC-201701-0001",
- "purchase_date": "201701",
- "type": "PC",
- "purpose": "저장소 및 전산모사",
- "details": "ParaView, CFDCore\r\n디지털화설문, 검색WIKI 웹서비스",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "172.16.10.213",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "조립PC\r\nProLiant DL360 Gen10",
- "os": "Windows 10 Pro",
- "cpu": "Intel Core i7-7700 CPU 3.60GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "500GB",
- "storage2": "2TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "5ijlr2q",
- "corp": "",
- "asset_code": "SVR-201710-0002",
- "purchase_date": "201710",
- "type": "PC",
- "purpose": "Ai-Cell-Util",
- "details": "깃티, 매터모스트 등 70여종",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HP Z6",
- "os": "Ubuntu 24.04",
- "cpu": "Intel(R) Xeon(R) Gold 6248R",
- "ram": "64GB",
- "gpu": "",
- "storage1": "2 TB",
- "storage2": "8 TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "615nity",
- "corp": "삼안",
- "asset_code": "SVR-201912-0001",
- "purchase_date": "201912",
- "type": "서버",
- "purpose": "삼안 인트라넷",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.237",
- "remote_tool": "원격데스크탑\r\nRemote Util",
- "server_id": "administrator\r\n118.220.172.237",
- "server_pw": "samanerp1!\r\n1234아이티!",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2016",
- "cpu": "intel xeon silver4214R CPU @2.40GHz 2.39GHZ",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "3.27TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "692s3fa",
- "corp": "삼안",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "SATIS 02",
- "details": "SATIS 리뉴얼 버전 (ERP 서버)",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.229",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "satissg11707808",
- "model_name": "HPE ProLiant DL380p GEN8",
- "os": "Windows Server 2008 R2",
- "cpu": "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz",
- "ram": "20GB",
- "gpu": "",
- "storage1": "100GB",
- "storage2": "458GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "as0irys",
- "corp": "PTC",
- "asset_code": "SVR-202204-0002",
- "purchase_date": "202204",
- "type": "서버",
- "purpose": "예비서버",
- "details": "PTC 인트라넷 예비서버",
- "current_org": "PTC",
- "prev_org": "PTC",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "192.168.10.8",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "1234dkdlxl!",
- "model_name": "HPE ProLiant DL360 GEN10",
- "os": "Windows Server 2019",
- "cpu": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "278GB",
- "storage2": "1.09TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "b46o1oh",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "AutoCAD 테스트 서버",
- "details": "오토캐드 테스트 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10 Pro",
- "cpu": "AMD Ryzen9 3900X 12-Core Processor",
- "ram": "32GB",
- "gpu": "",
- "storage1": "500GB",
- "storage2": "2TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "byzop6f",
- "corp": "(주)장헌",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "(주) 장헌 인트라넷",
- "details": "2025.12.23 (주) 장헌 센터 MDF에서 IDC로 이전 설치",
- "current_org": "(주)장헌",
- "prev_org": "장헌",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.76",
- "remote_tool": "원격데스크탑",
- "server_id": "User",
- "server_pw": "Hanmac2141!%",
- "model_name": "",
- "os": "Windows 10",
- "cpu": "12th Gen Intel(R) Core(TM) i7-12700F",
- "ram": "32GB",
- "gpu": "",
- "storage1": "465GB",
- "storage2": "1.81TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "c716tha",
- "corp": "현타",
- "asset_code": "SVR-202209-0003",
- "purchase_date": "202209",
- "type": "서버",
- "purpose": "인트라넷",
- "details": "",
- "current_org": "현타",
- "prev_org": "현타",
- "location": "IDC (동관 53번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "1.234.37.172",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "Hanmac2141!",
- "model_name": "HPE ProLiant DL380 GEN10",
- "os": "Windows Server 2019",
- "cpu": "Intel Xeon Silver 4210R CPU @ 2.40GHz 2.39GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "cdv3f00",
- "corp": "한맥",
- "asset_code": "SVR-202012-0001",
- "purchase_date": "202012",
- "type": "서버",
- "purpose": "한맥 인트라넷",
- "details": "",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.70",
- "remote_tool": "원격데스크탑\r\nRemote Util",
- "server_id": "administrator\r\n211.206.127.70",
- "server_pw": "samanerp1!\r\n1234아이티!",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2016",
- "cpu": "intel xeon silver4110 CPU @2.10GHz 2.10GHZ",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "2.7TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "e8f39ms",
- "corp": "",
- "asset_code": "PC-202412-0001",
- "purchase_date": "202412",
- "type": "PC",
- "purpose": "BEPs 서버",
- "details": "BEPs 개발서버, Outline 협업서비스",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Dell Precision 3680T",
- "os": "Windows 11 Pro",
- "cpu": "Intel Core i9 14900K (24 Core, 32 Thread)",
- "ram": "64GB",
- "gpu": "",
- "storage1": "2 TB",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "epta6mt",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "한라CAD",
- "details": "",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "찾아야함",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "조립PC",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "evamgnr",
- "corp": "삼안",
- "asset_code": "SVR-202504-0001",
- "purchase_date": "202504",
- "type": "서버",
- "purpose": "안전관리",
- "details": "삼안 개발서버2 - AI, SSL, 장헌TBM, 노드",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 202번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "1.234.37.171",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "samanerp1!",
- "model_name": "HPE ProLiant DL380 GEN10",
- "os": "Windwos Server 2022",
- "cpu": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "ram": "128GB",
- "gpu": "",
- "storage1": "278GB",
- "storage2": "3.27TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ezoax0f",
- "corp": "삼안",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "웹 서버",
- "details": "남양주 테스트 서버 (도메인 관리 기능 제거 2026.03.11)",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "samanweb.cafe24.com",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "saman+2013+web",
- "model_name": "HPE ProLiant DL380p GEN8",
- "os": "Windwos Server 2012",
- "cpu": "Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz 2.40GHz",
- "ram": "16GB",
- "gpu": "",
- "storage1": "100GB",
- "storage2": "230GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "f0g41bs",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "한맥CAD",
- "details": "",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "찾아야함",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "조립PC",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "f6sommq",
- "corp": "PTC",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "DB 백업 서버",
- "details": "구 파일 인트라넷, 2024.05.22에 DB 백업 테스트 서버로 변경 (데스크탑)",
- "current_org": "PTC",
- "prev_org": "PTC",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.74",
- "remote_tool": "Remote Util",
- "server_id": "211.206.127.74",
- "server_pw": "1234dkdlxl!",
- "model_name": "",
- "os": "Window 7",
- "cpu": "Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz 2.13GHz",
- "ram": "4GB",
- "gpu": "",
- "storage1": "593GB",
- "storage2": "1.23TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "g5yalni",
- "corp": "삼안",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "삼안 인트라넷 예비",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.249",
- "remote_tool": "원격데스크탑\r\nRemote Util",
- "server_id": "administrator\r\n678-605-383-130",
- "server_pw": "samanerp1!\r\n1234아이티!",
- "model_name": "HPE ProLiant DL360 GEN9",
- "os": "Windows Server 2008 R2",
- "cpu": "Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz 2.40GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "279GB",
- "storage2": "2.72TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hazi0dt",
- "corp": "삼안",
- "asset_code": "SVR-202412-0003",
- "purchase_date": "202412",
- "type": "서버",
- "purpose": "PQ DB 서버",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 204번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.231",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "7013ddj10235!",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2019",
- "cpu": "intel xeon silver4210R CPU @2.40GHz 2.39GHZ",
- "ram": "32GB",
- "gpu": "",
- "storage1": "278GB",
- "storage2": "2.18TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hfs0hwy",
- "corp": "한라",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "안전전산화 서버 (디자인팀 웹)",
- "details": "인트라넷 서버 다운 시 백업용 대기, (임시) 디자인팀 웹 퍼블리싱 서버",
- "current_org": "총괄기획실",
- "prev_org": "한라",
- "location": "IDC (동관 54번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "1.234.37.144",
- "remote_tool": "Remote Util",
- "server_id": "1.234.37.144",
- "server_pw": "1234dkdlxl!",
- "model_name": "HPE ProLiant DL360 GEN9",
- "os": "Windows Server 2012",
- "cpu": "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz",
- "ram": "8GB",
- "gpu": "",
- "storage1": "299GB",
- "storage2": "631GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hhpjhjg",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "AI 관련",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "htcdoqb",
- "corp": "",
- "asset_code": "SVR-202306-0001",
- "purchase_date": "202306",
- "type": "서버",
- "purpose": "Gitlab Runner",
- "details": "GitLab 운영 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Window Server 2019 Standard",
- "cpu": "Intel(R) Xeon(R) Silver 4208 CPU @ 2.10GHz",
- "ram": "64GB",
- "gpu": "",
- "storage1": "1.2 TB",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hx5maav",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "GSIM 언리얼 서버",
- "details": "오브젝트 스토리지(클라우드)를 NAS에 백업(매주 목), ERP유저정보 업데이트(매일), 언리얼 스트리밍 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10 Pro",
- "cpu": "Intel(R) Xeon(R) Gold 6136",
- "ram": "128GB",
- "gpu": "",
- "storage1": "1TB",
- "storage2": "8TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "i0hsbvg",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "공통 GIT 서버",
- "details": "개발 소스코드 서버 (구조물 S/W ,그래픽스개발_HMEG.천지인)",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Dell EMC PowerEdge T380",
- "os": "CentOS Linux 7 (Core)",
- "cpu": "Intel(R) Xeon(R) E-2324G CPU @ 3.10GHz",
- "ram": "16GB",
- "gpu": "",
- "storage1": "1TB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "k2rgwpj",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "BUILD 서버",
- "details": "PM 컨버터(PDF) 서버, PDF 및 비디오 썸네일 생성",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10 Pro",
- "cpu": "12th Gen Intel(R) Core(TM) i9-12900K",
- "ram": "128GB",
- "gpu": "",
- "storage1": "4TB",
- "storage2": "10TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ka4k5j4",
- "corp": "",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "함양-합천 서버",
- "details": "함양합천서버, GSIM 웹서비스, PM 웹서비스",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL380 Gen10",
- "os": "Windows Server 2019 Standard",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "600GB",
- "storage2": "10TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "m7w6kb5",
- "corp": "",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "GSIM META 서버",
- "details": "PM 백업 서버, 오브젝트 스토리지(온프레미스, 클라우드)API 연결",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2019 Standard",
- "cpu": "Intel(R) Xeon(R) Silver 4208 CPU",
- "ram": "96GB",
- "gpu": "",
- "storage1": "300GB",
- "storage2": "4TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "m9h78ru",
- "corp": "바론",
- "asset_code": "SVR-202504-0003",
- "purchase_date": "202504",
- "type": "서버",
- "purpose": "인트라넷",
- "details": "",
- "current_org": "바론",
- "prev_org": "기술개발센터",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.75",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "Hanmac2141!%",
- "model_name": "HPE ProLiant DL360 GEN10",
- "os": "Windows Server 2022",
- "cpu": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "2.18TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "mb93q5s",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "회계",
- "details": "",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "찾아야함",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "조립PC",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "n32fjee",
- "corp": "",
- "asset_code": "PC-202108-0001",
- "purchase_date": "202108",
- "type": "PC",
- "purpose": "인사정보 서버",
- "details": "인사정보 PM",
- "current_org": "총괄기획실",
- "prev_org": "총괄기획실",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "172.16.10.187",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HP Z2 Mini G5 Workstation",
- "os": "Windows 11 Pro",
- "cpu": "intel xeon w-1250p cpu",
- "ram": "32GB",
- "gpu": "",
- "storage1": "2 TB",
- "storage2": "2 TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "nmf3z8e",
- "corp": "장헌",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "인트라넷(구)",
- "details": "현재는 GIT 백업 으로 사용",
- "current_org": "장헌",
- "prev_org": "기술개발센터",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.110",
- "remote_tool": "Remote Util\r\n원격데스크탑",
- "server_id": "211.206.127.110\r\nUser",
- "server_pw": "1234dkdlxl!\r\nHanmac2141!",
- "model_name": "",
- "os": "Windows Server 2019",
- "cpu": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "o2yd1xl",
- "corp": "PTC",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "PTC인트라넷",
- "details": "구 파일 서버(부서자료 백업용), 2024.05.22 인트라넷서버로 교체",
- "current_org": "PTC",
- "prev_org": "PTC",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.72",
- "remote_tool": "Remote Util",
- "server_id": "211.206.127.72",
- "server_pw": "1234dkdlxl!",
- "model_name": "SYSTEM X3650 M2",
- "os": "Windows Server 2008 R2",
- "cpu": "Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 2.26GHz",
- "ram": "16GB",
- "gpu": "",
- "storage1": "556GB",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "o4fanbj",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "산하 ERP 개발서버",
- "details": "산하 ERP 개발용 서버(산하 ERP는 클라우드)",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ojn1djz",
- "corp": "장헌",
- "asset_code": "SVR-202209-0002",
- "purchase_date": "202209",
- "type": "서버",
- "purpose": "장헌인트라넷",
- "details": "",
- "current_org": "장헌",
- "prev_org": "장헌",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.71",
- "remote_tool": "Remote Util",
- "server_id": "211.206.127.71",
- "server_pw": "1234dkdlxl!",
- "model_name": "HPE ProLiant DL380 GEN10",
- "os": "Windows Server 2019",
- "cpu": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "oygs4a4",
- "corp": "",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "전산모사",
- "details": "EGBIM, ParaView, CFDCore",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 11 Pro",
- "cpu": "13th Gen Intel(R) Core(TM) i9-13900KS (3.20 GHz)",
- "ram": "128GB",
- "gpu": "",
- "storage1": "2TB",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "pdrzgv9",
- "corp": "",
- "asset_code": "SVR-202403-0001",
- "purchase_date": "202403",
- "type": "서버",
- "purpose": "GSIM 협업",
- "details": "삼안 예비서버2 + 한종개발 +한종기존소스 vmware",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "HPE ProLiant DL380 Gen10",
- "os": "Server 2019",
- "cpu": "Intel Xeon(R) Silver 4208 CPU @ 2.10GHz",
- "ram": "128GB",
- "gpu": "",
- "storage1": "300GB",
- "storage2": "1.88TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "pic7ldg",
- "corp": "삼안",
- "asset_code": "SVR-202504-0002",
- "purchase_date": "202504",
- "type": "서버",
- "purpose": "가족사 공통메뉴",
- "details": "삼안 개발서버1 - QNA, 급여명세서",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 202번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.233",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "samanerp1!",
- "model_name": "HPE ProLiant DL380 GEN10",
- "os": "Windwos Server 2022",
- "cpu": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "ram": "128GB",
- "gpu": "",
- "storage1": "278GB",
- "storage2": "3.27TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "pvjiuu9",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "GSIM 테스트 서버",
- "details": "개발 테스트용 일반 PC",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10 Pro",
- "cpu": "Intel(R) Core(TM) i7-9700KF",
- "ram": "32GB",
- "gpu": "",
- "storage1": "512GB",
- "storage2": "512GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "qi3jv8r",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "공간데이터 서버",
- "details": "인트라넷 공간정보신청 서비스, 과거 공간데이터(~2022년) 보관 - 추후 공간정보 백업서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "CentOS 7.6.1810 (Core)",
- "cpu": "Intel Xeon Silver 4108 * 2",
- "ram": "128 GB",
- "gpu": "",
- "storage1": "512 GB",
- "storage2": "8 TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "qlzuplz",
- "corp": "한라",
- "asset_code": "SVR-202209-0001",
- "purchase_date": "202209",
- "type": "서버",
- "purpose": "개발서버2",
- "details": "PTC 연구비로 구매한 예비서버2\r\n이전 : 하수도자산 소스+프로그램 현재 : 큰길 서비스용 xampp+ PostgreSQL, BEPs",
- "current_org": "한라",
- "prev_org": "기술개발센터",
- "location": "IDC (동관 53번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "192.168.20.171",
- "remote_tool": "Remote Util\r\n원격데스크탑",
- "server_id": "1.234.37.171\r\nadministrator",
- "server_pw": "1234dkdlxl!\r\nHanmac2141!%",
- "model_name": "HPE ProLiant DL380 Gen10",
- "os": "Windows Server 2019 Standard",
- "cpu": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "rpzqdok",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "한종 테스트",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "sarnjvr",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "공간정보 신청",
- "details": "수치지형도 , 지적도 등 공간정보 자료 제공 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10",
- "cpu": "Intel(R) Core i5-10400 CPU @ 2.90GHz 2.90GHz",
- "ram": "16GB",
- "gpu": "",
- "storage1": "232GB",
- "storage2": "931GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "t93020g",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "가평 VM 원격 서버",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ulmxkpk",
- "corp": "장헌",
- "asset_code": "SVR-202204-0001",
- "purchase_date": "202204",
- "type": "서버",
- "purpose": "장헌 인트라넷 예비",
- "details": "",
- "current_org": "장헌",
- "prev_org": "장헌",
- "location": "IDC (동관 53번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "1.234.37.170",
- "remote_tool": "Remote Util\r\n원격데스크탑",
- "server_id": "1.234.37.170\r\nAdministrator",
- "server_pw": "1234dkdlxl!\r\nHanmac2141!",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2019",
- "cpu": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "uzgeybi",
- "corp": "삼안",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "Oracle DB 서버",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 202번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.225",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "7013ddj10235!",
- "model_name": "HPE ProLiant DL380 GEN9",
- "os": "Windows Server 2012",
- "cpu": "Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 2.20GHz",
- "ram": "64GB",
- "gpu": "",
- "storage1": "558GB",
- "storage2": "1.09TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "vobo00b",
- "corp": "",
- "asset_code": "PC-202110-0001",
- "purchase_date": "202110",
- "type": "PC",
- "purpose": "빌드서버",
- "details": "인스톨 쉴드, 지라",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Dell EMC PowerEdge T350",
- "os": "Windows Server 2022 Standard",
- "cpu": "Intel(R) Xeon(R) E-2378G CPU @ 2.80GHz 2.81 GHz",
- "ram": "32GB",
- "gpu": "",
- "storage1": "1TB",
- "storage2": "4TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "we5apln",
- "corp": "한라",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "한라 인트라넷",
- "details": "인트라넷,안전, 운영, MISO 서버로 운영 중(win 2008)",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "IDC (동관 54번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "1.234.37.143",
- "remote_tool": "Remote Util",
- "server_id": "1.234.37.143",
- "server_pw": "1234dkdlxl!",
- "model_name": "HPE ProLiant DL360 GEN9",
- "os": "Windows Server 2008 R2",
- "cpu": "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz",
- "ram": "8GB",
- "gpu": "",
- "storage1": "299GB",
- "storage2": "631GB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ymcw975",
- "corp": "",
- "asset_code": "PC--0000",
- "purchase_date": "",
- "type": "PC",
- "purpose": "HmEG 테스트 서버",
- "details": "HmEG 테스트 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "Windows 10 Pro",
- "cpu": "Intel(R) Core(TM) i5-10400F @ 2.906 GHz",
- "ram": "16GB",
- "gpu": "",
- "storage1": "250GB",
- "storage2": "1TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "zhjm5nt",
- "corp": "한맥",
- "asset_code": "SVR--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "한맥 인트라넷 예비",
- "details": "단가, 입사자지원 서버 (4/1 장헌산업 이름으로 스마트 건설 용도 구매)",
- "current_org": "한맥",
- "prev_org": "장헌",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "211.206.127.78",
- "remote_tool": "원격데스크탑",
- "server_id": "administrator",
- "server_pw": "Hanmac2141!",
- "model_name": "HPE ProLiant DL360 Gen10",
- "os": "Windows Server 2019",
- "cpu": "intel xeon silver4214R CPU @2.40GHz 2.39GHZ",
- "ram": "32GB",
- "gpu": "",
- "storage1": "280GB",
- "storage2": "2.7TB",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- }
- ],
- "pc_assets": [
- {
- "id": "0dm6v3v",
- "corp": "한맥",
- "asset_code": "HM-PC-2020-003",
- "user": "홍길동",
- "location": "본사 5층",
- "cpu": "i5-10400",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-10-20",
- "price": "1,370,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "1ky5hkv",
- "corp": "바론",
- "asset_code": "HM-PC-2024-011",
- "user": "",
- "location": "지사 1층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-11-05",
- "price": "860,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "2mkcpcm",
- "corp": "한맥",
- "asset_code": "HM-PC-2025-035",
- "user": "",
- "location": "지사 2층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-09-03",
- "price": "770,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "2oiyjqa",
- "corp": "삼안",
- "asset_code": "HM-PC-2020-009",
- "user": "홍길동",
- "location": "본사 1층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-02-08",
- "price": "900,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "3tbi0ya",
- "corp": "한맥",
- "asset_code": "HM-PC-2025-046",
- "user": "홍길동",
- "location": "지사 3층",
- "cpu": "Ryzen 7",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-01-17",
- "price": "1,240,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "564z6nz",
- "corp": "바론",
- "asset_code": "HM-PC-2026-012",
- "user": "",
- "location": "본사 2층",
- "cpu": "i7-12700",
- "gpu": "GTX 1660",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-11-10",
- "price": "960,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "5btnmr6",
- "corp": "바론",
- "asset_code": "HM-PC-2025-031",
- "user": "박지훈",
- "location": "지사 3층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-01-10",
- "price": "1,110,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "677n8b7",
- "corp": "한맥",
- "asset_code": "HM-PC-2026-043",
- "user": "박지훈",
- "location": "본사 4층",
- "cpu": "i7-12700",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-11-04",
- "price": "1,410,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "6q9ehoe",
- "corp": "한맥",
- "asset_code": "HM-PC-2025-037",
- "user": "홍길동",
- "location": "본사 4층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-06-01",
- "price": "870,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "6w9889f",
- "corp": "삼안",
- "asset_code": "HM-PC-2021-030",
- "user": "",
- "location": "본사 4층",
- "cpu": "i7-12700",
- "gpu": "GTX 1660",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2021-05-08",
- "price": "1,410,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "7um2rt7",
- "corp": "삼안",
- "asset_code": "HM-PC-2023-016",
- "user": "김철수",
- "location": "본사 5층",
- "cpu": "Ryzen 7",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2023-03-11",
- "price": "920,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "88swa9a",
- "corp": "바론",
- "asset_code": "HM-PC-2022-007",
- "user": "",
- "location": "지사 3층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-11-12",
- "price": "900,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "8ao7tow",
- "corp": "바론",
- "asset_code": "HM-PC-2026-049",
- "user": "홍길동",
- "location": "본사 2층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-01-15",
- "price": "1,320,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "8dealns",
- "corp": "바론",
- "asset_code": "HM-PC-2025-029",
- "user": "이영희",
- "location": "지사 3층",
- "cpu": "i7-12700",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-02-19",
- "price": "1,360,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "9jfqnwt",
- "corp": "삼안",
- "asset_code": "HM-PC-2018-045",
- "user": "박지훈",
- "location": "지사 5층",
- "cpu": "i5-10400",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2018-11-23",
- "price": "830,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "bb6gofw",
- "corp": "바론",
- "asset_code": "HM-PC-2022-047",
- "user": "김철수",
- "location": "본사 4층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-04-15",
- "price": "610,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "bclulvy",
- "corp": "한맥",
- "asset_code": "HM-PC-2022-024",
- "user": "김팀장",
- "location": "본사 3층",
- "cpu": "Ryzen 5",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-09-05",
- "price": "1,200,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "c8vawkj",
- "corp": "바론",
- "asset_code": "HM-PC-2025-032",
- "user": "마리아",
- "location": "본사 2층",
- "cpu": "i5-10400",
- "gpu": "GTX 1660",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-08-13",
- "price": "1,490,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "cp9idwr",
- "corp": "삼안",
- "asset_code": "HM-PC-2022-038",
- "user": "",
- "location": "지사 5층",
- "cpu": "Ryzen 7",
- "gpu": "-",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-04-17",
- "price": "1,420,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "d8hub4g",
- "corp": "바론",
- "asset_code": "HM-PC-2023-025",
- "user": "",
- "location": "본사 3층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2023-05-11",
- "price": "1,470,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "e02zsht",
- "corp": "한맥",
- "asset_code": "HM-PC-2024-015",
- "user": "신유진",
- "location": "지사 1층",
- "cpu": "Ryzen 5",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-09-06",
- "price": "1,290,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "e352qix",
- "corp": "삼안",
- "asset_code": "HM-PC-2026-002",
- "user": "윤대웅",
- "location": "본사 5층",
- "cpu": "i7-12700",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-04-19",
- "price": "1,030,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ees27k2",
- "corp": "삼안",
- "asset_code": "HM-PC-2023-021",
- "user": "",
- "location": "지사 3층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2023-05-18",
- "price": "540,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "eopuf5p",
- "corp": "삼안",
- "asset_code": "HM-PC-2022-010",
- "user": "윤대웅",
- "location": "지사 5층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-09-23",
- "price": "1,040,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "f0h7a52",
- "corp": "한맥",
- "asset_code": "HM-PC-2017-039",
- "user": "김철수",
- "location": "본사 1층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2017-07-02",
- "price": "1,450,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "f1yw8q7",
- "corp": "한맥",
- "asset_code": "HM-PC-2017-001",
- "user": "홍길동",
- "location": "본사 2층",
- "cpu": "i5-10400",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2017-06-27",
- "price": "1,360,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "fdqihin",
- "corp": "바론",
- "asset_code": "HM-PC-2019-040",
- "user": "김팀장",
- "location": "지사 1층",
- "cpu": "Ryzen 7",
- "gpu": "GTX 1660",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2019-12-27",
- "price": "1,280,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hh4bdmv",
- "corp": "바론",
- "asset_code": "HM-PC-2024-004",
- "user": "신유진",
- "location": "본사 3층",
- "cpu": "i5-10400",
- "gpu": "-",
- "ram": "16GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-06-01",
- "price": "720,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hi6k0u3",
- "corp": "삼안",
- "asset_code": "HM-PC-2020-026",
- "user": "마리아",
- "location": "지사 5층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-04-15",
- "price": "1,340,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "igupfpl",
- "corp": "바론",
- "asset_code": "HM-PC-2024-018",
- "user": "김철수",
- "location": "본사 2층",
- "cpu": "Ryzen 7",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-01-27",
- "price": "1,030,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "jvvzr0q",
- "corp": "삼안",
- "asset_code": "HM-PC-2026-013",
- "user": "",
- "location": "본사 4층",
- "cpu": "Ryzen 5",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-02-13",
- "price": "1,290,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "k6kpw69",
- "corp": "삼안",
- "asset_code": "HM-PC-2019-008",
- "user": "윤대웅",
- "location": "지사 1층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2019-09-04",
- "price": "890,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "kbhib5d",
- "corp": "삼안",
- "asset_code": "HM-PC-2019-033",
- "user": "",
- "location": "지사 4층",
- "cpu": "i7-12700",
- "gpu": "RTX 4070",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2019-06-10",
- "price": "720,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ksa3xuu",
- "corp": "삼안",
- "asset_code": "HM-PC-2019-014",
- "user": "윤대웅",
- "location": "지사 1층",
- "cpu": "i7-12700",
- "gpu": "-",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2019-11-28",
- "price": "690,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "lx8lmnz",
- "corp": "삼안",
- "asset_code": "HM-PC-2020-005",
- "user": "김팀장",
- "location": "지사 1층",
- "cpu": "i7-12700",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-09-22",
- "price": "800,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "odd77ur",
- "corp": "바론",
- "asset_code": "HM-PC-2024-044",
- "user": "홍길동",
- "location": "본사 4층",
- "cpu": "Ryzen 7",
- "gpu": "GTX 1660",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-11-03",
- "price": "520,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "pmf79ic",
- "corp": "바론",
- "asset_code": "HM-PC-2026-041",
- "user": "김철수",
- "location": "본사 1층",
- "cpu": "i7-12700",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2026-04-24",
- "price": "1,150,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "qcs82lb",
- "corp": "삼안",
- "asset_code": "HM-PC-2024-042",
- "user": "신유진",
- "location": "본사 1층",
- "cpu": "i5-10400",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-11-07",
- "price": "650,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "qjb3kz5",
- "corp": "바론",
- "asset_code": "HM-PC-2017-017",
- "user": "김철수",
- "location": "본사 5층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2017-04-28",
- "price": "590,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "sayp9a6",
- "corp": "바론",
- "asset_code": "HM-PC-2025-048",
- "user": "박지훈",
- "location": "지사 4층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-08-01",
- "price": "1,130,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "uu3e3p7",
- "corp": "한맥",
- "asset_code": "HM-PC-2018-006",
- "user": "신유진",
- "location": "본사 2층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2018-05-11",
- "price": "540,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "vqcb09e",
- "corp": "바론",
- "asset_code": "HM-PC-2024-036",
- "user": "윤대웅",
- "location": "지사 5층",
- "cpu": "Ryzen 5",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2024-03-13",
- "price": "590,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "wb9697r",
- "corp": "한맥",
- "asset_code": "HM-PC-2020-020",
- "user": "",
- "location": "본사 5층",
- "cpu": "Ryzen 5",
- "gpu": "GTX 1660",
- "ram": "32GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-06-01",
- "price": "830,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "wjbzneh",
- "corp": "한맥",
- "asset_code": "HM-PC-2025-028",
- "user": "김철수",
- "location": "본사 4층",
- "cpu": "Ryzen 5",
- "gpu": "-",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2025-05-18",
- "price": "640,000",
- "vendor": "컴퓨존",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "xpi653y",
- "corp": "바론",
- "asset_code": "HM-PC-2020-023",
- "user": "김팀장",
- "location": "지사 2층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2020-02-08",
- "price": "560,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "xx3dqs6",
- "corp": "한맥",
- "asset_code": "HM-PC-2021-019",
- "user": "박지훈",
- "location": "지사 3층",
- "cpu": "i5-10400",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "256GB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2021-06-24",
- "price": "1,470,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "xxsx1ex",
- "corp": "바론",
- "asset_code": "HM-PC-2018-022",
- "user": "홍길동",
- "location": "지사 2층",
- "cpu": "Ryzen 7",
- "gpu": "RTX 4070",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2018-02-01",
- "price": "830,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "yoo1re7",
- "corp": "한맥",
- "asset_code": "HM-PC-2018-034",
- "user": "박지훈",
- "location": "본사 5층",
- "cpu": "i5-10400",
- "gpu": "RTX 3060",
- "ram": "16GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "-",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2018-04-06",
- "price": "630,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "zwieocg",
- "corp": "바론",
- "asset_code": "HM-PC-2022-027",
- "user": "마리아",
- "location": "본사 3층",
- "cpu": "Ryzen 5",
- "gpu": "RTX 4070",
- "ram": "32GB",
- "ssd1": "1TB",
- "ssd2": "",
- "hdd1": "1TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2022-03-28",
- "price": "1,260,000",
- "vendor": "오피스디포",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "zz08j3r",
- "corp": "바론",
- "asset_code": "HM-PC-2018-050",
- "user": "",
- "location": "본사 5층",
- "cpu": "i7-12700",
- "gpu": "RTX 3060",
- "ram": "32GB",
- "ssd1": "512GB",
- "ssd2": "",
- "hdd1": "2TB",
- "hdd2": "",
- "ip_address": "",
- "hw_spec": "",
- "purchase_date": "2018-02-06",
- "price": "590,000",
- "vendor": "다나와",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- }
- ],
- "storage_assets": [
- {
- "id": "0ecxlwq",
- "corp": "",
- "asset_code": "STO-202403-0002",
- "purchase_date": "202403",
- "type": "스토리지",
- "purpose": "GSIM 협업 스토리지",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promiss R Series R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "1v5b2tf",
- "corp": "",
- "asset_code": "NAS-201404-0001",
- "purchase_date": "201404",
- "type": "NAS",
- "purpose": "한라 NAS 2",
- "details": "한라 기업부설연구소 공용 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.23",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS414j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "2dx6whb",
- "corp": "한라",
- "asset_code": "DAS-201907-0001",
- "purchase_date": "201907",
- "type": "서버",
- "purpose": "",
- "details": "파일서버 정보 없음(접속 불가)",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "IDC (동관 54번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "3fgahyo",
- "corp": "",
- "asset_code": "NAS-202308-0001",
- "purchase_date": "202308",
- "type": "NAS",
- "purpose": "한라 NAS 1",
- "details": "한라 공용 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.32",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS224+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "51f03yu",
- "corp": "",
- "asset_code": "NAS-202211-0001",
- "purchase_date": "202211",
- "type": "NAS",
- "purpose": "한라 NAS 5",
- "details": "한라 환경플랜트사업부 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.30",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS923+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "54v9m2c",
- "corp": "",
- "asset_code": "NAS-202206-0001",
- "purchase_date": "202206",
- "type": "NAS",
- "purpose": "디자인팀1 NAS",
- "details": "",
- "current_org": "총괄기획실",
- "prev_org": "총괄기획실",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "권순호 연구원",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.99",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS1522+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "7mgxgv7",
- "corp": "",
- "asset_code": "STO--0000",
- "purchase_date": "",
- "type": "스토리지",
- "purpose": "GSIM 스토리지",
- "details": "ProjectMaster 오브젝트 스토리지",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promiss R Series R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "b2bvjcw",
- "corp": "한라",
- "asset_code": "DAS--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "",
- "details": "파일서버 정보 없음(접속 불가)",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "IDC (동관 54번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "btei73p",
- "corp": "",
- "asset_code": "SVR-201708-0001",
- "purchase_date": "201708",
- "type": "NAS",
- "purpose": "한라 백업 서버",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "RS822+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "cowf5lc",
- "corp": "",
- "asset_code": "NAS-201601-0003",
- "purchase_date": "201601",
- "type": "NAS",
- "purpose": "한맥 NAS 3",
- "details": "한맥 공용 NAS",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "순서 파악 필요",
- "manager_sub": "김철수",
- "ip_address": "192.168.10.7",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS416j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "dzoq0tr",
- "corp": "",
- "asset_code": "NAS--0000",
- "purchase_date": "",
- "type": "NAS",
- "purpose": "GSIM NAS",
- "details": "팀 내부 자료 저장 , 정사영상 및 지도 데이터 저장 , Gitea 및 Git 내장 NAS",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Synology DS923+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "e52neft",
- "corp": "",
- "asset_code": "STO-201908-0003",
- "purchase_date": "201908",
- "type": "스토리지",
- "purpose": "Backup Storage",
- "details": "",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promise Vess R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:27.000Z"
- },
- {
- "id": "fl7ufz6",
- "corp": "",
- "asset_code": "SVR-201707-0002",
- "purchase_date": "201707",
- "type": "스토리지",
- "purpose": "IDC 산하ERP서버",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promise Vess R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "g27d2py",
- "corp": "삼안",
- "asset_code": "STO-202503-0001",
- "purchase_date": "202503",
- "type": "서버",
- "purpose": "성과품 백업 스토리지",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 202번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.241",
- "remote_tool": "원격",
- "server_id": "administrator\r\nadmin0",
- "server_pw": "saman1!\r\nRoot1234",
- "model_name": "",
- "os": "Promiss R Series",
- "cpu": "48TB",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "g5c27hj",
- "corp": "",
- "asset_code": "NAS-201501-0001",
- "purchase_date": "201501",
- "type": "스토리지",
- "purpose": "-",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promise Vess",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "h9s2a2g",
- "corp": "",
- "asset_code": "NAS-202211-0002",
- "purchase_date": "202211",
- "type": "NAS",
- "purpose": "한라 NAS 6",
- "details": "한라 공용 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.27",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS923+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "hv9j8d0",
- "corp": "",
- "asset_code": "NAS-202206-0002",
- "purchase_date": "202206",
- "type": "NAS",
- "purpose": "디자인팀2 NAS",
- "details": "",
- "current_org": "총괄기획실",
- "prev_org": "총괄기획실",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "권순호 연구원",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.100",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS1522+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "mh2g66k",
- "corp": "",
- "asset_code": "NAS-200707-0001",
- "purchase_date": "200707",
- "type": "NAS",
- "purpose": "한라 NAS 4",
- "details": "한라 공용 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.25",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "CS407",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "o50dqtc",
- "corp": "",
- "asset_code": "NAS-202206-0003",
- "purchase_date": "202206",
- "type": "NAS",
- "purpose": "기술개발센터 NAS",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "RS815+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "p5vn2mv",
- "corp": "",
- "asset_code": "STO-201908-0001",
- "purchase_date": "201908",
- "type": "서버",
- "purpose": "WAS Storage",
- "details": "가족사 인트라넷 소스 백업 서버",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promise Vess R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "pphqt04",
- "corp": "",
- "asset_code": "NAS-201601-0002",
- "purchase_date": "201601",
- "type": "NAS",
- "purpose": "한맥 NAS 2",
- "details": "한맥 공용 NAS",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "순서 파악 필요",
- "manager_sub": "김철수",
- "ip_address": "192.168.10.6",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS416j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "s30s6co",
- "corp": "삼안",
- "asset_code": "DAS--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "",
- "details": "Satis01, Satis02 광케이블 연결 (물리연결)",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "s5lc90i",
- "corp": "",
- "asset_code": "STO-202305-0002",
- "purchase_date": "202305",
- "type": "스토리지",
- "purpose": "HM MapService 2.0 스토리지",
- "details": "공간데이터 저장용",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Promiss R Series R3600",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "sqeze8d",
- "corp": "",
- "asset_code": "NAS-201209-0001",
- "purchase_date": "201209",
- "type": "NAS",
- "purpose": "총괄기획실 NAS",
- "details": "총괄기획실 공용 NAS",
- "current_org": "총괄기획실",
- "prev_org": "총괄기획실",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "-",
- "manager_sub": "김철수",
- "ip_address": "192.168.10.5",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS413j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "tcmsqia",
- "corp": "",
- "asset_code": "NAS-201601-0001",
- "purchase_date": "201601",
- "type": "NAS",
- "purpose": "한맥 NAS 1",
- "details": "한맥 공용 NAS",
- "current_org": "한맥",
- "prev_org": "한맥",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "순서 파악 필요",
- "manager_sub": "김철수",
- "ip_address": "192.168.10.3",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS416j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "ti2e73o",
- "corp": "",
- "asset_code": "NAS--0000",
- "purchase_date": "",
- "type": "NAS",
- "purpose": "그래픽스개발팀 데이터 백업 NAS",
- "details": "그래픽스 개발팀 데이터 백업용 NAS",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "마천사무실",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "Synology DS923+",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "usw8y07",
- "corp": "삼안",
- "asset_code": "NAS-201906-0001",
- "purchase_date": "201906",
- "type": "서버",
- "purpose": "성과품 스토리지",
- "details": "매니지먼트 접속 확인 불가 (콘솔 연결 후 페이지 오픈 필요)",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 205번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.248",
- "remote_tool": "원격",
- "server_id": "administrator\r\n-",
- "server_pw": "sg11707808\r\n-",
- "model_name": "",
- "os": "ENC_3U_16BAY_D // SEAGATE ST2000NM0045",
- "cpu": "23TB",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "utrq339",
- "corp": "",
- "asset_code": "NAS-201404-0002",
- "purchase_date": "201404",
- "type": "NAS",
- "purpose": "한라 NAS7",
- "details": "한라 원주바이오 NAS",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "192.168.9.20",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS414j",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "wccgrer",
- "corp": "",
- "asset_code": "STO-201908-0004",
- "purchase_date": "201908",
- "type": "서버",
- "purpose": "-",
- "details": "",
- "current_org": "기술개발센터",
- "prev_org": "기술개발센터",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "-",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "ProLiant DL360 Gen10",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "xg9p05x",
- "corp": "삼안",
- "asset_code": "NAS--0000",
- "purchase_date": "",
- "type": "서버",
- "purpose": "인트라넷 백업 스토리지",
- "details": "",
- "current_org": "삼안",
- "prev_org": "삼안",
- "location": "IDC (서관 203번)",
- "manager_main": "홍길동",
- "manager_sub": "김철수",
- "ip_address": "118.220.172.246",
- "remote_tool": "원격",
- "server_id": "administrator",
- "server_pw": "sg11707808",
- "model_name": "",
- "os": "Promiss R Series",
- "cpu": "36TB",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:07:13.000Z"
- },
- {
- "id": "y6epdvi",
- "corp": "",
- "asset_code": "NAS-201710-0001",
- "purchase_date": "201710",
- "type": "NAS",
- "purpose": "NAS 13",
- "details": "환경플랜트사업",
- "current_org": "한라",
- "prev_org": "한라",
- "location": "한맥빌딩(MDF 실)",
- "manager_main": "이준하 차장",
- "manager_sub": "김철수",
- "ip_address": "172.16.100.3",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "DS218play",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- },
- {
- "id": "yslzufm",
- "corp": "",
- "asset_code": "STO-201908-0005",
- "purchase_date": "201908",
- "type": "스토리지",
- "purpose": "WAS Storage",
- "details": "",
- "current_org": "",
- "prev_org": "",
- "location": "",
- "manager_main": "",
- "manager_sub": "",
- "ip_address": "",
- "remote_tool": "",
- "server_id": "",
- "server_pw": "",
- "model_name": "",
- "os": "",
- "cpu": "",
- "ram": "",
- "gpu": "",
- "storage1": "",
- "storage2": "",
- "storage3": "",
- "monitoring": "",
- "remarks": "",
- "created_at": "2026-04-20T01:02:28.000Z"
- }
- ],
- "equip_assets": [
- {
- "id": "28wa20p",
- "corp": "바론",
- "type": "HM-TB-2026-005",
- "asset_code": "아이패드 프로 12.9",
- "asset_name": "지사",
- "location": "",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2026-03-13",
- "purchase_date": "1,500,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "2ikwidj",
- "corp": "삼안",
- "type": "HM-TB-2020-004",
- "asset_code": "아이패드 프로 12.9",
- "asset_name": "본사",
- "location": "",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2020-09-08",
- "purchase_date": "1,500,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "g7w01ud",
- "corp": "삼안",
- "type": "HM-TB-2024-002",
- "asset_code": "아이패드 프로 12.9",
- "asset_name": "지사",
- "location": "이영희",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2024-10-05",
- "purchase_date": "1,500,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ger7ivx",
- "corp": "삼안",
- "type": "HM-NB-2021-002",
- "asset_code": "LG 그램 16인치",
- "asset_name": "지사",
- "location": "윤대웅",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2021-01-26",
- "purchase_date": "1,800,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hgp00ck",
- "corp": "삼안",
- "type": "HM-NB-2023-005",
- "asset_code": "LG 그램 16인치",
- "asset_name": "본사",
- "location": "홍길동",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2023-05-22",
- "purchase_date": "1,800,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "hhpajol",
- "corp": "삼안",
- "type": "HM-PH-2021-005",
- "asset_code": "갤럭시 S24",
- "asset_name": "본사",
- "location": "홍길동",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2021-01-04",
- "purchase_date": "1,200,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "lui73me",
- "corp": "삼안",
- "type": "HM-NB-2022-004",
- "asset_code": "LG 그램 16인치",
- "asset_name": "지사",
- "location": "김철수",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2022-09-11",
- "purchase_date": "1,800,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "o1kn7bz",
- "corp": "삼안",
- "type": "HM-NB-2025-001",
- "asset_code": "LG 그램 16인치",
- "asset_name": "지사",
- "location": "마리아",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2025-09-02",
- "purchase_date": "1,800,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ouv0s34",
- "corp": "한맥",
- "type": "HM-PH-2022-001",
- "asset_code": "갤럭시 S24",
- "asset_name": "지사",
- "location": "김팀장",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2022-10-09",
- "purchase_date": "1,200,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "pyt610t",
- "corp": "한맥",
- "type": "HM-NB-2023-003",
- "asset_code": "LG 그램 16인치",
- "asset_name": "본사",
- "location": "이영희",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2023-01-16",
- "purchase_date": "1,800,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "qnq7vue",
- "corp": "삼안",
- "type": "HM-TB-2021-001",
- "asset_code": "아이패드 프로 12.9",
- "asset_name": "지사",
- "location": "마리아",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2021-11-09",
- "purchase_date": "1,500,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "tzjf0zg",
- "corp": "삼안",
- "type": "HM-PH-2019-002",
- "asset_code": "갤럭시 S24",
- "asset_name": "지사",
- "location": "신유진",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2019-11-02",
- "purchase_date": "1,200,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ymh7uj0",
- "corp": "삼안",
- "type": "HM-PH-2026-004",
- "asset_code": "갤럭시 S24",
- "asset_name": "지사",
- "location": "",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2026-08-13",
- "purchase_date": "1,200,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "ywvmsjy",
- "corp": "바론",
- "type": "HM-PH-2020-003",
- "asset_code": "갤럭시 S24",
- "asset_name": "지사",
- "location": "",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2020-11-04",
- "purchase_date": "1,200,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- },
- {
- "id": "zk5c3j2",
- "corp": "삼안",
- "type": "HM-TB-2022-003",
- "asset_code": "아이패드 프로 12.9",
- "asset_name": "지사",
- "location": "김철수",
- "manager": "",
- "ip_address": "",
- "mac_address": "",
- "hw_spec": "",
- "os": "2022-06-28",
- "purchase_date": "1,500,000",
- "price": "브랜드 총판",
- "vendor": "",
- "doc_name": "",
- "remarks": "",
- "created_at": "2026-04-17T08:52:11.000Z"
- }
- ]
-}
\ No newline at end of file
diff --git a/backup_refactor/index.html b/backup_refactor/index.html
deleted file mode 100644
index 5208b03..0000000
--- a/backup_refactor/index.html
+++ /dev/null
@@ -1,55 +0,0 @@
-
-
-
-
-
-
- ITAM 자산관리 ERP
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/backup_refactor/package.json b/backup_refactor/package.json
deleted file mode 100644
index 8b0150a..0000000
--- a/backup_refactor/package.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
- "name": "hm-itam",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "tsc && vite build",
- "preview": "vite preview",
- "server": "node server.js",
- "db-init": "node db_init.js"
- },
- "devDependencies": {
- "typescript": "^5.2.2",
- "vite": "^5.2.0"
- },
- "dependencies": {
- "cors": "^2.8.6",
- "dotenv": "^17.4.2",
- "express": "^5.2.1",
- "lucide": "^0.364.0",
- "mysql2": "^3.22.1",
- "xlsx": "^0.18.5"
- }
-}
diff --git a/backup_refactor/src/components/Modal/BaseModal.ts b/backup_refactor/src/components/Modal/BaseModal.ts
deleted file mode 100644
index 7e1c518..0000000
--- a/backup_refactor/src/components/Modal/BaseModal.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * 모든 모달의 공통 기능 (닫기, ESC 처리, 배경 클릭 등)을 관리하는 베이스 모듈입니다.
- */
-export function initBaseModal() {
- const closeAllModals = () => {
- const modals = document.querySelectorAll('.modal-overlay');
- modals.forEach(modal => modal.classList.add('hidden'));
- };
-
- // ESC 키로 닫기
- window.addEventListener('keydown', (e) => {
- if (e.key === 'Escape') closeAllModals();
- });
-
- // 배경(Overlay) 클릭 시 닫기 (동적 생성된 모달 대응을 위해 이벤트 위임 고려 가능하나 일단 단순 구현)
- document.addEventListener('click', (e) => {
- const target = e.target as HTMLElement;
- if (target.classList.contains('modal-overlay')) {
- closeAllModals();
- }
- });
-
- return { closeAllModals };
-}
-
-/**
- * 특정 모달을 엽니다.
- * @param modalId 모달 엘리먼트의 ID
- */
-export function openModal(modalId: string) {
- const modal = document.getElementById(modalId);
- if (modal) {
- modal.classList.remove('hidden');
- }
-}
diff --git a/backup_refactor/src/components/Modal/DashboardDetailModal.ts b/backup_refactor/src/components/Modal/DashboardDetailModal.ts
deleted file mode 100644
index 16c1273..0000000
--- a/backup_refactor/src/components/Modal/DashboardDetailModal.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { HardwareAsset, SoftwareAsset } from '../../core/excelHandler';
-import { state } from '../../core/state';
-
-const DASHBOARD_DETAIL_MODAL_HTML = `
-
-`;
-
-export function initDashboardDetailModal() {
- if (!document.getElementById('dashboard-detail-modal')) {
- document.body.insertAdjacentHTML('beforeend', DASHBOARD_DETAIL_MODAL_HTML);
- }
-
- const modal = document.getElementById('dashboard-detail-modal')!;
- const closeBtn = document.getElementById('btn-close-dashboard-detail-modal')!;
- const cancelBtn = document.getElementById('btn-cancel-dashboard-detail-modal')!;
-
- const closeModal = () => modal.classList.add('hidden');
- closeBtn.addEventListener('click', closeModal);
- cancelBtn.addEventListener('click', closeModal);
- modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); });
-}
-
-export function openDashboardDetail(title: string, list: HardwareAsset[]) {
- const modal = document.getElementById('dashboard-detail-modal');
- if (!modal) return;
- const titleEl = document.getElementById('dashboard-detail-modal-title');
- const tbody = document.getElementById('dashboard-detail-tbody');
- if (!titleEl || !tbody) return;
- const thead = tbody.closest('table')?.querySelector('thead');
- if (!thead) return;
-
- titleEl.textContent = title;
- thead.innerHTML = `| No | 유형 | 자산코드 | 명칭/모델 | 위치 | 담당/사용자 | 구매일 | 금액 |
`;
- tbody.innerHTML = '';
- if (list.length === 0) {
- tbody.innerHTML = `| 해당 조건의 자산이 없습니다. |
`;
- } else {
- list.forEach((asset, idx) => {
- let manager = asset.관리자 || asset.사용자 || asset.담당자_정 || '-';
- let name = asset.명칭 || asset.모델명 || '-';
- const tr = document.createElement('tr');
- tr.innerHTML = `${idx+1} | ${asset.type} | ${asset.자산코드} | ${name} | ${asset.위치||'-'} | ${manager} | ${asset.구매일||'-'} | ${asset.금액||'-'} | `;
- tbody.appendChild(tr);
- });
- }
- modal.classList.remove('hidden');
-}
-
-export function openSwDashboardDetail(title: string, list: SoftwareAsset[]) {
- const modal = document.getElementById('dashboard-detail-modal');
- if (!modal) return;
- const titleEl = document.getElementById('dashboard-detail-modal-title');
- const tbody = document.getElementById('dashboard-detail-tbody');
- if (!titleEl || !tbody) return;
- const thead = tbody.closest('table')?.querySelector('thead');
- if (!thead) return;
-
- titleEl.textContent = title;
- thead.innerHTML = `| No | 유형 | 법인 | 제품명 | 수량 | 금액 |
`;
- tbody.innerHTML = '';
- list.forEach((sw, idx) => {
- const tr = document.createElement('tr');
- tr.innerHTML = `${idx+1} | ${sw.type} | ${sw.법인} | ${sw.제품명} | ${sw.수량} | ${sw.금액} | `;
- tbody.appendChild(tr);
- });
- modal.classList.remove('hidden');
-}
-
-export function openSwUsageDetail(title: string, list: SoftwareAsset[]) {
- const modal = document.getElementById('dashboard-detail-modal');
- if (!modal) return;
- const titleEl = document.getElementById('dashboard-detail-modal-title');
- const tbody = document.getElementById('dashboard-detail-tbody');
- if (!titleEl || !tbody) return;
- const thead = tbody.closest('table')?.querySelector('thead');
- if (!thead) return;
-
- titleEl.textContent = title;
- thead.innerHTML = `| No | 법인 | 제품명 | 수량 | 사용중 | 사용가능 |
`;
- tbody.innerHTML = '';
- list.forEach((sw, idx) => {
- const assigned = state.masterData.swUsers.filter(u => u.swId === sw.id).length;
- const qty = typeof sw.수량 === 'number' ? sw.수량 : parseInt(sw.수량||'0', 10);
- const avail = qty - assigned;
- const tr = document.createElement('tr');
- tr.innerHTML = `${idx+1} | ${sw.법인} | ${sw.제품명} | ${qty} | ${assigned} | ${avail} | `;
- tbody.appendChild(tr);
- });
- modal.classList.remove('hidden');
-}
diff --git a/backup_refactor/src/components/Modal/HWModal.ts b/backup_refactor/src/components/Modal/HWModal.ts
deleted file mode 100644
index a330711..0000000
--- a/backup_refactor/src/components/Modal/HWModal.ts
+++ /dev/null
@@ -1,335 +0,0 @@
-import { state } from '../../core/state';
-import { HardwareAsset } from '../../core/excelHandler';
-import { renderTable } from '../../views/AssetTableView';
-import { createIcons, Paperclip } from 'lucide';
-
-let currentAsset: HardwareAsset | null = null;
-let isEditMode = false;
-
-const HW_MODAL_HTML = `
-
-`;
-
-export function openHwModal(asset: HardwareAsset) {
- currentAsset = asset;
- isEditMode = false;
-
- const modal = document.getElementById('hw-asset-modal')!;
- const form = document.getElementById('hw-asset-form') as HTMLFormElement;
- const saveBtn = document.getElementById('btn-save-hw-asset')!;
- const revertBtn = document.getElementById('btn-revert-hw-edit')!;
-
- form.reset();
- form.classList.remove('is-edit-mode');
- form.classList.add('is-view-mode');
- saveBtn.textContent = '수정';
- revertBtn.classList.add('hidden');
-
- fillHwFormData(asset);
-
- modal.classList.remove('hidden');
- createIcons({ icons: { Paperclip } });
-}
-
-function fillHwFormData(asset: HardwareAsset) {
- (document.getElementById('hw-asset-id') as HTMLInputElement).value = asset.id;
- (document.getElementById('hw-asset-type') as HTMLInputElement).value = asset.type;
- (document.getElementById('hw-법인') as HTMLInputElement).value = asset.법인;
- (document.getElementById('hw-자산코드') as HTMLInputElement).value = asset.자산코드;
- (document.getElementById('hw-위치') as HTMLInputElement).value = asset.위치;
- (document.getElementById('hw-모델명') as HTMLInputElement).value = asset.모델명 || '';
- (document.getElementById('hw-OS') as HTMLInputElement).value = asset.OS || '';
- (document.getElementById('hw-CPU') as HTMLInputElement).value = asset.CPU || '';
- (document.getElementById('hw-RAM') as HTMLInputElement).value = asset.RAM || '';
- (document.getElementById('hw-SSD1') as HTMLInputElement).value = asset.SSD1 || '';
- (document.getElementById('hw-SSD2') as HTMLInputElement).value = asset.SSD2 || '';
- (document.getElementById('hw-담당자_정') as HTMLInputElement).value = asset.담당자_정 || asset.관리자 || '';
- (document.getElementById('hw-담당자_부') as HTMLInputElement).value = asset.담당자_부 || '';
- (document.getElementById('hw-품의서명') as HTMLElement).textContent = asset.품의서명 || '';
-
- const serverOnly = document.querySelectorAll('.server-only');
- const nonServer = document.querySelectorAll('.non-server');
- const equipGroup = document.getElementById('hw-비품유형-group')!;
-
- if (asset.type === '서버') {
- serverOnly.forEach(el => (el as HTMLElement).style.display = 'flex');
- nonServer.forEach(el => (el as HTMLElement).style.display = 'none');
- equipGroup.style.display = 'none';
-
- (document.getElementById('hw-용도') as HTMLInputElement).value = asset.용도 || '';
- (document.getElementById('hw-상세') as HTMLInputElement).value = asset.상세 || '';
- (document.getElementById('hw-비고') as HTMLInputElement).value = asset.비고 || '';
- (document.getElementById('hw-IP주소') as HTMLInputElement).value = asset.IP주소 || '';
- (document.getElementById('hw-IP2') as HTMLInputElement).value = (asset as any).IP2 || '';
- (document.getElementById('hw-원격접속') as HTMLInputElement).value = asset.원격접속 || '';
- (document.getElementById('hw-서버ID') as HTMLInputElement).value = (asset as any).서버ID || '';
- (document.getElementById('hw-서버PW') as HTMLInputElement).value = (asset as any).서버PW || '';
- (document.getElementById('hw-모니터링') as HTMLInputElement).value = asset.모니터링 || '';
- } else {
- serverOnly.forEach(el => (el as HTMLElement).style.display = 'none');
- nonServer.forEach(el => (el as HTMLElement).style.display = 'flex');
-
- (document.getElementById('hw-명칭') as HTMLInputElement).value = asset.명칭 || '';
- (document.getElementById('hw-구매일') as HTMLInputElement).value = asset.구매일 || '';
- (document.getElementById('hw-금액') as HTMLInputElement).value = asset.금액 || '';
- (document.getElementById('hw-HW사양') as HTMLTextAreaElement).value = asset.HW사양 || '';
- (document.getElementById('hw-IP주소-non-server') as HTMLInputElement).value = asset.IP주소 || '';
-
- if (asset.type === '전산비품') {
- equipGroup.style.display = 'flex';
- (document.getElementById('hw-비품유형') as HTMLSelectElement).value = asset.비품유형 || '노트북';
- } else {
- equipGroup.style.display = 'none';
- }
- }
-}
-
-export function initHwModal() {
- // HTML 주입
- if (!document.getElementById('hw-asset-modal')) {
- document.body.insertAdjacentHTML('beforeend', HW_MODAL_HTML);
- }
-
- const modal = document.getElementById('hw-asset-modal')!;
- const form = document.getElementById('hw-asset-form') as HTMLFormElement;
- const closeBtn = document.getElementById('btn-close-hw-modal')!;
- const cancelBtn = document.getElementById('btn-cancel-hw-modal')!;
- const saveBtn = document.getElementById('btn-save-hw-asset')!;
- const revertBtn = document.getElementById('btn-revert-hw-edit')!;
- const deleteBtn = document.getElementById('btn-delete-hw-asset')!;
-
- const closeModal = () => {
- modal.classList.add('hidden');
- isEditMode = false;
- };
-
- const switchToViewMode = () => {
- isEditMode = false;
- form.classList.remove('is-edit-mode');
- form.classList.add('is-view-mode');
- saveBtn.textContent = '수정';
- revertBtn.classList.add('hidden');
- if (currentAsset) fillHwFormData(currentAsset);
- };
-
- closeBtn.addEventListener('click', closeModal);
- cancelBtn.addEventListener('click', closeModal);
- modal.addEventListener('click', (e) => { if (e.target === modal) closeModal(); });
- revertBtn.addEventListener('click', () => { switchToViewMode(); });
-
- saveBtn.addEventListener('click', () => {
- if (!currentAsset) return;
-
- if (!isEditMode) {
- isEditMode = true;
- form.classList.remove('is-view-mode');
- form.classList.add('is-edit-mode');
- saveBtn.textContent = '저장';
- revertBtn.classList.remove('hidden');
- return;
- }
-
- const assetId = (document.getElementById('hw-asset-id') as HTMLInputElement).value;
- const type = (document.getElementById('hw-asset-type') as HTMLInputElement).value;
-
- const updated: HardwareAsset = {
- ...currentAsset,
- 법인: (document.getElementById('hw-법인') as HTMLInputElement).value,
- 자산코드: (document.getElementById('hw-자산코드') as HTMLInputElement).value,
- 위치: (document.getElementById('hw-위치') as HTMLInputElement).value,
- 모델명: (document.getElementById('hw-모델명') as HTMLInputElement).value,
- OS: (document.getElementById('hw-OS') as HTMLInputElement).value,
- CPU: (document.getElementById('hw-CPU') as HTMLInputElement).value,
- RAM: (document.getElementById('hw-RAM') as HTMLInputElement).value,
- SSD1: (document.getElementById('hw-SSD1') as HTMLInputElement).value,
- SSD2: (document.getElementById('hw-SSD2') as HTMLInputElement).value,
- 담당자_정: (document.getElementById('hw-담당자_정') as HTMLInputElement).value,
- 관리자: (document.getElementById('hw-담당자_정') as HTMLInputElement).value,
- 담당자_부: (document.getElementById('hw-담당자_부') as HTMLInputElement).value,
- };
-
- if (type === '서버') {
- updated.용도 = (document.getElementById('hw-용도') as HTMLInputElement).value;
- updated.상세 = (document.getElementById('hw-상세') as HTMLInputElement).value;
- updated.비고 = (document.getElementById('hw-비고') as HTMLInputElement).value;
- updated.IP주소 = (document.getElementById('hw-IP주소') as HTMLInputElement).value;
- (updated as any).IP2 = (document.getElementById('hw-IP2') as HTMLInputElement).value;
- updated.원격접속 = (document.getElementById('hw-원격접속') as HTMLInputElement).value;
- (updated as any).서버ID = (document.getElementById('hw-서버ID') as HTMLInputElement).value;
- (updated as any).서버PW = (document.getElementById('hw-서버PW') as HTMLInputElement).value;
- updated.모니터링 = (document.getElementById('hw-모니터링') as HTMLInputElement).value;
- } else {
- updated.명칭 = (document.getElementById('hw-명칭') as HTMLInputElement).value;
- updated.구매일 = (document.getElementById('hw-구매일') as HTMLInputElement).value;
- updated.금액 = (document.getElementById('hw-금액') as HTMLInputElement).value;
- updated.HW사양 = (document.getElementById('hw-HW사양') as HTMLTextAreaElement).value;
- updated.IP주소 = (document.getElementById('hw-IP주소-non-server') as HTMLInputElement).value;
-
- if (type === '전산비품') {
- updated.비품유형 = (document.getElementById('hw-비품유형') as HTMLSelectElement).value;
- }
- }
-
- const idx = state.masterData.hw.findIndex(a => a.id === assetId);
- if (idx > -1) {
- state.masterData.hw[idx] = updated;
- renderTable(document.getElementById('main-content')!);
- switchToViewMode();
- }
- });
-
- deleteBtn.addEventListener('click', () => {
- if (!currentAsset) return;
- if (confirm('정말로 이 자산을 삭제하시겠습니까?')) {
- state.masterData.hw = state.masterData.hw.filter(a => a.id !== currentAsset!.id);
- renderTable(document.getElementById('main-content')!);
- closeModal();
- }
- });
-}
diff --git a/backup_refactor/src/components/Modal/PCModal.ts b/backup_refactor/src/components/Modal/PCModal.ts
deleted file mode 100644
index 0061d71..0000000
--- a/backup_refactor/src/components/Modal/PCModal.ts
+++ /dev/null
@@ -1,342 +0,0 @@
-import { state } from '../../core/state';
-import { HardwareAsset, HardwareLog } from '../../core/excelHandler';
-import { openModal } from './BaseModal';
-
-const PC_MODAL_HTML = `
-
-`;
-
-export function initPcModal(renderContent: () => void, closeModals: () => void) {
- if (!document.getElementById('pc-asset-modal')) {
- document.body.insertAdjacentHTML('beforeend', PC_MODAL_HTML);
- }
-
- const pcForm = document.getElementById('pc-asset-form') as HTMLFormElement;
- const btnRevertEdit = document.getElementById('btn-revert-pc-edit') as HTMLButtonElement;
- const btnSavePc = document.getElementById('btn-save-pc-asset') as HTMLButtonElement;
- const btnDeletePc = document.getElementById('btn-delete-pc-asset') as HTMLButtonElement;
- const btnCloseHeader = document.getElementById('btn-close-pc-modal') as HTMLButtonElement;
- const btnCloseFooter = document.getElementById('btn-close-pc-footer') as HTMLButtonElement;
-
- let isEditMode = false;
- let currentAsset: HardwareAsset | null = null;
-
- const setEditMode = (edit: boolean) => {
- isEditMode = edit;
- if (edit) {
- pcForm.classList.add('is-edit-mode');
- pcForm.classList.remove('is-view-mode');
- btnSavePc.textContent = '저장';
- btnRevertEdit.classList.remove('hidden');
- btnCloseFooter.classList.add('hidden');
- } else {
- pcForm.classList.add('is-view-mode');
- pcForm.classList.remove('is-edit-mode');
- btnSavePc.textContent = '수정';
- btnRevertEdit.classList.add('hidden');
- btnCloseFooter.classList.remove('hidden');
- if (currentAsset) fillFormData(currentAsset);
- }
- };
-
- function fillFormData(asset: HardwareAsset) {
- (document.getElementById('pc-asset-id') as HTMLInputElement).value = asset.id;
- (document.getElementById('pc-법인') as HTMLSelectElement).value = asset.법인;
- (document.getElementById('pc-자산코드') as HTMLInputElement).value = asset.자산코드;
- (document.getElementById('pc-사용자') as HTMLInputElement).value = asset.사용자 || '';
- (document.getElementById('pc-위치') as HTMLInputElement).value = asset.위치 || '';
- (document.getElementById('pc-CPU') as HTMLInputElement).value = asset.CPU || '';
- (document.getElementById('pc-GPU') as HTMLInputElement).value = asset.GPU || '';
- (document.getElementById('pc-RAM') as HTMLInputElement).value = asset.RAM || '';
- (document.getElementById('pc-SSD1') as HTMLInputElement).value = asset.SSD1 || '';
- (document.getElementById('pc-SSD2') as HTMLInputElement).value = asset.SSD2 || '';
- (document.getElementById('pc-HDD1') as HTMLInputElement).value = asset.HDD1 || '';
- (document.getElementById('pc-HDD2') as HTMLInputElement).value = asset.HDD2 || '';
- (document.getElementById('pc-구매일') as HTMLInputElement).value = asset.구매일 || '';
- (document.getElementById('pc-금액') as HTMLInputElement).value = asset.금액 || '';
- (document.getElementById('pc-납품업체') as HTMLInputElement).value = asset.납품업체 || '';
- (document.getElementById('pc-품의서명') as HTMLElement).innerText = asset.품의서명 ? `첨부: ${asset.품의서명}` : '';
- }
-
- btnRevertEdit?.addEventListener('click', () => setEditMode(false));
- btnCloseHeader?.addEventListener('click', closeModals);
- btnCloseFooter?.addEventListener('click', closeModals);
-
- btnSavePc?.addEventListener('click', (e) => {
- e.preventDefault();
- if (!isEditMode) {
- setEditMode(true);
- return;
- }
-
- if (!pcForm.checkValidity()) { pcForm.reportValidity(); return; }
-
- // ... (저장 로직 유지)
- e.preventDefault();
- if (!pcForm.checkValidity()) { pcForm.reportValidity(); return; }
-
- const id = (document.getElementById('pc-asset-id') as HTMLInputElement).value;
- const fileInput = document.getElementById('pc-품의서') as HTMLInputElement;
- const 품의서명 = fileInput.files && fileInput.files.length > 0 ? fileInput.files[0].name : (document.getElementById('pc-품의서명') as HTMLElement).innerText.replace('첨부: ', '');
-
- const newAsset: HardwareAsset = {
- id: id || Math.random().toString(36).substring(2, 9),
- type: '개인PC',
- 법인: (document.getElementById('pc-법인') as HTMLSelectElement).value,
- 자산코드: (document.getElementById('pc-자산코드') as HTMLInputElement).value,
- 명칭: '',
- 위치: (document.getElementById('pc-위치') as HTMLInputElement).value,
- 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', 납품업체: (document.getElementById('pc-납품업체') as HTMLInputElement).value,
- 사용자: (document.getElementById('pc-사용자') as HTMLInputElement).value,
- CPU: (document.getElementById('pc-CPU') as HTMLInputElement).value,
- GPU: (document.getElementById('pc-GPU') as HTMLInputElement).value,
- RAM: (document.getElementById('pc-RAM') as HTMLInputElement).value,
- SSD1: (document.getElementById('pc-SSD1') as HTMLInputElement).value,
- SSD2: (document.getElementById('pc-SSD2') as HTMLInputElement).value,
- HDD1: (document.getElementById('pc-HDD1') as HTMLInputElement).value,
- HDD2: (document.getElementById('pc-HDD2') as HTMLInputElement).value,
- 구매일: (document.getElementById('pc-구매일') as HTMLInputElement).value,
- 금액: (document.getElementById('pc-금액') as HTMLInputElement).value,
- 품의서명
- };
-
- if (id) {
- const idx = state.masterData.hw.findIndex(a => a.id === id);
- if(idx !== -1) {
- const oldAsset = state.masterData.hw[idx];
- const changes = getChangeDetails(oldAsset, newAsset);
- if (changes) {
- state.masterData.logs.push({
- id: Math.random().toString(36).substring(2, 9),
- assetId: id,
- date: new Date().toLocaleString(),
- details: changes,
- user: '관리자'
- });
- }
- state.masterData.hw[idx] = newAsset;
- }
- } else {
- state.masterData.hw.push(newAsset);
- }
-
- closeModals();
- renderContent();
- });
-
- btnDeletePc?.addEventListener('click', (e) => {
- e.preventDefault();
- const id = (document.getElementById('pc-asset-id') as HTMLInputElement).value;
- if (confirm('삭제하시겠습니까?')) {
- state.masterData.hw = state.masterData.hw.filter(a => a.id !== id);
- closeModals();
- renderContent();
- }
- });
-}
-
-export function openPcModal(asset?: HardwareAsset) {
- const pcForm = document.getElementById('pc-asset-form') as HTMLFormElement;
- const deleteBtn = document.getElementById('btn-delete-pc-asset')!;
- const historyArea = document.querySelector('.modal-history-area') as HTMLElement;
-
- openModal('pc-asset-modal');
- pcForm.reset();
-
- if (asset) {
- document.getElementById('pc-modal-title')!.textContent = '개인PC 상세 정보 수정';
- deleteBtn.style.display = 'block';
- if (historyArea) historyArea.style.display = 'flex';
-
- (document.getElementById('pc-asset-id') as HTMLInputElement).value = asset.id;
- (document.getElementById('pc-법인') as HTMLSelectElement).value = asset.법인;
- (document.getElementById('pc-자산코드') as HTMLInputElement).value = asset.자산코드;
- (document.getElementById('pc-사용자') as HTMLInputElement).value = asset.사용자 || '';
- (document.getElementById('pc-위치') as HTMLInputElement).value = asset.위치 || '';
- (document.getElementById('pc-CPU') as HTMLInputElement).value = asset.CPU || '';
- (document.getElementById('pc-GPU') as HTMLInputElement).value = asset.GPU || '';
- (document.getElementById('pc-RAM') as HTMLInputElement).value = asset.RAM || '';
- (document.getElementById('pc-SSD1') as HTMLInputElement).value = asset.SSD1 || '';
- (document.getElementById('pc-SSD2') as HTMLInputElement).value = asset.SSD2 || '';
- (document.getElementById('pc-HDD1') as HTMLInputElement).value = asset.HDD1 || '';
- (document.getElementById('pc-HDD2') as HTMLInputElement).value = asset.HDD2 || '';
- (document.getElementById('pc-구매일') as HTMLInputElement).value = asset.구매일 || '';
- (document.getElementById('pc-금액') as HTMLInputElement).value = asset.금액 || '';
- (document.getElementById('pc-납품업체') as HTMLInputElement).value = asset.납품업체 || '';
- (document.getElementById('pc-품의서명') as HTMLElement).innerText = asset.품의서명 ? `첨부: ${asset.품의서명}` : '';
-
- renderHistory(asset.id);
- } else {
- document.getElementById('pc-modal-title')!.textContent = '신규 개인PC 자산 추가';
- deleteBtn.style.display = 'none';
- if (historyArea) historyArea.style.display = 'none';
-
- (document.getElementById('pc-asset-id') as HTMLInputElement).value = '';
- (document.getElementById('pc-법인') as HTMLSelectElement).value = '한맥';
- (document.getElementById('pc-품의서명') as HTMLElement).innerText = '';
- }
-}
-
-function getChangeDetails(oldAsset: HardwareAsset, newAsset: HardwareAsset): string {
- const changes: string[] = [];
- const fields = [
- { key: '법인', label: '법인' },
- { key: '자산코드', label: '자산코드' },
- { key: '사용자', label: '사용자' },
- { key: '위치', label: '위치' },
- { key: 'CPU', label: 'CPU' },
- { key: 'GPU', label: 'GPU' },
- { key: 'RAM', label: 'RAM' },
- { key: 'SSD1', label: 'SSD1' },
- { key: 'SSD2', label: 'SSD2' },
- { key: 'HDD1', label: 'HDD1' },
- { key: 'HDD2', label: 'HDD2' },
- { key: '구매일', label: '구매일' },
- { key: '금액', label: '금액' },
- { key: '납품업체', label: '납품업체' },
- { key: '품의서명', label: '품의서' },
- ];
-
- fields.forEach(field => {
- const oldVal = (oldAsset as any)[field.key] || '';
- const newVal = (newAsset as any)[field.key] || '';
- if (oldVal !== newVal) {
- changes.push(`${field.label}: ${oldVal || '없음'} → ${newVal || '없음'}`);
- }
- });
- return changes.join('\n');
-}
-
-function renderHistory(assetId: string) {
- const historyList = document.getElementById('pc-history-list');
- if (!historyList) return;
-
- const logs = state.masterData.logs
- .filter(l => l.assetId === assetId)
- .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime());
-
- if (logs.length === 0) {
- historyList.innerHTML = '이력이 없습니다.
';
- return;
- }
-
- historyList.innerHTML = logs.map(log => `
-
-
${log.date}
-
수정자: ${log.user}
-
${log.details.replace(/\\n/g, '
')}
-
- `).join('');
-}
diff --git a/backup_refactor/src/components/Modal/SWModal.ts b/backup_refactor/src/components/Modal/SWModal.ts
deleted file mode 100644
index ecfb78f..0000000
--- a/backup_refactor/src/components/Modal/SWModal.ts
+++ /dev/null
@@ -1,222 +0,0 @@
-import { state } from '../../core/state';
-import { SoftwareAsset } from '../../core/excelHandler';
-import { openModal } from './BaseModal';
-
-const SW_MODAL_HTML = `
-
-`;
-
-export function initSwModal(renderContent: () => void, closeModals: () => void) {
- if (!document.getElementById('sw-asset-modal')) {
- document.body.insertAdjacentHTML('beforeend', SW_MODAL_HTML);
- }
-
- const swForm = document.getElementById('sw-asset-form') as HTMLFormElement;
- const btnRevertEdit = document.getElementById('btn-revert-sw-edit') as HTMLButtonElement;
- const btnSaveSw = document.getElementById('btn-save-sw-asset') as HTMLButtonElement;
- const btnDeleteSw = document.getElementById('btn-delete-sw-asset') as HTMLButtonElement;
- const btnCloseHeader = document.getElementById('btn-close-sw-modal') as HTMLButtonElement;
- const btnCloseFooter = document.getElementById('btn-close-sw-footer') as HTMLButtonElement;
-
- let isEditMode = false;
- let currentAsset: SoftwareAsset | null = null;
-
- const setEditMode = (edit: boolean) => {
- isEditMode = edit;
- if (edit) {
- swForm.classList.add('is-edit-mode');
- swForm.classList.remove('is-view-mode');
- btnSaveSw.textContent = '저장';
- btnRevertEdit.classList.remove('hidden');
- btnCloseFooter.classList.add('hidden');
- } else {
- swForm.classList.add('is-view-mode');
- swForm.classList.remove('is-edit-mode');
- btnSaveSw.textContent = '수정';
- btnRevertEdit.classList.add('hidden');
- btnCloseFooter.classList.remove('hidden');
- if (currentAsset) fillFormData(currentAsset);
- }
- };
-
- function fillFormData(asset: SoftwareAsset) {
- (document.getElementById('sw-asset-id') as HTMLInputElement).value = asset.id;
- (document.getElementById('sw-asset-type') as HTMLInputElement).value = asset.type;
- (document.getElementById('sw-분야') as HTMLSelectElement).value = asset.분야 || '업무공통';
- (document.getElementById('sw-법인') as HTMLSelectElement).value = asset.법인;
- (document.getElementById('sw-부서') as HTMLInputElement).value = asset.부서 || '';
- (document.getElementById('sw-제품명') as HTMLInputElement).value = asset.제품명;
- (document.getElementById('sw-구매일') as HTMLInputElement).value = asset.구매일 || '';
- (document.getElementById('sw-구독일') as HTMLInputElement).value = asset.구독일 || '';
- (document.getElementById('sw-유지보수여부') as HTMLInputElement).checked = !!asset.유지보수여부;
- (document.getElementById('sw-금액') as HTMLInputElement).value = asset.금액 || '';
- (document.getElementById('sw-수량') as HTMLInputElement).value = String(asset.수량);
- (document.getElementById('sw-계정명') as HTMLInputElement).value = asset.계정명 || '';
- (document.getElementById('sw-납품업체') as HTMLInputElement).value = asset.납품업체 || '';
- (document.getElementById('sw-비고') as HTMLInputElement).value = asset.비고 || '';
- }
-
- btnRevertEdit?.addEventListener('click', () => setEditMode(false));
- btnCloseHeader?.addEventListener('click', closeModals);
- btnCloseFooter?.addEventListener('click', closeModals);
-
- btnSaveSw?.addEventListener('click', (e) => {
- e.preventDefault();
- if (!isEditMode) {
- setEditMode(true);
- return;
- }
-
- if (!swForm.checkValidity()) { swForm.reportValidity(); return; }
-
- const id = (document.getElementById('sw-asset-id') as HTMLInputElement).value;
- const newAsset: SoftwareAsset = {
- id: id || Math.random().toString(36).substring(2, 9),
- type: (document.getElementById('sw-asset-type') as HTMLInputElement).value,
- 분야: (document.getElementById('sw-분야') as HTMLSelectElement).value,
- 법인: (document.getElementById('sw-법인') as HTMLSelectElement).value,
- 부서: (document.getElementById('sw-부서') as HTMLInputElement).value,
- 제품명: (document.getElementById('sw-제품명') as HTMLInputElement).value,
- 구매일: (document.getElementById('sw-구매일') as HTMLInputElement).value,
- 구독일: (document.getElementById('sw-구독일') as HTMLInputElement).value,
- 유지보수여부: (document.getElementById('sw-유지보수여부') as HTMLInputElement).checked,
- 금액: (document.getElementById('sw-금액') as HTMLInputElement).value,
- 수량: parseInt((document.getElementById('sw-수량') as HTMLInputElement).value || '1', 10),
- 계정명: (document.getElementById('sw-계정명') as HTMLInputElement).value,
- 납품업체: (document.getElementById('sw-납품업체') as HTMLInputElement).value,
- 비고: (document.getElementById('sw-비고') as HTMLInputElement).value,
- };
-
- if (id) {
- const idx = state.masterData.sw.findIndex(a => a.id === id);
- if(idx !== -1) state.masterData.sw[idx] = newAsset;
- } else {
- state.masterData.sw.push(newAsset);
- }
-
- closeModals();
- renderContent();
- });
-
- btnDeleteSw?.addEventListener('click', (e) => {
- e.preventDefault();
- const id = (document.getElementById('sw-asset-id') as HTMLInputElement).value;
- if (confirm('삭제하시겠습니까?')) {
- state.masterData.sw = state.masterData.sw.filter(a => a.id !== id);
- closeModals();
- renderContent();
- }
- });
-}
-
-export function openSwModal(asset?: SoftwareAsset) {
- currentAsset = asset || null;
- const swForm = document.getElementById('sw-asset-form') as HTMLFormElement;
- const deleteBtn = document.getElementById('btn-delete-sw-asset')!;
-
- openModal('sw-asset-modal');
- swForm.reset();
-
- const subGroup = document.getElementById('sw-구독일-group')!;
- const permGroup = document.getElementById('sw-유지보수-group')!;
- if (state.activeSubTab === '구독SW') {
- subGroup.style.display = 'flex';
- permGroup.style.display = 'none';
- } else {
- subGroup.style.display = 'none';
- permGroup.style.display = 'flex';
- }
-
- if (asset) {
- document.getElementById('sw-modal-title')!.textContent = `${state.activeSubTab} 상세 정보 수정`;
- deleteBtn.style.display = 'block';
- fillFormData(asset);
- setEditMode(false);
- } else {
- document.getElementById('sw-modal-title')!.textContent = `신규 ${state.activeSubTab} 자산 추가`;
- deleteBtn.style.display = 'none';
- (document.getElementById('sw-asset-id') as HTMLInputElement).value = '';
- (document.getElementById('sw-asset-type') as HTMLInputElement).value = state.activeSubTab;
- setEditMode(true);
- }
-}
diff --git a/backup_refactor/src/components/Modal/SWUserModal.ts b/backup_refactor/src/components/Modal/SWUserModal.ts
deleted file mode 100644
index f4f0668..0000000
--- a/backup_refactor/src/components/Modal/SWUserModal.ts
+++ /dev/null
@@ -1,241 +0,0 @@
-import { state } from '../../core/state';
-import { SoftwareAsset, SWUser } from '../../core/excelHandler';
-import { openModal } from './BaseModal';
-import { createIcons, Edit2, X, Paperclip } from 'lucide';
-
-let currentSwUserAssetId: string = '';
-let tempSwUsers: SWUser[] = [];
-
-const SW_USER_MODAL_HTML = `
-
-
-
-
-
-
-
-
-
-
-
-
-
- | 법인 |
- 부서/팀 |
- 직위 |
- 이름 |
- 사용기간 |
- 증빙 |
- 관리 |
-
-
-
-
-
-
-
-
-
-
-
-
-`;
-
-export function initSwUserModal(renderContent: () => void, closeModals: () => void) {
- if (!document.getElementById('sw-user-modal')) {
- document.body.insertAdjacentHTML('beforeend', SW_USER_MODAL_HTML);
- }
-
- const btnOpenAddUser = document.getElementById('btn-open-add-user');
- const btnSaveEditUser = document.getElementById('btn-save-edit-user');
- const btnSaveSwUserMapping = document.getElementById('btn-save-sw-user-mapping');
- const btnCancelUserEdit = document.getElementById('btn-cancel-sw-user-edit');
- const btnCloseUserEdit = document.getElementById('btn-close-sw-user-edit');
- const btnCancelUserModal = document.getElementById('btn-cancel-sw-user-modal');
- const btnCloseUserModal = document.getElementById('btn-close-sw-user-modal');
-
- btnOpenAddUser?.addEventListener('click', () => openUserEditModal(-1));
- btnSaveEditUser?.addEventListener('click', () => saveUserEdit());
-
- btnSaveSwUserMapping?.addEventListener('click', () => {
- state.masterData.swUsers = state.masterData.swUsers.filter(u => u.swId !== currentSwUserAssetId);
- state.masterData.swUsers.push(...tempSwUsers);
- document.getElementById('sw-user-modal')?.classList.add('hidden');
- renderContent();
- });
-
- btnCancelUserEdit?.addEventListener('click', () => document.getElementById('sw-user-edit-modal')?.classList.add('hidden'));
- btnCloseUserEdit?.addEventListener('click', () => document.getElementById('sw-user-edit-modal')?.classList.add('hidden'));
- btnCancelUserModal?.addEventListener('click', () => document.getElementById('sw-user-modal')?.classList.add('hidden'));
- btnCloseUserModal?.addEventListener('click', () => document.getElementById('sw-user-modal')?.classList.add('hidden'));
-}
-
-function renderUserList() {
- const tbody = document.getElementById('user-list-body')!;
- tbody.innerHTML = '';
- if (tempSwUsers.length === 0) {
- tbody.innerHTML = '| 할당된 사용자가 없습니다. |
';
- return;
- }
-
- tempSwUsers.forEach((user, idx) => {
- const tr = document.createElement('tr');
- const deptTeam = [user.부서, user.팀].filter(Boolean).join(' / ') || '-';
- const attachIcon = user.신청서명 ? `` : '-';
-
- tr.innerHTML = `
- ${user.법인} |
- ${deptTeam} |
- ${user.직위 || '-'} |
- ${user.이름} |
- ${user.사용기간 || '-'} |
- ${attachIcon} |
-
-
-
- |
- `;
- tbody.appendChild(tr);
- });
-
- createIcons({ icons: { Edit2, X, Paperclip } });
-
- tbody.querySelectorAll('.btn-edit-user').forEach(btn => {
- btn.addEventListener('click', (e) => {
- const idx = parseInt((e.currentTarget as HTMLElement).getAttribute('data-idx')!);
- openUserEditModal(idx);
- });
- });
-
- tbody.querySelectorAll('.btn-remove-user').forEach(btn => {
- btn.addEventListener('click', (e) => {
- const idx = parseInt((e.currentTarget as HTMLButtonElement).getAttribute('data-idx')!);
- tempSwUsers.splice(idx, 1);
- renderUserList();
- });
- });
-}
-
-export function openSwUserModal(asset: SoftwareAsset) {
- openModal('sw-user-modal');
- currentSwUserAssetId = asset.id;
- tempSwUsers = state.masterData.swUsers.filter(u => u.swId === asset.id).map(u => ({...u}));
- renderUserList();
-}
-
-function openUserEditModal(idx: number) {
- const editModal = document.getElementById('sw-user-edit-modal')!;
- editModal.classList.remove('hidden');
- (document.getElementById('edit-user-idx') as HTMLInputElement).value = String(idx);
-
- if (idx === -1) {
- document.getElementById('sw-user-edit-modal-title')!.innerText = '새 사용자 추가';
- (document.getElementById('new-user-법인') as HTMLSelectElement).value = '한맥';
- (document.getElementById('new-user-부서') as HTMLInputElement).value = '';
- (document.getElementById('new-user-팀') as HTMLInputElement).value = '';
- (document.getElementById('new-user-직위') as HTMLInputElement).value = '';
- (document.getElementById('new-user-이름') as HTMLInputElement).value = '';
- (document.getElementById('new-user-사용기간') as HTMLInputElement).value = '';
- (document.getElementById('new-user-신청서') as HTMLInputElement).value = '';
- document.getElementById('new-user-신청서명')!.innerText = '';
- } else {
- document.getElementById('sw-user-edit-modal-title')!.innerText = '사용자 정보 수정';
- const u = tempSwUsers[idx];
- (document.getElementById('new-user-법인') as HTMLSelectElement).value = u.법인;
- (document.getElementById('new-user-부서') as HTMLInputElement).value = u.부서;
- (document.getElementById('new-user-팀') as HTMLInputElement).value = u.팀;
- (document.getElementById('new-user-직위') as HTMLInputElement).value = u.직위;
- (document.getElementById('new-user-이름') as HTMLInputElement).value = u.이름;
- (document.getElementById('new-user-사용기간') as HTMLInputElement).value = u.사용기간;
- (document.getElementById('new-user-신청서') as HTMLInputElement).value = '';
- document.getElementById('new-user-신청서명')!.innerText = u.신청서명 ? `첨부: ${u.신청서명}` : '';
- }
-}
-
-function saveUserEdit() {
- const idx = parseInt((document.getElementById('edit-user-idx') as HTMLInputElement).value);
- const 이름 = (document.getElementById('new-user-이름') as HTMLInputElement).value.trim();
- if (!이름) { alert('이름을 입력해주세요.'); return; }
-
- const fileInput = document.getElementById('new-user-신청서') as HTMLInputElement;
- let 신청서명 = '';
- if (fileInput.files && fileInput.files.length > 0) {
- 신청서명 = fileInput.files[0].name;
- } else if (idx !== -1) {
- 신청서명 = tempSwUsers[idx].신청서명;
- }
-
- const userData: SWUser = {
- id: idx === -1 ? Math.random().toString(36).substring(2, 9) : tempSwUsers[idx].id,
- swId: currentSwUserAssetId,
- 법인: (document.getElementById('new-user-법인') as HTMLSelectElement).value,
- 부서: (document.getElementById('new-user-부서') as HTMLInputElement).value,
- 팀: (document.getElementById('new-user-팀') as HTMLInputElement).value,
- 직위: (document.getElementById('new-user-직위') as HTMLInputElement).value,
- 이름,
- 사용기간: (document.getElementById('new-user-사용기간') as HTMLInputElement).value,
- 신청서명
- };
-
- if (idx === -1) tempSwUsers.push(userData);
- else tempSwUsers[idx] = userData;
-
- document.getElementById('sw-user-edit-modal')?.classList.add('hidden');
- renderUserList();
-}
diff --git a/backup_refactor/src/components/Modal/StorageModal.ts b/backup_refactor/src/components/Modal/StorageModal.ts
deleted file mode 100644
index 1a88b70..0000000
--- a/backup_refactor/src/components/Modal/StorageModal.ts
+++ /dev/null
@@ -1,161 +0,0 @@
-import { state } from '../../core/state';
-import { HardwareAsset } from '../../core/excelHandler';
-import { openModal } from './BaseModal';
-
-const STORAGE_MODAL_HTML = `
-
-`;
-
-export function initStorageModal(renderContent: () => void, closeModals: () => void) {
- if (!document.getElementById('storage-asset-modal')) {
- document.body.insertAdjacentHTML('beforeend', STORAGE_MODAL_HTML);
- }
-
- const storageForm = document.getElementById('storage-asset-form') as HTMLFormElement;
- const btnRevertEdit = document.getElementById('btn-revert-storage-edit') as HTMLButtonElement;
- const btnSaveStorage = document.getElementById('btn-save-storage-asset') as HTMLButtonElement;
- const btnDeleteStorage = document.getElementById('btn-delete-storage-asset') as HTMLButtonElement;
- const btnCloseHeader = document.getElementById('btn-close-storage-modal') as HTMLButtonElement;
- const btnCloseFooter = document.getElementById('btn-close-storage-footer') as HTMLButtonElement;
-
- let isEditMode = false;
- let currentAsset: HardwareAsset | null = null;
-
- const setEditMode = (edit: boolean) => {
- isEditMode = edit;
- if (edit) {
- storageForm.classList.add('is-edit-mode');
- storageForm.classList.remove('is-view-mode');
- btnSaveStorage.textContent = '저장';
- btnRevertEdit.classList.remove('hidden');
- btnCloseFooter.classList.add('hidden');
- } else {
- storageForm.classList.add('is-view-mode');
- storageForm.classList.remove('is-edit-mode');
- btnSaveStorage.textContent = '수정';
- btnRevertEdit.classList.add('hidden');
- btnCloseFooter.classList.remove('hidden');
- if (currentAsset) fillFormData(currentAsset);
- }
- };
-
- function fillFormData(asset: HardwareAsset) {
- (document.getElementById('storage-asset-id') as HTMLInputElement).value = asset.id;
- (document.getElementById('storage-법인') as HTMLInputElement).value = asset.법인;
- (document.getElementById('storage-유형') as HTMLInputElement).value = asset.storage유형 || 'NAS';
- (document.getElementById('storage-자산코드') as HTMLInputElement).value = asset.자산코드;
- (document.getElementById('storage-명칭') as HTMLInputElement).value = asset.명칭;
- (document.getElementById('storage-위치') as HTMLInputElement).value = asset.위치 || '';
- (document.getElementById('storage-모델명') as HTMLInputElement).value = asset.모델명 || '';
- (document.getElementById('storage-용량') as HTMLInputElement).value = asset.용량 || '';
- (document.getElementById('storage-담당자_정') as HTMLInputElement).value = asset.담당자_정 || '';
- (document.getElementById('storage-IP주소') as HTMLInputElement).value = asset.IP주소 || '';
- (document.getElementById('storage-구매일') as HTMLInputElement).value = asset.구매일 || '';
- (document.getElementById('storage-금액') as HTMLInputElement).value = asset.금액 || '';
- }
-
- btnRevertEdit?.addEventListener('click', () => setEditMode(false));
- btnCloseHeader?.addEventListener('click', closeModals);
- btnCloseFooter?.addEventListener('click', closeModals);
-
- btnSaveStorage?.addEventListener('click', (e) => {
- e.preventDefault();
- if (!isEditMode) {
- setEditMode(true);
- return;
- }
-
- if (!storageForm.checkValidity()) { storageForm.reportValidity(); return; }
-
- const id = (document.getElementById('storage-asset-id') as HTMLInputElement).value;
- const newAsset: HardwareAsset = {
- id: id || Math.random().toString(36).substring(2, 9),
- type: '스토리지',
- 법인: (document.getElementById('storage-법인') as HTMLInputElement).value,
- storage유형: (document.getElementById('storage-유형') as HTMLInputElement).value,
- 자산코드: (document.getElementById('storage-자산코드') as HTMLInputElement).value,
- 명칭: (document.getElementById('storage-명칭') as HTMLInputElement).value,
- 위치: (document.getElementById('storage-위치') as HTMLInputElement).value,
- 모델명: (document.getElementById('storage-모델명') as HTMLInputElement).value,
- 용량: (document.getElementById('storage-용량') as HTMLInputElement).value,
- 담당자_정: (document.getElementById('storage-담당자_정') as HTMLInputElement).value,
- IP주소: (document.getElementById('storage-IP주소') as HTMLInputElement).value,
- 구매일: (document.getElementById('storage-구매일') as HTMLInputElement).value,
- 금액: (document.getElementById('storage-금액') as HTMLInputElement).value,
- 관리자: '', MACaddress: '', HW사양: '', OS: '', 납품업체: '', 품의서명: ''
- };
-
- if (id) {
- const idx = state.masterData.hw.findIndex(a => a.id === id);
- if(idx !== -1) state.masterData.hw[idx] = newAsset;
- } else {
- state.masterData.hw.push(newAsset);
- }
-
- closeModals();
- renderContent();
- });
-
- btnDeleteStorage?.addEventListener('click', (e) => {
- e.preventDefault();
- const id = (document.getElementById('storage-asset-id') as HTMLInputElement).value;
- if (confirm('삭제하시겠습니까?')) {
- state.masterData.hw = state.masterData.hw.filter(a => a.id !== id);
- closeModals();
- renderContent();
- }
- });
-}
-
-export function openStorageModal(asset?: HardwareAsset) {
- currentAsset = asset || null;
- const storageForm = document.getElementById('storage-asset-form') as HTMLFormElement;
- const deleteBtn = document.getElementById('btn-delete-storage-asset')!;
-
- openModal('storage-asset-modal');
- storageForm.reset();
-
- if (asset) {
- document.getElementById('storage-modal-title')!.textContent = '스토리지 상세 정보 수정';
- deleteBtn.style.display = 'block';
- fillFormData(asset);
- setEditMode(false);
- } else {
- document.getElementById('storage-modal-title')!.textContent = '신규 스토리지 자산 추가';
- deleteBtn.style.display = 'none';
- (document.getElementById('storage-asset-id') as HTMLInputElement).value = '';
- setEditMode(true);
- }
-}
diff --git a/backup_refactor/src/components/Navigation.ts b/backup_refactor/src/components/Navigation.ts
deleted file mode 100644
index 8ed0688..0000000
--- a/backup_refactor/src/components/Navigation.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { state } from '../core/state';
-
-const MENU_CONFIG = {
- hw: {
- label: '하드웨어',
- tabs: ['대시보드', '개인PC', '서버', '스토리지', '전산비품']
- },
- sw: {
- label: '소프트웨어',
- tabs: ['대시보드', '구독SW', '영구SW']
- },
- ops: {
- label: '운영 서비스',
- tabs: ['대시보드', '서비스현황', '백업관리', '보안점검']
- }
-};
-
-export function renderNavigation(onTabChange: (tab: string) => void) {
- const navContainer = document.getElementById('main-nav')!;
- const btnAddAsset = document.getElementById('btn-add-asset') as HTMLButtonElement;
-
- const render = () => {
- navContainer.innerHTML = '';
-
- (Object.keys(MENU_CONFIG) as Array).forEach(catKey => {
- const config = MENU_CONFIG[catKey];
- const isActive = state.activeCategory === catKey;
-
- const group = document.createElement('div');
- group.className = `nav-group ${isActive ? 'active is-showing-shelf' : ''}`;
-
- // 메인 카테고리 트리거
- const trigger = document.createElement('div');
- trigger.className = 'gnb-trigger';
- trigger.textContent = config.label;
-
- trigger.addEventListener('click', () => {
- if (state.activeCategory !== catKey) {
- state.activeCategory = catKey;
- state.activeSubTab = '대시보드';
- if (btnAddAsset) btnAddAsset.classList.add('hidden');
- render();
- onTabChange('대시보드');
- }
- });
- group.appendChild(trigger);
-
- // 하위 탭 선반 (Shelf)
- const shelf = document.createElement('div');
- shelf.className = 'lnb-shelf';
-
- config.tabs.forEach(tab => {
- const item = document.createElement('div');
- item.className = `lnb-item ${isActive && state.activeSubTab === tab ? 'active' : ''}`;
- item.textContent = tab;
-
- item.addEventListener('click', (e) => {
- e.stopPropagation();
- state.activeCategory = catKey;
- state.activeSubTab = tab;
-
- if (btnAddAsset) {
- if (tab === '대시보드') btnAddAsset.classList.add('hidden');
- else btnAddAsset.classList.remove('hidden');
- }
-
- render();
- onTabChange(tab);
- });
- shelf.appendChild(item);
- });
- group.appendChild(shelf);
-
- // 마우스 오버 시 다른 그룹의 선반은 가리고 내 것만 보여주는 스타일은 CSS에서 처리함
- navContainer.appendChild(group);
- });
- };
-
- render();
-}
diff --git a/backup_refactor/src/core/dummyDataGenerator.ts b/backup_refactor/src/core/dummyDataGenerator.ts
deleted file mode 100644
index 55f3b43..0000000
--- a/backup_refactor/src/core/dummyDataGenerator.ts
+++ /dev/null
@@ -1,232 +0,0 @@
-import { MasterAssetData, HardwareAsset, SoftwareAsset, SWUser } from './excelHandler';
-
-const corps = ['한맥', '삼안', '바론'];
-const users = ['홍길동', '김철수', '이영희', '박지훈', '김팀장', '신유진', '윤대웅', '마리아'];
-const depts = ['설계팀', '기술팀', '경영지원팀', '영업팀'];
-
-function rand(arr: any[]) {
- return arr[Math.floor(Math.random() * arr.length)];
-}
-
-function randDate(startYear: number, endYear: number) {
- const y = Math.floor(Math.random() * (endYear - startYear + 1)) + startYear;
- const m = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');
- const d = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0');
- return `${y}-${m}-${d}`;
-}
-
-function randUser() { // 25% 확률로 유휴자산 할당
- return Math.random() < 0.25 ? '' : rand(users);
-}
-
-export function generateDummyData(): MasterAssetData {
- const hw: HardwareAsset[] = [];
- const sw: SoftwareAsset[] = [];
- const swUsers: SWUser[] = [];
-
- // 1. 개인PC 50개
- for (let i = 1; i <= 50; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
- hw.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '개인PC',
- 법인: rand(corps),
- 자산코드: `HM-PC-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: '',
- 위치: `${rand(['본사', '지사'])} ${Math.floor(Math.random()*5)+1}층`,
- 사용자: randUser(),
- CPU: rand(['i5-10400', 'i7-12700', 'Ryzen 5', 'Ryzen 7']),
- GPU: rand(['-', 'GTX 1660', 'RTX 3060', 'RTX 4070']),
- RAM: rand(['16GB', '32GB']),
- SSD1: rand(['256GB', '512GB', '1TB']),
- SSD2: '',
- HDD1: rand(['-', '1TB', '2TB']),
- HDD2: '',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: String(Math.floor(Math.random()*100 + 50) * 10000).replace(/\B(?=(\d{3})+(?!\d))/g, ','),
- 납품업체: rand(['다나와', '컴퓨존', '오피스디포']),
- 품의서명: '',
- 관리자: '', IP주소: '', MACaddress: '', OS: '', HW사양: ''
- });
- }
-
- // 2. 서버 20개
- for (let i = 1; i <= 20; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
- hw.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '서버',
- 법인: rand(corps),
- 자산코드: `HM-SV-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: `웹/DB 서버 #${i}`,
- 용도: rand(['웹 서버', 'DB 서버', '백업 서버', '개발 서버']),
- storage유형: rand(['물리', 'VM']),
- 위치: rand(['IDC 1센터', 'IDC 2센터', '본사 전산실']),
- 관리자: rand(users),
- 담당자_정: rand(users),
- 담당자_부: rand(users),
- IP주소: `192.168.10.${i}`,
- 원격접속: `ssh://192.168.10.${i}:22`,
- MACaddress: '00:11:22:33:44:' + String(i).padStart(2, '0'),
- OS: rand(['Windows Server 2019', 'Ubuntu 22.04 LTS', 'CentOS 7']),
- 모델명: rand(['Dell PowerEdge R740', 'HP ProLiant DL380', 'Lenovo ThinkSystem']),
- CPU: rand(['Xeon Silver 4210', 'Xeon Gold 6248', 'EPYC 7702']),
- RAM: rand(['64GB', '128GB', '256GB']),
- GPU: rand(['-', 'RTX A4000', 'Tesla V100']),
- SSD1: rand(['512GB SSD', '1TB NVMe']),
- SSD2: rand(['-', '1TB SSD', '2TB SSD']),
- HDD1: rand(['-', '4TB HDD', '8TB HDD']),
- 모니터링: rand(['Zabbix', 'Grafana', 'PRTG']),
- 비고: i % 5 === 0 ? '정기 점검 대상' : '-',
- HW사양: 'Xeon 16Core, 64GB RAM',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '5,000,000',
- 납품업체: '서버뱅크',
- 품의서명: ''
- });
- }
-
- // 3. 스토리지 20개
- for (let i = 1; i <= 20; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017; // 2017~2026
- hw.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '스토리지',
- 법인: rand(corps),
- storage유형: rand(['NAS', 'DAS']),
- 자산코드: `HM-ST-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: `백업 스토리지 #${i}`,
- 위치: '전산실',
- 모델명: rand(['Synology DS920+', 'QNAP TS-453D']),
- 용량: rand(['16TB', '32TB', '64TB']),
- 담당자_정: randUser(),
- 담당자_부: rand(users),
- IP주소: `192.168.20.${i}`,
- MACaddress: '',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '1,500,000',
- 납품업체: '스토리지넷',
- 품의서명: '',
- 관리자: '', OS: '', HW사양: ''
- });
- }
-
- // 4. 전산비품 (노트북, 태블릿, 휴대폰 각각 5개씩)
- const equips = [
- { type: '노트북', code: 'NB', name: 'LG 그램 16인치', price: '1,800,000' },
- { type: '태블릿', code: 'TB', name: '아이패드 프로 12.9', price: '1,500,000' },
- { type: '휴대폰', code: 'PH', name: '갤럭시 S24', price: '1,200,000' }
- ];
- equips.forEach((eq) => {
- for (let i = 1; i <= 5; i++) {
- const purchaseYear = Math.floor(Math.random() * 8) + 2019; // 2019~2026
- hw.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '전산비품',
- 법인: rand(corps),
- 비품유형: eq.type,
- 자산코드: `HM-${eq.code}-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: eq.name,
- 위치: rand(['본사', '지사']),
- 관리자: randUser(),
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: eq.price,
- 납품업체: '브랜드 총판',
- 품의서명: '',
- IP주소: '', MACaddress: '', OS: '', HW사양: ''
- });
- }
- });
-
- // 5. 구독형 S/W 40개
- for (let i = 1; i <= 40; i++) {
- const swId = Math.random().toString(36).substring(2, 9);
- const purchaseYear = Math.random() < 0.3 ? 2026 : 2024;
-
- let isExpiring = Math.random() < 0.25;
- let endDt = new Date();
- if (isExpiring) {
- endDt.setDate(endDt.getDate() + Math.floor(Math.random() * 25) + 1); // 1~25일 뒤 만료
- } else {
- endDt.setMonth(endDt.getMonth() + Math.floor(Math.random() * 11) + 2); // 넉넉히 남음
- }
- const endStr = `${endDt.getFullYear()}.${String(endDt.getMonth()+1).padStart(2,'0')}.${String(endDt.getDate()).padStart(2,'0')}`;
-
- sw.push({
- id: swId,
- type: '구독SW',
- 분야: rand(['업무공통', '개발S/W', '디자인', '설계S/W']),
- 법인: rand(corps),
- 부서: rand(depts),
- 제품명: rand(['Adobe CC All Apps', 'Microsoft 365', 'Slack Pro', 'Notion Team']),
- 구매일: `${purchaseYear}-01-01`,
- 구독일: `${purchaseYear}.01.01 ~ ${endStr}`,
- 금액: String(Math.floor(Math.random() * 100 + 10) * 10000).replace(/\B(?=(\d{3})+(?!\d))/g, ','),
- 수량: Math.floor(Math.random() * 5) + 3, // 3~7
- 계정명: `user${i}@hm.com`,
- 납품업체: '총판',
- 비고: '연간구독'
- });
-
- const assignCount = Math.floor(Math.random() * 2) + 1;
- for (let j=0; j {
- let hd = HW_HEADERS;
- let wscols: any[] = [];
-
- if (tab === '개인PC') {
- hd = PC_HEADERS;
- wscols = [{wch:15}, {wch:25}, {wch:15}, {wch:20}, {wch:20}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- } else if (tab === '서버') {
- hd = SERVER_HEADERS;
- wscols = [{wch:15}, {wch:20}, {wch:15}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:30}];
- } else if (tab === '스토리지') {
- hd = STORAGE_HEADERS;
- wscols = [{wch:15}, {wch:15}, {wch:25}, {wch:25}, {wch:20}, {wch:25}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- } else {
- hd = HW_HEADERS;
- wscols = [{wch:15}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:40}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- }
-
- const ws = XLSX.utils.aoa_to_sheet([hd]);
- ws['!cols'] = wscols;
- XLSX.utils.book_append_sheet(wb, ws, tab);
- });
-
- SW_TABS.forEach(tab => {
- let hd = tab === '구독SW' ? SUB_SW_HEADERS : PERM_SW_HEADERS;
- const ws = XLSX.utils.aoa_to_sheet([hd]);
- ws['!cols'] = [{wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:30}, {wch:15}, {wch:20}, {wch:15}, {wch:10}, {wch:20}, {wch:20}, {wch:30}];
- XLSX.utils.book_append_sheet(wb, ws, tab);
- });
-
- const swUserWs = XLSX.utils.aoa_to_sheet([SW_USER_HEADERS]);
- swUserWs['!cols'] = [{wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- XLSX.utils.book_append_sheet(wb, swUserWs, 'SW_사용자');
-
- const historyWs = XLSX.utils.aoa_to_sheet([HISTORY_HEADERS]);
- historyWs['!cols'] = [{wch:15}, {wch:20}, {wch:20}, {wch:50}, {wch:15}];
- XLSX.utils.book_append_sheet(wb, historyWs, 'History');
-
- XLSX.writeFile(wb, 'itam_assets_template.xlsx');
-}
-
-/**
- * 마스터 데이터를 여러 시트로 쪼개서 내보내기
- */
-export function exportToExcel(masterData: MasterAssetData) {
- const wb = XLSX.utils.book_new();
-
- HW_TABS.forEach(tab => {
- const targetAssets = masterData.hw.filter(a => a.type === tab);
- let wsData;
- let colsConfig;
-
- if (tab === '개인PC') {
- wsData = [
- PC_HEADERS,
- ...targetAssets.map(a => [a.법인, a.자산코드, a.사용자, a.위치, a.CPU, a.GPU, a.RAM, a.SSD1, a.SSD2, a.HDD1, a.HDD2, a.구매일, a.금액, a.납품업체, a.품의서명])
- ];
- colsConfig = [{wch:15}, {wch:25}, {wch:15}, {wch:20}, {wch:20}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- } else if (tab === '서버') {
- wsData = [
- SERVER_HEADERS,
- ...targetAssets.map(a => [a.법인, a.자산코드, a.storage유형 || '물리', a.용도 || '', a.위치, a.담당자_정 || '', a.담당자_부 || '', a.IP주소, a.원격접속 || '', a.모델명 || '', a.OS, a.CPU, a.RAM, a.GPU || '', a.SSD1 || '', a.SSD2 || '', a.HDD1 || '', a.모니터링 || '', a.비고 || ''])
- ];
- colsConfig = [{wch:15}, {wch:20}, {wch:15}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:30}];
- } else if (tab === '스토리지') {
- wsData = [
- STORAGE_HEADERS,
- ...targetAssets.map(a => [a.법인, a.storage유형, a.자산코드, a.명칭, a.위치, a.모델명, a.용량, a.담당자_정, a.담당자_부, a.IP주소, a.MACaddress, a.구매일, a.금액, a.납품업체, a.품의서명])
- ];
- colsConfig = [{wch:15}, {wch:15}, {wch:25}, {wch:25}, {wch:20}, {wch:25}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- } else {
- wsData = [
- HW_HEADERS,
- ...targetAssets.map(a => [a.법인, a.자산코드, a.명칭, a.위치, a.관리자, a.IP주소, a.MACaddress, a.HW사양, a.OS, a.구매일, a.금액, a.납품업체, a.품의서명])
- ];
- colsConfig = [{wch:15}, {wch:20}, {wch:25}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:40}, {wch:20}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- }
-
- const ws = XLSX.utils.aoa_to_sheet(wsData);
- ws['!cols'] = colsConfig;
- XLSX.utils.book_append_sheet(wb, ws, tab);
- });
-
- SW_TABS.forEach(tab => {
- const targetAssets = masterData.sw.filter(a => a.type === tab);
- let wsData;
- if (tab === '구독SW') {
- wsData = [
- SUB_SW_HEADERS,
- ...targetAssets.map(a => [a.id, a.분야||'', a.법인, a.부서||'', a.제품명, a.구매일, a.구독일, a.금액, a.수량, a.계정명, a.납품업체, a.비고])
- ];
- } else {
- wsData = [
- PERM_SW_HEADERS,
- ...targetAssets.map(a => [a.id, a.분야||'', a.법인, a.부서||'', a.제품명, a.구매일, a.유지보수여부 ? 'Y' : 'N', a.금액, a.수량, a.계정명, a.납품업체, a.비고])
- ];
- }
- const ws = XLSX.utils.aoa_to_sheet(wsData);
- ws['!cols'] = [{wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:30}, {wch:15}, {wch:20}, {wch:15}, {wch:10}, {wch:20}, {wch:20}, {wch:30}];
- XLSX.utils.book_append_sheet(wb, ws, tab);
- });
-
- const swUserWsData = [
- SW_USER_HEADERS,
- ...masterData.swUsers.map(u => [u.id, u.swId, u.법인, u.부서, u.팀, u.직위, u.이름, u.사용기간, u.신청서명])
- ];
- const swUserWs = XLSX.utils.aoa_to_sheet(swUserWsData);
- swUserWs['!cols'] = [{wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:15}, {wch:20}, {wch:25}];
- XLSX.utils.book_append_sheet(wb, swUserWs, 'SW_사용자');
-
- const historyWsData = [
- HISTORY_HEADERS,
- ...masterData.logs.map(l => [l.id, l.assetId, l.date, l.details, l.user])
- ];
- const historyWs = XLSX.utils.aoa_to_sheet(historyWsData);
- historyWs['!cols'] = [{wch:15}, {wch:20}, {wch:20}, {wch:50}, {wch:15}];
- XLSX.utils.book_append_sheet(wb, historyWs, 'History');
-
- const dateStr = new Date().toISOString().split('T')[0];
- XLSX.writeFile(wb, `itam_assets_master_${dateStr}.xlsx`);
-}
-
-export async function parseExcel(file: File): Promise {
- return new Promise((resolve, reject) => {
- const reader = new FileReader();
- reader.onload = (e) => {
- try {
- const data = e.target?.result;
- const workbook = XLSX.read(data, { type: 'binary' });
- const hwAssets: HardwareAsset[] = [];
- const swAssets: SoftwareAsset[] = [];
- const swUsers: SWUser[] = [];
- const logs: HardwareLog[] = [];
-
- workbook.SheetNames.forEach(sheetName => {
- const worksheet = workbook.Sheets[sheetName];
- const json = XLSX.utils.sheet_to_json(worksheet) as any[];
-
- if (HW_TABS.includes(sheetName)) {
- json.forEach(row => {
- if (sheetName === '개인PC') {
- hwAssets.push({
- id: Math.random().toString(36).substring(2, 9),
- type: sheetName,
- 법인: row['법인'] || '',
- 자산코드: row['자산코드'] || '',
- 명칭: '',
- 위치: row['위치'] || '',
- 사용자: row['사용자'] || '',
- 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '',
- CPU: row['CPU'] || '', GPU: row['GPU'] || '', RAM: row['RAM'] || '',
- SSD1: row['SSD1'] || '', SSD2: row['SSD2'] || '', HDD1: row['HDD1'] || '', HDD2: row['HDD2'] || '',
- 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '',
- 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '',
- });
- } else if (sheetName === '서버') {
- hwAssets.push({
- id: Math.random().toString(36).substring(2, 9),
- type: sheetName,
- 법인: row['법인'] || '',
- 자산코드: row['자산번호'] || row['자산코드'] || '',
- 명칭: row['용도'] || row['명칭'] || '',
- 용도: row['용도'] || '', 위치: row['설치위치'] || row['위치'] || '',
- 관리자: row['담당자(정)'] || '', 담당자_정: row['담당자(정)'] || '', 담당자_부: row['담당자(부)'] || '',
- IP주소: row['IP 주소'] || row['IP주소'] || '', IP2: row['IP2'] || '',
- 원격접속: row['원격접속'] || '', 서버ID: row['서버ID'] || '', 서버PW: row['서버PW'] || '',
- 모델명: row['모델명'] || '', OS: row['OS'] || '',
- CPU: row['CPU'] || '', RAM: row['RAM'] || '', GPU: row['GPU'] || '',
- SSD1: row['Storage1'] || row['SSD1'] || '', SSD2: row['Storage2'] || row['SSD2'] || '', HDD1: row['Storage3'] || row['HDD1'] || '',
- 모니터링: row['모니터링'] || '', 비고: row['비고'] || '', storage유형: row['유형'] || '물리',
- MACaddress: '', HW사양: '', 구매일: '', 금액: '', 납품업체: '', 품의서명: '',
- });
- } else if (sheetName === '스토리지') {
- hwAssets.push({
- id: Math.random().toString(36).substring(2, 9),
- type: sheetName,
- 법인: row['법인'] || '', 자산코드: row['자산코드'] || '', 명칭: row['명칭'] || '', 위치: row['위치'] || '',
- 관리자: '', IP주소: row['IP주소'] || '', MACaddress: row['MAC주소'] || '', HW사양: '', OS: '',
- storage유형: row['유형'] || '', 모델명: row['모델명'] || '', 용량: row['용량'] || '',
- 담당자_정: row['담당자(정)'] || '', 담당자_부: row['담당자(부)'] || '',
- 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '',
- 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '',
- });
- } else {
- hwAssets.push({
- id: Math.random().toString(36).substring(2, 9),
- type: sheetName,
- 법인: row['법인'] || '', 자산코드: row['자산코드'] || '', 명칭: row['명칭'] || '', 위치: row['위치'] || '',
- 관리자: row['관리자'] || '', IP주소: row['IP주소'] || '', MACaddress: row['MACaddress'] || '',
- HW사양: row['HW사양'] || '', OS: row['OS'] || '',
- 구매일: row['구매일'] || '', 금액: row['금액'] ? String(row['금액']) : '',
- 납품업체: row['납품업체'] || '', 품의서명: row['품의서명'] || '',
- });
- }
- });
- }
-
- if (SW_TABS.includes(sheetName)) {
- json.forEach(row => {
- swAssets.push({
- id: row['ID'] ? String(row['ID']) : Math.random().toString(36).substring(2, 9),
- type: sheetName, 분야: row['분야'] || '', 법인: row['법인'] || '', 부서: row['부서'] || '', 제품명: row['제품명'] || '',
- 구매일: row['구매일'] || '', 구독일: row['구독일'] || '', 유지보수여부: row['유지보수여부'] === 'Y' || row['유지보수여부'] === true,
- 금액: row['금액'] ? String(row['금액']) : '', 수량: parseInt(row['수량'] || '1', 10),
- 계정명: row['계정명'] || '', 납품업체: row['납품업체'] || '', 비고: row['비고'] || '',
- });
- });
- }
-
- if (sheetName === 'SW_사용자') {
- json.forEach(row => {
- swUsers.push({
- id: row['id'] ? String(row['id']) : Math.random().toString(36).substring(2, 9),
- swId: row['swId'] ? String(row['swId']) : '', 법인: row['법인'] || '', 부서: row['부서'] || '',
- 팀: row['팀'] || '', 직위: row['직위'] || '', 이름: row['이름'] || '',
- 사용기간: row['사용기간'] || '', 신청서명: row['신청서명'] || '',
- });
- });
- }
-
- if (sheetName === 'History') {
- json.forEach(row => {
- logs.push({
- id: row['id'] ? String(row['id']) : Math.random().toString(36).substring(2, 9),
- assetId: row['assetId'] ? String(row['assetId']) : '',
- date: row['date'] || '', details: row['details'] || '', user: row['user'] || '',
- });
- });
- }
- });
- resolve({ hw: hwAssets, sw: swAssets, swUsers, logs });
- } catch (err) {
- reject(err);
- }
- };
- reader.onerror = (err) => reject(err);
- reader.readAsBinaryString(file);
- });
-}
diff --git a/backup_refactor/src/core/realServerData.ts b/backup_refactor/src/core/realServerData.ts
deleted file mode 100644
index ead448d..0000000
--- a/backup_refactor/src/core/realServerData.ts
+++ /dev/null
@@ -1,1603 +0,0 @@
-export const realServerData = [
- {
- "법인": "한맥",
- "자산코드": "hm-idc-001",
- "storage유형": "서버",
- "용도": "한맥 인트라넷",
- "상세": "",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.70",
- "IP2": "192.168.10.5",
- "원격접속": "원격데스크탑\nRemote Util",
- "서버ID": "administrator\n211.206.127.70",
- "서버PW": "samanerp1!\n1234아이티!",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2016",
- "CPU": "intel xeon silver4110 CPU @2.10GHz 2.10GHZ",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "2.7TB"
- },
- {
- "법인": "한맥",
- "자산코드": "hm-idc-002",
- "storage유형": "서버",
- "용도": "한맥 인트라넷 예비",
- "상세": "단가, 입사자지원 서버 (4/1 장헌산업 이름으로 스마트 건설 용도 구매)",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.78",
- "IP2": "192.168.10.13",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "Hanmac2141!",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2019",
- "CPU": "intel xeon silver4214R CPU @2.40GHz 2.39GHZ",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "2.7TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-001",
- "storage유형": "서버",
- "용도": "삼안 인트라넷",
- "상세": "",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.237",
- "IP2": "erp.samaneng.com",
- "원격접속": "원격데스크탑\nRemote Util",
- "서버ID": "administrator\n118.220.172.237",
- "서버PW": "samanerp1!\n1234아이티!",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2016",
- "CPU": "intel xeon silver4214R CPU @2.40GHz 2.39GHZ",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "3.27TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-002",
- "storage유형": "서버",
- "용도": "삼안 인트라넷 예비",
- "상세": "",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.249",
- "IP2": "",
- "원격접속": "원격데스크탑\nRemote Util",
- "서버ID": "administrator\n678-605-383-130",
- "서버PW": "samanerp1!\n1234아이티!",
- "모델명": "HPE ProLiant DL360 GEN9",
- "OS": "Windows Server 2008 R2",
- "CPU": "Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz 2.40GHz",
- "RAM": "32GB",
- "SSD1": "279GB",
- "SSD2": "2.72TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-003",
- "storage유형": "서버",
- "용도": "SATIS 01",
- "상세": "구 SATIS 서버, 세금계산서 발행(회계)",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.228",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "satissg11707808",
- "모델명": "HPE ProLiant DL380p GEN8",
- "OS": "Windows Server 2008 R2",
- "CPU": "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz",
- "RAM": "20GB",
- "SSD1": "100GB",
- "SSD2": "458GB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-004",
- "storage유형": "서버",
- "용도": "SATIS 02",
- "상세": "SATIS 리뉴얼 버전 (ERP 서버)",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.229",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "satissg11707808",
- "모델명": "HPE ProLiant DL380p GEN8",
- "OS": "Windows Server 2008 R2",
- "CPU": "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz",
- "RAM": "20GB",
- "SSD1": "100GB",
- "SSD2": "458GB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-005",
- "storage유형": "서버",
- "용도": "웹 서버",
- "상세": "남양주 테스트 서버 (도메인 관리 기능 제거 2026.03.11)",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "samanweb.cafe24.com",
- "IP2": "118.220.172.195",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "saman+2013+web",
- "모델명": "HPE ProLiant DL380p GEN8",
- "OS": "Windwos Server 2012",
- "CPU": "Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz 2.40GHz",
- "RAM": "16GB",
- "SSD1": "100GB",
- "SSD2": "230GB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-006",
- "storage유형": "서버",
- "용도": "PQ DB 서버",
- "상세": "",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.231",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "7013ddj10235!",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2019",
- "CPU": "intel xeon silver4210R CPU @2.40GHz 2.39GHZ",
- "RAM": "32GB",
- "SSD1": "278GB",
- "SSD2": "2.18TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-007",
- "storage유형": "서버",
- "용도": "Oracle DB 서버",
- "상세": "",
- "위치": "서관 202번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.225",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "7013ddj10235!",
- "모델명": "HPE ProLiant DL380 GEN9",
- "OS": "Windows Server 2012",
- "CPU": "Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 2.20GHz",
- "RAM": "64GB",
- "SSD1": "558GB",
- "SSD2": "1.09TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-008",
- "storage유형": "서버",
- "용도": "안전관리",
- "상세": "삼안 개발서버2 - AI, SSL, 장헌TBM, 노드",
- "위치": "서관 202번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "1.234.37.171",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "samanerp1!",
- "모델명": "HPE ProLiant DL380 GEN10",
- "OS": "Windwos Server 2022",
- "CPU": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "RAM": "128GB",
- "SSD1": "278GB",
- "SSD2": "3.27TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-idc-009",
- "storage유형": "서버",
- "용도": "가족사 공통메뉴",
- "상세": "삼안 개발서버1 - QNA, 급여명세서",
- "위치": "서관 202번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.233",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "samanerp1!",
- "모델명": "HPE ProLiant DL380 GEN10",
- "OS": "Windwos Server 2022",
- "CPU": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "RAM": "128GB",
- "SSD1": "278GB",
- "SSD2": "3.27TB"
- },
- {
- "법인": "한라",
- "자산코드": "hl-idc-001",
- "storage유형": "서버",
- "용도": "한라 인트라넷",
- "상세": "인트라넷,안전, 운영, MISO 서버로 운영 중(win 2008)",
- "위치": "동관 54번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "1.234.37.143",
- "IP2": "",
- "원격접속": "Remote Util",
- "서버ID": "1.234.37.143",
- "서버PW": "1234dkdlxl!",
- "모델명": "HPE ProLiant DL360 GEN9",
- "OS": "Windows Server 2008 R2",
- "CPU": "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz",
- "RAM": "8GB",
- "SSD1": "299GB",
- "SSD2": "631GB"
- },
- {
- "법인": "한라",
- "자산코드": "hl-idc-002",
- "storage유형": "서버",
- "용도": "안전전산화 서버 (디자인팀 웹)",
- "상세": "인트라넷 서버 다운 시 백업용 대기, (임시) 디자인팀 웹 퍼블리싱 서버",
- "위치": "동관 54번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "1.234.37.144",
- "IP2": "192.168.20.49",
- "원격접속": "Remote Util",
- "서버ID": "1.234.37.144",
- "서버PW": "1234dkdlxl!",
- "모델명": "HPE ProLiant DL360 GEN9",
- "OS": "Windows Server 2012",
- "CPU": "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz",
- "RAM": "8GB",
- "SSD1": "299GB",
- "SSD2": "631GB"
- },
- {
- "법인": "한라",
- "자산코드": "hl-idc-003",
- "storage유형": "서버",
- "용도": "개발서버2",
- "상세": "PTC 연구비로 구매한 예비서버2\n이전 : 하수도자산 소스+프로그램 현재 : 큰길 서비스용 xampp+ PostgreSQL, BEPs",
- "위치": "동관 53번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "192.168.20.171",
- "IP2": "1.234.37.171",
- "원격접속": "Remote Util\n원격데스크탑",
- "서버ID": "1.234.37.171\nadministrator",
- "서버PW": "1234dkdlxl!\nHanmac2141!%",
- "모델명": "HPE ProLiant DL380 Gen10",
- "OS": "Windows Server 2019 Standard",
- "CPU": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "1TB"
- },
- {
- "법인": "장헌",
- "자산코드": "jh-idc-001",
- "storage유형": "서버",
- "용도": "장헌인트라넷",
- "상세": "",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.71",
- "IP2": "192.168.10.6",
- "원격접속": "Remote Util",
- "서버ID": "211.206.127.71",
- "서버PW": "1234dkdlxl!",
- "모델명": "HPE ProLiant DL380 GEN10",
- "OS": "Windows Server 2019",
- "CPU": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "1TB"
- },
- {
- "법인": "장헌",
- "자산코드": "jh-idc-002",
- "storage유형": "서버",
- "용도": "장헌 인트라넷 예비",
- "상세": "",
- "위치": "동관 53번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "1.234.37.170",
- "IP2": "192.168.20.170",
- "원격접속": "Remote Util\n원격데스크탑",
- "서버ID": "1.234.37.170\nAdministrator",
- "서버PW": "1234dkdlxl!\nHanmac2141!",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2019",
- "CPU": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "1TB"
- },
- {
- "법인": "장헌",
- "자산코드": "jh-idc-003",
- "storage유형": "서버",
- "용도": "인트라넷(구)",
- "상세": "현재는 GIT 백업 으로 사용",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.110",
- "IP2": "192.168.10.40",
- "원격접속": "Remote Util\n원격데스크탑",
- "서버ID": "211.206.127.110\nUser",
- "서버PW": "1234dkdlxl!\nHanmac2141!",
- "모델명": "",
- "OS": "Windows Server 2019",
- "CPU": "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "(주)장헌",
- "자산코드": "jh-idc-004",
- "storage유형": "서버",
- "용도": "(주) 장헌 인트라넷",
- "상세": "2025.12.23 (주) 장헌 센터 MDF에서 IDC로 이전 설치",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.76",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "User",
- "서버PW": "Hanmac2141!%",
- "모델명": "",
- "OS": "Windows 10",
- "CPU": "12th Gen Intel(R) Core(TM) i7-12700F",
- "RAM": "32GB",
- "SSD1": "465GB",
- "SSD2": "1.81TB"
- },
- {
- "법인": "PTC",
- "자산코드": "ptc-idc-001",
- "storage유형": "서버",
- "용도": "PTC인트라넷",
- "상세": "구 파일 서버(부서자료 백업용), 2024.05.22 인트라넷서버로 교체",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.72",
- "IP2": "192.168.10.7",
- "원격접속": "Remote Util",
- "서버ID": "211.206.127.72",
- "서버PW": "1234dkdlxl!",
- "모델명": "SYSTEM X3650 M2",
- "OS": "Windows Server 2008 R2",
- "CPU": "Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 2.26GHz",
- "RAM": "16GB",
- "SSD1": "556GB",
- "SSD2": ""
- },
- {
- "법인": "PTC",
- "자산코드": "ptc-idc-002",
- "storage유형": "서버",
- "용도": "예비서버",
- "상세": "PTC 인트라넷 예비서버",
- "위치": "서관 204번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "192.168.10.8",
- "IP2": "",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "1234dkdlxl!",
- "모델명": "HPE ProLiant DL360 GEN10",
- "OS": "Windows Server 2019",
- "CPU": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "RAM": "32GB",
- "SSD1": "278GB",
- "SSD2": "1.09TB"
- },
- {
- "법인": "PTC",
- "자산코드": "ptc-idc-003",
- "storage유형": "서버",
- "용도": "DB 백업 서버",
- "상세": "구 파일 인트라넷, 2024.05.22에 DB 백업 테스트 서버로 변경 (데스크탑)",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.74",
- "IP2": "192.168.10.9",
- "원격접속": "Remote Util",
- "서버ID": "211.206.127.74",
- "서버PW": "1234dkdlxl!",
- "모델명": "",
- "OS": "Window 7",
- "CPU": "Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz 2.13GHz",
- "RAM": "4GB",
- "SSD1": "593GB",
- "SSD2": "1.23TB"
- },
- {
- "법인": "바론",
- "자산코드": "br-idc-001",
- "storage유형": "서버",
- "용도": "인트라넷",
- "상세": "",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "211.206.127.75",
- "IP2": "192.168.10.10",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "Hanmac2141!%",
- "모델명": "HPE ProLiant DL360 GEN10",
- "OS": "Windows Server 2022",
- "CPU": "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "2.18TB"
- },
- {
- "법인": "현타",
- "자산코드": "ht-idc-001",
- "storage유형": "서버",
- "용도": "인트라넷",
- "상세": "",
- "위치": "동관 53번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "1.234.37.172",
- "IP2": "192.168.20.172",
- "원격접속": "원격데스크탑",
- "서버ID": "administrator",
- "서버PW": "Hanmac2141!",
- "모델명": "HPE ProLiant DL380 GEN10",
- "OS": "Windows Server 2019",
- "CPU": "Intel Xeon Silver 4210R CPU @ 2.40GHz 2.39GHz",
- "RAM": "32GB",
- "SSD1": "280GB",
- "SSD2": "1TB"
- },
- {
- "법인": "삼안",
- "자산코드": "sa-das-001",
- "storage유형": "서버",
- "용도": "",
- "상세": "Satis01, Satis02 광케이블 연결 (물리연결)",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "IP2": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "삼안",
- "자산코드": "sa-nas-001",
- "storage유형": "서버",
- "용도": "인트라넷 백업 스토리지",
- "상세": "",
- "위치": "서관 203번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.246",
- "IP2": "118.220.172.246",
- "원격접속": "원격",
- "서버ID": "administrator",
- "서버PW": "sg11707808",
- "모델명": "",
- "OS": "Promiss R Series",
- "CPU": "36TB",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "삼안",
- "자산코드": "sa-nas-002",
- "storage유형": "서버",
- "용도": "성과품 스토리지",
- "상세": "매니지먼트 접속 확인 불가 (콘솔 연결 후 페이지 오픈 필요)",
- "위치": "서관 205번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.248",
- "IP2": "118.220.172.247",
- "원격접속": "원격",
- "서버ID": "administrator\n-",
- "서버PW": "sg11707808\n-",
- "모델명": "",
- "OS": "ENC_3U_16BAY_D // SEAGATE ST2000NM0045",
- "CPU": "23TB",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "삼안",
- "자산코드": "sa-nas-003",
- "storage유형": "서버",
- "용도": "성과품 백업 스토리지",
- "상세": "",
- "위치": "서관 202번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "118.220.172.241",
- "IP2": "118.220.172.240",
- "원격접속": "원격",
- "서버ID": "administrator\nadmin0",
- "서버PW": "saman1!\nRoot1234",
- "모델명": "",
- "OS": "Promiss R Series",
- "CPU": "48TB",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한라",
- "자산코드": "hl-das-001",
- "storage유형": "서버",
- "용도": "",
- "상세": "파일서버 정보 없음(접속 불가)",
- "위치": "동관 54번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "IP2": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한라",
- "자산코드": "hl-das-002",
- "storage유형": "서버",
- "용도": "",
- "상세": "파일서버 정보 없음(접속 불가)",
- "위치": "동관 54번",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "IP2": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "NAS",
- "용도": "GSIM NAS",
- "상세": "팀 내부 자료 저장 , 정사영상 및 지도 데이터 저장 , Gitea 및 Git 내장 NAS",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Synology DS923+",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "NAS",
- "용도": "그래픽스개발팀 데이터 백업 NAS",
- "상세": "그래픽스 개발팀 데이터 백업용 NAS",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Synology DS923+",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "공통 GIT 서버",
- "상세": "개발 소스코드 서버 (구조물 S/W ,그래픽스개발_HMEG.천지인)",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Dell EMC PowerEdge T380",
- "OS": "CentOS Linux 7 (Core)",
- "CPU": "Intel(R) Xeon(R) E-2324G CPU @ 3.10GHz",
- "RAM": "16GB",
- "SSD1": "1TB",
- "SSD2": "1TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "BUILD 서버",
- "상세": "PM 컨버터(PDF) 서버, PDF 및 비디오 썸네일 생성",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10 Pro",
- "CPU": "12th Gen Intel(R) Core(TM) i9-12900K",
- "RAM": "128GB",
- "SSD1": "4TB",
- "SSD2": "10TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "HmEG 테스트 서버",
- "상세": "HmEG 테스트 서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10 Pro",
- "CPU": "Intel(R) Core(TM) i5-10400F @ 2.906 GHz",
- "RAM": "16GB",
- "SSD1": "250GB",
- "SSD2": "1TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "산하 ERP 개발서버",
- "상세": "산하 ERP 개발용 서버(산하 ERP는 클라우드)",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "공간정보 신청",
- "상세": "수치지형도 , 지적도 등 공간정보 자료 제공 서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10",
- "CPU": "Intel(R) Core i5-10400 CPU @ 2.90GHz 2.90GHz",
- "RAM": "16GB",
- "SSD1": "232GB",
- "SSD2": "931GB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "AI 관련",
- "상세": "",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "한종 테스트",
- "상세": "",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "GSIM 언리얼 서버",
- "상세": "오브젝트 스토리지(클라우드)를 NAS에 백업(매주 목), ERP유저정보 업데이트(매일), 언리얼 스트리밍 서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10 Pro",
- "CPU": "Intel(R) Xeon(R) Gold 6136",
- "RAM": "128GB",
- "SSD1": "1TB",
- "SSD2": "8TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "AutoCAD 테스트 서버",
- "상세": "오토캐드 테스트 서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10 Pro",
- "CPU": "AMD Ryzen9 3900X 12-Core Processor",
- "RAM": "32GB",
- "SSD1": "500GB",
- "SSD2": "2TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "GSIM 테스트 서버",
- "상세": "개발 테스트용 일반 PC",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 10 Pro",
- "CPU": "Intel(R) Core(TM) i7-9700KF",
- "RAM": "32GB",
- "SSD1": "512GB",
- "SSD2": "512GB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "공간데이터 서버",
- "상세": "인트라넷 공간정보신청 서비스, 과거 공간데이터(~2022년) 보관 - 추후 공간정보 백업서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "CentOS 7.6.1810 (Core)",
- "CPU": "Intel Xeon Silver 4108 * 2",
- "RAM": "128 GB",
- "SSD1": "512 GB",
- "SSD2": "8 TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "PC",
- "용도": "가평 VM 원격 서버",
- "상세": "",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "GSIM 협업",
- "상세": "삼안 예비서버2 + 한종개발 +한종기존소스 vmware",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL380 Gen10",
- "OS": "Server 2019",
- "CPU": "Intel Xeon(R) Silver 4208 CPU @ 2.10GHz",
- "RAM": "128GB",
- "SSD1": "300GB",
- "SSD2": "1.88TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "스토리지",
- "용도": "GSIM 협업 스토리지",
- "상세": "",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Promiss R Series R3600",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "GSIM META 서버",
- "상세": "PM 백업 서버, 오브젝트 스토리지(온프레미스, 클라우드)API 연결",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2019 Standard",
- "CPU": "Intel(R) Xeon(R) Silver 4208 CPU",
- "RAM": "96GB",
- "SSD1": "300GB",
- "SSD2": "4TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "GSIM 서버",
- "상세": "Basemap 데이터 저장",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Windows Server 2019 Standard",
- "CPU": "Intel(R) Xeon(R) Silver 4214R",
- "RAM": "32GB",
- "SSD1": "300GB",
- "SSD2": "4TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "스토리지",
- "용도": "GSIM 스토리지",
- "상세": "ProjectMaster 오브젝트 스토리지",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Promiss R Series R3600",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "함양-합천 서버",
- "상세": "함양합천서버, GSIM 웹서비스, PM 웹서비스",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL380 Gen10",
- "OS": "Windows Server 2019 Standard",
- "CPU": "",
- "RAM": "",
- "SSD1": "600GB",
- "SSD2": "10TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "HM MapService 2.0 서버",
- "상세": "공간데이터 다운로드 서비스 등",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "172.16.42.127",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL380 Gen10",
- "OS": "Windows Server 2019 Standard",
- "CPU": "Intel Xeon Silver 4208",
- "RAM": "128 GB",
- "SSD1": "1.2 TB",
- "SSD2": "40 TB"
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "스토리지",
- "용도": "HM MapService 2.0 스토리지",
- "상세": "공간데이터 저장용",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "Promiss R Series R3600",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "Gitlab Runner",
- "상세": "GitLab 운영 서버",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "HPE ProLiant DL360 Gen10",
- "OS": "Window Server 2019 Standard",
- "CPU": "Intel(R) Xeon(R) Silver 4208 CPU @ 2.10GHz",
- "RAM": "64GB",
- "SSD1": "1.2 TB",
- "SSD2": ""
- },
- {
- "법인": "기술개발센터",
- "자산코드": "",
- "storage유형": "서버",
- "용도": "전산모사",
- "상세": "EGBIM, ParaView, CFDCore",
- "위치": "마천사무실",
- "담당자_정": "",
- "담당자_부": "",
- "IP주소": "",
- "원격접속": "",
- "서버ID": "",
- "서버PW": "",
- "모델명": "",
- "OS": "Windows 11 Pro",
- "CPU": "13th Gen Intel(R) Core(TM) i9-13900KS (3.20 GHz)",
- "RAM": "128GB",
- "SSD1": "2TB",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "1",
- "storage유형": "NAS",
- "용도": "NAS 2",
- "상세": "한라 기업부설연구소 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.23",
- "모델명": "DS414j",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "2",
- "storage유형": "NAS",
- "용도": "NAS 1",
- "상세": "한라 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.32",
- "모델명": "DS224+",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "3",
- "storage유형": "NAS",
- "용도": "NAS 4",
- "상세": "한라 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.25",
- "모델명": "CS407",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "4",
- "storage유형": "NAS",
- "용도": "NAS 5",
- "상세": "한라 환경플랜트사업부 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.30",
- "모델명": "DS923+",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "5",
- "storage유형": "NAS",
- "용도": "NAS 6",
- "상세": "한라 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.27",
- "모델명": "DS923+",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "6",
- "storage유형": "NAS",
- "용도": "NAS7",
- "상세": "한라 원주바이오 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.20",
- "모델명": "DS414j",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "7",
- "storage유형": "NAS",
- "용도": "총괄기획실 NAS",
- "상세": "총괄기획실 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.10.5",
- "모델명": "DS413j",
- "담당자_정": "-",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "8",
- "storage유형": "NAS",
- "용도": "한맥 NAS 1",
- "상세": "한맥 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.10.3",
- "모델명": "DS416j",
- "담당자_정": "순서 파악 필요",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "9",
- "storage유형": "NAS",
- "용도": "한맥 NAS 2",
- "상세": "한맥 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.10.6",
- "모델명": "DS416j",
- "담당자_정": "순서 파악 필요",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "10",
- "storage유형": "NAS",
- "용도": "한맥 NAS 3",
- "상세": "한맥 공용 NAS",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.10.7",
- "모델명": "DS416j",
- "담당자_정": "순서 파악 필요",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "11",
- "storage유형": "NAS",
- "용도": "NAS 13",
- "상세": "환경플랜트사업",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "172.16.100.3",
- "모델명": "DS218play",
- "담당자_정": "이준하 차장",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "12",
- "storage유형": "PC",
- "용도": "회계",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "조립PC",
- "담당자_정": "찾아야함",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "13",
- "storage유형": "PC",
- "용도": "한맥CAD",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "조립PC",
- "담당자_정": "찾아야함",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "14",
- "storage유형": "서버(타워)",
- "용도": "Ai-Cell-Util",
- "상세": "깃티, 매터모스트 등 70여종",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "HP Z6",
- "담당자_정": "",
- "OS": "Ubuntu 24.04",
- "CPU": "Intel(R) Xeon(R) Gold 6248R",
- "RAM": "64GB",
- "SSD1": "2 TB",
- "SSD2": "8 TB"
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "15",
- "storage유형": "PC",
- "용도": "한라CAD",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "조립PC",
- "담당자_정": "찾아야함",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "16",
- "storage유형": "NAS",
- "용도": "디자인팀1 NAS",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.99",
- "모델명": "DS1522+",
- "담당자_정": "권순호 연구원",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "17",
- "storage유형": "NAS",
- "용도": "디자인팀2 NAS",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "192.168.9.100",
- "모델명": "DS1522+",
- "담당자_정": "권순호 연구원",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "18",
- "storage유형": "서버(미니워크스테이션)",
- "용도": "인사정보 서버",
- "상세": "인사정보 PM",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "172.16.10.187",
- "모델명": "HP Z2 Mini G5 Workstation",
- "담당자_정": "",
- "OS": "Windows 11 Pro",
- "CPU": "intel xeon w-1250p cpu",
- "RAM": "32GB",
- "SSD1": "2 TB",
- "SSD2": "2 TB"
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "19",
- "storage유형": "서버(타워)",
- "용도": "BEPs 서버",
- "상세": "BEPs 개발서버, Outline 협업서비스",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "Dell Precision 3680T",
- "담당자_정": "",
- "OS": "Windows 11 Pro",
- "CPU": "Intel Core i9 14900K (24 Core, 32 Thread)",
- "RAM": "64GB",
- "SSD1": "2 TB",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "20",
- "storage유형": "서버(타워)",
- "용도": "Ai-Cell-A100-1",
- "상세": "OCR, Local LLM 등 30여종",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "조립",
- "담당자_정": "",
- "OS": "Ubuntu 24.04",
- "CPU": "AMD Ryzen Threadripper PRO 7975WX",
- "RAM": "256GB",
- "SSD1": "2 TB",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "21",
- "storage유형": "서버(타워)",
- "용도": "빌드서버",
- "상세": "인스톨 쉴드, 지라",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "",
- "모델명": "Dell EMC PowerEdge T350",
- "담당자_정": "",
- "OS": "Windows Server 2022 Standard",
- "CPU": "Intel(R) Xeon(R) E-2378G CPU @ 2.80GHz 2.81 GHz",
- "RAM": "32GB",
- "SSD1": "1TB",
- "SSD2": "4TB"
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "22",
- "storage유형": "PC\n서버(랙)",
- "용도": "저장소 및 전산모사\n구)스마트건설 서버",
- "상세": "ParaView, CFDCore\n디지털화설문, 검색WIKI 웹서비스",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "172.16.10.213",
- "모델명": "조립PC\nProLiant DL360 Gen10",
- "담당자_정": "",
- "OS": "Windows 10 Pro",
- "CPU": "Intel Core i7-7700 CPU 3.60GHz",
- "RAM": "32GB",
- "SSD1": "500GB",
- "SSD2": "2TB"
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "23",
- "storage유형": "서버(랙)",
- "용도": "IDC 산하ERP서버",
- "상세": "XR 가상화 메인 서버 → IDC 산하ERP서버",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "172.16.10.226",
- "모델명": "ProLiant DL360 Gen10",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "24",
- "storage유형": "스토리지(랙)",
- "용도": "WAS Storage",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "Promise Vess R3600",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "25",
- "storage유형": "서버(랙)",
- "용도": "한맥 백업 서버",
- "상세": "가족사 인트라넷 소스 백업 서버",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "Promise Vess R3600",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "26",
- "storage유형": "서버(랙)",
- "용도": "한라 백업 서버",
- "상세": "한라 웹 소스 및 Miso DB 백업 서버",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "SuperMicro IR5019P-Series",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "27",
- "storage유형": "NAS",
- "용도": "기술개발센터 NAS",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "RS822+",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "28",
- "storage유형": "NAS",
- "용도": "-",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "RS815+",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "29",
- "storage유형": "스토리지(랙)",
- "용도": "Backup Storage",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "Promise Vess",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "30",
- "storage유형": "스토리지(랙)",
- "용도": "-",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "Promise Vess R3600",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "31",
- "storage유형": "서버(랙)",
- "용도": "XR WAS Server",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "ProLiant DL360 Gen10",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- },
- {
- "법인": "한맥빌딩",
- "자산코드": "32",
- "storage유형": "서버(랙)",
- "용도": "WAS Storage",
- "상세": "",
- "위치": "한맥빌딩(MDF 실)",
- "IP주소": "-",
- "모델명": "Promise Vess R3600",
- "담당자_정": "",
- "OS": "",
- "CPU": "",
- "RAM": "",
- "SSD1": "",
- "SSD2": ""
- }
-];
diff --git a/backup_refactor/src/core/state.ts b/backup_refactor/src/core/state.ts
deleted file mode 100644
index 96bc1ac..0000000
--- a/backup_refactor/src/core/state.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { MasterAssetData, HardwareAsset } from './excelHandler';
-import { generateDummyData } from './dummyDataGenerator';
-import { realServerData } from './realServerData';
-
-// --- State Definitions ---
-export interface AppState {
- masterData: MasterAssetData;
- activeCategory: 'hw' | 'sw' | 'ops';
- activeSubTab: string;
- activeCharts: any[];
-}
-
-const dummy = generateDummyData();
-// 서버 데이터만 실제 데이터로 교체
-const mergedHw: HardwareAsset[] = [
- ...dummy.hw.filter(a => a.type !== '서버'),
- ...realServerData.map(s => ({
- id: s.id || Math.random().toString(36).substring(2, 9),
- type: '서버',
- 법인: s.법인,
- 자산코드: s.자산코드,
- 명칭: s.용도 || '',
- 위치: s.위치,
- 관리자: s.담당자_정 || '홍길동',
- 담당자_정: s.담당자_정 || '홍길동',
- 담당자_부: s.담당자_부 || '김철수',
- IP주소: s.IP주소,
- IP2: s.IP2 || '',
- MACaddress: s.MACaddress || '',
- HW사양: s.HW사양 || '',
- OS: s.OS,
- CPU: s.CPU,
- RAM: s.RAM,
- SSD1: s.SSD1,
- SSD2: s.SSD2,
- HDD1: s.HDD1,
- storage유형: s.storage유형,
- 모델명: s.모델명,
- 구매일: s.구매일 || '',
- 금액: s.금액 || '',
- 납품업체: s.납품업체 || '',
- 품의서명: s.품의서명 || '',
- 용도: s.용도,
- 상세: s.상세,
- 원격접속: s.원격접속 || '',
- 서버ID: s.서버ID || '',
- 서버PW: s.서버PW || '',
- 모니터링: s.모니터링 || '',
- 비고: s.비고 || ''
- }))
-];
-
-// --- Initial State ---
-export const state: AppState = {
- masterData: {
- ...dummy,
- hw: mergedHw, // 기본적으로 하드코딩된 데이터를 가지고 시작
- logs: []
- },
- activeCategory: 'hw',
- activeSubTab: '대시보드',
- activeCharts: []
-};
-
-/**
- * DB에서 데이터 로드
- */
-export async function loadMasterDataFromDB() {
- try {
- const response = await fetch('http://localhost:3000/api/hw');
- if (!response.ok) throw new Error('DB 로드 실패');
- const data = await response.json();
- if (data && data.length > 0) {
- state.masterData.hw = data;
- console.log('✅ DB 데이터 로드 완료');
- return true;
- }
- } catch (err) {
- console.warn('⚠️ 백엔드 서버 연결 실패. 로컬 데이터를 유지합니다.');
- }
- return false;
-}
-
-// --- State Helpers ---
-export function updateState(newState: Partial) {
- Object.assign(state, newState);
-}
diff --git a/backup_refactor/src/main.ts b/backup_refactor/src/main.ts
deleted file mode 100644
index c575bff..0000000
--- a/backup_refactor/src/main.ts
+++ /dev/null
@@ -1,108 +0,0 @@
-import { state, loadMasterDataFromDB } from './core/state';
-import { renderNavigation } from './components/Navigation';
-import { renderDashboard } from './views/DashboardView';
-import { renderTable } from './views/AssetTableView';
-import { downloadTemplate, exportToExcel, parseExcel, HardwareAsset } from './core/excelHandler';
-import { initBaseModal } from './components/Modal/BaseModal';
-import { initPcModal } from './components/Modal/PCModal';
-import { initHwModal, openHwModal } from './components/Modal/HWModal';
-import { initStorageModal } from './components/Modal/StorageModal';
-import { initSwModal } from './components/Modal/SWModal';
-import { initSwUserModal } from './components/Modal/SWUserModal';
-import { initDashboardDetailModal } from './components/Modal/DashboardDetailModal';
-import { createIcons, Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw } from 'lucide';
-
-// --- DB 저장을 위한 헬퍼 함수 ---
-async function saveAllHwToDB(assets: HardwareAsset[]) {
- try {
- const response = await fetch('http://localhost:3000/api/hw/batch', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify(assets)
- });
- if (!response.ok) throw new Error('DB 저장 실패');
- console.log('✅ DB 저장 완료');
- } catch (err) {
- console.error('❌ DB 저장 실패:', err);
- }
-}
-
-// --- App Initialization ---
-function initApp() {
- console.log('🚀 ITAM System Initializing...');
- const mainContent = document.getElementById('main-content')!;
- if (!mainContent) return;
-
- // 1. 전역 모달 및 내비게이션 초기화
- const { closeAllModals } = initBaseModal();
-
- try {
- renderNavigation((tab) => {
- if (tab === '대시보드') {
- renderDashboard(mainContent);
- } else {
- renderTable(mainContent);
- }
- });
-
- initPcModal(() => {
- saveAllHwToDB(state.masterData.hw);
- renderTable(mainContent);
- }, closeAllModals);
-
- initHwModal();
-
- initStorageModal(() => {
- saveAllHwToDB(state.masterData.hw);
- renderTable(mainContent);
- }, closeAllModals);
-
- initSwModal(() => renderTable(mainContent), closeAllModals);
- initSwUserModal(() => renderTable(mainContent), closeAllModals);
- initDashboardDetailModal();
- } catch (e) {
- console.error('❌ Initialization failed:', e);
- }
-
- // 2. 초기 렌더링
- renderDashboard(mainContent);
-
- // 3. 비동기 데이터 로드
- loadMasterDataFromDB().then((success) => {
- if (success) {
- if (state.activeSubTab === '대시보드') renderDashboard(mainContent);
- else renderTable(mainContent);
- }
- });
-
- // 4. 이벤트 바인딩
- document.getElementById('btn-download-template')?.addEventListener('click', () => downloadTemplate());
- document.getElementById('btn-export-excel')?.addEventListener('click', () => exportToExcel(state.masterData));
-
- const uploadInput = document.getElementById('excel-upload') as HTMLInputElement;
- uploadInput?.addEventListener('change', async (e) => {
- const file = (e.target as HTMLInputElement).files?.[0];
- if (file) {
- const data = await parseExcel(file);
- state.masterData = data;
- await saveAllHwToDB(data.hw);
- renderTable(mainContent);
- }
- });
-
- document.getElementById('btn-add-asset')?.addEventListener('click', () => {
- if (state.activeSubTab === '서버' || state.activeSubTab === '전산비품' || state.activeSubTab === '스토리지') {
- openHwModal({
- id: Math.random().toString(36).substring(2, 9),
- type: state.activeSubTab,
- 법인: '한맥', 자산코드: '', 명칭: '', 위치: '', 관리자: '', IP주소: '', MACaddress: '', HW사양: '', OS: '', 납품업체: '', 품의서명: ''
- } as any);
- }
- });
-
- createIcons({
- icons: { Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, History, RefreshCcw }
- });
-}
-
-document.addEventListener('DOMContentLoaded', initApp);
diff --git a/backup_refactor/src/server_data.json b/backup_refactor/src/server_data.json
deleted file mode 100644
index d193679..0000000
--- a/backup_refactor/src/server_data.json
+++ /dev/null
@@ -1,13 +0,0 @@
-[
- {
- "법인": "(주)회사1",
- "자산코드": "ASSET-100",
- "명칭": "서버 모델A",
- "위치": "본사 1층",
- "관리자": "관리자A",
- "IP주소": "192.168.0.1",
- "MACaddress": "00:00:00:00:00:01",
- "HW사양": "Core i7, 16GB RAM",
- "OS": "Windows 10"
- }
-]
\ No newline at end of file
diff --git a/backup_refactor/src/styles/common.css b/backup_refactor/src/styles/common.css
deleted file mode 100644
index fa5cae3..0000000
--- a/backup_refactor/src/styles/common.css
+++ /dev/null
@@ -1,262 +0,0 @@
-:root {
- --primary-color: #1E5149;
- --primary-hover: #153c36;
- --primary-light: #edf2f1;
- --text-main: #111827;
- --text-muted: #6B7280;
- --border-color: #E5E7EB;
- --bg-color: #F9FAFB;
- --white: #FFFFFF;
- --danger: #dc2626;
-
- --header-height: 52px;
-}
-
-* {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
-}
-
-body {
- font-family: 'Pretendard Variable', Pretendard, sans-serif;
- color: var(--text-main);
- background-color: var(--bg-color);
- line-height: 1.5;
- letter-spacing: -0.02em;
- font-size: 14px;
- overflow: hidden;
-}
-
-.app-layout {
- display: flex;
- flex-direction: column;
- height: 100vh;
- width: 100%;
-}
-
-/* --- Integrated Header Style --- */
-.main-header {
- background-color: var(--white);
- border-bottom: 1px solid var(--border-color);
- z-index: 100;
- height: var(--header-height);
-}
-
-.header-container {
- height: 100%;
- display: flex;
- align-items: center;
- padding: 0 1.5rem;
- gap: 1.5rem;
-}
-
-.brand h1 {
- font-size: 1.2rem;
- font-weight: 800;
- color: var(--text-main);
- white-space: nowrap;
- margin-right: 1rem;
-}
-.brand h1 span { color: var(--primary-color); }
-
-/* --- Integrated Nav --- */
-.integrated-nav {
- flex: 1;
- height: 100%;
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.nav-group {
- display: flex;
- align-items: center;
- height: 100%;
-}
-
-.gnb-trigger {
- font-size: 14px;
- font-weight: 700;
- color: var(--text-main);
- padding: 0 1rem;
- cursor: pointer;
- height: 100%;
- display: flex;
- align-items: center;
- white-space: nowrap;
-}
-
-.lnb-shelf {
- display: none;
- align-items: center;
- gap: 0.25rem;
- padding: 0 0.75rem;
- height: 60%;
- border-left: 1px solid var(--border-color);
- margin-left: 0.25rem;
- animation: fadeIn 0.2s ease-out;
-}
-
-.nav-group:hover .lnb-shelf,
-.nav-group.is-showing-shelf .lnb-shelf {
- display: flex;
-}
-
-.lnb-item {
- font-size: 13px;
- font-weight: 500;
- color: var(--text-muted);
- cursor: pointer;
- padding: 0.2rem 0.6rem;
- border-radius: 4px;
- white-space: nowrap;
-}
-
-.lnb-item.active {
- color: var(--primary-color);
- background-color: var(--primary-light);
- font-weight: 700;
-}
-
-@keyframes fadeIn {
- from { opacity: 0; transform: translateX(-5px); }
- to { opacity: 1; transform: translateX(0); }
-}
-
-/* --- Header Actions --- */
-.header-actions { display: flex; gap: 0.3rem; align-items: center; }
-
-.btn {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- gap: 0.35rem;
- padding: 0 0.8rem;
- font-size: 12px;
- font-weight: 600;
- border-radius: 4px;
- cursor: pointer;
- height: 28px;
- line-height: 1;
-}
-
-.btn i, .btn svg { width: 12px !important; height: 12px !important; }
-
-.btn-primary { background-color: var(--primary-color); color: var(--white); border: 1px solid var(--primary-color); }
-.btn-outline { background-color: transparent; color: var(--text-muted); border: 1px solid var(--border-color); }
-
-/* --- Content Area & Standardized Layout --- */
-.content-area {
- flex: 1;
- padding: 2rem; /* benchmark: 좌, 우, 하단 2rem 공백 통일 */
- overflow-y: auto;
- background-color: var(--bg-color);
-}
-
-.view-container {
- width: 100%;
- display: flex;
- flex-direction: column;
- gap: 1.5rem;
-}
-
-/* --- Search Filter Bar --- */
-.search-bar {
- display: flex;
- flex-wrap: wrap;
- gap: 1.25rem;
- background-color: var(--white);
- padding: 1.5rem;
- border: 1px solid var(--border-color);
- border-radius: 8px;
- align-items: flex-end;
-}
-
-.search-item { display: flex; flex-direction: column; gap: 0.4rem; }
-.search-item.flex-1 { flex: 1; }
-.search-item label { font-size: 11px; font-weight: 800; color: var(--text-muted); }
-.search-item input,
-.search-item select {
- height: 32px;
- padding: 0 2.5rem 0 0.75rem; /* Increased right padding for arrow */
- border: 1px solid var(--border-color);
- border-radius: 3px;
- font-size: 13px;
- outline: none;
- appearance: none; /* Modern arrow styling */
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236B7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-9'/%3E%3C/svg%3E");
- background-repeat: no-repeat;
- background-position: right 0.75rem center;
-}
-
-.search-item input {
- padding-right: 0.75rem;
-}
-
-.btn-reset {
- height: 32px !important;
- padding: 0 0.8rem !important;
- font-size: 12px !important;
- display: inline-flex !important;
- align-items: center !important;
- gap: 0.35rem !important;
- border-radius: 4px !important;
-}
-
-/* --- Table (Box-less Design) --- */
-.table-container {
- background-color: var(--white);
- border-top: 1px solid var(--border-color);
- border-bottom: 1px solid var(--border-color);
- border-left: none;
- border-right: none;
- overflow: auto;
- max-height: calc(100vh - 240px); /* Adjusting for bottom spacing */
-}
-
-table { width: 100%; border-collapse: collapse; }
-th, td {
- padding: 1rem 1.5rem;
- border-bottom: 1px solid var(--border-color);
- text-align: left;
- white-space: nowrap; /* Force single line for all info */
-}
-th {
- background-color: #FAFAFA;
- font-weight: 700;
- color: var(--text-muted);
- font-size: 12px;
- position: sticky;
- top: 0;
- z-index: 10;
- box-shadow: inset 0 -1px 0 var(--border-color);
- text-transform: uppercase;
-}
-td { font-size: 14px; }
-tbody tr:hover { background-color: #F9FAFB; }
-
-/* --- Dashboard Style --- */
-.dashboard-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.5rem; margin-bottom: 2rem; }
-.stat-card { background-color: var(--white); padding: 1.5rem; border: 1px solid var(--border-color); border-radius: 8px; }
-.stat-card .value { font-size: 2.2rem; font-weight: 800; color: var(--primary-color); margin-top: 0.5rem; }
-.dashboard-layout-2col { display: grid; grid-template-columns: repeat(2, 1fr); gap: 1.5rem; }
-.dashboard-card {
- background-color: var(--white);
- border: 1px solid var(--border-color);
- border-radius: 8px;
- padding: 1.5rem;
- display: flex;
- flex-direction: column;
- min-height: 360px; /* Increased height for better chart view */
-}
-.dashboard-card canvas {
- flex: 1;
- width: 100% !important;
- max-height: 280px;
-}
-.dashboard-section-title { padding: 0 0 1rem 0; font-size: 1.1rem; font-weight: 700; color: var(--text-main); }
-
-.hidden { display: none !important; }
-.text-nowrap { white-space: nowrap; }
-.btn-sm { padding: 0.25rem 0.5rem; font-size: 11px; height: 24px; }
diff --git a/backup_refactor/src/styles/modal.css b/backup_refactor/src/styles/modal.css
deleted file mode 100644
index 4f6b79c..0000000
--- a/backup_refactor/src/styles/modal.css
+++ /dev/null
@@ -1,267 +0,0 @@
-/* Modal */
-.modal-overlay {
- position: fixed;
- top: 0; left: 0; right: 0; bottom: 0;
- background-color: rgba(0, 0, 0, 0.4);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 1000;
- opacity: 0;
- visibility: hidden;
- transition: opacity 0.2s ease, visibility 0.2s ease;
-}
-
-.modal-overlay:not(.hidden) { opacity: 1; visibility: visible; }
-
-.modal-content {
- background-color: var(--white);
- width: 100%;
- max-width: 600px;
- max-height: 90vh;
- border-radius: 8px;
- overflow: hidden;
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.1);
- transform: translateY(20px);
- transition: transform 0.2s ease;
- display: flex;
- flex-direction: column;
-}
-
-.modal-overlay:not(.hidden) .modal-content { transform: translateY(0); }
-
-.modal-header {
- background-color: var(--primary-color);
- color: var(--white);
- padding: 1rem 1.5rem;
- display: flex;
- justify-content: space-between;
- align-items: center;
- flex-shrink: 0;
-}
-
-.modal-header h2 {
- font-size: 1.125rem;
- font-weight: 600;
- letter-spacing: -0.02em;
-}
-
-.modal-header .btn-icon {
- color: #FFFFFF !important;
- cursor: pointer;
- background: none !important;
- border: none !important;
-}
-
-.modal-header .btn-icon i,
-.modal-header .btn-icon svg {
- width: 20px !important; /* Original natural size */
- height: 20px !important;
- stroke: #FFFFFF !important;
-}
-
-.modal-header .btn-icon:hover {
- background: none !important;
-}
-
-.modal-body {
- padding: 1.5rem;
- overflow-y: auto;
- flex: 1;
-}
-
-.grid-form {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 1.25rem;
-}
-
-.form-group {
- display: flex;
- flex-direction: column;
- gap: 0.375rem;
-}
-
-.form-group.full-width {
- grid-column: span 2;
-}
-
-/* Section Title for Grouping */
-.form-section-title {
- grid-column: span 2;
- font-size: 0.875rem;
- font-weight: 700;
- color: var(--primary-color);
- padding: 1.5rem 0 0.5rem 0; /* 패딩 조정 */
- border-bottom: 1px solid var(--border-color);
- margin-bottom: 0.5rem;
- display: flex;
- align-items: center;
-}
-
-/* Modal Readonly/Edit Mode Interaction */
-.grid-form.is-view-mode input,
-.grid-form.is-view-mode select,
-.grid-form.is-view-mode textarea {
- border-color: transparent !important;
- background-color: transparent !important;
- padding-left: 0;
- padding-right: 0;
- pointer-events: none;
- color: var(--text-main);
- font-weight: 500;
-}
-
-.grid-form.is-edit-mode input,
-.grid-form.is-edit-mode select,
-.grid-form.is-edit-mode textarea {
- color: #FF3D00; /* 수정 시 글자색 변경 */
- border: 1px solid var(--border-color);
-}
-
-.grid-form.is-edit-mode input:focus,
-.grid-form.is-edit-mode select:focus,
-.grid-form.is-edit-mode textarea:focus {
- border-color: #FF3D00;
- box-shadow: 0 0 0 2px rgba(255, 61, 0, 0.1);
-}
-
-.form-section-title:first-child {
- padding-top: 0.5rem;
-}
-
-.form-group label {
- font-size: 0.8125rem;
- font-weight: 600;
- color: var(--text-muted);
-}
-
-.form-group input,
-.form-group select,
-.form-group textarea {
- padding: 0.625rem;
- border: 1px solid var(--border-color);
- border-radius: 4px;
- font-family: inherit;
- font-size: 0.875rem;
- outline: none;
- transition: all 0.2s;
- background-color: var(--white);
-}
-
-.form-group input:focus,
-.form-group select:focus,
-.form-group textarea:focus {
- border-color: var(--primary-color);
- box-shadow: 0 0 0 2px rgba(30, 81, 73, 0.1);
-}
-
-.modal-footer {
- padding: 1rem 1.5rem;
- border-top: 1px solid var(--border-color);
- display: flex;
- justify-content: space-between;
- align-items: center;
- background-color: #FAFAFA;
- flex-shrink: 0;
-}
-
-.footer-actions {
- display: flex;
- gap: 0.5rem;
-}
-
-/* Wide Modal for History/Detail */
-.modal-content.wide {
- max-width: 950px;
-}
-
-.modal-body-split {
- display: flex;
- gap: 2rem;
- min-height: 480px;
-}
-
-.modal-form-area {
- flex: 1.2;
-}
-
-.modal-history-area {
- flex: 0.8;
- border-left: 1px solid var(--border-color);
- padding-left: 1.5rem;
- display: flex;
- flex-direction: column;
-}
-
-.history-header {
- margin-bottom: 1rem;
-}
-
-.history-header h3 {
- font-size: 0.9375rem;
- font-weight: 600;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- color: var(--text-main);
-}
-
-.history-timeline {
- flex: 1;
- overflow-y: auto;
- max-height: 500px;
- padding-right: 0.5rem;
-}
-
-.history-item {
- position: relative;
- padding-left: 1.25rem;
- padding-bottom: 1.5rem;
- border-left: 2px solid var(--border-color);
-}
-
-.history-item::before {
- content: '';
- position: absolute;
- left: -7px;
- top: 0;
- width: 12px;
- height: 12px;
- border-radius: 50%;
- background-color: var(--white);
- border: 2px solid var(--primary-color);
-}
-
-.history-item:last-child {
- border-left: 2px solid transparent;
-}
-
-.history-date {
- font-size: 0.75rem;
- color: var(--text-muted);
- font-weight: 500;
- margin-bottom: 0.25rem;
-}
-
-.history-user {
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--primary-color);
- margin-bottom: 0.25rem;
-}
-
-.history-details {
- font-size: 0.8125rem;
- color: var(--text-main);
- line-height: 1.4;
- white-space: pre-wrap;
- word-break: break-all;
-}
-
-.empty-history {
- padding: 2rem 0;
- text-align: center;
- color: var(--text-muted);
- font-size: 0.8125rem;
-}
diff --git a/backup_refactor/src/views/AssetTableView.ts b/backup_refactor/src/views/AssetTableView.ts
deleted file mode 100644
index af4460d..0000000
--- a/backup_refactor/src/views/AssetTableView.ts
+++ /dev/null
@@ -1,208 +0,0 @@
-import { state } from '../core/state';
-import { createIcons, Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2, RefreshCcw } from 'lucide';
-import { openPcModal } from '../components/Modal/PCModal';
-import { openHwModal } from '../components/Modal/HWModal';
-import { openStorageModal } from '../components/Modal/StorageModal';
-import { openSwModal } from '../components/Modal/SWModal';
-import { openSwUserModal } from '../components/Modal/SWUserModal';
-
-/**
- * 자산 목록 테이블 렌더링 메인 함수
- */
-export function renderTable(mainContent: HTMLElement) {
- mainContent.innerHTML = '';
- const container = document.createElement('div');
- container.className = 'view-container';
- const table = document.createElement('table');
-
- if (state.activeCategory === 'hw') {
- renderHwTable(table, container, mainContent);
- } else {
- renderSwTable(table, container, mainContent);
- }
-
- createIcons({
- icons: { Download, Upload, FileSpreadsheet, Plus, X, LayoutDashboard, Monitor, Server, Database, Laptop, CalendarClock, Key, Cpu, Layers, Users, Paperclip, Edit2 }
- });
-}
-
-function renderHwTable(table: HTMLTableElement, container: HTMLElement, mainContent: HTMLElement) {
- const fullList = state.masterData.hw.filter(a => a.type === state.activeSubTab);
- container.innerHTML = '';
-
- // --- 1. Search Bar (Unified Style) ---
- const filterBar = document.createElement('div');
- filterBar.className = 'search-bar';
-
- const corps = Array.from(new Set(fullList.map(a => a.법인))).filter(Boolean).sort();
- const orgUnits = Array.from(new Set(fullList.map(a => a.현사용조직))).filter(Boolean).sort();
-
- filterBar.innerHTML = `
-
-
-
-
-
-
-
-
- ${state.activeSubTab === '서버' ? `
-
-
-
-
` : ''}
-
- `;
- container.appendChild(filterBar);
-
- // --- 2. Table Structure (Unified Style) ---
- const tableWrapper = document.createElement('div');
- tableWrapper.className = 'table-container';
-
- if (state.activeSubTab === '개인PC') {
- table.innerHTML = `| No | 법인 | 자산코드 | 사용자 | 위치 | CPU | RAM | Storage | 구매일 | 금액 | 품의서 | 관리 |
`;
- } else if (state.activeSubTab === '서버') {
- table.innerHTML = `| No | 법인 | 현 사용조직 | 자산번호 | 용도 | 상세 | 설치위치 | 담당자 | IP주소 | 모델명 | OS | CPU/RAM | Storage | 관리 |
`;
- } else if (state.activeSubTab === '스토리지') {
- table.innerHTML = `| No | 법인 | 유형 | 자산코드 | 명칭 | 위치 | 모델명 | 용량 | IP주소 | 구매일 | 관리 |
`;
- } else {
- table.innerHTML = `| No | 법인 | 자산코드 | 명칭 | 위치 | 관리자 | 구매일 | 금액 | 관리 |
`;
- }
-
- tableWrapper.appendChild(table);
- container.appendChild(tableWrapper);
- mainContent.appendChild(container);
-
- const tbody = document.getElementById('dynamic-tbody')!;
-
- const updateTable = () => {
- const keyword = (document.getElementById('filter-keyword') as HTMLInputElement).value.toLowerCase().trim();
- const corp = (document.getElementById('filter-corp') as HTMLSelectElement).value;
- const orgUnit = (document.getElementById('filter-org-unit') as HTMLSelectElement)?.value || '';
-
- const filtered = fullList.filter(asset => {
- const matchKeyword = !keyword || String(asset.자산코드||'').toLowerCase().includes(keyword) || String(asset.현사용조직||'').toLowerCase().includes(keyword) || String(asset.모델명||'').toLowerCase().includes(keyword);
- const matchCorp = !corp || asset.법인 === corp;
- const matchOrg = !orgUnit || asset.현사용조직 === orgUnit;
- return matchKeyword && matchCorp && matchOrg;
- });
-
- tbody.innerHTML = '';
- if (filtered.length === 0) {
- const colSpan = table.querySelectorAll('th').length;
- tbody.innerHTML = `| 검색 결과가 없습니다. |
`;
- return;
- }
-
- filtered.forEach((asset, idx) => {
- const tr = document.createElement('tr');
- tr.style.cursor = 'pointer';
- const formatInline = (v: any) => String(v || '').replace(/\n/g, ' / ').trim();
-
- if (state.activeSubTab === '개인PC') {
- const storage = [asset.SSD1, asset.SSD2, asset.HDD1].filter(v => v).join(' / ');
- tr.innerHTML = `${idx+1} | ${asset.법인} | ${asset.자산코드} | ${asset.사용자||''} | ${asset.위치||''} | ${asset.CPU||''} | ${asset.RAM||''} | ${formatInline(storage)} | ${asset.구매일||''} | ${asset.금액||''} | ${asset.품의서명 ? '' : '-'} | | `;
- tr.addEventListener('click', (e) => { if (!(e.target as HTMLElement).closest('button')) openPcModal(asset); });
- } else if (state.activeSubTab === '서버') {
- const cpuRam = [asset.CPU, asset.RAM].filter(v => v).join(' / ');
- const storage = [asset.SSD1, asset.SSD2].filter(v => v).join(' / ');
- const ipInfo = [asset.IP주소, asset.IP2].filter(v => v).join(' / ');
- tr.innerHTML = `${idx+1} | ${asset.법인} | ${asset.현사용조직||''} | ${asset.자산코드} | ${formatInline(asset.용도)} | ${formatInline(asset.상세)} | ${formatInline(asset.위치)} | ${asset.담당자_정||''} | ${formatInline(ipInfo)} | ${asset.모델명||''} | ${asset.OS||''} | ${formatInline(cpuRam)} | ${formatInline(storage)} | | `;
- tr.addEventListener('click', (e) => { if (!(e.target as HTMLElement).closest('button')) openHwModal(asset); });
- } else if (state.activeSubTab === '스토리지') {
- tr.innerHTML = `${idx+1} | ${asset.법인} | ${asset.storage유형||''} | ${asset.자산코드} | ${asset.명칭} | ${asset.위치||''} | ${asset.모델명||''} | ${asset.용량||''} | ${asset.IP주소||''} | ${asset.구매일||''} | | `;
- tr.addEventListener('click', (e) => { if (!(e.target as HTMLElement).closest('button')) openStorageModal(asset); });
- } else {
- tr.innerHTML = `${idx+1} | ${asset.법인} | ${asset.자산코드} | ${asset.명칭} | ${asset.위치} | ${asset.관리자} | ${asset.구매일||''} | ${asset.금액||''} | | `;
- tr.addEventListener('click', (e) => { if (!(e.target as HTMLElement).closest('button')) openHwModal(asset); });
- }
- tbody.appendChild(tr);
- });
- createIcons({ icons: { Paperclip, Edit2, RefreshCcw } });
- };
-
- const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement;
- const corpSelect = document.getElementById('filter-corp') as HTMLSelectElement;
- const orgSelect = document.getElementById('filter-org-unit') as HTMLSelectElement;
- const resetBtn = document.getElementById('btn-reset-filters') as HTMLButtonElement;
-
- keywordInput.addEventListener('input', updateTable);
- corpSelect.addEventListener('change', updateTable);
- orgSelect?.addEventListener('change', updateTable);
- resetBtn.addEventListener('click', () => {
- keywordInput.value = ''; corpSelect.value = ''; if(orgSelect) orgSelect.value = '';
- updateTable();
- });
-
- updateTable();
-}
-
-function renderSwTable(table: HTMLTableElement, container: HTMLElement, mainContent: HTMLElement) {
- const fullList = state.masterData.sw.filter(a => a.type === state.activeSubTab);
- const isSub = state.activeSubTab === '구독SW';
- container.innerHTML = '';
- const filterBar = document.createElement('div');
- filterBar.className = 'search-bar';
- filterBar.innerHTML = ``;
- container.appendChild(filterBar);
-
- const tableWrapper = document.createElement('div');
- tableWrapper.className = 'table-container';
- table.classList.add('sw-table');
- table.innerHTML = `| No. | 분야 | 법인 | 부서 | 제품명 | 구매일 | ${isSub ? '구독일 | ' : ''}금액 | 수량 | 사용가능 | 관리 |
`;
- tableWrapper.appendChild(table);
- container.appendChild(tableWrapper);
- mainContent.appendChild(container);
-
- const tbody = document.getElementById('dynamic-tbody')!;
- const updateTable = () => {
- const keyword = (document.getElementById('filter-keyword') as HTMLInputElement).value.toLowerCase().trim();
- const field = (document.getElementById('filter-field') as HTMLSelectElement).value;
- const corp = (document.getElementById('filter-corp') as HTMLSelectElement).value;
- const filtered = fullList.filter(asset => {
- const matchKeyword = !keyword || (asset.제품명 || '').toLowerCase().includes(keyword) || (asset.부서 || '').toLowerCase().includes(keyword);
- const matchField = !field || asset.분야 === field;
- const matchCorp = !corp || asset.법인 === corp;
- return matchKeyword && matchField && matchCorp;
- });
- tbody.innerHTML = '';
- if (filtered.length === 0) {
- tbody.innerHTML = `| 검색 결과가 없습니다. |
`;
- return;
- }
- filtered.forEach((asset, idx) => {
- const assigned = state.masterData.swUsers.filter(u => u.swId === asset.id).length;
- const qty = typeof asset.수량 === 'number' ? asset.수량 : parseInt(asset.수량||'0', 10);
- const avail = qty - assigned;
- const tr = document.createElement('tr');
- tr.style.cursor = 'pointer';
- tr.innerHTML = `${idx+1} | ${asset.분야||''} | ${asset.법인} | ${asset.부서||''} | ${asset.제품명} | ${asset.구매일||''} | ${isSub ? `${asset.구독일||''} | ` : ''}${asset.금액||'0'} | ${qty} | ${avail} | | `;
- tr.addEventListener('click', (e) => { if (!(e.target as HTMLElement).closest('button')) openSwModal(asset); });
- tr.querySelector('.btn-edit')?.addEventListener('click', () => openSwModal(asset));
- tr.querySelector('.btn-users')?.addEventListener('click', () => openSwUserModal(asset));
- tbody.appendChild(tr);
- });
- createIcons({ icons: { Edit2, Users, RefreshCcw } });
- };
-
- const keywordInput = document.getElementById('filter-keyword') as HTMLInputElement;
- const fieldSelect = document.getElementById('filter-field') as HTMLSelectElement;
- const corpSelect = document.getElementById('filter-corp') as HTMLSelectElement;
- const resetBtn = document.getElementById('btn-reset-filters') as HTMLButtonElement;
- keywordInput.addEventListener('input', updateTable);
- fieldSelect.addEventListener('change', updateTable);
- corpSelect.addEventListener('change', updateTable);
- resetBtn.addEventListener('click', () => {
- keywordInput.value = ''; fieldSelect.value = ''; corpSelect.value = '';
- updateTable();
- });
- updateTable();
-}
diff --git a/backup_refactor/src/views/DashboardView.ts b/backup_refactor/src/views/DashboardView.ts
deleted file mode 100644
index 364514f..0000000
--- a/backup_refactor/src/views/DashboardView.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import { state } from '../core/state';
-import { HardwareAsset, SoftwareAsset } from '../core/excelHandler';
-import { openDashboardDetail, openSwDashboardDetail, openSwUsageDetail } from '../components/Modal/DashboardDetailModal';
-
-declare var Chart: any;
-
-/**
- * 대시보드 렌더링 메인 함수
- */
-export function renderDashboard(mainContent: HTMLElement) {
- if (!mainContent) return;
- mainContent.innerHTML = '';
-
- // 기존 차트 리소스 해제
- if (state.activeCharts) {
- state.activeCharts.forEach(c => {
- if (c && typeof c.destroy === 'function') c.destroy();
- });
- }
- state.activeCharts = [];
-
- if (state.activeCategory === 'hw') {
- renderHwDashboard(mainContent);
- } else if (state.activeCategory === 'sw') {
- renderSwDashboard(mainContent);
- } else {
- mainContent.innerHTML = `운영 서비스 대시보드는 준비 중입니다.
`;
- }
-}
-
-// --- 하드웨어 대시보드 ---
-function renderHwDashboard(container: HTMLElement) {
- const types = ['개인PC', '서버', '스토리지', '전산비품'];
- const units = ['대', '대', '대', '개'];
- const groups: any = {};
-
- types.forEach(t => { groups[t] = { idle: [], active: [], aged: [], normal: [] }; });
-
- state.masterData.hw.forEach(a => {
- if (!groups[a.type]) return;
- if (isHwIdle(a)) groups[a.type].idle.push(a);
- else groups[a.type].active.push(a);
-
- const ageY = getHwAgeYears(a);
- const isAged = a.type === '전산비품' ? ageY >= 3 : ageY >= 5;
- if (isAged) groups[a.type].aged.push(a);
- else groups[a.type].normal.push(a);
- });
-
- let usageCards = '';
- types.forEach((t, i) => {
- const total = groups[t].idle.length + groups[t].active.length;
- const used = groups[t].active.length;
- const per = total > 0 ? Math.round((used / total) * 100) : 0;
- const barColor = per >= 50 ? 'var(--dash-primary)' : 'var(--dash-danger)';
-
- usageCards += `
-
-
${t} 사용현황
-
- ${total}${units[i]} 중 ${used}${units[i]} 사용 중
-
-
${per}%
-
-
`;
- });
-
- container.innerHTML = `
-
-
자산 사용현황 요약
-
${usageCards}
-
-
하드웨어 보유 통계
-
-
-
자산 유형별 보유 현황
-
-
-
-
법인별 자산 분포
-
-
-
-
- `;
-
- setTimeout(() => {
- if (typeof Chart === 'undefined') return;
- const ctxType = (document.getElementById('chart-hw-types') as HTMLCanvasElement)?.getContext('2d');
- const ctxCorp = (document.getElementById('chart-hw-corps') as HTMLCanvasElement)?.getContext('2d');
- if (ctxType) {
- const chart = new Chart(ctxType, {
- type: 'doughnut',
- data: { labels: types, datasets: [{ data: types.map(t => state.masterData.hw.filter(a => a.type === t).length), backgroundColor: ['#1E5149', '#3b82f6', '#10b981', '#f59e0b'] }] },
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'right' } } }
- });
- state.activeCharts.push(chart);
- }
- if (ctxCorp) {
- const corps = ['한맥', '삼안', '바론'];
- const chart = new Chart(ctxCorp, {
- type: 'bar',
- data: { labels: corps, datasets: [{ label: '보유 수량', data: corps.map(c => state.masterData.hw.filter(a => a.법인 === c).length), backgroundColor: 'rgba(30, 81, 73, 0.7)', borderRadius: 4 }] },
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } } }
- });
- state.activeCharts.push(chart);
- }
- }, 100);
-
- container.querySelectorAll('[data-action="idle"]').forEach(card => {
- card.addEventListener('click', () => {
- const t = card.getAttribute('data-type')!;
- openDashboardDetail(`[${t}] 유휴 자산 목록`, groups[t].idle);
- });
- });
-}
-
-// --- 소프트웨어 대시보드 ---
-function renderSwDashboard(container: HTMLElement) {
- let subQty = 0, subUsed = 0, subExp = 0, subTotal = 0;
- let permQty = 0, permUsed = 0, permExp = 0, permTotal = 0;
-
- const currentYear = new Date().getFullYear().toString();
- const corps = ['한맥', '삼안', '바론'];
- const categories = ['업무공통', '개발S/W', '디자인', '설계S/W'];
-
- const costByCorp: Record = { '한맥': 0, '삼안': 0, '바론': 0 };
- const costByCat: Record = {};
- categories.forEach(c => costByCat[c] = 0);
-
- state.masterData.sw.forEach(sw => {
- const assigned = state.masterData.swUsers.filter(u => u.swId === sw.id).length;
- const qty = typeof sw.수량 === 'number' ? sw.수량 : parseInt(sw.수량||'0', 10);
- const priceStr = sw.금액 ? String(sw.금액).replace(/,/g, '') : '0';
- const price = parseInt(priceStr, 10) || 0;
-
- if (sw.type === '구독SW') {
- subQty += qty; subUsed += assigned; subTotal++;
- if (isSWExpiring(sw)) subExp++;
- } else {
- permQty += qty; permUsed += assigned; permTotal++;
- if (isSWExpiring(sw)) permExp++;
- }
-
- if (sw.구매일 && sw.구매일.startsWith(currentYear)) {
- if (costByCorp[sw.법인] !== undefined) costByCorp[sw.법인] += price;
- if (sw.분야 && costByCat[sw.분야] !== undefined) costByCat[sw.분야] += price;
- }
- });
-
- const subPer = subQty > 0 ? Math.round((subUsed/subQty)*100) : 0;
- const permPer = permQty > 0 ? Math.round((permUsed/permQty)*100) : 0;
- const subExpPer = subTotal > 0 ? Math.round((subExp/subTotal)*100) : 0;
- const permExpPer = permTotal > 0 ? Math.round((permExp/permTotal)*100) : 0;
-
- container.innerHTML = `
-
-
소프트웨어 라이선스 현황
-
-
-
구독 소프트웨어 사용율
-
${subQty}카피 중 ${subUsed}개 할당
-
${subPer}%
-
-
-
-
영구 소프트웨어 사용율
-
${permQty}카피 중 ${permUsed}개 할당
-
${permPer}%
-
-
-
-
-
-
-
-
구독 SW 만료 예정 (30일 이내)
-
${subExp}개 제품
-
-
-
-
-
-
유지보수 만료 예정 (30일 이내)
-
${permExp}개 제품
-
-
-
-
-
-
${currentYear}년 도입 비용 분석
-
-
-
법인별 도입 금액 (원)
-
-
-
-
분야별 도입 금액 (원)
-
-
-
-
- `;
-
- setTimeout(() => {
- if (typeof Chart === 'undefined') return;
- const ctxCorp = (document.getElementById('chart-sw-corp') as HTMLCanvasElement)?.getContext('2d');
- const ctxCat = (document.getElementById('chart-sw-cat') as HTMLCanvasElement)?.getContext('2d');
- if (ctxCorp) {
- const chart = new Chart(ctxCorp, {
- type: 'bar',
- data: { labels: corps, datasets: [{ data: corps.map(c => costByCorp[c]), backgroundColor: 'rgba(30, 81, 73, 0.8)', borderRadius: 4 }] },
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } } }
- });
- state.activeCharts.push(chart);
- }
- if (ctxCat) {
- const chart = new Chart(ctxCat, {
- type: 'bar',
- data: { labels: categories, datasets: [{ data: categories.map(c => costByCat[c]), backgroundColor: 'rgba(59, 130, 246, 0.8)', borderRadius: 4 }] },
- options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } } }
- });
- state.activeCharts.push(chart);
- }
- }, 100);
-
- container.querySelector('[data-action="sub-usage"]')?.addEventListener('click', () => openSwUsageDetail('구독 소프트웨어 사용 목록', state.masterData.sw.filter(sw => sw.type === '구독SW')));
- container.querySelector('[data-action="perm-usage"]')?.addEventListener('click', () => openSwUsageDetail('영구 소프트웨어 사용 목록', state.masterData.sw.filter(sw => sw.type === '영구SW')));
- container.querySelector('[data-action="sub-exp"]')?.addEventListener('click', () => openSwDashboardDetail('구독 SW 만료 예정 목록', state.masterData.sw.filter(sw => sw.type === '구독SW' && isSWExpiring(sw))));
- container.querySelector('[data-action="perm-exp"]')?.addEventListener('click', () => openSwDashboardDetail('유지보수 만료 예정 목록', state.masterData.sw.filter(sw => sw.type === '영구SW' && isSWExpiring(sw))));
-}
-
-function isHwIdle(a: HardwareAsset) {
- if (a.type === '개인PC') return !a.사용자 || a.사용자.trim() === '' || a.사용자.trim() === '-';
- if (a.type === '스토리지') return !a.담당자_정 || a.담당자_정.trim() === '' || a.담당자_정.trim() === '-';
- return !a.관리자 || a.관리자.trim() === '' || a.관리자.trim() === '-';
-}
-
-function getHwAgeYears(a: HardwareAsset) {
- if (!a.구매일) return 0;
- try {
- const buyDate = new Date(a.구매일.replace(/\./g, '-'));
- if (isNaN(buyDate.getTime())) return 0;
- return (Date.now() - buyDate.getTime()) / (1000 * 60 * 60 * 24 * 365.25);
- } catch { return 0; }
-}
-
-function isSWExpiring(sw: SoftwareAsset) {
- if (sw.type === '구독SW' && sw.구독일) {
- const parts = sw.구독일.split('~');
- if (parts.length > 1) {
- const endMs = new Date(parts[1].trim().replace(/\./g, '-')).getTime();
- const diffDays = (endMs - Date.now()) / (1000 * 60 * 60 * 24);
- return diffDays >= 0 && diffDays <= 30;
- }
- } else if (sw.type === '영구SW' && sw.비고 && sw.비고.includes('유지보수: ~')) {
- try {
- const endMs = new Date(sw.비고.split('~')[1].trim().replace(/\./g, '-')).getTime();
- const diffDays = (endMs - Date.now()) / (1000 * 60 * 60 * 24);
- return diffDays >= 0 && diffDays <= 30;
- } catch { return false; }
- }
- return false;
-}
diff --git a/backup_temp/README.md b/backup_temp/README.md
deleted file mode 100644
index 3bc41b3..0000000
--- a/backup_temp/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# 🛠️ 개발 및 관리 규칙 (Strict Development Rules)
-
-1. **언어 설정**: 영어로 생각하되, 모든 답변은 **한국어**로 작성한다.
-2. **임의 수정 절대 금지 (Zero-Arbitrary Change)**:
- - 사용자가 명시적으로 지시한 부분 외에는 **단 한 줄의 코드도, 그 어떤 파일도 임의로 수정, 정리, 리팩토링하지 않는다.**
- - 지시받지 않은 다른 파트의 코드는 절대 건드리지 않으며, 영향 범위가 요청 범위를 벗어나지 않도록 '외과 수술식(Surgical) 수정'을 원칙으로 한다.
-3. **개선 작업 절차 (Test-First Approach)**:
- - 사용자가 개선(Refactoring, Optimization 등)을 지시한 경우, **수정 전 현재 시스템이 정상적으로 잘 작동하는지 먼저 전수 확인**한다.
- - 기존 동작 방식과 성능을 기준(Baseline)으로 삼고, 수정 후에도 **기존의 모든 기능이 무결하게 유지되는지 반드시 테스트하여 입증**한다.
- - 검증 결과를 바탕으로 "무엇을, 왜, 어떻게" 바꿀지 상세 보고 후, 사용자로부터 **'진행시켜'** 승인을 얻은 뒤에만 집행한다.
-4. **선보고 후승인**: 모든 기능 수정 및 코드 변경 전에는 예상 방안을 먼저 보고하고 승인 절차를 거친다.
-
----
-
-### 🚀 서버 구동 및 외부 접속 규칙 (Server Run & External Access)
-
-1. **포트 고정**: 개발 서버는 반드시 **8080** 포트를 사용한다. (`vite.config.ts` 설정 준수)
-2. **외부 접속 허용 (Host)**: 사무실 내 타 직원이 접속할 수 있도록 `--host` 모드로 구동한다.
-3. **구동 명령어**:
- ```bash
- npm run dev
- ```
- * 해당 명령어 실행 시 `0.0.0.0` 또는 `Network: http://[내-IP]:8080/` 경로로 타인 접속이 가능하다.
-4. **IP 확인 방법**:
- * Windows: `ipconfig` 명령어로 'IPv4 주소' 확인 후 공유.
-
----
-
-### 🎨 ITAM 시스템 디자인 가이드 (Design Guide)
-
-1. **디자인 철학 (Design Philosophy)**
- * **Minimalist & Border-based**: 불필요한 박스(Card) 사용을 최소화하고, 정보의 구분은 간결한 라인(Border/Divider)을 활용하여 시각적 피로도를 낮춥니다.
- * **Professional Achromatic**: 무채색(Black, White, Grey)을 기본으로 하여 정돈된 업무 환경을 제공합니다.
- * **Green Accent**: 블루 대신 짙은 그린(`#1E5149`)을 포인트 컬러로 사용하여 차분한 전문성을 강조합니다.
-
-2. **타이포그래피 (Typography)**
- * **Font Family**: `Pretendard` (전역 적용)
- * **Letter Spacing**: `-0.02em` (약 -2%) 적용. 자간을 좁게 설정하여 밀도 있고 세련된 가독성을 확보합니다.
- * **Weights**: 400(Regular), 500(Medium), 600(SemiBold), 700(Bold).
- * **Date Format (날짜 표기 규칙)**: 시스템 내 모든 날짜는 `YYYY.MM.DD` 형식을 기본으로 사용합니다. (예: 2026.04.10)
-
-3. **컬러 팔레트 (Color Palette)**
- * **Point Color**: `#1E5149` (Deep Green) - 강조, 활성화 상태, 주요 액션 버튼.
- * **Text**: Main(`#111827` - Near Black), Muted(`#6B7280` - Grey).
- * **Border/Divider**: `#E5E7EB` (Light Grey) - 정보 구분을 위한 얇은 실선.
- * **Background**: `#FFFFFF` (White) / `#F9FAFB` (Off White).
-
-4. **레이아웃 및 컴포넌트 규칙 (Layout Rules)**
- * **Box-less Design**: 꼭 필요한 정보 묶음(데이터 그룹화 등)이 아니면 박스 형태의 테두리나 배경 사용을 지양합니다.
- * **Line-based Division**: 섹션 간의 구분은 1px 두께의 얇은 실선(Border)을 통해 명확히 합니다.
- * **Table**: 배경색이나 화려한 효과 없이 행(Row) 간의 얇은 구분선만 사용하여 데이터 본연에 집중하게 합니다.
- * **Input/Button**: 입력 필드와 버튼은 최소한의 보더와 포인트 컬러만 사용하여 정갈하게 표현합니다.
- * **Modal (모달 공통 규칙)**:
- * **Header**: 짙은 그린(`#1E5149`) 배경에 화이트 텍스트를 사용하며, 우측 상단에 명확한 'X' 닫기 버튼을 배치합니다.
- * **Interaction**: 사용자의 편의를 위해 `ESC` 키를 누르거나 모달 바깥 영역(Overlay)을 클릭하면 모달이 닫히도록 구현합니다.
- * **Layout**: `detail.png` 기준의 2열 그리드 시스템을 권장하며, 하단 우측에 액션 버튼(닫기, 저장 등)을 배치합니다.
-
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/00.HW요약정보.png b/backup_temp/SAMQ 기능 이미지 캡쳐/00.HW요약정보.png
deleted file mode 100644
index c705eef..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/00.HW요약정보.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/00.SW요약정보.png b/backup_temp/SAMQ 기능 이미지 캡쳐/00.SW요약정보.png
deleted file mode 100644
index 6adf117..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/00.SW요약정보.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/01.SW자산 사용자 할당.png b/backup_temp/SAMQ 기능 이미지 캡쳐/01.SW자산 사용자 할당.png
deleted file mode 100644
index 8234fa2..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/01.SW자산 사용자 할당.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/02.개인PC프로그램설치현황.png b/backup_temp/SAMQ 기능 이미지 캡쳐/02.개인PC프로그램설치현황.png
deleted file mode 100644
index 4795416..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/02.개인PC프로그램설치현황.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/03.비인가프로그램실행찯안.png b/backup_temp/SAMQ 기능 이미지 캡쳐/03.비인가프로그램실행찯안.png
deleted file mode 100644
index 8e06abb..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/03.비인가프로그램실행찯안.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/04.개인PC사양정보수집.png b/backup_temp/SAMQ 기능 이미지 캡쳐/04.개인PC사양정보수집.png
deleted file mode 100644
index 2516b59..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/04.개인PC사양정보수집.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/05.구독라이센스등록페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/05.구독라이센스등록페이지.png
deleted file mode 100644
index 59626eb..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/05.구독라이센스등록페이지.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/05.영구라이센스등록페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/05.영구라이센스등록페이지.png
deleted file mode 100644
index d17d615..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/05.영구라이센스등록페이지.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/06. 프로그램 할당 현황.png b/backup_temp/SAMQ 기능 이미지 캡쳐/06. 프로그램 할당 현황.png
deleted file mode 100644
index f650bf3..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/06. 프로그램 할당 현황.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산관리페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산관리페이지.png
deleted file mode 100644
index 0d57cfc..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산관리페이지.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산등록페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산등록페이지.png
deleted file mode 100644
index 3537b6c..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/07.실물자산등록페이지.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/08.변경내역페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/08.변경내역페이지.png
deleted file mode 100644
index f3a3a6a..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/08.변경내역페이지.png and /dev/null differ
diff --git a/backup_temp/SAMQ 기능 이미지 캡쳐/09.HW관리페이지.png b/backup_temp/SAMQ 기능 이미지 캡쳐/09.HW관리페이지.png
deleted file mode 100644
index 5d2bc5d..0000000
Binary files a/backup_temp/SAMQ 기능 이미지 캡쳐/09.HW관리페이지.png and /dev/null differ
diff --git a/backup_temp/[전산자산관리] 자산번호체계 부여방안 검토 (2026.04.09).pdf b/backup_temp/[전산자산관리] 자산번호체계 부여방안 검토 (2026.04.09).pdf
deleted file mode 100644
index 9ac90c6..0000000
Binary files a/backup_temp/[전산자산관리] 자산번호체계 부여방안 검토 (2026.04.09).pdf and /dev/null differ
diff --git a/backup_temp/detail.png b/backup_temp/detail.png
deleted file mode 100644
index 85fe4f2..0000000
Binary files a/backup_temp/detail.png and /dev/null differ
diff --git a/backup_temp/index.html b/backup_temp/index.html
deleted file mode 100644
index 4be2827..0000000
--- a/backup_temp/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- ITAM - IT Asset Management
-
-
-
-
-
-
diff --git a/backup_temp/plan.md b/backup_temp/plan.md
deleted file mode 100644
index 34a17f2..0000000
--- a/backup_temp/plan.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# 📑 ITAM 시스템 통합 구축 기획서 (plan.md)
-
-## 1. 프로젝트 목적 (Objective)
-본 시스템은 **'전산자산번호 부여방안'** 표준 가이드에 따라 사내 모든 전산 자산을 통합 관리하는 것을 목적으로 한다. 분산된 자산 정보를 일원화된 번호 체계로 시스템화하여 직관적인 식별과 정밀한 이력 추적이 가능한 플랫폼을 지향한다.
-
-## 2. 자산번호 체계 적용 (Standardization)
-검토안에 따라 모든 자산은 다음과 같은 규칙으로 고유 번호를 부여받으며, 시스템의 핵심 Key로 활용된다.
-
-* **번호 생성 규칙**: `[구매법인]-[설치위치]-[자산종류]-[일련번호(구매연월+3자리)]`
- * *예시: 삼안에서 2025년 4월에 구매한 IDC 서버 → `SM-IDC-SVR-202504001`*
-* **코드 정의**:
- * **구매법인**: BR(바론), SM(삼안), HM(한맥), JH(장헌), HL(한라), PTC(PTC) 등
- * **설치위치**: TDC(센터 서버실), HBD(한맥빌딩), IDC(IDC), UBD(유니온 빌딩), NBD(뉴코아 빌딩) 등
- * **자산종류**: SVR(서버), PC(PC), STO(스토리지), NAS(NAS), DAS(DAS), HDD(하드) 등
-
-## 3. 기획 의도 및 시스템 가치 (Core Intent)
-1. **식별 용이성 확보**: 번호만으로도 법인, 위치, 종류, 도입 시기를 즉시 파악할 수 있는 시스템 UI를 제공한다.
-2. **전사 통합 관리 로드맵**:
- * **Phase 1**: IDC 서버 및 스토리지 데이터 마이그레이션 (현재 완료 단계)
- * **Phase 2**: 센터 서버실(TDC) 및 빌딩별 네트워크 장비 확장
- * **Phase 3**: 전사 개인 PC(PC) 및 하드웨어 부품(HDD 등) 통합
- * **Phase 4**: 소프트웨어 라이선스와 하드웨어 자산의 매핑 관리
-3. **데이터 무결성 유지**: 자산 위치 변경 시 기존 번호를 폐기하고 신규 번호를 부여하는 이력 관리 원칙을 시스템상에서 강제 및 기록한다.
-
-## 4. 시스템 주요 기능 (Key Features)
-* **자산 자동 번호 부여**: 입력 폼에서 법인/위치/종류 선택 시 가이드에 따른 자산번호 자동 생성 기능.
-* **상세 이력 카드**: 자산번호를 클릭하면 상세 사양, 취득일, 사용자, 현재 상태 및 과거 이동 이력을 모달로 표시.
-* **통합 필터링**: 법인별, 위치별, 종류별로 자산을 즉시 분류하여 조회할 수 있는 고성능 테이블 제공.
-
-## 5. 기술 및 디자인 원칙 (Engineering Standards)
-* **Design**: `README.md` 가이드를 준수하며, 자산번호가 가장 강조되는 레이아웃을 유지한다.
-* **Data Structure**: 향후 DB 전환 시 자산번호의 각 코드(SM, IDC 등)를 정규화하여 관리 효율을 극대화한다.
diff --git a/backup_temp/src/App.css b/backup_temp/src/App.css
deleted file mode 100644
index ca88bd1..0000000
--- a/backup_temp/src/App.css
+++ /dev/null
@@ -1,295 +0,0 @@
-:root {
- --primary-color: #1E5149;
- --primary-hover: #163d37;
- --bg-default: #FFFFFF;
- --bg-muted: #F9FAFB;
- --info-color: #4B5563; /* 무채색 계열로 변경 */
- --text-main: #111827;
- --text-muted: #6B7280;
- --border-color: #E5E7EB;
-}
-
-.app-container {
- display: flex;
- flex-direction: column;
- height: 100vh;
- width: 100%;
- background-color: var(--bg-default);
- color: var(--text-main);
- letter-spacing: -0.02em;
-}
-
-.top-bar {
- height: 50px;
- background-color: var(--primary-color);
- color: white;
- display: flex;
- align-items: center;
- padding: 0 40px;
- border-bottom: 1px solid rgba(0, 0, 0, 0.1);
- box-sizing: border-box;
-}
-
-.top-bar-brand {
- font-size: 1rem;
- font-weight: 700;
- margin-right: 48px;
- color: white;
-}
-
-.top-bar-menu {
- display: flex;
- gap: 4px;
- height: 100%;
-}
-
-.menu-item {
- display: flex;
- align-items: center;
- padding: 0 16px;
- cursor: pointer;
- transition: all 0.2s;
- color: rgba(255, 255, 255, 0.7);
- font-weight: 500;
- font-size: 0.875rem;
- height: 100%;
- border-bottom: 3px solid transparent;
-}
-
-.menu-item:hover {
- color: white;
-}
-
-.menu-item.active {
- color: white;
- border-bottom: 3px solid white;
- background-color: rgba(255, 255, 255, 0.1);
-}
-
-.main-content {
- flex: 1;
- display: flex;
- flex-direction: column;
- height: calc(100vh - 50px);
- overflow: hidden; /* 전체 페이지 스크롤 방지 */
- padding: 0; /* 패딩은 내부 요소에서 관리 */
-}
-
-.content-header {
- padding: 32px 40px 16px 40px;
- margin-bottom: 0;
- border-bottom: 1px solid var(--border-color);
- display: flex;
- justify-content: space-between;
- align-items: center;
- background-color: var(--bg-default);
- flex-shrink: 0;
-}
-
-.table-container {
- flex: 1;
- overflow: auto;
- padding: 0 40px 40px 40px;
-}
-
-.content-title {
- font-size: 1.5rem;
- font-weight: 700;
- color: var(--text-main);
-}
-
-/* Common Table Styles */
-.data-table {
- width: 100%;
- border-collapse: separate; /* sticky border 유지를 위해 separate 사용 */
- border-spacing: 0;
- font-size: 0.875rem;
-}
-
-.data-table th, .data-table td {
- padding: 14px 12px;
- text-align: left;
- border-bottom: 1px solid var(--border-color);
- white-space: nowrap;
-}
-
-.data-table th {
- font-weight: 600;
- color: var(--text-muted);
- font-size: 0.75rem;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- background-color: #F8FAFC; /* 헤더 전용 배경색 */
- position: sticky;
- top: 0;
- z-index: 10;
- border-bottom: 2px solid var(--border-color);
-}
-
-.data-table tr:hover {
- background-color: var(--bg-muted);
-}
-
-/* Buttons */
-.btn {
- padding: 8px 16px;
- border-radius: 4px;
- cursor: pointer;
- border: 1px solid transparent;
- font-weight: 600;
- font-size: 0.875rem;
- transition: all 0.2s;
-}
-
-.btn-primary {
- background-color: var(--primary-color);
- color: white;
-}
-
-.btn-primary:hover {
- background-color: var(--primary-hover);
-}
-
-.btn-outline {
- background-color: transparent;
- border: 1px solid var(--border-color);
- color: var(--text-main);
-}
-
-.btn-outline:hover {
- background-color: var(--bg-muted);
-}
-
-/* Dashboard Stats - Border based */
-.dashboard-stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 0;
- margin-bottom: 48px;
- border-top: 1px solid var(--border-color);
- border-bottom: 1px solid var(--border-color);
-}
-
-.stat-card {
- padding: 24px;
- display: flex;
- flex-direction: column;
- border-right: 1px solid var(--border-color);
-}
-
-.stat-card:last-child {
- border-right: none;
-}
-
-.stat-label {
- font-size: 0.875rem;
- font-weight: 500;
- color: var(--text-muted);
- margin-bottom: 12px;
-}
-
-.stat-value {
- font-size: 2rem;
- font-weight: 700;
- color: var(--primary-color);
-}
-
-/* Modal Styles */
-.modal-overlay {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background-color: rgba(0, 0, 0, 0.5);
- display: flex;
- justify-content: center;
- align-items: center;
- z-index: 1000;
- padding: 20px;
-}
-
-.modal-content {
- background-color: var(--bg-default);
- width: 100%;
- max-width: 800px;
- border-radius: 8px;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- overflow: hidden;
- display: flex;
- flex-direction: column;
- max-height: 90vh;
-}
-
-.modal-header {
- background-color: var(--primary-color);
- color: white;
- padding: 16px 24px;
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
- display: flex;
- justify-content: space-between;
- align-items: center;
-}
-
-.modal-close-btn {
- background: none;
- border: none;
- color: white;
- font-size: 1.5rem;
- line-height: 1;
- cursor: pointer;
- padding: 4px;
- opacity: 0.8;
- transition: opacity 0.2s;
-}
-
-.modal-close-btn:hover {
- opacity: 1;
-}
-
-.modal-body {
- padding: 24px;
- overflow-y: auto;
- flex: 1;
-}
-
-.detail-grid {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 16px 24px;
-}
-
-.detail-item {
- display: flex;
- flex-direction: column;
- gap: 6px;
-}
-
-.detail-item.full-width {
- grid-column: 1 / -1;
-}
-
-.detail-item label {
- font-size: 0.8125rem;
- font-weight: 600;
- color: var(--text-main);
-}
-
-.detail-value {
- padding: 10px 12px;
- border: 1px solid var(--border-color);
- border-radius: 4px;
- font-size: 0.875rem;
- color: var(--text-muted);
- background-color: var(--bg-default);
- min-height: 20px;
-}
-
-.modal-footer {
- padding: 16px 24px;
- border-top: 1px solid var(--border-color);
- display: flex;
- justify-content: flex-end;
- background-color: var(--bg-muted);
-}
-
diff --git a/backup_temp/src/App.tsx b/backup_temp/src/App.tsx
deleted file mode 100644
index fbaa585..0000000
--- a/backup_temp/src/App.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { useState } from 'react'
-import './App.css'
-import AssetManagementView from './components/AssetManagementView'
-import HardwareManagementView from './components/HardwareManagementView'
-
-function App() {
- const [activeMenu, setActiveMenu] = useState('assets')
-
- const renderContent = () => {
- switch (activeMenu) {
- case 'assets':
- return
- case 'hardware':
- return
- default:
- return
- }
- }
-
- return (
-
-
-
- {renderContent()}
-
-
- )
-}
-
-export default App
diff --git a/backup_temp/src/components/AssetManagementView.tsx b/backup_temp/src/components/AssetManagementView.tsx
deleted file mode 100644
index 3cc60ce..0000000
--- a/backup_temp/src/components/AssetManagementView.tsx
+++ /dev/null
@@ -1,168 +0,0 @@
-import { useState } from 'react'
-import { idcServers, idcStorages, IdcServer } from '../data/idcData'
-import ServerDetailModal from './ServerDetailModal'
-
-const AssetManagementView = () => {
- const [viewMode, setViewMode] = useState<'server' | 'storage'>('server')
- const [selectedServer, setSelectedServer] = useState(null)
-
- return (
-
-
-
전산자산관리대장 (IDC)
-
-
-
-
-
-
-
-
-
- {viewMode === 'server' ? 'IDC 서버 상세 정보' : 'IDC 스토리지 상세 정보'}
-
-
-
- {viewMode === 'server' ? (
-
-
-
- | 회사 |
- 서버번호 |
- 구분 |
- 설치위치 |
- 관리자 |
- IP 주소 |
- 접속 정보 |
- H/W 사양 |
- OS |
- 구매일 |
-
-
-
- {idcServers.map((server) => (
- setSelectedServer(server)} style={{ cursor: 'pointer' }}>
- | {server.company} |
- {server.serverNo} |
-
- {server.category}
- {server.remarks && {server.remarks} }
- |
- {server.location} |
-
- {server.managerPrimary ? `정: ${server.managerPrimary}` : '정: -'}
- {server.managerSecondary ? `부: ${server.managerSecondary}` : '부: -'}
- |
-
- {server.ip1}
- {server.ip2 && {server.ip2} }
- |
-
- {server.remoteAccess.map((access, idx) => (
-
-
- {access.tool}
- {access.id}
-
-
- PW: {access.pw}
-
-
- ))}
- |
-
- {server.model}
- {server.cpu} / {server.ram}
- {server.storage.join(' + ')}
- |
- {server.os} |
- {server.purchaseDate} |
-
- ))}
-
-
- ) : (
-
-
-
- | 회사 |
- 서버번호 |
- 구분 |
- 설치위치 |
- 관리자 |
- IP 주소 |
- 접속 정보 |
- 모델명 |
- 용량 |
- 구매일 |
-
-
-
- {idcStorages.map((storage) => (
-
- | {storage.company} |
- {storage.serverNo} |
-
- {storage.category}
- {storage.remarks && {storage.remarks} }
- |
- {storage.location} |
-
- 정: {storage.managerPrimary}
- 부: {storage.managerSecondary}
- |
- {storage.ip} |
-
- {storage.remoteAccess.map((access, idx) => (
-
-
- {access.tool}
- {access.id}
-
-
- PW: {access.pw}
-
-
- ))}
- |
- {storage.model} |
- {storage.capacity} |
- {storage.purchaseDate} |
-
- ))}
-
-
- )}
-
-
- {selectedServer && (
-
setSelectedServer(null)}
- />
- )}
-
- )
-}
-
-export default AssetManagementView
diff --git a/backup_temp/src/components/DashboardView.tsx b/backup_temp/src/components/DashboardView.tsx
deleted file mode 100644
index d1c98d0..0000000
--- a/backup_temp/src/components/DashboardView.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import { mockCategories } from '../data/mockData'
-
-const DashboardView = () => {
- return (
-
-
-
-
-
- {mockCategories.map(cat => (
-
-
{cat.name}
-
{cat.count}개
-
- ))}
-
-
-
-
최근 변경 내역
-
-
-
- | 날짜 |
- 내용 |
- 사용자 |
-
-
-
-
- | 2023-04-11 |
- PC 신규 등록 |
- 이관형 |
-
-
- | 2023-04-10 |
- 모니터 부서 할당 변경 |
- 관리자 |
-
-
-
-
-
- )
-}
-
-export default DashboardView
diff --git a/backup_temp/src/components/HardwareManagementView.tsx b/backup_temp/src/components/HardwareManagementView.tsx
deleted file mode 100644
index e23805f..0000000
--- a/backup_temp/src/components/HardwareManagementView.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import { useState } from 'react'
-import { mockHardwareSpecs, HardwareSpec } from '../data/mockData'
-
-const SpecModal = ({ spec, onClose }: { spec: HardwareSpec, onClose: () => void }) => {
- return (
-
-
-
-
상세 사양 정보
-
-
-
- PC명: {spec.pcName}
- 사용자: {spec.userName}
- 부서: {spec.department}
- OS: {spec.os}
- CPU: {spec.cpu}
- Memory: {spec.memory}
- Disk: {spec.disk}
- MAC: {spec.macAddress}
- IP: {spec.ipAddress}
- Graphic: {spec.graphicCard}
-
-
-
-
-
-
- )
-}
-
-const HardwareManagementView = () => {
- const [selectedSpec, setSelectedSpec] = useState(null)
-
- return (
-
-
-
-
-
-
- | PC명 |
- 부서 |
- 사용자 |
- OS |
- CPU |
- IP주소 |
- 상세 |
-
-
-
- {mockHardwareSpecs.map(spec => (
-
- | {spec.pcName} |
- {spec.department} |
- {spec.userName} |
- {spec.os.split(' ')[2]} |
- {spec.cpu.split('@')[0]} |
- {spec.ipAddress} |
-
-
- |
-
- ))}
-
-
-
- {selectedSpec && (
-
setSelectedSpec(null)} />
- )}
-
- )
-}
-
-export default HardwareManagementView
diff --git a/backup_temp/src/components/ServerDetailModal.tsx b/backup_temp/src/components/ServerDetailModal.tsx
deleted file mode 100644
index 39d477b..0000000
--- a/backup_temp/src/components/ServerDetailModal.tsx
+++ /dev/null
@@ -1,144 +0,0 @@
-import React, { useEffect } from 'react';
-import { IdcServer } from '../data/idcData';
-
-interface ServerDetailModalProps {
- server: IdcServer;
- onClose: () => void;
-}
-
-const ServerDetailModal: React.FC = ({ server, onClose }) => {
- // ESC 키로 모달 닫기
- useEffect(() => {
- const handleEsc = (event: KeyboardEvent) => {
- if (event.key === 'Escape') {
- onClose();
- }
- };
- window.addEventListener('keydown', handleEsc);
- return () => {
- window.removeEventListener('keydown', handleEsc);
- };
- }, [onClose]);
-
- return (
-
-
e.stopPropagation()}>
-
-
{server.category} ({server.serverNo})
-
-
-
-
-
- {/* Row 1 */}
-
-
-
{server.company}
-
-
-
-
{server.serverNo}
-
-
- {/* Row 2 */}
-
-
-
{server.category}
-
-
-
-
{server.location}
-
-
- {/* Row 3: 관리자 추가 */}
-
-
-
- 정: {server.managerPrimary}
- 부: {server.managerSecondary}
-
-
-
- {/* Row 4 */}
-
-
-
{server.ip1 || '-'}
-
-
-
-
{server.ip2 || '-'}
-
-
- {/* Row 5 */}
-
-
-
- {server.remoteAccess.length > 0 ? (
-
- {server.remoteAccess.map((access, idx) => (
-
- {access.tool}
- {access.id}
- |
- PW: {access.pw}
-
- ))}
-
- ) : '-'}
-
-
-
- {/* Row 6 */}
-
-
-
{server.model || '-'}
-
-
-
-
{server.os || '-'}
-
-
- {/* Row 7 */}
-
-
-
{server.cpu || '-'}
-
-
-
-
{server.ram || '-'}
-
-
- {/* Row 8 */}
-
-
-
{server.storage.length > 0 ? server.storage.join(' + ') : '-'}
-
-
- {/* Row 9 */}
-
-
-
{server.purchaseDate || '-'}
-
-
-
-
{server.monitoring || '-'}
-
-
- {/* Row 10 */}
-
-
-
{server.remarks || '-'}
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default ServerDetailModal;
diff --git a/backup_temp/src/data/idcData.ts b/backup_temp/src/data/idcData.ts
deleted file mode 100644
index 94fd214..0000000
--- a/backup_temp/src/data/idcData.ts
+++ /dev/null
@@ -1,608 +0,0 @@
-export interface RemoteAccess {
- tool: string;
- ip?: string;
- id: string;
- pw: string;
-}
-
-export interface IdcServer {
- company: string;
- serverNo: string;
- category: string;
- remarks: string;
- location: string;
- managerPrimary: string;
- managerSecondary: string;
- ip1: string;
- ip2: string;
- remoteAccess: RemoteAccess[];
- monitoring: string;
- serverIdMatch: string;
- model: string;
- os: string;
- cpu: string;
- ram: string;
- storage: string[];
- purchaseDate: string;
-}
-
-export interface IdcStorage {
- company: string;
- serverNo: string;
- category: string;
- remarks: string;
- location: string;
- managerPrimary: string;
- managerSecondary: string;
- ip: string;
- managementIp?: string;
- remoteAccess: RemoteAccess[];
- model: string;
- capacity: string;
- purchaseDate: string;
-}
-
-export const idcServers: IdcServer[] = [
- {
- company: "한맥",
- serverNo: "hm-idc-001",
- category: "한맥 인트라넷",
- remarks: "",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.70",
- ip2: "192.168.10.5",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "samanerp1!" },
- { tool: "Remote Util", id: "211.206.127.70", pw: "1234아이티!" }
- ],
- monitoring: "win exp, raid X",
- serverIdMatch: "srv07d330084",
- model: "HPE ProLiant DL360 Gen10",
- os: "Windows Server 2016",
- cpu: "intel xeon silver4110 CPU @2.10GHz",
- ram: "32GB",
- storage: ["280GB", "2.7TB"],
- purchaseDate: "2020.12.10"
- },
- {
- company: "한맥",
- serverNo: "hm-idc-002",
- category: "한맥 인트라넷 예비",
- remarks: "단가, 입사자지원 서버 (스마트 건설 용도 구매)",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.78",
- ip2: "192.168.10.13",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "Hanmac2141!" }
- ],
- monitoring: "win exp, raid X",
- serverIdMatch: "srcff5294c84",
- model: "HPE ProLiant DL360 Gen10",
- os: "Windows Server 2019",
- cpu: "intel xeon silver4214R CPU @2.40GHz",
- ram: "32GB",
- storage: ["280GB", "2.7TB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-001",
- category: "삼안 인트라넷",
- remarks: "",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.237",
- ip2: "erp.samaneng.com",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "samanerp1!" },
- { tool: "Remote Util", id: "118.220.172.237", pw: "1234아이티!" }
- ],
- monitoring: "O",
- serverIdMatch: "newSmintranet",
- model: "HPE ProLiant DL360 Gen10",
- os: "Windows Server 2016",
- cpu: "intel xeon silver4214R CPU @2.40GHz",
- ram: "32GB",
- storage: ["280GB", "3.27TB"],
- purchaseDate: "2019.12.20"
- },
- {
- company: "삼안",
- serverNo: "sa-idc-002",
- category: "삼안 인트라넷 예비",
- remarks: "",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.249",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "samanerp1!" },
- { tool: "Remote Util", id: "678-605-383-130", pw: "1234아이티!" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "INTRANET",
- model: "HPE ProLiant DL360 GEN9",
- os: "Windows Server 2008 R2",
- cpu: "Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz",
- ram: "32GB",
- storage: ["279GB", "2.72TB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-003",
- category: "SATIS 01",
- remarks: "구 SATIS 서버, 세금계산서 발행(회계)",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.228",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "satissg11707808" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "satis01",
- model: "HPE ProLiant DL380p GEN8",
- os: "Windows Server 2008 R2",
- cpu: "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz",
- ram: "20GB",
- storage: ["100GB", "458GB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-004",
- category: "SATIS 02",
- remarks: "SATIS 리뉴얼 버전 (ERP 서버)",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.229",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "satissg11707808" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "satis02",
- model: "HPE ProLiant DL380p GEN8",
- os: "Windows Server 2008 R2",
- cpu: "Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz",
- ram: "20GB",
- storage: ["100GB", "458GB", "18.1TB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-005",
- category: "웹 서버",
- remarks: "남양주 테스트 서버 (도메인 관리 기능 제거 2026.03.11)",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "samanweb.cafe24.com",
- ip2: "118.220.172.195",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "saman+2013+web" }
- ],
- monitoring: "win exp, 포트 안열림",
- serverIdMatch: "www",
- model: "HPE ProLiant DL380p GEN8",
- os: "Windwos Server 2012",
- cpu: "Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz",
- ram: "16GB",
- storage: ["100GB", "230GB", "230GB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-006",
- category: "PQ DB 서버",
- remarks: "",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.231",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "7013ddj10235!" }
- ],
- monitoring: "O",
- serverIdMatch: "src5dd67f2ed",
- model: "HPE ProLiant DL360 Gen10",
- os: "Windows Server 2019",
- cpu: "intel xeon silver4210R CPU @2.40GHz",
- ram: "32GB",
- storage: ["278GB", "2.18TB"],
- purchaseDate: "2024.12.16"
- },
- {
- company: "삼안",
- serverNo: "sa-idc-007",
- category: "Oracle DB 서버",
- remarks: "",
- location: "서관 202번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.225",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "7013ddj10235!" }
- ],
- monitoring: "win exp, raid X",
- serverIdMatch: "SAMAN-DB",
- model: "HPE ProLiant DL380 GEN9",
- os: "Windows Server 2012",
- cpu: "Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz",
- ram: "64GB",
- storage: ["558GB", "1.09TB", "1.09TB"],
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-idc-008",
- category: "안전관리",
- remarks: "삼안 개발서버2 - AI, SSL, 장헌TBM, 노드",
- location: "서관 202번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "1.234.37.171",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "samanerp1!" }
- ],
- monitoring: "연결 X",
- serverIdMatch: "",
- model: "HPE ProLiant DL380 GEN10",
- os: "Windwos Server 2022",
- cpu: "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- ram: "128GB",
- storage: ["278GB", "3.27TB"],
- purchaseDate: "2025.04.10"
- },
- {
- company: "삼안",
- serverNo: "sa-idc-009",
- category: "가족사 공통메뉴",
- remarks: "삼안 개발서버1 - QNA, 급여명세서",
- location: "서관 202번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "118.220.172.233",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "samanerp1!" }
- ],
- monitoring: "O",
- serverIdMatch: "srcc9ac928ee",
- model: "HPE ProLiant DL380 GEN10",
- os: "Windwos Server 2022",
- cpu: "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- ram: "128GB",
- storage: ["278GB", "3.27TB"],
- purchaseDate: "2025.04.10"
- },
- {
- company: "한라",
- serverNo: "hl-idc-001",
- category: "한라 인트라넷",
- remarks: "인트라넷,안전, 운영, MISO 서버로 운영 중(win 2008)",
- location: "동관 54번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "1.234.37.143",
- ip2: "",
- remoteAccess: [
- { tool: "Remote Util", id: "1.234.37.143", pw: "1234dkdlxl!" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "",
- model: "HPE ProLiant DL360 GEN9",
- os: "Windows Server 2008 R2",
- cpu: "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz",
- ram: "8GB",
- storage: ["299GB", "631GB"],
- purchaseDate: ""
- },
- {
- company: "한라",
- serverNo: "hl-idc-002",
- category: "안전전산화 서버 (디자인팀 웹)",
- remarks: "인트라넷 서버 다운 시 백업용 대기",
- location: "동관 54번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "1.234.37.144",
- ip2: "192.168.20.49",
- remoteAccess: [
- { tool: "Remote Util", id: "1.234.37.144", pw: "1234dkdlxl!" }
- ],
- monitoring: "O",
- serverIdMatch: "",
- model: "HPE ProLiant DL360 GEN9",
- os: "Windows Server 2012",
- cpu: "Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz",
- ram: "8GB",
- storage: ["299GB", "631GB"],
- purchaseDate: ""
- },
- {
- company: "한라",
- serverNo: "hl-idc-003",
- category: "개발서버2",
- remarks: "PTC 연구비로 구매한 예비서버2",
- location: "동관 53번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "192.168.20.171",
- ip2: "1.234.37.171",
- remoteAccess: [
- { tool: "Remote Util", id: "1.234.37.171", pw: "1234dkdlxl!" }
- ],
- monitoring: "O",
- serverIdMatch: "",
- model: "HPE ProLiant DL380 Gen10",
- os: "Windows Server 2019 Standard",
- cpu: "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["280GB", "1TB"],
- purchaseDate: "2022.09.21"
- },
- {
- company: "장헌",
- serverNo: "jh-idc-001",
- category: "장헌인트라넷",
- remarks: "BEPs",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.71",
- ip2: "192.168.10.6",
- remoteAccess: [
- { tool: "Remote Util", id: "211.206.127.71", pw: "1234dkdlxl!" },
- { tool: "원격데스크탑", id: "administrator", pw: "Hanmac2141!%" }
- ],
- monitoring: "잠금 걸려있음",
- serverIdMatch: "src775d3e5df",
- model: "HPE ProLiant DL380 GEN10",
- os: "Windows Server 2019",
- cpu: "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["280GB", "1TB"],
- purchaseDate: "2022.09.21"
- },
- {
- company: "장헌",
- serverNo: "jh-idc-002",
- category: "장헌 인트라넷 예비",
- remarks: "",
- location: "동관 53번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "1.234.37.170",
- ip2: "192.168.20.170",
- remoteAccess: [
- { tool: "Remote Util", id: "1.234.37.170", pw: "1234dkdlxl!" },
- { tool: "원격데스크탑", id: "Administrator", pw: "Hanmac2141!" }
- ],
- monitoring: "원격 X, O",
- serverIdMatch: "",
- model: "HPE ProLiant DL360 Gen10",
- os: "Windows Server 2019",
- cpu: "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["280GB", "1TB"],
- purchaseDate: "2022.04.01"
- },
- {
- company: "장헌",
- serverNo: "jh-idc-003",
- category: "인트라넷(구)",
- remarks: "현재는 GIT 백업 으로 사용",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.110",
- ip2: "192.168.10.40",
- remoteAccess: [
- { tool: "Remote Util", id: "211.206.127.110", pw: "1234dkdlxl!" },
- { tool: "원격데스크탑", id: "User", pw: "Hanmac2141!" }
- ],
- monitoring: "",
- serverIdMatch: "",
- model: "",
- os: "Windows Server 2019",
- cpu: "Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz",
- ram: "",
- storage: [],
- purchaseDate: ""
- },
- {
- company: "(주)장헌",
- serverNo: "jh-idc-004",
- category: "(주) 장헌 인트라넷",
- remarks: "2025.12.23 IDC 이전 설치",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.76",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "User", pw: "Hanmac2141!%" }
- ],
- monitoring: "win exp, raid X",
- serverIdMatch: "DESKTOP-5IL75B7",
- model: "",
- os: "Windows 10",
- cpu: "12th Gen Intel(R) Core(TM) i7-12700F",
- ram: "32GB",
- storage: ["465GB", "1.81TB"],
- purchaseDate: ""
- },
- {
- company: "PTC",
- serverNo: "ptc-idc-001",
- category: "PTC인트라넷",
- remarks: "2024.05.22 인트라넷서버로 교체",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.72",
- ip2: "192.168.10.7",
- remoteAccess: [
- { tool: "Remote Util", id: "211.206.127.72", pw: "1234dkdlxl!" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "",
- model: "SYSTEM X3650 M2",
- os: "Windows Server 2008 R2",
- cpu: "Intel(R) Xeon(R) CPU E5520 @ 2.27GHz",
- ram: "16GB",
- storage: ["556GB"],
- purchaseDate: ""
- },
- {
- company: "PTC",
- serverNo: "ptc-idc-002",
- category: "예비서버",
- remarks: "PTC 인트라넷 예비서버",
- location: "서관 204번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "192.168.10.8",
- ip2: "",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "1234dkdlxl!" }
- ],
- monitoring: "O",
- serverIdMatch: "",
- model: "HPE ProLiant DL360 GEN10",
- os: "Windows Server 2019",
- cpu: "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["278GB", "1.09TB"],
- purchaseDate: "2022.04.01"
- },
- {
- company: "PTC",
- serverNo: "ptc-idc-003",
- category: "DB 백업 서버",
- remarks: "2024.05.22 변경 (데스크탑)",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.74",
- ip2: "192.168.10.9",
- remoteAccess: [
- { tool: "Remote Util", id: "211.206.127.74", pw: "1234dkdlxl!" }
- ],
- monitoring: "설치 X",
- serverIdMatch: "",
- model: "",
- os: "Window 7",
- cpu: "Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz",
- ram: "4GB",
- storage: ["593GB", "1.23TB"],
- purchaseDate: ""
- },
- {
- company: "바론",
- serverNo: "br-idc-001",
- category: "인트라넷",
- remarks: "",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "211.206.127.75",
- ip2: "192.168.10.10",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "Hanmac2141!%" }
- ],
- monitoring: "O",
- serverIdMatch: "srcf0136042d",
- model: "HPE ProLiant DL360 GEN10",
- os: "Windows Server 2022",
- cpu: "Intel Xeon(R) Silver 4210R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["280GB", "2.18TB"],
- purchaseDate: "2025.04.14"
- },
- {
- company: "현타",
- serverNo: "ht-idc-001",
- category: "인트라넷",
- remarks: "",
- location: "동관 53번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip1: "1.234.37.172",
- ip2: "192.168.20.172",
- remoteAccess: [
- { tool: "원격데스크탑", id: "administrator", pw: "Hanmac2141!" }
- ],
- monitoring: "O",
- serverIdMatch: "src901e49933",
- model: "HPE ProLiant DL380 GEN10",
- os: "Windows Server 2019",
- cpu: "Intel Xeon Silver 4210R CPU @ 2.40GHz",
- ram: "32GB",
- storage: ["280GB", "1TB"],
- purchaseDate: "2022.09.21"
- }
-];
-
-export const idcStorages: IdcStorage[] = [
- {
- company: "삼안",
- serverNo: "sa-nas-001",
- category: "인트라넷 백업 스토리지",
- remarks: "",
- location: "서관 203번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip: "118.220.172.246",
- remoteAccess: [{ tool: "원격", id: "administrator", pw: "sg11707808" }],
- model: "Promiss R Series",
- capacity: "36TB",
- purchaseDate: ""
- },
- {
- company: "삼안",
- serverNo: "sa-nas-002",
- category: "성과품 스토리지",
- remarks: "매니지먼트 접속 확인 불가",
- location: "서관 205번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip: "118.220.172.248",
- managementIp: "118.220.172.247",
- remoteAccess: [{ tool: "원격", id: "administrator", pw: "sg11707808" }],
- model: "ENC_3U_16BAY_D",
- capacity: "23TB",
- purchaseDate: "2019.06.03"
- },
- {
- company: "삼안",
- serverNo: "sa-nas-003",
- category: "성과품 백업 스토리지",
- remarks: "",
- location: "서관 202번",
- managerPrimary: "김철수",
- managerSecondary: "홍길동",
- ip: "118.220.172.241",
- managementIp: "118.220.172.240",
- remoteAccess: [
- { tool: "원격", id: "administrator", pw: "saman1!" },
- { tool: "원격", id: "admin0", pw: "Root1234" }
- ],
- model: "Promiss R Series",
- capacity: "48TB",
- purchaseDate: "2025.03.13"
- }
-];
diff --git a/backup_temp/src/data/mockData.ts b/backup_temp/src/data/mockData.ts
deleted file mode 100644
index d848549..0000000
--- a/backup_temp/src/data/mockData.ts
+++ /dev/null
@@ -1,84 +0,0 @@
-export interface Category {
- id: string;
- name: string;
- count: number;
-}
-
-export interface Asset {
- id: string;
- categoryName: string;
- name: string;
- quantity: number;
- internalCode: string;
- serialNumber: string;
- department: string;
- user: string;
- acquisitionDate: string;
- status: string;
- location: string;
-}
-
-export interface HardwareSpec {
- id: string;
- pcName: string;
- department: string;
- userName: string;
- os: string;
- cpu: string;
- memory: string;
- disk: string;
- macAddress: string;
- ipAddress: string;
- graphicCard: string;
-}
-
-export const mockCategories: Category[] = [
- { id: '1', name: 'PC', count: 1 },
- { id: '2', name: '모니터', count: 5 },
- { id: '3', name: '노트북', count: 2 },
-];
-
-export const mockAssets: Asset[] = [
- {
- id: '1',
- categoryName: 'PC',
- name: 'PC',
- quantity: 1,
- internalCode: 'PC20230411001',
- serialNumber: 'SN-001-A1',
- department: '한맥기술',
- user: '이관형',
- acquisitionDate: '2023-04-11',
- status: '정상',
- location: '본사 3층',
- },
-];
-
-export const mockHardwareSpecs: HardwareSpec[] = [
- {
- id: '1',
- pcName: 'DESKTOP-G1DVL26',
- department: '한맥기술',
- userName: '이준권',
- os: 'Microsoft Windows 10 Pro 10.0.19044',
- cpu: 'Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz',
- memory: 'Samsung 4 GB / Samsung 4 GB',
- disk: 'ST2000DM001-1CH164 1.82 TB / Samsung SSD 850 EVO 120GB',
- macAddress: '0862664B98A3',
- ipAddress: '172.16.9.68',
- graphicCard: 'NVIDIA GeForce GTX 750',
- },
- {
- id: '2',
- pcName: 'DESKTOP-BNBPOUP',
- department: '한맥기술',
- userName: '주완기 연구원',
- os: 'Microsoft Windows 10 Pro 10.0.19045',
- cpu: 'Intel(R) Core(TM) i5-4570 CPU @ 3.20GHz',
- memory: 'Samsung 8 GB / Samsung 8 GB',
- disk: 'ST1000DM003-1CH162 931.51 GB / Samsung SSD 840 EVO 120GB',
- macAddress: 'E03F4948ECC6',
- ipAddress: '172.16.9.23',
- graphicCard: 'Intel(R) HD Graphics 4600',
- },
-];
diff --git a/backup_temp/src/index.css b/backup_temp/src/index.css
deleted file mode 100644
index cc457c7..0000000
--- a/backup_temp/src/index.css
+++ /dev/null
@@ -1,26 +0,0 @@
-:root {
- font-family: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif;
- line-height: 1.5;
- font-weight: 400;
- letter-spacing: -0.02em;
-
- color-scheme: light;
- color: #111827;
- background-color: #F9FAFB;
-
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-body {
- margin: 0;
- display: flex;
- min-width: 320px;
- min-height: 100vh;
-}
-
-#root {
- width: 100%;
-}
diff --git a/backup_temp/src/main.tsx b/backup_temp/src/main.tsx
deleted file mode 100644
index 3d7150d..0000000
--- a/backup_temp/src/main.tsx
+++ /dev/null
@@ -1,10 +0,0 @@
-import React from 'react'
-import ReactDOM from 'react-dom/client'
-import App from './App.tsx'
-import './index.css'
-
-ReactDOM.createRoot(document.getElementById('root')!).render(
-
-
- ,
-)
diff --git a/backup_temp/서버목록 및 IDC 서버 위치 - 서버 및 스토리지 목록(IDC).csv b/backup_temp/서버목록 및 IDC 서버 위치 - 서버 및 스토리지 목록(IDC).csv
deleted file mode 100644
index 509bafe..0000000
--- a/backup_temp/서버목록 및 IDC 서버 위치 - 서버 및 스토리지 목록(IDC).csv
+++ /dev/null
@@ -1,49 +0,0 @@
-IDC,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-서버목록,,,,,,,,,,,,,,,,,,,,,,,,,,한맥,LMS 서버,mdf,
-회사,서버번호,구분,비고,설치위치,담당자,,IP 주소,,원격접속,,,모니터링 여부,"서버 이름 ID
- 일치 여부, 전 서버 이름",제조사 및 모델명,OS,CPU,RAM,Storage1,Storage2,Storage3,계산서,,,,,삼안,XR플래그십 스토리지,,20250414
-,,,,,정,부,IP,IP2,접속도구,아이디,비빌번호,,,,,,,,,,,,,,,장헌,"스토리지, 서버",mdf 추정,
-한맥,hm-idc-001,한맥 인트라넷,,서관 204번,,,211.206.127.70,192.168.10.5,원격데스크탑,administrator,samanerp1!,"win exp, raid X",srv07d330084,HPE ProLiant DL360 Gen10,Windows Server 2016,intel xeon silver4110 CPU @2.10GHz 2.10GHZ,32GB,280GB,2.7TB,,20201210 추정,한맥,,,,한라,백업서버,mdf,
-,,,,,,,,,Remote Util,211.206.127.70,1234아이티!,,,,,,,,,,,,,,,,,,
-,hm-idc-002,한맥 인트라넷 예비,"단가, 입사자지원 서버 (4/1 장헌산업 이름으로 스마트 건설 용도 구매)",서관 205번,,,211.206.127.78,192.168.10.13,원격데스크탑,administrator,Hanmac2141!,"win exp, raid X",srcff5294c84,HPE ProLiant DL360 Gen10,Windows Server 2019,intel xeon silver4214R CPU @2.40GHz 2.39GHZ,32GB,280GB,2.7TB,,,,,,,,,,
-삼안,sa-idc-001,삼안 인트라넷,,서관 204번,,,118.220.172.237,erp.samaneng.com,원격데스크탑,administrator,samanerp1!,O,newSmintranet,HPE ProLiant DL360 Gen10,Windows Server 2016,intel xeon silver4214R CPU @2.40GHz 2.39GHZ,32GB,280GB,3.27TB,,20191220 추정,삼안,,,,,,,
-,,,,,,,,,Remote Util,118.220.172.237,1234아이티!,,,,,,,,,,,,,,,,,,
-,sa-idc-002,삼안 인트라넷 예비,,서관 204번,,,118.220.172.249,,원격데스크탑,administrator,samanerp1!,설치 X,INTRANET,HPE ProLiant DL360 GEN9,Windows Server 2008 R2,Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz 2.40GHz,32GB,279GB,2.72TB,,,,,,,,,,
-,,,,,,,,,Remote Util,678-605-383-130,1234아이티!,,,,,,,,,,,,,,,,,,
-,sa-idc-003,SATIS 01,"구 SATIS 서버, 세금계산서 발행(회계)",서관 204번,,,118.220.172.228,,원격데스크탑,administrator,satissg11707808,설치 X,satis01,HPE ProLiant DL380p GEN8,Windows Server 2008 R2,Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz,20GB,100GB,458GB,,,,,,,,,,
-,sa-idc-004,SATIS 02,SATIS 리뉴얼 버전 (ERP 서버),서관 204번,,,118.220.172.229,,원격데스크탑,administrator,satissg11707808,설치 X,satis02,HPE ProLiant DL380p GEN8,Windows Server 2008 R2,Intel(R) Xeon(R) CPU E5-2643 0 @ 3.30GHz 3.30GHz,20GB,100GB,458GB,18.1TB,,,,,,,,,
-,sa-idc-005,웹 서버,남양주 테스트 서버 (도메인 관리 기능 제거 2026.03.11),서관 204번,,,samanweb.cafe24.com,118.220.172.195,원격데스크탑,administrator,saman+2013+web,"win exp, 포트 안열림",www,HPE ProLiant DL380p GEN8,Windwos Server 2012,Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz 2.40GHz,16GB,100GB,230GB,230GB,,,,,,,,,
-,sa-idc-006,PQ DB 서버,,서관 204번,,,118.220.172.231,,원격데스크탑,administrator,7013ddj10235!, O,src5dd67f2ed,HPE ProLiant DL360 Gen10,Windows Server 2019,intel xeon silver4210R CPU @2.40GHz 2.39GHZ,32GB,278GB,2.18TB,,20241216 구매교체,삼안,,,,,,,
-,sa-idc-007,Oracle DB 서버,,서관 202번,,,118.220.172.225,,원격데스크탑,administrator,7013ddj10235!,"win exp, raid X",SAMAN-DB,HPE ProLiant DL380 GEN9,Windows Server 2012,Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz 2.20GHz,64GB,558GB,1.09TB,1.09TB,,,,,,,,,
-,sa-idc-008,안전관리,"삼안 개발서버2 - AI, SSL, 장헌TBM, 노드",서관 202번,,,1.234.37.171,,원격데스크탑,administrator,samanerp1!,연결 X,,HPE ProLiant DL380 GEN10,Windwos Server 2022,Intel Xeon(R) Silver 4210R CPU @ 2.40GHz,128GB,278GB,3.27TB,,20250410 설치,삼안,,,,,,,
-,sa-idc-009,가족사 공통메뉴,"삼안 개발서버1 - QNA, 급여명세서",서관 202번,,,118.220.172.233,,원격데스크탑,administrator,samanerp1!,O,srcc9ac928ee,HPE ProLiant DL380 GEN10,Windwos Server 2022,Intel Xeon(R) Silver 4210R CPU @ 2.40GHz,128GB,278GB,3.27TB,,20250410 설치,삼안,,,,,,,
-한라,hl-idc-001,한라 인트라넷,"인트라넷,안전, 운영, MISO 서버로 운영 중(win 2008)",동관 54번,,,1.234.37.143,,Remote Util,1.234.37.143,1234dkdlxl!,설치 X,,HPE ProLiant DL360 GEN9,Windows Server 2008 R2,Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz,8GB,299GB,631GB,,,,,,,,,,
-,hl-idc-002,안전전산화 서버 (디자인팀 웹),"인트라넷 서버 다운 시 백업용 대기, (임시) 디자인팀 웹 퍼블리싱 서버",동관 54번,,,1.234.37.144,192.168.20.49,Remote Util,1.234.37.144,1234dkdlxl!,O,,HPE ProLiant DL360 GEN9,Windows Server 2012,Intel(R) Xeon(R) CPU E5-2603 v4 @ 1.70GHz 1.70GHz,8GB,299GB,631GB,,,,,,,,,,
-,hl-idc-003,개발서버2,PTC 연구비로 구매한 예비서버2 ,동관 53번,,,192.168.20.171,1.234.37.171,Remote Util,1.234.37.171,1234dkdlxl!,O,,HPE ProLiant DL380 Gen10,Windows Server 2019 Standard,Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz,32GB,280GB,1TB,,20220921 추정,ptc,,,,,,,
-,,,"이전 : 하수도자산 소스+프로그램 현재 : 큰길 서비스용 xampp+ PostgreSQL, BEPs",,,,,,원격데스크탑,administrator,Hanmac2141!%,,src775d3e5df,,,,,,,,,,,,,,,,
-장헌,jh-idc-001,장헌인트라넷,,서관 205번,,,211.206.127.71,192.168.10.6,Remote Util,211.206.127.71,1234dkdlxl!,잠금 걸려있음,,HPE ProLiant DL380 GEN10,Windows Server 2019,Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz,32GB,280GB,1TB,,20220921 추정,ptc,,,,,,,
-,jh-idc-002,장헌 인트라넷 예비,,동관 53번,,,1.234.37.170,192.168.20.170,Remote Util,1.234.37.170,1234dkdlxl!,"원격 X, O
-",,HPE ProLiant DL360 Gen10,Windows Server 2019,Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz 2.39GHz,32GB,280GB,1TB,,20220401 추정,장헌,,,,,,,
-,,,,,,,,,원격데스크탑,Administrator,Hanmac2141!,,,,,,,,,,,,,,,,,,
-,jh-idc-003,인트라넷(구),현재는 GIT 백업 으로 사용,서관 205번,,,211.206.127.110,192.168.10.40,Remote Util,211.206.127.110,1234dkdlxl!,,,,Windows Server 2019,Intel(R) Xeon(R) Silver 4214R CPU @ 2.40GHz,,,,,,,,,,,,,
-,,,,,,,,,원격데스크탑,User,Hanmac2141!,,,,,,,,,,,,,,,,,,
-(주)장헌,jh-idc-004,(주) 장헌 인트라넷,2025.12.23 (주) 장헌 센터 MDF에서 IDC로 이전 설치,서관 205번,,,211.206.127.76,,원격데스크탑,User,Hanmac2141!%,"win exp, raid X",DESKTOP-5IL75B7,,Windows 10,12th Gen Intel(R) Core(TM) i7-12700F,32GB,465GB,1.81TB,,,,,,,,,,
-PTC,ptc-idc-001,PTC인트라넷,"구 파일 서버(부서자료 백업용), 2024.05.22 인트라넷서버로 교체",서관 205번,,,211.206.127.72,192.168.10.7,Remote Util,211.206.127.72,1234dkdlxl!,설치 X,,SYSTEM X3650 M2,Windows Server 2008 R2,Intel(R) Xeon(R) CPU E5520 @ 2.27GHz 2.26GHz,16GB,556GB,,,,,,,,,,,
-,ptc-idc-002,예비서버,PTC 인트라넷 예비서버,서관 204번,,,192.168.10.8,,원격데스크탑,administrator,1234dkdlxl!,O,,HPE ProLiant DL360 GEN10,Windows Server 2019,Intel Xeon(R) Silver 4210R CPU @ 2.40GHz,32GB,278GB,1.09TB,,20220401 추정,장헌,,,,,,,
-,ptc-idc-003,DB 백업 서버,"구 파일 인트라넷, 2024.05.22에 DB 백업 테스트 서버로 변경 (데스크탑)",서관 205번,,,211.206.127.74,192.168.10.9,Remote Util,211.206.127.74,1234dkdlxl!,설치 X,,,Window 7,Intel(R) Core(TM)2 CPU 6400 @ 2.13GHz 2.13GHz,4GB,593GB,1.23TB,,,,,,,,,,
-바론,br-idc-001,인트라넷,,서관 205번,,,211.206.127.75,192.168.10.10,원격데스크탑,administrator,Hanmac2141!%,O,srcf0136042d,HPE ProLiant DL360 GEN10,Windows Server 2022,Intel Xeon(R) Silver 4210R CPU @ 2.40GHz,32GB,280GB,2.18TB,,20250414 추정,바론,,,,,,,
-현타,ht-idc-001,인트라넷,,동관 53번,,,1.234.37.172,192.168.20.172,원격데스크탑,administrator,Hanmac2141!,O,src901e49933,HPE ProLiant DL380 GEN10,Windows Server 2019,Intel Xeon Silver 4210R CPU @ 2.40GHz 2.39GHz,32GB,280GB,1TB,,20220921 추정,ptc,,,,,,,
-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-스토리지 목록,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
-회사,서버번호,구분,비고,설치위치,담당자,,IP 주소,,원격접속,,,,,,모델명,용량,,,,,,,,,,,,,
-,,,,,정,부,,,접속도구,아이디,비빌번호,,,,,,,,,,,,,,,,,,
-삼안,sa-das-001,,"Satis01, Satis02 광케이블 연결 (물리연결)",서관 205번,,,,,,,,,,,,,,,,,,,,,,,,,
-,sa-nas-001,인트라넷 백업 스토리지,,서관 203번,,,(IDC) 118.220.172.246,,원격,administrator,sg11707808,,,,Promiss R Series,36TB,,,,,,,,,,,,,
-,sa-nas-002,성과품 스토리지,,서관 205번,,,(IDC) 118.220.172.248,,원격,administrator,sg11707808,,,,ENC_3U_16BAY_D // SEAGATE ST2000NM0045,23TB,,,,,20190603 추정,삼안,,,,,,,
-,,,매니지먼트 접속 확인 불가 (콘솔 연결 후 페이지 오픈 필요),,,,(매니지먼트) 118.220.172.247,,원격,-,-,,,,,,,,,,,,,,,,,,
-,sa-nas-003,성과품 백업 스토리지,,서관 202번,,,(IDC) 118.220.172.241,,원격,administrator,saman1!,,,,Promiss R Series,48TB,,,,,20250313,삼안,,,,,,,
-,,,,,,,(매지니먼트) 118.220.172.240,,원격,admin0,Root1234,,,,,,,,,,,,,,,,,,
-한라,hl-das-001,,파일서버 정보 없음(접속 불가),동관 54번,,,,,,,,,,,,,,,,,20190701 추정,한라,(한라 파일서버도 동일일자 추정),,,,,,
-,hl-das-002,,,동관 54번,,,,,,,,,,,,,,,,,,,,,,,,,
\ No newline at end of file
diff --git a/backup_temp/서버목록 및 IDC 서버 위치.xlsx b/backup_temp/서버목록 및 IDC 서버 위치.xlsx
deleted file mode 100644
index 8c41508..0000000
Binary files a/backup_temp/서버목록 및 IDC 서버 위치.xlsx and /dev/null differ
diff --git a/batch_reformat_codes.js b/batch_reformat_codes.js
deleted file mode 100644
index d0ba02f..0000000
--- a/batch_reformat_codes.js
+++ /dev/null
@@ -1,124 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-
-dotenv.config();
-
-const TYPE_PREFIX_MAP = {
- '서버': 'SVR', '가상서버(VM)': 'VM', '워크스테이션': 'WKS', '서버PC': 'PC',
- '개인PC': 'PC', '공용PC': 'PC', '노트북': 'NBK', '태블릿': 'TAB',
- 'NAS': 'NAS', 'DAS': 'DAS', '스토리지': 'STO', '스토리지 렉': 'STO',
- '스위치': 'NET', '방화벽': 'NET', '공유기': 'NET', '허브': 'NET', '네트워크': 'NET',
- '모니터': 'MNT', '프린터': 'PRT', '스캐너': 'SCN', '복합기': 'MFP', '빔프로젝터': 'PRJ', '화상회의장비': 'VCF', '업무지원장비': 'EQP',
- 'CPU': 'CPU', 'HDD': 'HDD', 'RAM': 'RAM', 'GPU': 'GPU', 'SSD': 'SSD', '메인보드': 'MBD', '파워서플라이': 'PWR', '쿨러': 'CLR', '케이스': 'CAS', 'PC부품': 'PRT',
- '드론': 'DRO', '측량장비': 'SUR', '보조기기': 'SUR', '공간정보장비': 'SUR',
- '책상': 'FRN', '의자': 'FRN', '캐비닛': 'FRN', '사무가구': 'FRN',
- '구독SW': 'SW', '영구SW': 'SW', '외부': 'SW', '내부': 'INT',
- '선물': 'GFT', 'VIP': 'VIP'
-};
-
-function formatPurchaseDate(date) {
- if (!date) return '000000';
- let s = String(date).replace(/[^0-9]/g, '');
- if (s.length >= 6) {
- return s.substring(0, 6);
- }
- return '000000';
-}
-
-async function reformatAllCodes() {
- const connection = await mysql.createConnection({
- host: process.env.DB_HOST,
- user: process.env.DB_USER,
- password: process.env.DB_PASS,
- database: process.env.DB_NAME,
- port: parseInt(process.env.DB_PORT || '3306')
- });
-
- try {
- const tables = [
- 'asset_pc', 'asset_server', 'asset_network', 'asset_storage',
- 'asset_equipment', 'asset_survey', 'asset_pc_parts', 'asset_office_supplies',
- 'asset_sw_external', 'asset_sw_internal', 'asset_vip'
- ];
-
- let allAssets = [];
-
- for (const table of tables) {
- try {
- const [rows] = await connection.query(`SELECT * FROM ${table}`);
- allAssets = allAssets.concat(rows.map(r => ({ ...r, sourceTable: table })));
- } catch (err) {
- if (err.code === 'ER_NO_SUCH_TABLE') {
- console.log(`Skipping missing table: ${table}`);
- } else {
- console.error(`Error querying ${table}:`, err.message);
- }
- }
- }
-
- console.log(`Total assets loaded: ${allAssets.length}`);
-
- // Process each asset
- const processed = allAssets.map(a => {
- // 1. Determine prefix
- let prefix = 'AST';
- if (a.asset_type && TYPE_PREFIX_MAP[a.asset_type]) {
- prefix = TYPE_PREFIX_MAP[a.asset_type];
- } else if (a.category && TYPE_PREFIX_MAP[a.category]) {
- prefix = TYPE_PREFIX_MAP[a.category];
- } else if (a.sourceTable === 'asset_sw_external') prefix = 'SW';
- else if (a.sourceTable === 'asset_sw_internal') prefix = 'INT';
-
- // 2. Determine YYYYMM
- const dateStr = a.purchase_date || a.start_date || ''; // start_date for SW
- const yyyymm = formatPurchaseDate(dateStr);
-
- return { ...a, prefix, yyyymm };
- });
-
- // Group by Prefix
- const groups = {};
- processed.forEach(a => {
- if (!groups[a.prefix]) groups[a.prefix] = [];
- groups[a.prefix].push(a);
- });
-
- // Start renaming
- for (const prefix in groups) {
- const items = groups[prefix];
-
- // Sort logic to maintain some order (by date then id)
- items.sort((a, b) => {
- if (a.yyyymm !== b.yyyymm) return a.yyyymm.localeCompare(b.yyyymm);
- return String(a.id).localeCompare(String(b.id));
- });
-
- console.log(`Processing group ${prefix}: ${items.length} items`);
-
- // Temporary rename to avoid UNIQUE constraint conflicts during sequential updates
- for (const item of items) {
- const tempCode = `TEMP-${Math.random().toString(36).substring(2, 10)}-${item.id}`;
- await connection.query(`UPDATE ${item.sourceTable} SET asset_code = ? WHERE id = ?`, [tempCode, item.id]);
- }
-
- for (let i = 0; i < items.length; i++) {
- const item = items[i];
- const serial = String(i + 1).padStart(4, '0'); // SVR-202209-0001
-
- // Some formats might want 3 or 4 digits. Defaulting to 4.
- const newCode = `${prefix}-${item.yyyymm}-${serial}`;
-
- await connection.query(`UPDATE ${item.sourceTable} SET asset_code = ? WHERE id = ?`, [newCode, item.id]);
- }
- }
-
- console.log('✅ Asset codes reformatted successfully.');
-
- } catch (err) {
- console.error('❌ Reformatting failed:', err);
- } finally {
- await connection.end();
- }
-}
-
-reformatAllCodes();
diff --git a/build/pc_agent/Analysis-00.toc b/build/pc_agent/Analysis-00.toc
new file mode 100644
index 0000000..4601015
--- /dev/null
+++ b/build/pc_agent/Analysis-00.toc
@@ -0,0 +1,1834 @@
+(['D:\\이태훈\\22전산자산조사\\ITAM\\pc_agent.py'],
+ ['D:\\이태훈\\22전산자산조사\\ITAM'],
+ [],
+ [('C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\numpy\\_pyinstaller',
+ 0),
+ ('C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\playwright\\_impl\\__pyinstaller',
+ 0),
+ ('C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\stdhooks',
+ -1000),
+ ('C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib',
+ -1000)],
+ {},
+ [],
+ [],
+ False,
+ {},
+ 0,
+ [],
+ [],
+ '3.12.5 (tags/v3.12.5:ff3bc82, Aug 6 2024, 20:45:27) [MSC v.1940 64 bit '
+ '(AMD64)]',
+ [('pyi_rth_inspect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pkgutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
+ 'PYSOURCE'),
+ ('pyi_rth_multiprocessing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
+ 'PYSOURCE'),
+ ('pyi_rth_cryptography_openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_cryptography_openssl.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pywintypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pywintypes.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pythoncom',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pythoncom.py',
+ 'PYSOURCE'),
+ ('pc_agent', 'D:\\이태훈\\22전산자산조사\\ITAM\\pc_agent.py', 'PYSOURCE')],
+ [('subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\subprocess.py',
+ 'PYMODULE'),
+ ('selectors',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\selectors.py',
+ 'PYMODULE'),
+ ('contextlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\contextlib.py',
+ 'PYMODULE'),
+ ('threading',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\threading.py',
+ 'PYMODULE'),
+ ('_threading_local',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_threading_local.py',
+ 'PYMODULE'),
+ ('signal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\signal.py',
+ 'PYMODULE'),
+ ('multiprocessing.spawn',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\spawn.py',
+ 'PYMODULE'),
+ ('multiprocessing.resource_tracker',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\resource_tracker.py',
+ 'PYMODULE'),
+ ('multiprocessing.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\util.py',
+ 'PYMODULE'),
+ ('multiprocessing.forkserver',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\forkserver.py',
+ 'PYMODULE'),
+ ('multiprocessing.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\connection.py',
+ 'PYMODULE'),
+ ('multiprocessing.resource_sharer',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\resource_sharer.py',
+ 'PYMODULE'),
+ ('xmlrpc.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xmlrpc\\client.py',
+ 'PYMODULE'),
+ ('xmlrpc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xmlrpc\\__init__.py',
+ 'PYMODULE'),
+ ('gzip',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\gzip.py',
+ 'PYMODULE'),
+ ('argparse',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\argparse.py',
+ 'PYMODULE'),
+ ('textwrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\textwrap.py',
+ 'PYMODULE'),
+ ('copy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\copy.py',
+ 'PYMODULE'),
+ ('gettext',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\gettext.py',
+ 'PYMODULE'),
+ ('_compression',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_compression.py',
+ 'PYMODULE'),
+ ('xml.parsers.expat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\parsers\\expat.py',
+ 'PYMODULE'),
+ ('xml.parsers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\parsers\\__init__.py',
+ 'PYMODULE'),
+ ('xml',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\__init__.py',
+ 'PYMODULE'),
+ ('xml.sax.expatreader',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\expatreader.py',
+ 'PYMODULE'),
+ ('xml.sax.saxutils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\saxutils.py',
+ 'PYMODULE'),
+ ('urllib.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\request.py',
+ 'PYMODULE'),
+ ('urllib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\__init__.py',
+ 'PYMODULE'),
+ ('ipaddress',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ipaddress.py',
+ 'PYMODULE'),
+ ('fnmatch',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\fnmatch.py',
+ 'PYMODULE'),
+ ('getpass',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\getpass.py',
+ 'PYMODULE'),
+ ('nturl2path',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\nturl2path.py',
+ 'PYMODULE'),
+ ('ftplib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ftplib.py',
+ 'PYMODULE'),
+ ('netrc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\netrc.py',
+ 'PYMODULE'),
+ ('mimetypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\mimetypes.py',
+ 'PYMODULE'),
+ ('getopt',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\getopt.py',
+ 'PYMODULE'),
+ ('email.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\utils.py',
+ 'PYMODULE'),
+ ('email.charset',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\charset.py',
+ 'PYMODULE'),
+ ('email.encoders',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\encoders.py',
+ 'PYMODULE'),
+ ('quopri',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\quopri.py',
+ 'PYMODULE'),
+ ('email.errors',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\errors.py',
+ 'PYMODULE'),
+ ('email.quoprimime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\quoprimime.py',
+ 'PYMODULE'),
+ ('email.base64mime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\base64mime.py',
+ 'PYMODULE'),
+ ('email._parseaddr',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_parseaddr.py',
+ 'PYMODULE'),
+ ('calendar',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\calendar.py',
+ 'PYMODULE'),
+ ('random',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\random.py',
+ 'PYMODULE'),
+ ('statistics',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\statistics.py',
+ 'PYMODULE'),
+ ('fractions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\fractions.py',
+ 'PYMODULE'),
+ ('numbers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\numbers.py',
+ 'PYMODULE'),
+ ('http.cookiejar',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\cookiejar.py',
+ 'PYMODULE'),
+ ('http',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\__init__.py',
+ 'PYMODULE'),
+ ('ssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ssl.py',
+ 'PYMODULE'),
+ ('urllib.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\response.py',
+ 'PYMODULE'),
+ ('urllib.error',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\error.py',
+ 'PYMODULE'),
+ ('string',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\string.py',
+ 'PYMODULE'),
+ ('hashlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\hashlib.py',
+ 'PYMODULE'),
+ ('email',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\__init__.py',
+ 'PYMODULE'),
+ ('email.parser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\parser.py',
+ 'PYMODULE'),
+ ('email._policybase',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_policybase.py',
+ 'PYMODULE'),
+ ('email.feedparser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\feedparser.py',
+ 'PYMODULE'),
+ ('email.message',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\message.py',
+ 'PYMODULE'),
+ ('email.policy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\policy.py',
+ 'PYMODULE'),
+ ('email.contentmanager',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\contentmanager.py',
+ 'PYMODULE'),
+ ('email.headerregistry',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\headerregistry.py',
+ 'PYMODULE'),
+ ('email.iterators',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\iterators.py',
+ 'PYMODULE'),
+ ('email.generator',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\generator.py',
+ 'PYMODULE'),
+ ('email._encoded_words',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_encoded_words.py',
+ 'PYMODULE'),
+ ('email._header_value_parser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_header_value_parser.py',
+ 'PYMODULE'),
+ ('email.header',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\header.py',
+ 'PYMODULE'),
+ ('bisect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\bisect.py',
+ 'PYMODULE'),
+ ('xml.sax',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\__init__.py',
+ 'PYMODULE'),
+ ('xml.sax.handler',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\handler.py',
+ 'PYMODULE'),
+ ('xml.sax._exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\_exceptions.py',
+ 'PYMODULE'),
+ ('xml.sax.xmlreader',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\xmlreader.py',
+ 'PYMODULE'),
+ ('urllib.parse',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\parse.py',
+ 'PYMODULE'),
+ ('http.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\client.py',
+ 'PYMODULE'),
+ ('decimal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\decimal.py',
+ 'PYMODULE'),
+ ('_pydecimal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_pydecimal.py',
+ 'PYMODULE'),
+ ('contextvars',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\contextvars.py',
+ 'PYMODULE'),
+ ('datetime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\datetime.py',
+ 'PYMODULE'),
+ ('_pydatetime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_pydatetime.py',
+ 'PYMODULE'),
+ ('_strptime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_strptime.py',
+ 'PYMODULE'),
+ ('base64',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\base64.py',
+ 'PYMODULE'),
+ ('hmac',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\hmac.py',
+ 'PYMODULE'),
+ ('struct',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\struct.py',
+ 'PYMODULE'),
+ ('tempfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tempfile.py',
+ 'PYMODULE'),
+ ('shutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\shutil.py',
+ 'PYMODULE'),
+ ('zipfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\__init__.py',
+ 'PYMODULE'),
+ ('zipfile._path',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\_path\\__init__.py',
+ 'PYMODULE'),
+ ('zipfile._path.glob',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\_path\\glob.py',
+ 'PYMODULE'),
+ ('pathlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pathlib.py',
+ 'PYMODULE'),
+ ('py_compile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\py_compile.py',
+ 'PYMODULE'),
+ ('importlib.machinery',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\machinery.py',
+ 'PYMODULE'),
+ ('importlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\__init__.py',
+ 'PYMODULE'),
+ ('importlib._bootstrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_bootstrap.py',
+ 'PYMODULE'),
+ ('importlib._bootstrap_external',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_bootstrap_external.py',
+ 'PYMODULE'),
+ ('importlib.metadata',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\__init__.py',
+ 'PYMODULE'),
+ ('typing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\typing.py',
+ 'PYMODULE'),
+ ('importlib.abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\abc.py',
+ 'PYMODULE'),
+ ('importlib.resources.abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\abc.py',
+ 'PYMODULE'),
+ ('importlib.resources',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\__init__.py',
+ 'PYMODULE'),
+ ('importlib.resources._legacy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_legacy.py',
+ 'PYMODULE'),
+ ('importlib.resources._common',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_common.py',
+ 'PYMODULE'),
+ ('importlib.resources._adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_adapters.py',
+ 'PYMODULE'),
+ ('importlib._abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_abc.py',
+ 'PYMODULE'),
+ ('importlib.metadata._itertools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_itertools.py',
+ 'PYMODULE'),
+ ('importlib.metadata._functools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_functools.py',
+ 'PYMODULE'),
+ ('importlib.metadata._collections',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_collections.py',
+ 'PYMODULE'),
+ ('importlib.metadata._meta',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_meta.py',
+ 'PYMODULE'),
+ ('importlib.metadata._adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_adapters.py',
+ 'PYMODULE'),
+ ('importlib.metadata._text',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_text.py',
+ 'PYMODULE'),
+ ('inspect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\inspect.py',
+ 'PYMODULE'),
+ ('token',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\token.py',
+ 'PYMODULE'),
+ ('dis',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\dis.py',
+ 'PYMODULE'),
+ ('opcode',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\opcode.py',
+ 'PYMODULE'),
+ ('ast',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ast.py',
+ 'PYMODULE'),
+ ('csv',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\csv.py',
+ 'PYMODULE'),
+ ('importlib.readers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\readers.py',
+ 'PYMODULE'),
+ ('importlib.resources.readers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\readers.py',
+ 'PYMODULE'),
+ ('importlib.resources._itertools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_itertools.py',
+ 'PYMODULE'),
+ ('tokenize',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tokenize.py',
+ 'PYMODULE'),
+ ('importlib.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\util.py',
+ 'PYMODULE'),
+ ('tarfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tarfile.py',
+ 'PYMODULE'),
+ ('lzma',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\lzma.py',
+ 'PYMODULE'),
+ ('bz2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\bz2.py',
+ 'PYMODULE'),
+ ('logging',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\logging\\__init__.py',
+ 'PYMODULE'),
+ ('pickle',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py',
+ 'PYMODULE'),
+ ('pprint',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pprint.py',
+ 'PYMODULE'),
+ ('dataclasses',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\dataclasses.py',
+ 'PYMODULE'),
+ ('_compat_pickle',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_compat_pickle.py',
+ 'PYMODULE'),
+ ('multiprocessing.context',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\context.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_spawn_win32',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_spawn_win32.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_forkserver',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_forkserver.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_spawn_posix',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_spawn_posix.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_fork',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_fork.py',
+ 'PYMODULE'),
+ ('multiprocessing.sharedctypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\sharedctypes.py',
+ 'PYMODULE'),
+ ('multiprocessing.heap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\heap.py',
+ 'PYMODULE'),
+ ('ctypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ctypes\\__init__.py',
+ 'PYMODULE'),
+ ('ctypes._endian',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ctypes\\_endian.py',
+ 'PYMODULE'),
+ ('multiprocessing.pool',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\pool.py',
+ 'PYMODULE'),
+ ('multiprocessing.dummy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\dummy\\__init__.py',
+ 'PYMODULE'),
+ ('multiprocessing.dummy.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\dummy\\connection.py',
+ 'PYMODULE'),
+ ('queue',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\queue.py',
+ 'PYMODULE'),
+ ('multiprocessing.queues',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\queues.py',
+ 'PYMODULE'),
+ ('multiprocessing.synchronize',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\synchronize.py',
+ 'PYMODULE'),
+ ('multiprocessing.managers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\managers.py',
+ 'PYMODULE'),
+ ('multiprocessing.shared_memory',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\shared_memory.py',
+ 'PYMODULE'),
+ ('secrets',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\secrets.py',
+ 'PYMODULE'),
+ ('multiprocessing.reduction',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\reduction.py',
+ 'PYMODULE'),
+ ('multiprocessing.process',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\process.py',
+ 'PYMODULE'),
+ ('runpy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\runpy.py',
+ 'PYMODULE'),
+ ('pkgutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pkgutil.py',
+ 'PYMODULE'),
+ ('zipimport',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipimport.py',
+ 'PYMODULE'),
+ ('multiprocessing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\__init__.py',
+ 'PYMODULE'),
+ ('tracemalloc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tracemalloc.py',
+ 'PYMODULE'),
+ ('stringprep',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\stringprep.py',
+ 'PYMODULE'),
+ ('_py_abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_py_abc.py',
+ 'PYMODULE'),
+ ('platform',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\platform.py',
+ 'PYMODULE'),
+ ('socket',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\socket.py',
+ 'PYMODULE'),
+ ('json',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\__init__.py',
+ 'PYMODULE'),
+ ('json.encoder',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\encoder.py',
+ 'PYMODULE'),
+ ('json.decoder',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\decoder.py',
+ 'PYMODULE'),
+ ('json.scanner',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\scanner.py',
+ 'PYMODULE'),
+ ('requests',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\__init__.py',
+ 'PYMODULE'),
+ ('requests.status_codes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\status_codes.py',
+ 'PYMODULE'),
+ ('requests.structures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\structures.py',
+ 'PYMODULE'),
+ ('requests.compat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\compat.py',
+ 'PYMODULE'),
+ ('http.cookies',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\cookies.py',
+ 'PYMODULE'),
+ ('requests.models',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\models.py',
+ 'PYMODULE'),
+ ('idna',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\__init__.py',
+ 'PYMODULE'),
+ ('idna.package_data',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\package_data.py',
+ 'PYMODULE'),
+ ('idna.intranges',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\intranges.py',
+ 'PYMODULE'),
+ ('idna.core',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\core.py',
+ 'PYMODULE'),
+ ('idna.uts46data',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\uts46data.py',
+ 'PYMODULE'),
+ ('idna.idnadata',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\idnadata.py',
+ 'PYMODULE'),
+ ('requests.hooks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\hooks.py',
+ 'PYMODULE'),
+ ('requests.cookies',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\cookies.py',
+ 'PYMODULE'),
+ ('requests.auth',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\auth.py',
+ 'PYMODULE'),
+ ('requests._internal_utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\_internal_utils.py',
+ 'PYMODULE'),
+ ('urllib3.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.util.wait',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\wait.py',
+ 'PYMODULE'),
+ ('urllib3.util.url',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\url.py',
+ 'PYMODULE'),
+ ('urllib3.util.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\util.py',
+ 'PYMODULE'),
+ ('urllib3.util.timeout',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\timeout.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssl_',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssl_.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssltransport',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssltransport.py',
+ 'PYMODULE'),
+ ('typing_extensions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\typing_extensions.py',
+ 'PYMODULE'),
+ ('asyncio.coroutines',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\coroutines.py',
+ 'PYMODULE'),
+ ('asyncio',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\__init__.py',
+ 'PYMODULE'),
+ ('asyncio.unix_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\unix_events.py',
+ 'PYMODULE'),
+ ('asyncio.log',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\log.py',
+ 'PYMODULE'),
+ ('asyncio.windows_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\windows_events.py',
+ 'PYMODULE'),
+ ('asyncio.windows_utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\windows_utils.py',
+ 'PYMODULE'),
+ ('asyncio.selector_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\selector_events.py',
+ 'PYMODULE'),
+ ('asyncio.proactor_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\proactor_events.py',
+ 'PYMODULE'),
+ ('asyncio.base_subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_subprocess.py',
+ 'PYMODULE'),
+ ('asyncio.threads',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\threads.py',
+ 'PYMODULE'),
+ ('asyncio.taskgroups',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\taskgroups.py',
+ 'PYMODULE'),
+ ('asyncio.subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\subprocess.py',
+ 'PYMODULE'),
+ ('asyncio.streams',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\streams.py',
+ 'PYMODULE'),
+ ('asyncio.queues',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\queues.py',
+ 'PYMODULE'),
+ ('asyncio.runners',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\runners.py',
+ 'PYMODULE'),
+ ('asyncio.base_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py',
+ 'PYMODULE'),
+ ('concurrent.futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\__init__.py',
+ 'PYMODULE'),
+ ('concurrent.futures.thread',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\thread.py',
+ 'PYMODULE'),
+ ('concurrent.futures.process',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\process.py',
+ 'PYMODULE'),
+ ('concurrent.futures._base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\_base.py',
+ 'PYMODULE'),
+ ('concurrent',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\__init__.py',
+ 'PYMODULE'),
+ ('asyncio.trsock',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\trsock.py',
+ 'PYMODULE'),
+ ('asyncio.staggered',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\staggered.py',
+ 'PYMODULE'),
+ ('asyncio.timeouts',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\timeouts.py',
+ 'PYMODULE'),
+ ('asyncio.tasks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\tasks.py',
+ 'PYMODULE'),
+ ('asyncio.base_tasks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_tasks.py',
+ 'PYMODULE'),
+ ('asyncio.locks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\locks.py',
+ 'PYMODULE'),
+ ('asyncio.mixins',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\mixins.py',
+ 'PYMODULE'),
+ ('asyncio.sslproto',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\sslproto.py',
+ 'PYMODULE'),
+ ('asyncio.transports',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\transports.py',
+ 'PYMODULE'),
+ ('asyncio.protocols',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\protocols.py',
+ 'PYMODULE'),
+ ('asyncio.futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\futures.py',
+ 'PYMODULE'),
+ ('asyncio.base_futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_futures.py',
+ 'PYMODULE'),
+ ('asyncio.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\exceptions.py',
+ 'PYMODULE'),
+ ('asyncio.events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\events.py',
+ 'PYMODULE'),
+ ('asyncio.format_helpers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\format_helpers.py',
+ 'PYMODULE'),
+ ('asyncio.constants',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\constants.py',
+ 'PYMODULE'),
+ ('urllib3.util.retry',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\retry.py',
+ 'PYMODULE'),
+ ('urllib3.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\response.py',
+ 'PYMODULE'),
+ ('urllib3.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssl_match_hostname',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssl_match_hostname.py',
+ 'PYMODULE'),
+ ('urllib3._version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_version.py',
+ 'PYMODULE'),
+ ('urllib3.http2.probe',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\probe.py',
+ 'PYMODULE'),
+ ('urllib3.http2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.http2.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\connection.py',
+ 'PYMODULE'),
+ ('urllib3._collections',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_collections.py',
+ 'PYMODULE'),
+ ('urllib3._base_connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_base_connection.py',
+ 'PYMODULE'),
+ ('urllib3.connectionpool',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\connectionpool.py',
+ 'PYMODULE'),
+ ('urllib3.util.proxy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\proxy.py',
+ 'PYMODULE'),
+ ('urllib3._request_methods',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_request_methods.py',
+ 'PYMODULE'),
+ ('urllib3.util.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\response.py',
+ 'PYMODULE'),
+ ('urllib3.util.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\request.py',
+ 'PYMODULE'),
+ ('urllib3.util.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\connection.py',
+ 'PYMODULE'),
+ ('__future__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\__future__.py',
+ 'PYMODULE'),
+ ('urllib3.filepost',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\filepost.py',
+ 'PYMODULE'),
+ ('urllib3.fields',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\fields.py',
+ 'PYMODULE'),
+ ('requests.api',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\api.py',
+ 'PYMODULE'),
+ ('requests.sessions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\sessions.py',
+ 'PYMODULE'),
+ ('requests.adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\adapters.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.socks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\socks.py',
+ 'PYMODULE'),
+ ('socks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\socks.py',
+ 'PYMODULE'),
+ ('urllib3.poolmanager',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\poolmanager.py',
+ 'PYMODULE'),
+ ('requests.__version__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\__version__.py',
+ 'PYMODULE'),
+ ('requests.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\utils.py',
+ 'PYMODULE'),
+ ('requests.certs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\certs.py',
+ 'PYMODULE'),
+ ('certifi',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\__init__.py',
+ 'PYMODULE'),
+ ('certifi.core',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\core.py',
+ 'PYMODULE'),
+ ('requests.packages',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\packages.py',
+ 'PYMODULE'),
+ ('urllib3.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\exceptions.py',
+ 'PYMODULE'),
+ ('cryptography',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl.binding',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\binding.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\exceptions.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl._conditional',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\_conditional.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends.openssl.backend',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\openssl\\backend.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.modes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\modes.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._cipheralgorithm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_cipheralgorithm.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.algorithms',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\algorithms.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit.ciphers.algorithms',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\ciphers\\algorithms.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit.ciphers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\ciphers\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\base.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.padding',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\padding.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.rsa',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\rsa.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._serialization',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_serialization.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\utils.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ec.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat._oid',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\_oid.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.dh',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\dh.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.x25519',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\x25519.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.x448',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\x448.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ed25519',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ed25519.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ed448',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ed448.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.dsa',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\dsa.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._asymmetric',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_asymmetric.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.hashes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\hashes.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization.ssh',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\ssh.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\base.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.constant_time',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\constant_time.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends.openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\openssl\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.x509',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.x509.oid',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\oid.py',
+ 'PYMODULE'),
+ ('cryptography.x509.name',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\name.py',
+ 'PYMODULE'),
+ ('cryptography.x509.general_name',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\general_name.py',
+ 'PYMODULE'),
+ ('cryptography.x509.extensions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\extensions.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.types',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\types.py',
+ 'PYMODULE'),
+ ('cryptography.x509.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\base.py',
+ 'PYMODULE'),
+ ('cryptography.x509.verification',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\verification.py',
+ 'PYMODULE'),
+ ('cryptography.x509.certificate_transparency',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\certificate_transparency.py',
+ 'PYMODULE'),
+ ('cryptography.__about__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\__about__.py',
+ 'PYMODULE'),
+ ('cryptography.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\utils.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.pyopenssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\pyopenssl.py',
+ 'PYMODULE'),
+ ('urllib3.contrib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\__init__.py',
+ 'PYMODULE'),
+ ('chardet',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\__init__.py',
+ 'PYMODULE'),
+ ('chardet.version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\version.py',
+ 'PYMODULE'),
+ ('chardet.universaldetector',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\universaldetector.py',
+ 'PYMODULE'),
+ ('chardet.utf1632prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\utf1632prober.py',
+ 'PYMODULE'),
+ ('chardet.sbcsgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sbcsgroupprober.py',
+ 'PYMODULE'),
+ ('chardet.sbcharsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sbcharsetprober.py',
+ 'PYMODULE'),
+ ('chardet.langturkishmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langturkishmodel.py',
+ 'PYMODULE'),
+ ('chardet.langthaimodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langthaimodel.py',
+ 'PYMODULE'),
+ ('chardet.langrussianmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langrussianmodel.py',
+ 'PYMODULE'),
+ ('chardet.langhebrewmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langhebrewmodel.py',
+ 'PYMODULE'),
+ ('chardet.langgreekmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langgreekmodel.py',
+ 'PYMODULE'),
+ ('chardet.langbulgarianmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langbulgarianmodel.py',
+ 'PYMODULE'),
+ ('chardet.hebrewprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\hebrewprober.py',
+ 'PYMODULE'),
+ ('chardet.mbcsgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcsgroupprober.py',
+ 'PYMODULE'),
+ ('chardet.utf8prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\utf8prober.py',
+ 'PYMODULE'),
+ ('chardet.mbcssm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcssm.py',
+ 'PYMODULE'),
+ ('chardet.codingstatemachinedict',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\codingstatemachinedict.py',
+ 'PYMODULE'),
+ ('chardet.codingstatemachine',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\codingstatemachine.py',
+ 'PYMODULE'),
+ ('chardet.sjisprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sjisprober.py',
+ 'PYMODULE'),
+ ('chardet.mbcharsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcharsetprober.py',
+ 'PYMODULE'),
+ ('chardet.jpcntx',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\jpcntx.py',
+ 'PYMODULE'),
+ ('chardet.chardistribution',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\chardistribution.py',
+ 'PYMODULE'),
+ ('chardet.johabfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\johabfreq.py',
+ 'PYMODULE'),
+ ('chardet.jisfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\jisfreq.py',
+ 'PYMODULE'),
+ ('chardet.gb2312freq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\gb2312freq.py',
+ 'PYMODULE'),
+ ('chardet.euctwfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euctwfreq.py',
+ 'PYMODULE'),
+ ('chardet.euckrfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euckrfreq.py',
+ 'PYMODULE'),
+ ('chardet.big5freq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\big5freq.py',
+ 'PYMODULE'),
+ ('chardet.johabprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\johabprober.py',
+ 'PYMODULE'),
+ ('chardet.gb2312prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\gb2312prober.py',
+ 'PYMODULE'),
+ ('chardet.euctwprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euctwprober.py',
+ 'PYMODULE'),
+ ('chardet.euckrprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euckrprober.py',
+ 'PYMODULE'),
+ ('chardet.eucjpprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\eucjpprober.py',
+ 'PYMODULE'),
+ ('chardet.cp949prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\cp949prober.py',
+ 'PYMODULE'),
+ ('chardet.big5prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\big5prober.py',
+ 'PYMODULE'),
+ ('chardet.macromanprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\macromanprober.py',
+ 'PYMODULE'),
+ ('chardet.latin1prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\latin1prober.py',
+ 'PYMODULE'),
+ ('chardet.escprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\escprober.py',
+ 'PYMODULE'),
+ ('chardet.escsm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\escsm.py',
+ 'PYMODULE'),
+ ('chardet.resultdict',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\resultdict.py',
+ 'PYMODULE'),
+ ('chardet.enums',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\enums.py',
+ 'PYMODULE'),
+ ('chardet.charsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\charsetprober.py',
+ 'PYMODULE'),
+ ('chardet.charsetgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\charsetgroupprober.py',
+ 'PYMODULE'),
+ ('charset_normalizer',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\__init__.py',
+ 'PYMODULE'),
+ ('charset_normalizer.version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\version.py',
+ 'PYMODULE'),
+ ('charset_normalizer.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\utils.py',
+ 'PYMODULE'),
+ ('charset_normalizer.constant',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\constant.py',
+ 'PYMODULE'),
+ ('charset_normalizer.models',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\models.py',
+ 'PYMODULE'),
+ ('charset_normalizer.cd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\cd.py',
+ 'PYMODULE'),
+ ('charset_normalizer.legacy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\legacy.py',
+ 'PYMODULE'),
+ ('charset_normalizer.api',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\api.py',
+ 'PYMODULE'),
+ ('requests.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\exceptions.py',
+ 'PYMODULE'),
+ ('urllib3',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\response.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\request.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.fetch',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\fetch.py',
+ 'PYMODULE'),
+ ('wmi',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\wmi.py',
+ 'PYMODULE'),
+ ('pywintypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\pywintypes.py',
+ 'PYMODULE'),
+ ('pywin32_system32', '-', 'PYMODULE'),
+ ('win32com.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\__init__.py',
+ 'PYMODULE'),
+ ('winerror',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\winerror.py',
+ 'PYMODULE'),
+ ('win32com.client.makepy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\makepy.py',
+ 'PYMODULE'),
+ ('pywin.dialogs.status',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\status.py',
+ 'PYMODULE'),
+ ('pywin.mfc.thread',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\thread.py',
+ 'PYMODULE'),
+ ('pywin.mfc.object',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\object.py',
+ 'PYMODULE'),
+ ('pywin.mfc.dialog',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\dialog.py',
+ 'PYMODULE'),
+ ('pywin.mfc.window',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\window.py',
+ 'PYMODULE'),
+ ('pywin.mfc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\__init__.py',
+ 'PYMODULE'),
+ ('win32con',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\win32con.py',
+ 'PYMODULE'),
+ ('pywin.dialogs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\__init__.py',
+ 'PYMODULE'),
+ ('pywin',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.client.selecttlb',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\selecttlb.py',
+ 'PYMODULE'),
+ ('pywin.dialogs.list',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\list.py',
+ 'PYMODULE'),
+ ('commctrl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\commctrl.py',
+ 'PYMODULE'),
+ ('win32com.client.genpy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\genpy.py',
+ 'PYMODULE'),
+ ('win32com.client.gencache',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\gencache.py',
+ 'PYMODULE'),
+ ('glob',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\glob.py',
+ 'PYMODULE'),
+ ('win32com.client.CLSIDToClass',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\CLSIDToClass.py',
+ 'PYMODULE'),
+ ('win32com.client.dynamic',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\dynamic.py',
+ 'PYMODULE'),
+ ('win32com.client.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\util.py',
+ 'PYMODULE'),
+ ('win32com.client.build',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\build.py',
+ 'PYMODULE'),
+ ('win32com',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.server.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\util.py',
+ 'PYMODULE'),
+ ('win32com.server.dispatcher',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\dispatcher.py',
+ 'PYMODULE'),
+ ('win32traceutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\win32traceutil.py',
+ 'PYMODULE'),
+ ('win32com.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\util.py',
+ 'PYMODULE'),
+ ('win32com.server.exception',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\exception.py',
+ 'PYMODULE'),
+ ('win32com.server.policy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\policy.py',
+ 'PYMODULE'),
+ ('win32com.server',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.universal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\universal.py',
+ 'PYMODULE'),
+ ('pythoncom',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pythoncom.py',
+ 'PYMODULE')],
+ [('python312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pywintypes312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pywintypes312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pythoncom312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pythoncom312.dll',
+ 'BINARY'),
+ ('select.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\select.pyd',
+ 'EXTENSION'),
+ ('_multiprocessing.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_multiprocessing.pyd',
+ 'EXTENSION'),
+ ('pyexpat.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\pyexpat.pyd',
+ 'EXTENSION'),
+ ('_ssl.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ssl.pyd',
+ 'EXTENSION'),
+ ('_hashlib.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_hashlib.pyd',
+ 'EXTENSION'),
+ ('unicodedata.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\unicodedata.pyd',
+ 'EXTENSION'),
+ ('_decimal.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_decimal.pyd',
+ 'EXTENSION'),
+ ('_lzma.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_lzma.pyd',
+ 'EXTENSION'),
+ ('_bz2.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_bz2.pyd',
+ 'EXTENSION'),
+ ('_ctypes.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ctypes.pyd',
+ 'EXTENSION'),
+ ('_queue.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_queue.pyd',
+ 'EXTENSION'),
+ ('_wmi.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_wmi.pyd',
+ 'EXTENSION'),
+ ('_socket.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_socket.pyd',
+ 'EXTENSION'),
+ ('_overlapped.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_overlapped.pyd',
+ 'EXTENSION'),
+ ('_asyncio.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_asyncio.pyd',
+ 'EXTENSION'),
+ ('_cffi_backend.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_cffi_backend.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('win32\\_win32sysloader.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\_win32sysloader.pyd',
+ 'EXTENSION'),
+ ('win32\\win32api.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32api.pyd',
+ 'EXTENSION'),
+ ('Pythonwin\\win32ui.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\win32ui.pyd',
+ 'EXTENSION'),
+ ('win32\\win32event.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32event.pyd',
+ 'EXTENSION'),
+ ('win32\\win32trace.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32trace.pyd',
+ 'EXTENSION'),
+ ('VCRUNTIME140.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140.dll',
+ 'BINARY'),
+ ('VCRUNTIME140_1.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140_1.dll',
+ 'BINARY'),
+ ('libssl-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libssl-3.dll',
+ 'BINARY'),
+ ('libcrypto-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libcrypto-3.dll',
+ 'BINARY'),
+ ('libffi-8.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libffi-8.dll',
+ 'BINARY'),
+ ('python3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python3.dll',
+ 'BINARY'),
+ ('Pythonwin\\mfc140u.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\mfc140u.dll',
+ 'BINARY')],
+ [],
+ [],
+ [('certifi\\cacert.pem',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\cacert.pem',
+ 'DATA'),
+ ('certifi\\py.typed',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\py.typed',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\RECORD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\RECORD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\METADATA',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\METADATA',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\WHEEL',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\WHEEL',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\INSTALLER',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\INSTALLER',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'DATA'),
+ ('base_library.zip',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\base_library.zip',
+ 'DATA')],
+ [('posixpath',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\posixpath.py',
+ 'PYMODULE'),
+ ('functools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\functools.py',
+ 'PYMODULE'),
+ ('warnings',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\warnings.py',
+ 'PYMODULE'),
+ ('io',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\io.py',
+ 'PYMODULE'),
+ ('stat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\stat.py',
+ 'PYMODULE'),
+ ('os',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\os.py',
+ 'PYMODULE'),
+ ('sre_constants',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\sre_constants.py',
+ 'PYMODULE'),
+ ('codecs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\codecs.py',
+ 'PYMODULE'),
+ ('_collections_abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_collections_abc.py',
+ 'PYMODULE'),
+ ('heapq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\heapq.py',
+ 'PYMODULE'),
+ ('ntpath',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ntpath.py',
+ 'PYMODULE'),
+ ('linecache',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\linecache.py',
+ 'PYMODULE'),
+ ('_weakrefset',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_weakrefset.py',
+ 'PYMODULE'),
+ ('sre_parse',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\sre_parse.py',
+ 'PYMODULE'),
+ ('re._parser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\re\\_parser.py',
+ 'PYMODULE'),
+ ('re._constants',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\re\\_constants.py',
+ 'PYMODULE'),
+ ('re._compiler',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\re\\_compiler.py',
+ 'PYMODULE'),
+ ('re._casefix',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\re\\_casefix.py',
+ 'PYMODULE'),
+ ('re',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\re\\__init__.py',
+ 'PYMODULE'),
+ ('traceback',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\traceback.py',
+ 'PYMODULE'),
+ ('weakref',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\weakref.py',
+ 'PYMODULE'),
+ ('keyword',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\keyword.py',
+ 'PYMODULE'),
+ ('copyreg',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\copyreg.py',
+ 'PYMODULE'),
+ ('reprlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\reprlib.py',
+ 'PYMODULE'),
+ ('enum',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\enum.py',
+ 'PYMODULE'),
+ ('encodings.zlib_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\zlib_codec.py',
+ 'PYMODULE'),
+ ('encodings.uu_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\uu_codec.py',
+ 'PYMODULE'),
+ ('encodings.utf_8_sig',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_8_sig.py',
+ 'PYMODULE'),
+ ('encodings.utf_8',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_8.py',
+ 'PYMODULE'),
+ ('encodings.utf_7',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_7.py',
+ 'PYMODULE'),
+ ('encodings.utf_32_le',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_32_le.py',
+ 'PYMODULE'),
+ ('encodings.utf_32_be',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_32_be.py',
+ 'PYMODULE'),
+ ('encodings.utf_32',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_32.py',
+ 'PYMODULE'),
+ ('encodings.utf_16_le',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_16_le.py',
+ 'PYMODULE'),
+ ('encodings.utf_16_be',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_16_be.py',
+ 'PYMODULE'),
+ ('encodings.utf_16',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\utf_16.py',
+ 'PYMODULE'),
+ ('encodings.unicode_escape',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\unicode_escape.py',
+ 'PYMODULE'),
+ ('encodings.undefined',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\undefined.py',
+ 'PYMODULE'),
+ ('encodings.tis_620',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\tis_620.py',
+ 'PYMODULE'),
+ ('encodings.shift_jisx0213',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\shift_jisx0213.py',
+ 'PYMODULE'),
+ ('encodings.shift_jis_2004',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\shift_jis_2004.py',
+ 'PYMODULE'),
+ ('encodings.shift_jis',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\shift_jis.py',
+ 'PYMODULE'),
+ ('encodings.rot_13',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\rot_13.py',
+ 'PYMODULE'),
+ ('encodings.raw_unicode_escape',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\raw_unicode_escape.py',
+ 'PYMODULE'),
+ ('encodings.quopri_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\quopri_codec.py',
+ 'PYMODULE'),
+ ('encodings.punycode',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\punycode.py',
+ 'PYMODULE'),
+ ('encodings.ptcp154',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\ptcp154.py',
+ 'PYMODULE'),
+ ('encodings.palmos',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\palmos.py',
+ 'PYMODULE'),
+ ('encodings.oem',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\oem.py',
+ 'PYMODULE'),
+ ('encodings.mbcs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mbcs.py',
+ 'PYMODULE'),
+ ('encodings.mac_turkish',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_turkish.py',
+ 'PYMODULE'),
+ ('encodings.mac_romanian',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_romanian.py',
+ 'PYMODULE'),
+ ('encodings.mac_roman',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_roman.py',
+ 'PYMODULE'),
+ ('encodings.mac_latin2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_latin2.py',
+ 'PYMODULE'),
+ ('encodings.mac_iceland',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_iceland.py',
+ 'PYMODULE'),
+ ('encodings.mac_greek',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_greek.py',
+ 'PYMODULE'),
+ ('encodings.mac_farsi',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_farsi.py',
+ 'PYMODULE'),
+ ('encodings.mac_cyrillic',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_cyrillic.py',
+ 'PYMODULE'),
+ ('encodings.mac_croatian',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_croatian.py',
+ 'PYMODULE'),
+ ('encodings.mac_arabic',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\mac_arabic.py',
+ 'PYMODULE'),
+ ('encodings.latin_1',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\latin_1.py',
+ 'PYMODULE'),
+ ('encodings.kz1048',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\kz1048.py',
+ 'PYMODULE'),
+ ('encodings.koi8_u',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\koi8_u.py',
+ 'PYMODULE'),
+ ('encodings.koi8_t',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\koi8_t.py',
+ 'PYMODULE'),
+ ('encodings.koi8_r',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\koi8_r.py',
+ 'PYMODULE'),
+ ('encodings.johab',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\johab.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_9',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_9.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_8',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_8.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_7',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_7.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_6',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_6.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_5',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_5.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_4',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_4.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_3',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_3.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_2.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_16',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_16.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_15',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_15.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_14',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_14.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_13',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_13.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_11',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_11.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_10',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_10.py',
+ 'PYMODULE'),
+ ('encodings.iso8859_1',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso8859_1.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_kr',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_kr.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp_ext',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp_ext.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp_3',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp_3.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp_2004',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp_2004.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp_2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp_2.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp_1',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp_1.py',
+ 'PYMODULE'),
+ ('encodings.iso2022_jp',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\iso2022_jp.py',
+ 'PYMODULE'),
+ ('encodings.idna',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\idna.py',
+ 'PYMODULE'),
+ ('encodings.hz',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\hz.py',
+ 'PYMODULE'),
+ ('encodings.hp_roman8',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\hp_roman8.py',
+ 'PYMODULE'),
+ ('encodings.hex_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\hex_codec.py',
+ 'PYMODULE'),
+ ('encodings.gbk',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\gbk.py',
+ 'PYMODULE'),
+ ('encodings.gb2312',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\gb2312.py',
+ 'PYMODULE'),
+ ('encodings.gb18030',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\gb18030.py',
+ 'PYMODULE'),
+ ('encodings.euc_kr',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\euc_kr.py',
+ 'PYMODULE'),
+ ('encodings.euc_jp',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\euc_jp.py',
+ 'PYMODULE'),
+ ('encodings.euc_jisx0213',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\euc_jisx0213.py',
+ 'PYMODULE'),
+ ('encodings.euc_jis_2004',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\euc_jis_2004.py',
+ 'PYMODULE'),
+ ('encodings.cp950',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp950.py',
+ 'PYMODULE'),
+ ('encodings.cp949',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp949.py',
+ 'PYMODULE'),
+ ('encodings.cp932',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp932.py',
+ 'PYMODULE'),
+ ('encodings.cp875',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp875.py',
+ 'PYMODULE'),
+ ('encodings.cp874',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp874.py',
+ 'PYMODULE'),
+ ('encodings.cp869',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp869.py',
+ 'PYMODULE'),
+ ('encodings.cp866',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp866.py',
+ 'PYMODULE'),
+ ('encodings.cp865',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp865.py',
+ 'PYMODULE'),
+ ('encodings.cp864',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp864.py',
+ 'PYMODULE'),
+ ('encodings.cp863',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp863.py',
+ 'PYMODULE'),
+ ('encodings.cp862',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp862.py',
+ 'PYMODULE'),
+ ('encodings.cp861',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp861.py',
+ 'PYMODULE'),
+ ('encodings.cp860',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp860.py',
+ 'PYMODULE'),
+ ('encodings.cp858',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp858.py',
+ 'PYMODULE'),
+ ('encodings.cp857',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp857.py',
+ 'PYMODULE'),
+ ('encodings.cp856',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp856.py',
+ 'PYMODULE'),
+ ('encodings.cp855',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp855.py',
+ 'PYMODULE'),
+ ('encodings.cp852',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp852.py',
+ 'PYMODULE'),
+ ('encodings.cp850',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp850.py',
+ 'PYMODULE'),
+ ('encodings.cp775',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp775.py',
+ 'PYMODULE'),
+ ('encodings.cp737',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp737.py',
+ 'PYMODULE'),
+ ('encodings.cp720',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp720.py',
+ 'PYMODULE'),
+ ('encodings.cp500',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp500.py',
+ 'PYMODULE'),
+ ('encodings.cp437',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp437.py',
+ 'PYMODULE'),
+ ('encodings.cp424',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp424.py',
+ 'PYMODULE'),
+ ('encodings.cp273',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp273.py',
+ 'PYMODULE'),
+ ('encodings.cp1258',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1258.py',
+ 'PYMODULE'),
+ ('encodings.cp1257',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1257.py',
+ 'PYMODULE'),
+ ('encodings.cp1256',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1256.py',
+ 'PYMODULE'),
+ ('encodings.cp1255',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1255.py',
+ 'PYMODULE'),
+ ('encodings.cp1254',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1254.py',
+ 'PYMODULE'),
+ ('encodings.cp1253',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1253.py',
+ 'PYMODULE'),
+ ('encodings.cp1252',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1252.py',
+ 'PYMODULE'),
+ ('encodings.cp1251',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1251.py',
+ 'PYMODULE'),
+ ('encodings.cp1250',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1250.py',
+ 'PYMODULE'),
+ ('encodings.cp1140',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1140.py',
+ 'PYMODULE'),
+ ('encodings.cp1125',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1125.py',
+ 'PYMODULE'),
+ ('encodings.cp1026',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1026.py',
+ 'PYMODULE'),
+ ('encodings.cp1006',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp1006.py',
+ 'PYMODULE'),
+ ('encodings.cp037',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\cp037.py',
+ 'PYMODULE'),
+ ('encodings.charmap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\charmap.py',
+ 'PYMODULE'),
+ ('encodings.bz2_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\bz2_codec.py',
+ 'PYMODULE'),
+ ('encodings.big5hkscs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\big5hkscs.py',
+ 'PYMODULE'),
+ ('encodings.big5',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\big5.py',
+ 'PYMODULE'),
+ ('encodings.base64_codec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\base64_codec.py',
+ 'PYMODULE'),
+ ('encodings.ascii',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\ascii.py',
+ 'PYMODULE'),
+ ('encodings.aliases',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\aliases.py',
+ 'PYMODULE'),
+ ('encodings',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\encodings\\__init__.py',
+ 'PYMODULE'),
+ ('operator',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\operator.py',
+ 'PYMODULE'),
+ ('genericpath',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\genericpath.py',
+ 'PYMODULE'),
+ ('types',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\types.py',
+ 'PYMODULE'),
+ ('abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\abc.py',
+ 'PYMODULE'),
+ ('collections.abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\collections\\abc.py',
+ 'PYMODULE'),
+ ('collections',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\collections\\__init__.py',
+ 'PYMODULE'),
+ ('sre_compile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\sre_compile.py',
+ 'PYMODULE'),
+ ('locale',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\locale.py',
+ 'PYMODULE')])
diff --git a/build/pc_agent/EXE-00.toc b/build/pc_agent/EXE-00.toc
new file mode 100644
index 0000000..2574201
--- /dev/null
+++ b/build/pc_agent/EXE-00.toc
@@ -0,0 +1,211 @@
+('D:\\이태훈\\22전산자산조사\\ITAM\\dist\\pc_agent.exe',
+ True,
+ False,
+ False,
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\images\\icon-console.ico',
+ None,
+ False,
+ False,
+ b'\n\n \n \n \n \n \n \n \n '
+ b'\n <'
+ b'application>\n \n \n '
+ b' \n \n \n \n <'
+ b'/compatibility>\n '
+ b'\n \n true\n \n \n \n \n \n \n \n',
+ True,
+ False,
+ None,
+ None,
+ None,
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\pc_agent.pkg',
+ [('pyi-contents-directory _internal', '', 'OPTION'),
+ ('PYZ-00.pyz', 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\PYZ-00.pyz', 'PYZ'),
+ ('struct',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\struct.pyc',
+ 'PYMODULE'),
+ ('pyimod01_archive',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod01_archive.pyc',
+ 'PYMODULE'),
+ ('pyimod02_importers',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod02_importers.pyc',
+ 'PYMODULE'),
+ ('pyimod03_ctypes',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod03_ctypes.pyc',
+ 'PYMODULE'),
+ ('pyimod04_pywin32',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod04_pywin32.pyc',
+ 'PYMODULE'),
+ ('pyiboot01_bootstrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
+ 'PYSOURCE'),
+ ('pyi_rth_inspect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pkgutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
+ 'PYSOURCE'),
+ ('pyi_rth_multiprocessing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
+ 'PYSOURCE'),
+ ('pyi_rth_cryptography_openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_cryptography_openssl.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pywintypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pywintypes.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pythoncom',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pythoncom.py',
+ 'PYSOURCE'),
+ ('pc_agent', 'D:\\이태훈\\22전산자산조사\\ITAM\\pc_agent.py', 'PYSOURCE'),
+ ('python312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pywintypes312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pywintypes312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pythoncom312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pythoncom312.dll',
+ 'BINARY'),
+ ('select.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\select.pyd',
+ 'EXTENSION'),
+ ('_multiprocessing.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_multiprocessing.pyd',
+ 'EXTENSION'),
+ ('pyexpat.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\pyexpat.pyd',
+ 'EXTENSION'),
+ ('_ssl.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ssl.pyd',
+ 'EXTENSION'),
+ ('_hashlib.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_hashlib.pyd',
+ 'EXTENSION'),
+ ('unicodedata.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\unicodedata.pyd',
+ 'EXTENSION'),
+ ('_decimal.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_decimal.pyd',
+ 'EXTENSION'),
+ ('_lzma.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_lzma.pyd',
+ 'EXTENSION'),
+ ('_bz2.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_bz2.pyd',
+ 'EXTENSION'),
+ ('_ctypes.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ctypes.pyd',
+ 'EXTENSION'),
+ ('_queue.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_queue.pyd',
+ 'EXTENSION'),
+ ('_wmi.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_wmi.pyd',
+ 'EXTENSION'),
+ ('_socket.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_socket.pyd',
+ 'EXTENSION'),
+ ('_overlapped.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_overlapped.pyd',
+ 'EXTENSION'),
+ ('_asyncio.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_asyncio.pyd',
+ 'EXTENSION'),
+ ('_cffi_backend.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_cffi_backend.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('win32\\_win32sysloader.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\_win32sysloader.pyd',
+ 'EXTENSION'),
+ ('win32\\win32api.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32api.pyd',
+ 'EXTENSION'),
+ ('Pythonwin\\win32ui.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\win32ui.pyd',
+ 'EXTENSION'),
+ ('win32\\win32event.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32event.pyd',
+ 'EXTENSION'),
+ ('win32\\win32trace.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32trace.pyd',
+ 'EXTENSION'),
+ ('VCRUNTIME140.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140.dll',
+ 'BINARY'),
+ ('VCRUNTIME140_1.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140_1.dll',
+ 'BINARY'),
+ ('libssl-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libssl-3.dll',
+ 'BINARY'),
+ ('libcrypto-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libcrypto-3.dll',
+ 'BINARY'),
+ ('libffi-8.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libffi-8.dll',
+ 'BINARY'),
+ ('python3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python3.dll',
+ 'BINARY'),
+ ('Pythonwin\\mfc140u.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\mfc140u.dll',
+ 'BINARY'),
+ ('certifi\\cacert.pem',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\cacert.pem',
+ 'DATA'),
+ ('certifi\\py.typed',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\py.typed',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\RECORD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\RECORD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\METADATA',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\METADATA',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\WHEEL',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\WHEEL',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\INSTALLER',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\INSTALLER',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'DATA'),
+ ('base_library.zip',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\base_library.zip',
+ 'DATA')],
+ [],
+ False,
+ False,
+ 1779102721,
+ [('run.exe',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\bootloader\\Windows-64bit-intel\\run.exe',
+ 'EXECUTABLE')],
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python312.dll')
diff --git a/build/pc_agent/PKG-00.toc b/build/pc_agent/PKG-00.toc
new file mode 100644
index 0000000..1cac0c0
--- /dev/null
+++ b/build/pc_agent/PKG-00.toc
@@ -0,0 +1,189 @@
+('D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\pc_agent.pkg',
+ {'BINARY': True,
+ 'DATA': True,
+ 'EXECUTABLE': True,
+ 'EXTENSION': True,
+ 'PYMODULE': True,
+ 'PYSOURCE': True,
+ 'PYZ': False,
+ 'SPLASH': True,
+ 'SYMLINK': False},
+ [('pyi-contents-directory _internal', '', 'OPTION'),
+ ('PYZ-00.pyz', 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\PYZ-00.pyz', 'PYZ'),
+ ('struct',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\struct.pyc',
+ 'PYMODULE'),
+ ('pyimod01_archive',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod01_archive.pyc',
+ 'PYMODULE'),
+ ('pyimod02_importers',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod02_importers.pyc',
+ 'PYMODULE'),
+ ('pyimod03_ctypes',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod03_ctypes.pyc',
+ 'PYMODULE'),
+ ('pyimod04_pywin32',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\localpycs\\pyimod04_pywin32.pyc',
+ 'PYMODULE'),
+ ('pyiboot01_bootstrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\loader\\pyiboot01_bootstrap.py',
+ 'PYSOURCE'),
+ ('pyi_rth_inspect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_inspect.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pkgutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_pkgutil.py',
+ 'PYSOURCE'),
+ ('pyi_rth_multiprocessing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\PyInstaller\\hooks\\rthooks\\pyi_rth_multiprocessing.py',
+ 'PYSOURCE'),
+ ('pyi_rth_cryptography_openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_cryptography_openssl.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pywintypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pywintypes.py',
+ 'PYSOURCE'),
+ ('pyi_rth_pythoncom',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_pyinstaller_hooks_contrib\\rthooks\\pyi_rth_pythoncom.py',
+ 'PYSOURCE'),
+ ('pc_agent', 'D:\\이태훈\\22전산자산조사\\ITAM\\pc_agent.py', 'PYSOURCE'),
+ ('python312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pywintypes312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pywintypes312.dll',
+ 'BINARY'),
+ ('pywin32_system32\\pythoncom312.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pywin32_system32\\pythoncom312.dll',
+ 'BINARY'),
+ ('select.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\select.pyd',
+ 'EXTENSION'),
+ ('_multiprocessing.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_multiprocessing.pyd',
+ 'EXTENSION'),
+ ('pyexpat.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\pyexpat.pyd',
+ 'EXTENSION'),
+ ('_ssl.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ssl.pyd',
+ 'EXTENSION'),
+ ('_hashlib.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_hashlib.pyd',
+ 'EXTENSION'),
+ ('unicodedata.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\unicodedata.pyd',
+ 'EXTENSION'),
+ ('_decimal.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_decimal.pyd',
+ 'EXTENSION'),
+ ('_lzma.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_lzma.pyd',
+ 'EXTENSION'),
+ ('_bz2.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_bz2.pyd',
+ 'EXTENSION'),
+ ('_ctypes.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_ctypes.pyd',
+ 'EXTENSION'),
+ ('_queue.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_queue.pyd',
+ 'EXTENSION'),
+ ('_wmi.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_wmi.pyd',
+ 'EXTENSION'),
+ ('_socket.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_socket.pyd',
+ 'EXTENSION'),
+ ('_overlapped.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_overlapped.pyd',
+ 'EXTENSION'),
+ ('_asyncio.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\_asyncio.pyd',
+ 'EXTENSION'),
+ ('_cffi_backend.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\_cffi_backend.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\_rust.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md__mypyc.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\md.cp312-win_amd64.pyd',
+ 'EXTENSION'),
+ ('win32\\_win32sysloader.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\_win32sysloader.pyd',
+ 'EXTENSION'),
+ ('win32\\win32api.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32api.pyd',
+ 'EXTENSION'),
+ ('Pythonwin\\win32ui.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\win32ui.pyd',
+ 'EXTENSION'),
+ ('win32\\win32event.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32event.pyd',
+ 'EXTENSION'),
+ ('win32\\win32trace.pyd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\win32trace.pyd',
+ 'EXTENSION'),
+ ('VCRUNTIME140.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140.dll',
+ 'BINARY'),
+ ('VCRUNTIME140_1.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\VCRUNTIME140_1.dll',
+ 'BINARY'),
+ ('libssl-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libssl-3.dll',
+ 'BINARY'),
+ ('libcrypto-3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libcrypto-3.dll',
+ 'BINARY'),
+ ('libffi-8.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\DLLs\\libffi-8.dll',
+ 'BINARY'),
+ ('python3.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\python3.dll',
+ 'BINARY'),
+ ('Pythonwin\\mfc140u.dll',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\mfc140u.dll',
+ 'BINARY'),
+ ('certifi\\cacert.pem',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\cacert.pem',
+ 'DATA'),
+ ('certifi\\py.typed',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\py.typed',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.BSD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\RECORD',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\RECORD',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\METADATA',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\METADATA',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\WHEEL',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\WHEEL',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\INSTALLER',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\INSTALLER',
+ 'DATA'),
+ ('cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography-45.0.2.dist-info\\licenses\\LICENSE.APACHE',
+ 'DATA'),
+ ('base_library.zip',
+ 'D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\base_library.zip',
+ 'DATA')],
+ 'python312.dll',
+ False,
+ False,
+ False,
+ [],
+ None,
+ None,
+ None)
diff --git a/build/pc_agent/PYZ-00.pyz b/build/pc_agent/PYZ-00.pyz
new file mode 100644
index 0000000..60a6d78
Binary files /dev/null and b/build/pc_agent/PYZ-00.pyz differ
diff --git a/build/pc_agent/PYZ-00.toc b/build/pc_agent/PYZ-00.toc
new file mode 100644
index 0000000..2d73843
--- /dev/null
+++ b/build/pc_agent/PYZ-00.toc
@@ -0,0 +1,1193 @@
+('D:\\이태훈\\22전산자산조사\\ITAM\\build\\pc_agent\\PYZ-00.pyz',
+ [('__future__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\__future__.py',
+ 'PYMODULE'),
+ ('_compat_pickle',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_compat_pickle.py',
+ 'PYMODULE'),
+ ('_compression',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_compression.py',
+ 'PYMODULE'),
+ ('_py_abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_py_abc.py',
+ 'PYMODULE'),
+ ('_pydatetime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_pydatetime.py',
+ 'PYMODULE'),
+ ('_pydecimal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_pydecimal.py',
+ 'PYMODULE'),
+ ('_strptime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_strptime.py',
+ 'PYMODULE'),
+ ('_threading_local',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\_threading_local.py',
+ 'PYMODULE'),
+ ('argparse',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\argparse.py',
+ 'PYMODULE'),
+ ('ast',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ast.py',
+ 'PYMODULE'),
+ ('asyncio',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\__init__.py',
+ 'PYMODULE'),
+ ('asyncio.base_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_events.py',
+ 'PYMODULE'),
+ ('asyncio.base_futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_futures.py',
+ 'PYMODULE'),
+ ('asyncio.base_subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_subprocess.py',
+ 'PYMODULE'),
+ ('asyncio.base_tasks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\base_tasks.py',
+ 'PYMODULE'),
+ ('asyncio.constants',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\constants.py',
+ 'PYMODULE'),
+ ('asyncio.coroutines',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\coroutines.py',
+ 'PYMODULE'),
+ ('asyncio.events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\events.py',
+ 'PYMODULE'),
+ ('asyncio.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\exceptions.py',
+ 'PYMODULE'),
+ ('asyncio.format_helpers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\format_helpers.py',
+ 'PYMODULE'),
+ ('asyncio.futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\futures.py',
+ 'PYMODULE'),
+ ('asyncio.locks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\locks.py',
+ 'PYMODULE'),
+ ('asyncio.log',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\log.py',
+ 'PYMODULE'),
+ ('asyncio.mixins',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\mixins.py',
+ 'PYMODULE'),
+ ('asyncio.proactor_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\proactor_events.py',
+ 'PYMODULE'),
+ ('asyncio.protocols',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\protocols.py',
+ 'PYMODULE'),
+ ('asyncio.queues',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\queues.py',
+ 'PYMODULE'),
+ ('asyncio.runners',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\runners.py',
+ 'PYMODULE'),
+ ('asyncio.selector_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\selector_events.py',
+ 'PYMODULE'),
+ ('asyncio.sslproto',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\sslproto.py',
+ 'PYMODULE'),
+ ('asyncio.staggered',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\staggered.py',
+ 'PYMODULE'),
+ ('asyncio.streams',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\streams.py',
+ 'PYMODULE'),
+ ('asyncio.subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\subprocess.py',
+ 'PYMODULE'),
+ ('asyncio.taskgroups',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\taskgroups.py',
+ 'PYMODULE'),
+ ('asyncio.tasks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\tasks.py',
+ 'PYMODULE'),
+ ('asyncio.threads',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\threads.py',
+ 'PYMODULE'),
+ ('asyncio.timeouts',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\timeouts.py',
+ 'PYMODULE'),
+ ('asyncio.transports',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\transports.py',
+ 'PYMODULE'),
+ ('asyncio.trsock',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\trsock.py',
+ 'PYMODULE'),
+ ('asyncio.unix_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\unix_events.py',
+ 'PYMODULE'),
+ ('asyncio.windows_events',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\windows_events.py',
+ 'PYMODULE'),
+ ('asyncio.windows_utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\asyncio\\windows_utils.py',
+ 'PYMODULE'),
+ ('base64',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\base64.py',
+ 'PYMODULE'),
+ ('bisect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\bisect.py',
+ 'PYMODULE'),
+ ('bz2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\bz2.py',
+ 'PYMODULE'),
+ ('calendar',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\calendar.py',
+ 'PYMODULE'),
+ ('certifi',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\__init__.py',
+ 'PYMODULE'),
+ ('certifi.core',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\certifi\\core.py',
+ 'PYMODULE'),
+ ('chardet',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\__init__.py',
+ 'PYMODULE'),
+ ('chardet.big5freq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\big5freq.py',
+ 'PYMODULE'),
+ ('chardet.big5prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\big5prober.py',
+ 'PYMODULE'),
+ ('chardet.chardistribution',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\chardistribution.py',
+ 'PYMODULE'),
+ ('chardet.charsetgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\charsetgroupprober.py',
+ 'PYMODULE'),
+ ('chardet.charsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\charsetprober.py',
+ 'PYMODULE'),
+ ('chardet.codingstatemachine',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\codingstatemachine.py',
+ 'PYMODULE'),
+ ('chardet.codingstatemachinedict',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\codingstatemachinedict.py',
+ 'PYMODULE'),
+ ('chardet.cp949prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\cp949prober.py',
+ 'PYMODULE'),
+ ('chardet.enums',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\enums.py',
+ 'PYMODULE'),
+ ('chardet.escprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\escprober.py',
+ 'PYMODULE'),
+ ('chardet.escsm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\escsm.py',
+ 'PYMODULE'),
+ ('chardet.eucjpprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\eucjpprober.py',
+ 'PYMODULE'),
+ ('chardet.euckrfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euckrfreq.py',
+ 'PYMODULE'),
+ ('chardet.euckrprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euckrprober.py',
+ 'PYMODULE'),
+ ('chardet.euctwfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euctwfreq.py',
+ 'PYMODULE'),
+ ('chardet.euctwprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\euctwprober.py',
+ 'PYMODULE'),
+ ('chardet.gb2312freq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\gb2312freq.py',
+ 'PYMODULE'),
+ ('chardet.gb2312prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\gb2312prober.py',
+ 'PYMODULE'),
+ ('chardet.hebrewprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\hebrewprober.py',
+ 'PYMODULE'),
+ ('chardet.jisfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\jisfreq.py',
+ 'PYMODULE'),
+ ('chardet.johabfreq',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\johabfreq.py',
+ 'PYMODULE'),
+ ('chardet.johabprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\johabprober.py',
+ 'PYMODULE'),
+ ('chardet.jpcntx',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\jpcntx.py',
+ 'PYMODULE'),
+ ('chardet.langbulgarianmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langbulgarianmodel.py',
+ 'PYMODULE'),
+ ('chardet.langgreekmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langgreekmodel.py',
+ 'PYMODULE'),
+ ('chardet.langhebrewmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langhebrewmodel.py',
+ 'PYMODULE'),
+ ('chardet.langrussianmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langrussianmodel.py',
+ 'PYMODULE'),
+ ('chardet.langthaimodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langthaimodel.py',
+ 'PYMODULE'),
+ ('chardet.langturkishmodel',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\langturkishmodel.py',
+ 'PYMODULE'),
+ ('chardet.latin1prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\latin1prober.py',
+ 'PYMODULE'),
+ ('chardet.macromanprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\macromanprober.py',
+ 'PYMODULE'),
+ ('chardet.mbcharsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcharsetprober.py',
+ 'PYMODULE'),
+ ('chardet.mbcsgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcsgroupprober.py',
+ 'PYMODULE'),
+ ('chardet.mbcssm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\mbcssm.py',
+ 'PYMODULE'),
+ ('chardet.resultdict',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\resultdict.py',
+ 'PYMODULE'),
+ ('chardet.sbcharsetprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sbcharsetprober.py',
+ 'PYMODULE'),
+ ('chardet.sbcsgroupprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sbcsgroupprober.py',
+ 'PYMODULE'),
+ ('chardet.sjisprober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\sjisprober.py',
+ 'PYMODULE'),
+ ('chardet.universaldetector',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\universaldetector.py',
+ 'PYMODULE'),
+ ('chardet.utf1632prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\utf1632prober.py',
+ 'PYMODULE'),
+ ('chardet.utf8prober',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\utf8prober.py',
+ 'PYMODULE'),
+ ('chardet.version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\chardet\\version.py',
+ 'PYMODULE'),
+ ('charset_normalizer',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\__init__.py',
+ 'PYMODULE'),
+ ('charset_normalizer.api',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\api.py',
+ 'PYMODULE'),
+ ('charset_normalizer.cd',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\cd.py',
+ 'PYMODULE'),
+ ('charset_normalizer.constant',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\constant.py',
+ 'PYMODULE'),
+ ('charset_normalizer.legacy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\legacy.py',
+ 'PYMODULE'),
+ ('charset_normalizer.models',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\models.py',
+ 'PYMODULE'),
+ ('charset_normalizer.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\utils.py',
+ 'PYMODULE'),
+ ('charset_normalizer.version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\charset_normalizer\\version.py',
+ 'PYMODULE'),
+ ('commctrl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\commctrl.py',
+ 'PYMODULE'),
+ ('concurrent',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\__init__.py',
+ 'PYMODULE'),
+ ('concurrent.futures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\__init__.py',
+ 'PYMODULE'),
+ ('concurrent.futures._base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\_base.py',
+ 'PYMODULE'),
+ ('concurrent.futures.process',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\process.py',
+ 'PYMODULE'),
+ ('concurrent.futures.thread',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\concurrent\\futures\\thread.py',
+ 'PYMODULE'),
+ ('contextlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\contextlib.py',
+ 'PYMODULE'),
+ ('contextvars',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\contextvars.py',
+ 'PYMODULE'),
+ ('copy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\copy.py',
+ 'PYMODULE'),
+ ('cryptography',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.__about__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\__about__.py',
+ 'PYMODULE'),
+ ('cryptography.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\exceptions.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat._oid',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\_oid.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends.openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\openssl\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.backends.openssl.backend',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\backends\\openssl\\backend.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl._conditional',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\_conditional.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.bindings.openssl.binding',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\bindings\\openssl\\binding.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit.ciphers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\ciphers\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.decrepit.ciphers.algorithms',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\decrepit\\ciphers\\algorithms.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._asymmetric',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_asymmetric.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._cipheralgorithm',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_cipheralgorithm.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives._serialization',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\_serialization.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.dh',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\dh.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.dsa',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\dsa.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ec',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ec.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ed25519',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ed25519.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.ed448',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\ed448.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.padding',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\padding.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.rsa',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\rsa.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.types',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\types.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\utils.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.x25519',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\x25519.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.asymmetric.x448',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\asymmetric\\x448.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.algorithms',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\algorithms.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\base.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.ciphers.modes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\ciphers\\modes.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.constant_time',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\constant_time.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.hashes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\hashes.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\base.py',
+ 'PYMODULE'),
+ ('cryptography.hazmat.primitives.serialization.ssh',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\hazmat\\primitives\\serialization\\ssh.py',
+ 'PYMODULE'),
+ ('cryptography.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\utils.py',
+ 'PYMODULE'),
+ ('cryptography.x509',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\__init__.py',
+ 'PYMODULE'),
+ ('cryptography.x509.base',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\base.py',
+ 'PYMODULE'),
+ ('cryptography.x509.certificate_transparency',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\certificate_transparency.py',
+ 'PYMODULE'),
+ ('cryptography.x509.extensions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\extensions.py',
+ 'PYMODULE'),
+ ('cryptography.x509.general_name',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\general_name.py',
+ 'PYMODULE'),
+ ('cryptography.x509.name',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\name.py',
+ 'PYMODULE'),
+ ('cryptography.x509.oid',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\oid.py',
+ 'PYMODULE'),
+ ('cryptography.x509.verification',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\cryptography\\x509\\verification.py',
+ 'PYMODULE'),
+ ('csv',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\csv.py',
+ 'PYMODULE'),
+ ('ctypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ctypes\\__init__.py',
+ 'PYMODULE'),
+ ('ctypes._endian',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ctypes\\_endian.py',
+ 'PYMODULE'),
+ ('dataclasses',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\dataclasses.py',
+ 'PYMODULE'),
+ ('datetime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\datetime.py',
+ 'PYMODULE'),
+ ('decimal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\decimal.py',
+ 'PYMODULE'),
+ ('dis',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\dis.py',
+ 'PYMODULE'),
+ ('email',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\__init__.py',
+ 'PYMODULE'),
+ ('email._encoded_words',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_encoded_words.py',
+ 'PYMODULE'),
+ ('email._header_value_parser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_header_value_parser.py',
+ 'PYMODULE'),
+ ('email._parseaddr',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_parseaddr.py',
+ 'PYMODULE'),
+ ('email._policybase',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\_policybase.py',
+ 'PYMODULE'),
+ ('email.base64mime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\base64mime.py',
+ 'PYMODULE'),
+ ('email.charset',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\charset.py',
+ 'PYMODULE'),
+ ('email.contentmanager',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\contentmanager.py',
+ 'PYMODULE'),
+ ('email.encoders',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\encoders.py',
+ 'PYMODULE'),
+ ('email.errors',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\errors.py',
+ 'PYMODULE'),
+ ('email.feedparser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\feedparser.py',
+ 'PYMODULE'),
+ ('email.generator',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\generator.py',
+ 'PYMODULE'),
+ ('email.header',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\header.py',
+ 'PYMODULE'),
+ ('email.headerregistry',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\headerregistry.py',
+ 'PYMODULE'),
+ ('email.iterators',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\iterators.py',
+ 'PYMODULE'),
+ ('email.message',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\message.py',
+ 'PYMODULE'),
+ ('email.parser',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\parser.py',
+ 'PYMODULE'),
+ ('email.policy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\policy.py',
+ 'PYMODULE'),
+ ('email.quoprimime',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\quoprimime.py',
+ 'PYMODULE'),
+ ('email.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\email\\utils.py',
+ 'PYMODULE'),
+ ('fnmatch',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\fnmatch.py',
+ 'PYMODULE'),
+ ('fractions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\fractions.py',
+ 'PYMODULE'),
+ ('ftplib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ftplib.py',
+ 'PYMODULE'),
+ ('getopt',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\getopt.py',
+ 'PYMODULE'),
+ ('getpass',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\getpass.py',
+ 'PYMODULE'),
+ ('gettext',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\gettext.py',
+ 'PYMODULE'),
+ ('glob',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\glob.py',
+ 'PYMODULE'),
+ ('gzip',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\gzip.py',
+ 'PYMODULE'),
+ ('hashlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\hashlib.py',
+ 'PYMODULE'),
+ ('hmac',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\hmac.py',
+ 'PYMODULE'),
+ ('http',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\__init__.py',
+ 'PYMODULE'),
+ ('http.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\client.py',
+ 'PYMODULE'),
+ ('http.cookiejar',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\cookiejar.py',
+ 'PYMODULE'),
+ ('http.cookies',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\http\\cookies.py',
+ 'PYMODULE'),
+ ('idna',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\__init__.py',
+ 'PYMODULE'),
+ ('idna.core',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\core.py',
+ 'PYMODULE'),
+ ('idna.idnadata',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\idnadata.py',
+ 'PYMODULE'),
+ ('idna.intranges',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\intranges.py',
+ 'PYMODULE'),
+ ('idna.package_data',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\package_data.py',
+ 'PYMODULE'),
+ ('idna.uts46data',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\idna\\uts46data.py',
+ 'PYMODULE'),
+ ('importlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\__init__.py',
+ 'PYMODULE'),
+ ('importlib._abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_abc.py',
+ 'PYMODULE'),
+ ('importlib._bootstrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_bootstrap.py',
+ 'PYMODULE'),
+ ('importlib._bootstrap_external',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\_bootstrap_external.py',
+ 'PYMODULE'),
+ ('importlib.abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\abc.py',
+ 'PYMODULE'),
+ ('importlib.machinery',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\machinery.py',
+ 'PYMODULE'),
+ ('importlib.metadata',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\__init__.py',
+ 'PYMODULE'),
+ ('importlib.metadata._adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_adapters.py',
+ 'PYMODULE'),
+ ('importlib.metadata._collections',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_collections.py',
+ 'PYMODULE'),
+ ('importlib.metadata._functools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_functools.py',
+ 'PYMODULE'),
+ ('importlib.metadata._itertools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_itertools.py',
+ 'PYMODULE'),
+ ('importlib.metadata._meta',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_meta.py',
+ 'PYMODULE'),
+ ('importlib.metadata._text',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\metadata\\_text.py',
+ 'PYMODULE'),
+ ('importlib.readers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\readers.py',
+ 'PYMODULE'),
+ ('importlib.resources',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\__init__.py',
+ 'PYMODULE'),
+ ('importlib.resources._adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_adapters.py',
+ 'PYMODULE'),
+ ('importlib.resources._common',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_common.py',
+ 'PYMODULE'),
+ ('importlib.resources._itertools',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_itertools.py',
+ 'PYMODULE'),
+ ('importlib.resources._legacy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\_legacy.py',
+ 'PYMODULE'),
+ ('importlib.resources.abc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\abc.py',
+ 'PYMODULE'),
+ ('importlib.resources.readers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\resources\\readers.py',
+ 'PYMODULE'),
+ ('importlib.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\importlib\\util.py',
+ 'PYMODULE'),
+ ('inspect',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\inspect.py',
+ 'PYMODULE'),
+ ('ipaddress',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ipaddress.py',
+ 'PYMODULE'),
+ ('json',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\__init__.py',
+ 'PYMODULE'),
+ ('json.decoder',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\decoder.py',
+ 'PYMODULE'),
+ ('json.encoder',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\encoder.py',
+ 'PYMODULE'),
+ ('json.scanner',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\json\\scanner.py',
+ 'PYMODULE'),
+ ('logging',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\logging\\__init__.py',
+ 'PYMODULE'),
+ ('lzma',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\lzma.py',
+ 'PYMODULE'),
+ ('mimetypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\mimetypes.py',
+ 'PYMODULE'),
+ ('multiprocessing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\__init__.py',
+ 'PYMODULE'),
+ ('multiprocessing.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\connection.py',
+ 'PYMODULE'),
+ ('multiprocessing.context',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\context.py',
+ 'PYMODULE'),
+ ('multiprocessing.dummy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\dummy\\__init__.py',
+ 'PYMODULE'),
+ ('multiprocessing.dummy.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\dummy\\connection.py',
+ 'PYMODULE'),
+ ('multiprocessing.forkserver',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\forkserver.py',
+ 'PYMODULE'),
+ ('multiprocessing.heap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\heap.py',
+ 'PYMODULE'),
+ ('multiprocessing.managers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\managers.py',
+ 'PYMODULE'),
+ ('multiprocessing.pool',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\pool.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_fork',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_fork.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_forkserver',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_forkserver.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_spawn_posix',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_spawn_posix.py',
+ 'PYMODULE'),
+ ('multiprocessing.popen_spawn_win32',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\popen_spawn_win32.py',
+ 'PYMODULE'),
+ ('multiprocessing.process',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\process.py',
+ 'PYMODULE'),
+ ('multiprocessing.queues',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\queues.py',
+ 'PYMODULE'),
+ ('multiprocessing.reduction',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\reduction.py',
+ 'PYMODULE'),
+ ('multiprocessing.resource_sharer',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\resource_sharer.py',
+ 'PYMODULE'),
+ ('multiprocessing.resource_tracker',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\resource_tracker.py',
+ 'PYMODULE'),
+ ('multiprocessing.shared_memory',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\shared_memory.py',
+ 'PYMODULE'),
+ ('multiprocessing.sharedctypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\sharedctypes.py',
+ 'PYMODULE'),
+ ('multiprocessing.spawn',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\spawn.py',
+ 'PYMODULE'),
+ ('multiprocessing.synchronize',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\synchronize.py',
+ 'PYMODULE'),
+ ('multiprocessing.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\multiprocessing\\util.py',
+ 'PYMODULE'),
+ ('netrc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\netrc.py',
+ 'PYMODULE'),
+ ('nturl2path',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\nturl2path.py',
+ 'PYMODULE'),
+ ('numbers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\numbers.py',
+ 'PYMODULE'),
+ ('opcode',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\opcode.py',
+ 'PYMODULE'),
+ ('pathlib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pathlib.py',
+ 'PYMODULE'),
+ ('pickle',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pickle.py',
+ 'PYMODULE'),
+ ('pkgutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pkgutil.py',
+ 'PYMODULE'),
+ ('platform',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\platform.py',
+ 'PYMODULE'),
+ ('pprint',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\pprint.py',
+ 'PYMODULE'),
+ ('py_compile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\py_compile.py',
+ 'PYMODULE'),
+ ('pythoncom',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\pythoncom.py',
+ 'PYMODULE'),
+ ('pywin',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\__init__.py',
+ 'PYMODULE'),
+ ('pywin.dialogs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\__init__.py',
+ 'PYMODULE'),
+ ('pywin.dialogs.list',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\list.py',
+ 'PYMODULE'),
+ ('pywin.dialogs.status',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\dialogs\\status.py',
+ 'PYMODULE'),
+ ('pywin.mfc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\__init__.py',
+ 'PYMODULE'),
+ ('pywin.mfc.dialog',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\dialog.py',
+ 'PYMODULE'),
+ ('pywin.mfc.object',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\object.py',
+ 'PYMODULE'),
+ ('pywin.mfc.thread',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\thread.py',
+ 'PYMODULE'),
+ ('pywin.mfc.window',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\Pythonwin\\pywin\\mfc\\window.py',
+ 'PYMODULE'),
+ ('pywin32_system32', '-', 'PYMODULE'),
+ ('pywintypes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\pywintypes.py',
+ 'PYMODULE'),
+ ('queue',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\queue.py',
+ 'PYMODULE'),
+ ('quopri',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\quopri.py',
+ 'PYMODULE'),
+ ('random',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\random.py',
+ 'PYMODULE'),
+ ('requests',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\__init__.py',
+ 'PYMODULE'),
+ ('requests.__version__',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\__version__.py',
+ 'PYMODULE'),
+ ('requests._internal_utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\_internal_utils.py',
+ 'PYMODULE'),
+ ('requests.adapters',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\adapters.py',
+ 'PYMODULE'),
+ ('requests.api',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\api.py',
+ 'PYMODULE'),
+ ('requests.auth',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\auth.py',
+ 'PYMODULE'),
+ ('requests.certs',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\certs.py',
+ 'PYMODULE'),
+ ('requests.compat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\compat.py',
+ 'PYMODULE'),
+ ('requests.cookies',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\cookies.py',
+ 'PYMODULE'),
+ ('requests.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\exceptions.py',
+ 'PYMODULE'),
+ ('requests.hooks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\hooks.py',
+ 'PYMODULE'),
+ ('requests.models',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\models.py',
+ 'PYMODULE'),
+ ('requests.packages',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\packages.py',
+ 'PYMODULE'),
+ ('requests.sessions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\sessions.py',
+ 'PYMODULE'),
+ ('requests.status_codes',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\status_codes.py',
+ 'PYMODULE'),
+ ('requests.structures',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\structures.py',
+ 'PYMODULE'),
+ ('requests.utils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\requests\\utils.py',
+ 'PYMODULE'),
+ ('runpy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\runpy.py',
+ 'PYMODULE'),
+ ('secrets',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\secrets.py',
+ 'PYMODULE'),
+ ('selectors',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\selectors.py',
+ 'PYMODULE'),
+ ('shutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\shutil.py',
+ 'PYMODULE'),
+ ('signal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\signal.py',
+ 'PYMODULE'),
+ ('socket',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\socket.py',
+ 'PYMODULE'),
+ ('socks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\socks.py',
+ 'PYMODULE'),
+ ('ssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\ssl.py',
+ 'PYMODULE'),
+ ('statistics',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\statistics.py',
+ 'PYMODULE'),
+ ('string',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\string.py',
+ 'PYMODULE'),
+ ('stringprep',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\stringprep.py',
+ 'PYMODULE'),
+ ('subprocess',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\subprocess.py',
+ 'PYMODULE'),
+ ('tarfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tarfile.py',
+ 'PYMODULE'),
+ ('tempfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tempfile.py',
+ 'PYMODULE'),
+ ('textwrap',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\textwrap.py',
+ 'PYMODULE'),
+ ('threading',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\threading.py',
+ 'PYMODULE'),
+ ('token',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\token.py',
+ 'PYMODULE'),
+ ('tokenize',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tokenize.py',
+ 'PYMODULE'),
+ ('tracemalloc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\tracemalloc.py',
+ 'PYMODULE'),
+ ('typing',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\typing.py',
+ 'PYMODULE'),
+ ('typing_extensions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\typing_extensions.py',
+ 'PYMODULE'),
+ ('urllib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\__init__.py',
+ 'PYMODULE'),
+ ('urllib.error',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\error.py',
+ 'PYMODULE'),
+ ('urllib.parse',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\parse.py',
+ 'PYMODULE'),
+ ('urllib.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\request.py',
+ 'PYMODULE'),
+ ('urllib.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\urllib\\response.py',
+ 'PYMODULE'),
+ ('urllib3',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3._base_connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_base_connection.py',
+ 'PYMODULE'),
+ ('urllib3._collections',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_collections.py',
+ 'PYMODULE'),
+ ('urllib3._request_methods',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_request_methods.py',
+ 'PYMODULE'),
+ ('urllib3._version',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\_version.py',
+ 'PYMODULE'),
+ ('urllib3.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.connectionpool',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\connectionpool.py',
+ 'PYMODULE'),
+ ('urllib3.contrib',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.fetch',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\fetch.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\request.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.emscripten.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\emscripten\\response.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.pyopenssl',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\pyopenssl.py',
+ 'PYMODULE'),
+ ('urllib3.contrib.socks',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\contrib\\socks.py',
+ 'PYMODULE'),
+ ('urllib3.exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\exceptions.py',
+ 'PYMODULE'),
+ ('urllib3.fields',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\fields.py',
+ 'PYMODULE'),
+ ('urllib3.filepost',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\filepost.py',
+ 'PYMODULE'),
+ ('urllib3.http2',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.http2.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.http2.probe',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\http2\\probe.py',
+ 'PYMODULE'),
+ ('urllib3.poolmanager',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\poolmanager.py',
+ 'PYMODULE'),
+ ('urllib3.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\response.py',
+ 'PYMODULE'),
+ ('urllib3.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\__init__.py',
+ 'PYMODULE'),
+ ('urllib3.util.connection',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\connection.py',
+ 'PYMODULE'),
+ ('urllib3.util.proxy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\proxy.py',
+ 'PYMODULE'),
+ ('urllib3.util.request',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\request.py',
+ 'PYMODULE'),
+ ('urllib3.util.response',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\response.py',
+ 'PYMODULE'),
+ ('urllib3.util.retry',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\retry.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssl_',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssl_.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssl_match_hostname',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssl_match_hostname.py',
+ 'PYMODULE'),
+ ('urllib3.util.ssltransport',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\ssltransport.py',
+ 'PYMODULE'),
+ ('urllib3.util.timeout',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\timeout.py',
+ 'PYMODULE'),
+ ('urllib3.util.url',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\url.py',
+ 'PYMODULE'),
+ ('urllib3.util.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\util.py',
+ 'PYMODULE'),
+ ('urllib3.util.wait',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\urllib3\\util\\wait.py',
+ 'PYMODULE'),
+ ('win32com',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.client.CLSIDToClass',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\CLSIDToClass.py',
+ 'PYMODULE'),
+ ('win32com.client.build',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\build.py',
+ 'PYMODULE'),
+ ('win32com.client.dynamic',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\dynamic.py',
+ 'PYMODULE'),
+ ('win32com.client.gencache',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\gencache.py',
+ 'PYMODULE'),
+ ('win32com.client.genpy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\genpy.py',
+ 'PYMODULE'),
+ ('win32com.client.makepy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\makepy.py',
+ 'PYMODULE'),
+ ('win32com.client.selecttlb',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\selecttlb.py',
+ 'PYMODULE'),
+ ('win32com.client.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\client\\util.py',
+ 'PYMODULE'),
+ ('win32com.server',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\__init__.py',
+ 'PYMODULE'),
+ ('win32com.server.dispatcher',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\dispatcher.py',
+ 'PYMODULE'),
+ ('win32com.server.exception',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\exception.py',
+ 'PYMODULE'),
+ ('win32com.server.policy',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\policy.py',
+ 'PYMODULE'),
+ ('win32com.server.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\server\\util.py',
+ 'PYMODULE'),
+ ('win32com.universal',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\universal.py',
+ 'PYMODULE'),
+ ('win32com.util',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32com\\util.py',
+ 'PYMODULE'),
+ ('win32con',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\win32con.py',
+ 'PYMODULE'),
+ ('win32traceutil',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\win32traceutil.py',
+ 'PYMODULE'),
+ ('winerror',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\win32\\lib\\winerror.py',
+ 'PYMODULE'),
+ ('wmi',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\site-packages\\wmi.py',
+ 'PYMODULE'),
+ ('xml',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\__init__.py',
+ 'PYMODULE'),
+ ('xml.parsers',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\parsers\\__init__.py',
+ 'PYMODULE'),
+ ('xml.parsers.expat',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\parsers\\expat.py',
+ 'PYMODULE'),
+ ('xml.sax',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\__init__.py',
+ 'PYMODULE'),
+ ('xml.sax._exceptions',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\_exceptions.py',
+ 'PYMODULE'),
+ ('xml.sax.expatreader',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\expatreader.py',
+ 'PYMODULE'),
+ ('xml.sax.handler',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\handler.py',
+ 'PYMODULE'),
+ ('xml.sax.saxutils',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\saxutils.py',
+ 'PYMODULE'),
+ ('xml.sax.xmlreader',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xml\\sax\\xmlreader.py',
+ 'PYMODULE'),
+ ('xmlrpc',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xmlrpc\\__init__.py',
+ 'PYMODULE'),
+ ('xmlrpc.client',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\xmlrpc\\client.py',
+ 'PYMODULE'),
+ ('zipfile',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\__init__.py',
+ 'PYMODULE'),
+ ('zipfile._path',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\_path\\__init__.py',
+ 'PYMODULE'),
+ ('zipfile._path.glob',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipfile\\_path\\glob.py',
+ 'PYMODULE'),
+ ('zipimport',
+ 'C:\\Users\\User\\AppData\\Local\\Programs\\Python\\Python312\\Lib\\zipimport.py',
+ 'PYMODULE')])
diff --git a/build/pc_agent/base_library.zip b/build/pc_agent/base_library.zip
new file mode 100644
index 0000000..843ae51
Binary files /dev/null and b/build/pc_agent/base_library.zip differ
diff --git a/build/pc_agent/localpycs/pyimod01_archive.pyc b/build/pc_agent/localpycs/pyimod01_archive.pyc
new file mode 100644
index 0000000..217c111
Binary files /dev/null and b/build/pc_agent/localpycs/pyimod01_archive.pyc differ
diff --git a/build/pc_agent/localpycs/pyimod02_importers.pyc b/build/pc_agent/localpycs/pyimod02_importers.pyc
new file mode 100644
index 0000000..ff909a9
Binary files /dev/null and b/build/pc_agent/localpycs/pyimod02_importers.pyc differ
diff --git a/build/pc_agent/localpycs/pyimod03_ctypes.pyc b/build/pc_agent/localpycs/pyimod03_ctypes.pyc
new file mode 100644
index 0000000..7707c7f
Binary files /dev/null and b/build/pc_agent/localpycs/pyimod03_ctypes.pyc differ
diff --git a/build/pc_agent/localpycs/pyimod04_pywin32.pyc b/build/pc_agent/localpycs/pyimod04_pywin32.pyc
new file mode 100644
index 0000000..5f57e3b
Binary files /dev/null and b/build/pc_agent/localpycs/pyimod04_pywin32.pyc differ
diff --git a/build/pc_agent/localpycs/struct.pyc b/build/pc_agent/localpycs/struct.pyc
new file mode 100644
index 0000000..ddc45c8
Binary files /dev/null and b/build/pc_agent/localpycs/struct.pyc differ
diff --git a/build/pc_agent/pc_agent.pkg b/build/pc_agent/pc_agent.pkg
new file mode 100644
index 0000000..8f67813
Binary files /dev/null and b/build/pc_agent/pc_agent.pkg differ
diff --git a/build/pc_agent/warn-pc_agent.txt b/build/pc_agent/warn-pc_agent.txt
new file mode 100644
index 0000000..cb4f9d6
--- /dev/null
+++ b/build/pc_agent/warn-pc_agent.txt
@@ -0,0 +1,58 @@
+
+This file lists modules PyInstaller was not able to find. This does not
+necessarily mean these modules are required for running your program. Both
+Python's standard library and 3rd-party Python packages often conditionally
+import optional modules, some of which may be available only on certain
+platforms.
+
+Types of import:
+* top-level: imported at the top-level - look at these first
+* conditional: imported within an if-statement
+* delayed: imported within a function
+* optional: imported within a try-except-statement
+
+IMPORTANT: Do NOT post this list to the issue-tracker. Use it as a basis for
+ tracking down the missing module yourself. Thanks!
+
+missing module named pwd - imported by posixpath (delayed, conditional, optional), shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional), netrc (delayed, conditional), getpass (delayed)
+missing module named grp - imported by shutil (delayed, optional), tarfile (optional), pathlib (delayed, optional), subprocess (delayed, conditional, optional)
+missing module named _posixsubprocess - imported by subprocess (conditional), multiprocessing.util (delayed)
+missing module named fcntl - imported by subprocess (optional)
+missing module named _posixshmem - imported by multiprocessing.resource_tracker (conditional), multiprocessing.shared_memory (conditional)
+missing module named _scproxy - imported by urllib.request (conditional)
+missing module named termios - imported by getpass (optional)
+missing module named multiprocessing.BufferTooShort - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
+missing module named multiprocessing.AuthenticationError - imported by multiprocessing (top-level), multiprocessing.connection (top-level)
+missing module named _frozen_importlib_external - imported by importlib._bootstrap (delayed), importlib (optional), importlib.abc (optional), zipimport (top-level)
+excluded module named _frozen_importlib - imported by importlib (optional), importlib.abc (optional), zipimport (top-level)
+missing module named posix - imported by os (conditional, optional), posixpath (optional), shutil (conditional), importlib._bootstrap_external (conditional)
+missing module named resource - imported by posix (top-level)
+missing module named multiprocessing.get_context - imported by multiprocessing (top-level), multiprocessing.pool (top-level), multiprocessing.managers (top-level), multiprocessing.sharedctypes (top-level)
+missing module named multiprocessing.TimeoutError - imported by multiprocessing (top-level), multiprocessing.pool (top-level)
+missing module named multiprocessing.set_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
+missing module named multiprocessing.get_start_method - imported by multiprocessing (top-level), multiprocessing.spawn (top-level)
+missing module named pyimod02_importers - imported by C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\PyInstaller\hooks\rthooks\pyi_rth_pkgutil.py (delayed)
+missing module named collections.Callable - imported by collections (optional), socks (optional)
+missing module named vms_lib - imported by platform (delayed, optional)
+missing module named 'java.lang' - imported by platform (delayed, optional)
+missing module named java - imported by platform (delayed)
+missing module named _winreg - imported by platform (delayed, optional)
+missing module named simplejson - imported by requests.compat (conditional, optional)
+missing module named dummy_threading - imported by requests.cookies (optional)
+missing module named asyncio.DefaultEventLoopPolicy - imported by asyncio (delayed, conditional), asyncio.events (delayed, conditional)
+missing module named annotationlib - imported by typing_extensions (conditional)
+missing module named 'h2.events' - imported by urllib3.http2.connection (top-level)
+missing module named 'h2.connection' - imported by urllib3.http2.connection (top-level)
+missing module named h2 - imported by urllib3.http2.connection (top-level)
+missing module named zstandard - imported by urllib3.util.request (optional), urllib3.response (optional)
+missing module named brotli - imported by urllib3.util.request (optional), urllib3.response (optional)
+missing module named brotlicffi - imported by urllib3.util.request (optional), urllib3.response (optional)
+missing module named win_inet_pton - imported by socks (conditional, optional)
+missing module named bcrypt - imported by cryptography.hazmat.primitives.serialization.ssh (optional)
+missing module named cryptography.x509.UnsupportedExtension - imported by cryptography.x509 (optional), urllib3.contrib.pyopenssl (optional)
+missing module named 'OpenSSL.crypto' - imported by urllib3.contrib.pyopenssl (delayed, conditional)
+missing module named OpenSSL - imported by urllib3.contrib.pyopenssl (top-level)
+missing module named 'pyodide.ffi' - imported by urllib3.contrib.emscripten.fetch (delayed, optional)
+missing module named pyodide - imported by urllib3.contrib.emscripten.fetch (top-level)
+missing module named js - imported by urllib3.contrib.emscripten.fetch (top-level)
+missing module named 'win32com.gen_py' - imported by win32com (conditional, optional)
diff --git a/build/pc_agent/xref-pc_agent.html b/build/pc_agent/xref-pc_agent.html
new file mode 100644
index 0000000..7d644df
--- /dev/null
+++ b/build/pc_agent/xref-pc_agent.html
@@ -0,0 +1,16542 @@
+
+
+
+
+ modulegraph cross reference for pc_agent.py, pyi_rth_cryptography_openssl.py, pyi_rth_inspect.py, pyi_rth_multiprocessing.py, pyi_rth_pkgutil.py, pyi_rth_pythoncom.py, pyi_rth_pywintypes.py
+
+
+
+ modulegraph cross reference for pc_agent.py, pyi_rth_cryptography_openssl.py, pyi_rth_inspect.py, pyi_rth_multiprocessing.py, pyi_rth_pkgutil.py, pyi_rth_pythoncom.py, pyi_rth_pywintypes.py
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_abc (builtin module)
+
+
+
+
+
+
_ast (builtin module)
+
+
+
+
+
+
_asyncio C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_asyncio.pyd
+
+
+
+
+
+
_bisect (builtin module)
+
+
+
+
+
+
_blake2 (builtin module)
+
+
+
+
+
+
_bz2 C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_bz2.pyd
+
+
+
+
+
+
_cffi_backend C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\_cffi_backend.cp312-win_amd64.pyd
+
+
+
+
+
+
_codecs (builtin module)
+
+
+
+
+
+
_codecs_cn (builtin module)
+
+
+
+
+
+
_codecs_hk (builtin module)
+
+
+
+
+
+
_codecs_iso2022 (builtin module)
+
+
+
+
+
+
_codecs_jp (builtin module)
+
+
+
+
+
+
_codecs_kr (builtin module)
+
+
+
+
+
+
_codecs_tw (builtin module)
+
+
+
+
+
+
_collections (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
_contextvars (builtin module)
+
+
+
+
+
+
_csv (builtin module)
+
+
+
+
+
+
_ctypes C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_ctypes.pyd
+
+
+
+
+
+
_datetime (builtin module)
+
+
+
+
+
+
+
_decimal C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_decimal.pyd
+
+
+
+
+
+
+
+
+
+
_functools (builtin module)
+
+
+
+
+
+
_hashlib C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_hashlib.pyd
+
+
+
+
+
+
_heapq (builtin module)
+imported by:
+
heapq
+
+
+
+
+
+
+
+
_imp (builtin module)
+
+
+
+
+
+
_io (builtin module)
+
+
+
+
+
+
_json (builtin module)
+
+
+
+
+
+
+
_locale (builtin module)
+
+
+
+
+
+
_lzma C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_lzma.pyd
+
+
+
+
+
+
_md5 (builtin module)
+
+
+
+
+
+
_multibytecodec (builtin module)
+
+
+
+
+
+
_multiprocessing C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_multiprocessing.pyd
+
+
+
+
+
+
_opcode (builtin module)
+
+
+
+
+
+
_operator (builtin module)
+
+
+
+
+
+
_overlapped C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_overlapped.pyd
+
+
+
+
+
+
_pickle (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_queue C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_queue.pyd
+imported by:
+
queue
+
+
+
+
+
+
+
+
_random (builtin module)
+
+
+
+
+
+
+
+
_sha1 (builtin module)
+
+
+
+
+
+
_sha2 (builtin module)
+
+
+
+
+
+
_sha3 (builtin module)
+
+
+
+
+
+
_signal (builtin module)
+
+
+
+
+
+
_socket C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_socket.pyd
+
+
+
+
+
+
_sre (builtin module)
+
+
+
+
+
+
+
_ssl C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_ssl.pyd
+
+
+
+
+
+
+
_stat (builtin module)
+
+
+
+
+
+
_statistics (builtin module)
+
+
+
+
+
+
_string (builtin module)
+
+
+
+
+
+
+
+
_struct (builtin module)
+
+
+
+
+
+
_thread (builtin module)
+
+
+
+
+
+
+
+
_tokenize (builtin module)
+
+
+
+
+
+
_tracemalloc (builtin module)
+
+
+
+
+
+
_typing (builtin module)
+
+
+
+
+
+
_warnings (builtin module)
+
+
+
+
+
+
_weakref (builtin module)
+
+
+
+
+
+
+
+
_win32sysloader C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32\_win32sysloader.pyd
+
+
+
+
+
+
_winapi (builtin module)
+
+
+
+
+
+
+
+
_wmi C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\_wmi.pyd
+
+
+
+
+
+
abc
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
array (builtin module)
+
+
+
+
+
+
ast
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
atexit (builtin module)
+
+
+
+
+
+
base64
+
SourceModule
+
+
+
+
+
+
+
+
+
binascii (builtin module)
+
+
+
+
+
+
bisect
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
builtins (builtin module)
+
+
+
+
+
+
bz2
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
charset_normalizer.md C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\charset_normalizer\md.cp312-win_amd64.pyd
+
+
+
+
+
+
+
charset_normalizer.md__mypyc C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\charset_normalizer\md__mypyc.cp312-win_amd64.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
codecs
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
copy
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
cryptography.hazmat.bindings._rust C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\cryptography\hazmat\bindings\_rust.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
csv
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
dis
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
enum
+
SourceModule
+
+
+
+
+
+
+
errno (builtin module)
+
+
+
+
+
+
fcntl
+
MissingModule
+
+
+
+
+
+
+
+
+
+
ftplib
+
SourceModule
+
+
+
+
+
+
+
+
+
gc (builtin module)
+
+
+
+
+
+
+
+
+
getopt
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
glob
+
SourceModule
+
+
+
+
+
+
+
grp
+
MissingModule
+
+
+
+
+
+
gzip
+
SourceModule
+
+
+
+
+
+
+
h2
+
MissingModule
+
+
+
+
+
+
+
+
heapq
+
SourceModule
+
+
+
+
+
+
+
hmac
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
io
+
SourceModule
+
+
+
+
+
+
+
+
+
itertools (builtin module)
+
+
+
+
+
+
java
+
MissingModule
+
+
+
+
+
+
js
+
MissingModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
locale
+
SourceModule
+
+
+
+
+
+
+
+
+
lzma
+
SourceModule
+
+
+
+
+
+
+
marshal (builtin module)
+
+
+
+
+
+
math (builtin module)
+
+
+
+
+
+
+
+
mmap (builtin module)
+
+
+
+
+
+
msvcrt (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
netrc
+
SourceModule
+
+
+
+
+
+
+
nt (builtin module)
+
+
+
+
+
+
ntpath
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
opcode
+
SourceModule
+
+
+
+
+
+
+
+
+
os
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
pickle
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
posix
+
MissingModule
+
+
+
+
+
+
+
+
+
pprint
+
SourceModule
+
+
+
+
+
+
+
pwd
+
MissingModule
+
+
+
+
+
+
+
+
pyexpat C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\pyexpat.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
queue
+
SourceModule
+
+
+
+
+
+
+
quopri
+
SourceModule
+
+
+
+
+
+
+
random
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
runpy
+
SourceModule
+
+
+
+
+
+
+
+
+
select C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\select.pyd
+
+
+
+
+
+
+
+
shutil
+
SourceModule
+
+
+
+
+
+
+
signal
+
SourceModule
+
+
+
+
+
+
+
+
+
socket
+
SourceModule
+
+
+
+
+
+
+
socks
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
ssl
+
SourceModule
+
+
+
+
+
+
+
stat
+
SourceModule
+
+
+
+
+
+
+
+
+
string
+
SourceModule
+
+
+
+
+
+
+
+
+
struct
+
SourceModule
+
+
+
+
+
+
+
+
+
sys (builtin module)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
time (builtin module)
+
+
+
+
+
+
+
token
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
types
+
SourceModule
+
+
+
+
+
+
+
typing
+
SourceModule
+
+
+
+
+
+
+
+
+
unicodedata C:\Users\User\AppData\Local\Programs\Python\Python312\DLLs\unicodedata.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
win32api C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32\win32api.pyd
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
win32event C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32\win32event.pyd
+
+
+
+
+
+
win32trace C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\win32\win32trace.pyd
+
+
+
+
+
+
+
+
win32ui C:\Users\User\AppData\Local\Programs\Python\Python312\Lib\site-packages\Pythonwin\win32ui.pyd
+
+
+
+
+
+
+
+
+
+
winreg (builtin module)
+
+
+
+
+
+
wmi
+
SourceModule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
zlib (builtin module)
+
+
+
+
+
+
+
diff --git a/create_db.js b/create_db.js
deleted file mode 100644
index f045a75..0000000
--- a/create_db.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import * as XLSX from 'xlsx';
-
-const hwTabs = ['개인PC', '서버', '스토리지', '전산비품'];
-const swTabs = ['구독SW', '영구SW'];
-
-const hwHeaders = ['법인', '자산코드', '명칭', '위치', '관리자', 'IP주소', 'MACaddress', 'HW사양', 'OS'];
-const swHeaders = ['법인', 'SW명', '라이선스키', '할당자', '사용기간', '비고'];
-
-const wb = XLSX.utils.book_new();
-
-hwTabs.forEach((tab, i) => {
- const wsData = [hwHeaders, [`(주)회사${i}`, `ASSET-${i}00`, `${tab} 모델A`, '본사 1층', '관리자A', '192.168.0.1', '00:00:00:00:00:01', 'Core i7, 16GB RAM', 'Windows 10']];
- const ws = XLSX.utils.aoa_to_sheet(wsData);
- XLSX.utils.book_append_sheet(wb, ws, tab);
-});
-
-swTabs.forEach((tab, i) => {
- const wsData = [swHeaders, [`(주)회사${i}`, `${tab} Adobe CC`, '1234-5678-ABCD', '홍길동,김철수', '2024.01~2024.12', '본사 전용']];
- const ws = XLSX.utils.aoa_to_sheet(wsData);
- XLSX.utils.book_append_sheet(wb, ws, tab);
-});
-
-XLSX.writeFile(wb, 'temp_db.xlsx');
-console.log('temp_db.xlsx created!');
diff --git a/db_fix_data.js b/db_fix_data.js
deleted file mode 100644
index 92fb2b4..0000000
--- a/db_fix_data.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-
-dotenv.config();
-
-const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
-
-async function migrateData() {
- const connection = await mysql.createConnection({
- host: DB_HOST,
- user: DB_USER,
- password: DB_PASS,
- database: DB_NAME,
- port: parseInt(DB_PORT || '3306')
- });
-
- console.log('🔄 기존 데이터 보정 시작 (상세유형 = 유형)...');
-
- const tables = ['pc_assets', 'server_assets', 'storage_assets', 'equip_assets', 'mobile_assets'];
-
- for (const table of tables) {
- // 1. 유형(type)이 비어있는 경우 기본값 채우기 (보정 전 단계)
- let defaultType = '기타';
- if (table === 'server_assets') defaultType = '서버';
- else if (table === 'pc_assets') defaultType = '개인PC';
- else if (table === 'storage_assets') defaultType = '스토리지';
- else if (table === 'equip_assets') defaultType = '전산비품';
- else if (table === 'mobile_assets') defaultType = '모바일기기';
-
- await connection.query(`UPDATE ${table} SET type = ? WHERE type IS NULL OR type = ''`, [defaultType]);
-
- // 2. 개인PC가 아닌 데이터들에 대해 상세유형 = 유형 업데이트
- const [result] = await connection.query(`
- UPDATE ${table}
- SET detail_purpose = type
- WHERE type NOT IN ('개인PC', 'PC')
- `);
-
- console.log(`✅ ${table}: ${result.affectedRows}개 데이터 보정 완료`);
- }
-
- console.log('✨ 모든 기존 데이터 보정이 완료되었습니다.');
- await connection.end();
-}
-
-migrateData().catch(err => {
- console.error('❌ 데이터 보정 실패:', err);
- process.exit(1);
-});
diff --git a/debug_excel.json b/debug_excel.json
deleted file mode 100644
index f98fe15..0000000
--- a/debug_excel.json
+++ /dev/null
@@ -1,140 +0,0 @@
-{
- "서버 관리대장(기술개발센터).xlsx": [
- [
- "마천사무실"
- ],
- [
- "실사진",
- "구성",
- "자산번호",
- "명칭(주기)",
- "상세",
- "유형",
- "담당자",
- null,
- "IP",
- "원격접속",
- null,
- null,
- "모델명",
- "OS",
- "CPU",
- "RAM",
- "GPU",
- "Storage1",
- "Storage2",
- "Storage3"
- ],
- [
- null,
- null,
- null,
- null,
- null,
- null,
- "정",
- "부",
- null,
- "접속도구",
- "아이디",
- "비밀번호"
- ],
- [
- null,
- null,
- "",
- "GSIM NAS",
- "팀 내부 자료 저장 , 정사영상 및 지도 데이터 저장 , Gitea 및 Git 내장 NAS",
- "NAS",
- null,
- null,
- null,
- null,
- null,
- null,
- "Synology DS923+"
- ],
- [
- null,
- null,
- "",
- "그래픽스개발팀\r\n데이터 백업 NAS",
- "그래픽스 개발팀 데이터 백업용 NAS",
- "NAS",
- null,
- null,
- null,
- null,
- null,
- null,
- "Synology DS923+"
- ]
- ],
- "서버 관리대장(한맥빌딩).xlsx": [
- [
- "한맥빌딩(MDF 실)"
- ],
- [
- "실사진",
- "구성",
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- "서버번호",
- "명칭(주기)",
- "유형",
- "IP",
- "모델명",
- "용도",
- "담당자",
- "OS",
- "CPU",
- "RAM",
- "GPU",
- "Storage1",
- "Storage2",
- "Storage3"
- ],
- [],
- [
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- null,
- 1,
- "NAS 2",
- "NAS",
- "192.168.9.23",
- "DS414j",
- "한라 기업부설연구소 공용 NAS",
- "이준하 차장"
- ],
- [
- null,
- null,
- "NAS2",
- "NAS 1\r\n(DS224+)",
- "NAS4",
- "NAS 5\r\n(DS923+)",
- "NAS 6\r\n(DS923+)",
- null,
- null,
- 2,
- "NAS 1",
- "NAS",
- "192.168.9.32",
- "DS224+",
- "한라 사업지원, 경영지원, 업무, 안전품질, 운영 공용 NAS",
- "이준하 차장"
- ]
- ]
-}
\ No newline at end of file
diff --git a/expand_pc_schema.js b/expand_pc_schema.js
deleted file mode 100644
index 28fac2c..0000000
--- a/expand_pc_schema.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-
-dotenv.config();
-
-async function expandSchema() {
- const connection = await mysql.createConnection({
- host: process.env.DB_HOST,
- user: process.env.DB_USER,
- password: process.env.DB_PASS,
- database: process.env.DB_NAME,
- port: parseInt(process.env.DB_PORT || '3306')
- });
-
- try {
- console.log('🏗️ Expanding asset_pc table schema...');
-
- const columnsToAdd = [
- { name: 'location', type: 'TEXT' },
- { name: 'location_detail', type: 'TEXT' },
- { name: 'ip_address', type: 'TEXT' },
- { name: 'ip_address_2', type: 'TEXT' },
- { name: 'remote_tool', type: 'TEXT' },
- { name: 'remote_id', type: 'TEXT' },
- { name: 'remote_pw', type: 'TEXT' },
- { name: 'monitoring', type: 'TEXT' },
- { name: 'asset_purpose', type: 'TEXT' }
- ];
-
- for (const col of columnsToAdd) {
- try {
- await connection.query(`ALTER TABLE asset_pc ADD COLUMN \`${col.name}\` ${col.type}`);
- console.log(`✅ Added column: ${col.name}`);
- } catch (err) {
- if (err.code === 'ER_DUP_COLUMN_NAME') {
- console.log(`ℹ️ Column ${col.name} already exists.`);
- } else {
- throw err;
- }
- }
- }
-
- console.log('🎉 Schema expansion completed!');
-
- } catch (err) {
- console.error('❌ Schema expansion failed:', err);
- } finally {
- await connection.end();
- }
-}
-
-expandSchema();
diff --git a/migrate_server_pc.js b/migrate_server_pc.js
deleted file mode 100644
index 60d64a5..0000000
--- a/migrate_server_pc.js
+++ /dev/null
@@ -1,81 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-
-dotenv.config();
-
-async function migrate() {
- const connection = await mysql.createConnection({
- host: process.env.DB_HOST,
- user: process.env.DB_USER,
- password: process.env.DB_PASS,
- database: process.env.DB_NAME,
- port: parseInt(process.env.DB_PORT || '3306')
- });
-
- try {
- console.log('🚀 ' + 'Starting migration: asset_server (서버PC) -> asset_pc');
-
- // 1. 서버PC 데이터 조회
- const [serverPcs] = await connection.query(
- "SELECT * FROM asset_server WHERE asset_type = '서버PC'"
- );
-
- if (serverPcs.length === 0) {
- console.log('✅ ' + 'No ServerPC assets found in asset_server table.');
- return;
- }
-
- console.log(`📦 Found ${serverPcs.length} ServerPC assets to migrate.`);
-
- // 2. asset_pc 컬럼 정보 조회
- const [pcColumnsRows] = await connection.query('DESCRIBE asset_pc');
- const pcColumns = pcColumnsRows.map(r => r.Field);
- console.log('📋 Target columns:', pcColumns);
-
- // 3. asset_pc 테이블로 이동 (category를 'PC'로 변경)
- for (const asset of serverPcs) {
- const dataToInsert = {};
-
- // 공통 컬럼 매핑
- pcColumns.forEach(col => {
- if (col === 'category') {
- dataToInsert[col] = 'PC';
- } else if (asset.hasOwnProperty(col)) {
- dataToInsert[col] = asset[col];
- }
- });
-
- // 특수한 매핑 (예: model_name -> asset_pc에 컬럼이 없다면 memo에 추가하거나 무시)
- // 현재 asset_pc에는 model_name이 없으므로 memo에 보존하는 것이 안전함
- if (asset.model_name) {
- const currentMemo = dataToInsert.memo || '';
- dataToInsert.memo = `[모델명: ${asset.model_name}] ${currentMemo}`.trim();
- }
-
- const columns = Object.keys(dataToInsert).map(col => `\`${col}\``).join(', ');
- const placeholders = Object.keys(dataToInsert).map(() => '?').join(', ');
- const values = Object.values(dataToInsert);
-
- await connection.query(
- `INSERT INTO asset_pc (${columns}) VALUES (${placeholders})`,
- values
- );
- console.log(` - Migrated: ${asset.asset_code || asset.id}`);
- }
-
- // 4. asset_server 테이블에서 삭제
- const [deleteResult] = await connection.query(
- "DELETE FROM asset_server WHERE asset_type = '서버PC'"
- );
- console.log(`🗑️ Deleted ${deleteResult.affectedRows} records from asset_server.`);
-
- console.log('🎉 Migration completed successfully!');
-
- } catch (err) {
- console.error('❌ Migration failed:', err);
- } finally {
- await connection.end();
- }
-}
-
-migrate();
diff --git a/migrate_to_korean.js b/migrate_to_korean.js
deleted file mode 100644
index 1fa3968..0000000
--- a/migrate_to_korean.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-
-dotenv.config();
-
-const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
-
-// 영문 -> 한글 필드 매핑 테이블
-const FIELD_MAPPING = {
- corp: '법인',
- asset_code: '자산코드',
- type: '유형',
- purpose: '용도',
- detail_purpose: '상세용도',
- details: '상세',
- current_org: '현사용조직',
- prev_org: '이전사용조직',
- location: '위치',
- manager_main: '담당자_정',
- manager_sub: '담당자_부',
- ip_address: 'IP주소',
- remote_tool: '원격접속',
- server_id: '서버ID',
- server_pw: '서버PW',
- model_name: '모델명',
- os: 'OS',
- cpu: 'CPU',
- ram: 'RAM',
- storage1: 'SSD1',
- storage2: 'SSD2',
- status: '상태'
-};
-
-async function migrateData() {
- const connection = await mysql.createConnection({
- host: DB_HOST,
- user: DB_USER,
- password: DB_PASS,
- database: DB_NAME,
- port: parseInt(DB_PORT || '3306')
- });
-
- console.log('🔄 데이터 필드 영문 -> 한글 마이그레이션 시작...');
-
- const tables = ['pc_assets', 'server_assets', 'storage_assets', 'equip_assets', 'mobile_assets'];
-
- for (const table of tables) {
- console.log(`📦 ${table} 처리 중...`);
- const [rows] = await connection.query(`SELECT * FROM ${table}`);
-
- for (const row of rows) {
- const updatedRow = { ...row };
- // 영문 키의 값을 한글 키로 복사
- Object.entries(FIELD_MAPPING).forEach(([eng, kor]) => {
- if (row[eng] !== undefined && row[eng] !== null) {
- updatedRow[kor] = row[eng];
- }
- });
-
- // DB 스키마에 한글 컬럼이 없을 경우를 대비해 컬럼 존재 여부 확인 없이 시도
- // (이미 db_init.js가 한글 컬럼을 생성했을 가능성 확인 필요)
- try {
- await connection.query(`UPDATE ${table} SET ? WHERE id = ?`, [updatedRow, row.id]);
- } catch (err) {
- // 컬럼이 없어서 실패하는 경우 무시 (나중에 수동 추가)
- }
- }
- }
-
- console.log('✨ 마이그레이션 완료.');
- await connection.end();
-}
-
-migrateData().catch(err => {
- console.error('❌ 마이그레이션 실패:', err);
- process.exit(1);
-});
diff --git a/pc_agent.py b/pc_agent.py
new file mode 100644
index 0000000..ecd2f9d
--- /dev/null
+++ b/pc_agent.py
@@ -0,0 +1,134 @@
+import wmi
+import requests
+import json
+import socket
+import platform
+import sys
+import time
+
+def collect_specs():
+ try:
+ c = wmi.WMI()
+ computer = c.Win32_ComputerSystem()[0]
+ os_info = c.Win32_OperatingSystem()[0]
+ proc = c.Win32_Processor()[0]
+ board = c.Win32_BaseBoard()[0]
+
+ # 1. 상세 GPU 정보 수집 (모든 그래픽 카드)
+ gpu_list = []
+ for g in c.Win32_VideoController():
+ gpu_list.append(g.Name)
+ gpu_info = ", ".join(gpu_list) if gpu_list else "N/A"
+
+ # 2. 모든 저장장치 정보 수집 및 SSD/HDD 구분
+ storage_list = []
+
+ # Windows 8 이상에서 작동하는 상세 저장소 정보 수집 시도
+ physical_disks = {}
+ try:
+ storage_c = wmi.WMI(namespace="Root\\Microsoft\\Windows\\Storage")
+ for d in storage_c.MSFT_PhysicalDisk():
+ # MediaType: 3(HDD), 4(SSD), 0(Unspecified)
+ physical_disks[d.DeviceId] = d.MediaType
+ except:
+ pass
+
+ for d in c.Win32_DiskDrive():
+ size_gb = round(float(d.Size) / (1024**3)) if d.Size else 0
+
+ # 미디어 타입 판단
+ media_type = physical_disks.get(str(d.Index), 0)
+ prefix = ""
+ if media_type == 4:
+ prefix = "[SSD] "
+ elif media_type == 3:
+ prefix = "[HDD] "
+ else:
+ # 힌트가 없을 경우 모델명으로 추측
+ cap = d.Caption.upper()
+ if "SSD" in cap or "NVME" in cap or "FLASH" in cap:
+ prefix = "[SSD] "
+ else:
+ prefix = "[HDD] "
+
+ storage_list.append(f"{prefix}{d.Caption} ({size_gb}GB)")
+
+ # DB 필드(SSD1, SSD2, SSD3)에 나눠 담기
+ storage1 = storage_list[0] if len(storage_list) > 0 else "N/A"
+ storage2 = storage_list[1] if len(storage_list) > 1 else ""
+ storage3 = storage_list[2] if len(storage_list) > 2 else ""
+
+ # 실시간 데이터 추출
+ specs = {
+ "메인보드": f"{board.Manufacturer} {board.Product}".strip(),
+ "CPU": proc.Name.strip(),
+ "RAM": f"{round(float(computer.TotalPhysicalMemory) / (1024**3))}GB",
+ "OS": os_info.Caption,
+ "GPU": gpu_info,
+ "SSD1": storage1,
+ "SSD2": storage2,
+ "SSD3": storage3,
+ "비고": "실시간 에이전트(EXE) 자동 수집"
+ }
+ return specs
+ except Exception as e:
+ print(f"데이터 수집 중 오류 발생: {e}")
+ return None
+
+def send_data(specs, server_url, asset_code):
+ try:
+ # 전송 데이터에 자산코드 추가 (식별용)
+ specs["자산코드"] = asset_code
+ print(f"\n📡 서버로 전송 중... ({server_url})")
+ response = requests.post(server_url, json=specs, timeout=10)
+ if response.status_code == 200:
+ print("✅ 전송 성공! ITAM 시스템에서 확인하세요.")
+ else:
+ print(f"❌ 전송 실패: 서버 응답 코드 {response.status_code}")
+ except Exception as e:
+ print(f"❌ 서버 연결 오류: {e}")
+ print("서버가 켜져 있는지, URL이 맞는지 확인해주세요.")
+
+if __name__ == "__main__":
+ print("========================================")
+ print(" ITAM PC 실시간 사양 수집 에이전트 (v1.1)")
+ print("========================================\n")
+
+ # 1. 정보 수집
+ print("🔍 하드웨어 정보를 읽어오는 중...")
+ data = collect_specs()
+
+ if data:
+ print("\n[수집된 실제 사양]")
+ display_map = {
+ "메인보드": "메인보드",
+ "CPU": "CPU",
+ "RAM": "RAM",
+ "OS": "OS",
+ "GPU": "GPU",
+ "SSD1": "Storage 1",
+ "SSD2": "Storage 2",
+ "SSD3": "Storage 3",
+ "비고": "비고"
+ }
+ for key, value in data.items():
+ if value: # 값이 있는 경우만 표시
+ label = display_map.get(key, key)
+ print(f" - {label}: {value}")
+
+ print("\n" + "="*40)
+ asset_code = input("등록할 자산번호를 입력하세요 (예: PC-001): ").strip()
+ if not asset_code:
+ print("❌ 자산번호 없이는 전송할 수 없습니다.")
+ else:
+ server_ip = input("서버 IP를 입력하세요 (기본값 localhost): ").strip()
+ if not server_ip: server_ip = "localhost"
+
+ target_url = f"http://{server_ip}:3000/api/agent/collect"
+
+ confirm = input("\n위 정보를 서버로 전송할까요? (y/n): ")
+ if confirm.lower() == 'y':
+ send_data(data, target_url, asset_code)
+
+ print("\n5초 후 프로그램이 종료됩니다...")
+ time.sleep(5)
diff --git a/pc_agent.spec b/pc_agent.spec
new file mode 100644
index 0000000..5a22678
--- /dev/null
+++ b/pc_agent.spec
@@ -0,0 +1,38 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+a = Analysis(
+ ['pc_agent.py'],
+ pathex=[],
+ binaries=[],
+ datas=[],
+ hiddenimports=[],
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ noarchive=False,
+ optimize=0,
+)
+pyz = PYZ(a.pure)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ a.binaries,
+ a.datas,
+ [],
+ name='pc_agent',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ runtime_tmpdir=None,
+ console=True,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+)
diff --git a/restore_db.js b/restore_db.js
deleted file mode 100644
index 303fb5a..0000000
--- a/restore_db.js
+++ /dev/null
@@ -1,91 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-import fs from 'fs';
-
-dotenv.config();
-
-const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
-
-async function restoreDB() {
- const connection = await mysql.createConnection({
- host: DB_HOST,
- user: DB_USER,
- password: DB_PASS,
- database: DB_NAME,
- port: parseInt(DB_PORT || '3306')
- });
-
- console.log('📖 백업 파일 읽는 중...');
- const rawData = fs.readFileSync('backup_atam_data.json', 'utf8');
- const data = JSON.parse(rawData);
-
- const tables = {
- pc_assets: data.pc_assets || [],
- server_assets: data.server_assets || [],
- storage_assets: data.storage_assets || [],
- equip_assets: data.equip_assets || [],
- mobile_assets: data.mobile_assets || [],
- sw_sub_assets: data.sw_sub_assets || [],
- sw_perm_assets: data.sw_perm_assets || [],
- cloud_assets: data.cloud_assets || [],
- sw_users: data.sw_users || [],
- asset_logs: data.logs || []
- };
-
- console.log('🚀 데이터 복구 시작...');
-
- for (const [tableName, rows] of Object.entries(tables)) {
- if (rows.length === 0) {
- console.log(`⏩ ${tableName}: 데이터 없음, 건너뜀`);
- continue;
- }
-
- console.log(`📦 ${tableName} 복구 중 (${rows.length}개)...`);
-
- // 테이블 컬럼 정보 조회
- const [columns] = await connection.query(`SHOW COLUMNS FROM ${tableName}`);
- const validColumns = columns.map(c => c.Field);
-
- for (const row of rows) {
- const filteredRow = {};
- Object.keys(row).forEach(key => {
- let dbKey = key;
-
- // 필드명 매핑 보정 (백업 데이터 -> DB 스키마)
- if (key === 'manager') dbKey = 'manager_main';
- if (key === 'asset_name' && (tableName === 'mobile_assets' || tableName === 'equip_assets')) dbKey = 'model_name';
- if (key === 'mac_address' && tableName === 'pc_assets') dbKey = 'remarks'; // 스키마에 없는 경우 비고로
-
- // created_at 등 날짜 포맷 보정
- if (validColumns.includes(dbKey)) {
- let value = row[key];
- if (dbKey === 'created_at' && value) {
- // '2026-04-17T08:52:11.000Z' -> '2026-04-17 08:52:11'
- value = value.replace('T', ' ').replace(/\..*$/, '');
- }
- filteredRow[dbKey] = value;
- }
- });
-
- // 필수값 ID 확인
- if (!filteredRow.id) {
- filteredRow.id = Math.random().toString(36).substr(2, 9);
- }
-
- try {
- await connection.query(`INSERT INTO ${tableName} SET ?`, filteredRow);
- } catch (err) {
- console.error(`❌ [${tableName}] ID ${filteredRow.id} 삽입 실패: ${err.message}`);
- }
- }
- console.log(`✅ ${tableName} 완료`);
- }
-
- console.log('✨ 모든 데이터 복구가 완료되었습니다.');
- await connection.end();
-}
-
-restoreDB().catch(err => {
- console.error('❌ 복구 실패:', err);
- process.exit(1);
-});
diff --git a/restore_final.js b/restore_final.js
deleted file mode 100644
index 28ad62e..0000000
--- a/restore_final.js
+++ /dev/null
@@ -1,63 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-import fs from 'fs';
-import path from 'path';
-
-dotenv.config();
-
-const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
-
-async function restoreFinal() {
- const connection = await mysql.createConnection({
- host: DB_HOST,
- user: DB_USER,
- password: DB_PASS,
- database: DB_NAME,
- port: parseInt(DB_PORT || '3306')
- });
-
- console.log('📖 realServerData.ts 읽는 중...');
- const filePath = path.join(process.cwd(), 'src/core/realServerData.ts');
- const fileContent = fs.readFileSync(filePath, 'utf8');
-
- const jsonMatch = fileContent.match(/\[\s*\{[\s\S]*\}\s*\]/);
- const realData = JSON.parse(jsonMatch[0]);
-
- console.log(`🚀 ${realData.length}개의 실제 데이터 복구 시작 (한글 필드 기준)...`);
-
- for (const item of realData) {
- const type = item.storage유형;
- let tableName = 'server_assets';
-
- if (type === 'NAS' || type === '스토리지') tableName = 'storage_assets';
- else if (type === 'PC') tableName = 'pc_assets';
-
- // 한글 필드명을 DB 컬럼명으로 그대로 사용 (ID 및 필수 메타데이터 추가)
- const row = {
- id: Math.random().toString(36).substr(2, 9),
- ...item,
- // mapping corrections for DB schema
- 유형: type,
- 용도: item.용도 || '',
- 상세: item.상세 || '',
- 위치: item.위치 || ''
- };
-
- // delete unnecessary key
- delete row.storage유형;
-
- try {
- await connection.query(`INSERT INTO ${tableName} SET ?`, row);
- } catch (err) {
- // console.error(`❌ 삽입 실패:`, err.message);
- }
- }
-
- console.log('✨ 모든 디자인 및 데이터 복구가 완료되었습니다.');
- await connection.end();
-}
-
-restoreFinal().catch(err => {
- console.error('❌ 복구 실패:', err);
- process.exit(1);
-});
diff --git a/restore_real_data.js b/restore_real_data.js
deleted file mode 100644
index c822bb3..0000000
--- a/restore_real_data.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-import fs from 'fs';
-import path from 'path';
-
-dotenv.config();
-
-const { DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT } = process.env;
-
-async function restoreRealData() {
- const connection = await mysql.createConnection({
- host: DB_HOST,
- user: DB_USER,
- password: DB_PASS,
- database: DB_NAME,
- port: parseInt(DB_PORT || '3306')
- });
-
- console.log('📖 realServerData.ts 읽는 중...');
- const filePath = path.join(process.cwd(), 'src/core/realServerData.ts');
- const fileContent = fs.readFileSync(filePath, 'utf8');
-
- // TypeScript 파일에서 JSON 배열 부분만 추출
- const jsonMatch = fileContent.match(/\[\s*\{[\s\S]*\}\s*\]/);
- if (!jsonMatch) {
- throw new Error('데이터 형식을 찾을 수 없습니다.');
- }
- const realData = JSON.parse(jsonMatch[0]);
-
- console.log(`🚀 ${realData.length}개의 실제 데이터 복구 시작...`);
-
- for (const item of realData) {
- const type = item.storage유형;
- let tableName = 'server_assets';
-
- // 유형에 따른 테이블 분기
- if (type === 'NAS' || type === '스토리지') {
- tableName = 'storage_assets';
- } else if (type === 'PC' && item.용도.includes('서버')) {
- tableName = 'server_assets'; // 서버 역할을 하는 PC
- } else if (type === 'PC') {
- tableName = 'pc_assets';
- }
-
- // DB 스키마 매핑
- const filteredRow = {
- id: Math.random().toString(36).substr(2, 9),
- corp: item.법인 || '',
- asset_code: item.자산코드 || '',
- type: type === 'NAS' ? '스토리지' : (type === 'PC' ? '서버(PC)' : type),
- purpose: item.용도 || '',
- details: item.상세 || '',
- location: item.위치 || '',
- manager_main: item.담당자_정 || '',
- manager_sub: item.담당자_부 || '',
- ip_address: item.IP주소 || '',
- remote_tool: item.원격접속 || '',
- server_id: item.서버ID || '',
- server_pw: item.서버PW || '',
- model_name: item.모델명 || '',
- os: item.OS || '',
- cpu: item.CPU || '',
- ram: item.RAM || '',
- storage1: item.SSD1 || '',
- storage2: item.SSD2 || '',
- remarks: item.IP2 ? `보조IP: ${item.IP2}` : ''
- };
-
- try {
- await connection.query(`INSERT INTO ${tableName} SET ?`, filteredRow);
- } catch (err) {
- console.error(`❌ [${tableName}] 삽입 실패 (${item.자산코드}):`, err.message);
- }
- }
-
- console.log('✨ 실제 운영 데이터 복구가 완료되었습니다.');
- await connection.end();
-}
-
-restoreRealData().catch(err => {
- console.error('❌ 복구 실패:', err);
- process.exit(1);
-});
diff --git a/restore_server_pc_data.js b/restore_server_pc_data.js
deleted file mode 100644
index 94c482c..0000000
--- a/restore_server_pc_data.js
+++ /dev/null
@@ -1,83 +0,0 @@
-import mysql from 'mysql2/promise';
-import dotenv from 'dotenv';
-import xlsx from 'xlsx';
-
-dotenv.config();
-
-async function restoreData() {
- const connection = await mysql.createConnection({
- host: process.env.DB_HOST,
- user: process.env.DB_USER,
- password: process.env.DB_PASS,
- database: process.env.DB_NAME,
- port: parseInt(process.env.DB_PORT || '3306')
- });
-
- try {
- console.log('🔄 Restoring ServerPC metadata (Final Attempt)...');
-
- // 1. Excel 로드
- const workbook = xlsx.readFile('server_db.xlsx');
- const sheetName = workbook.SheetNames[0];
- const excelRows = xlsx.utils.sheet_to_json(workbook.Sheets[sheetName]);
-
- // 2. DB에서 현재 서버PC 데이터 로드
- const [dbAssets] = await connection.query(
- "SELECT id, memo, asset_code FROM asset_pc WHERE asset_type = '서버PC'"
- );
-
- console.log(`📊 DB: ${dbAssets.length} assets, Excel: ${excelRows.length} rows.`);
-
- for (const asset of dbAssets) {
- // 메모에서 "서버코드 : [ID]" 패턴 추출
- // 인코딩 문제로 깨져 보일 수 있으므로 유연하게 매칭 ( jh-idc-001 패턴 찾기 )
- const memo = asset.memo || '';
- const match = memo.match(/[a-z]+-idc-[0-9]+/i);
- const serverCode = match ? match[0] : null;
-
- if (!serverCode) {
- console.log(` ❓ Could not find server code in memo for asset ${asset.asset_code}`);
- continue;
- }
-
- // Excel에서 해당 서버코드 찾기 (memo 필드 안에 포함되어 있음)
- const matchedExcelRow = excelRows.find(r =>
- r.memo && r.memo.includes(serverCode)
- );
-
- if (matchedExcelRow) {
- const updateData = {
- location: matchedExcelRow.location,
- location_detail: matchedExcelRow.location_detail,
- ip_address: matchedExcelRow.ip_address,
- ip_address_2: matchedExcelRow.ip_address_2,
- remote_tool: matchedExcelRow.remote_tool,
- remote_id: matchedExcelRow.remote_id,
- remote_pw: matchedExcelRow.remote_pw,
- monitoring: matchedExcelRow.monitoring,
- asset_purpose: matchedExcelRow.asset_purpose
- };
-
- const setClause = Object.keys(updateData).map(key => `\`${key}\` = ?`).join(', ');
- const values = [...Object.values(updateData), asset.id];
-
- await connection.query(
- `UPDATE asset_pc SET ${setClause} WHERE id = ?`,
- values
- );
- console.log(` ✅ Restored: ${asset.asset_code} (Code: ${serverCode})`);
- } else {
- console.log(` ⚠️ No Excel match for server code: ${serverCode}`);
- }
- }
-
- console.log('🎉 Restoration completed!');
-
- } catch (err) {
- console.error('❌ Restoration failed:', err);
- } finally {
- await connection.end();
- }
-}
-
-restoreData();
diff --git a/server.js b/server.js
index 5762053..0e6a598 100644
--- a/server.js
+++ b/server.js
@@ -88,54 +88,30 @@ const saveAssetsBatch = async (tableName, items, res, context) => {
// --- Routes ---
-// 0. User Management
-app.get('/api/users', (req, res) => fetchAssets('system_users', res, 'USERS'));
-app.post('/api/users/batch', (req, res) => saveAssetsBatch('system_users', req.body, res, 'USERS BATCH'));
+const routeMap = {
+ '/api/users': { table: 'system_users', context: 'USERS' },
+ '/api/pc': { table: 'asset_pc', context: 'PC' },
+ '/api/server': { table: 'asset_server', context: 'SERVER' },
+ '/api/storage': { table: 'asset_storage', context: 'STORAGE' },
+ '/api/network': { table: 'asset_network', context: 'NETWORK' },
+ '/api/sw/internal': { table: 'asset_sw_internal', context: 'SW INTERNAL' },
+ '/api/sw/external': { table: 'asset_sw_external', context: 'SW EXTERNAL' },
+ '/api/survey': { table: 'asset_survey', context: 'SURVEY' },
+ '/api/pc-parts': { table: 'asset_pc_parts', context: 'PC PARTS' },
+ '/api/equipment': { table: 'asset_equipment', context: 'EQUIPMENT' },
+ '/api/office-supplies': { table: 'asset_office_supplies', context: 'OFFICE SUPPLIES' },
+ '/api/cloud': { table: 'asset_cloud', context: 'CLOUD' },
+ '/api/domain': { table: 'asset_domain', context: 'DOMAIN' },
+ '/api/cost': { table: 'asset_cost', context: 'COST' },
+ '/api/vip': { table: 'asset_vip', context: 'VIP' },
+ '/api/asset/software/assignment': { table: 'asset_software_assignment', context: 'SW ASSIGN' }
+};
-// 1. Hardware Assets
-app.get('/api/pc', (req, res) => fetchAssets('asset_pc', res, 'PC'));
-app.post('/api/pc/batch', (req, res) => saveAssetsBatch('asset_pc', req.body, res, 'PC BATCH'));
-
-app.get('/api/server', (req, res) => fetchAssets('asset_server', res, 'SERVER'));
-app.post('/api/server/batch', (req, res) => saveAssetsBatch('asset_server', req.body, res, 'SERVER BATCH'));
-
-app.get('/api/storage', (req, res) => fetchAssets('asset_storage', res, 'STORAGE'));
-app.post('/api/storage/batch', (req, res) => saveAssetsBatch('asset_storage', req.body, res, 'STORAGE BATCH'));
-
-app.get('/api/network', (req, res) => fetchAssets('asset_network', res, 'NETWORK'));
-app.post('/api/network/batch', (req, res) => saveAssetsBatch('asset_network', req.body, res, 'NETWORK BATCH'));
-
-// 2. Software Assets
-app.get('/api/sw/internal', (req, res) => fetchAssets('asset_sw_internal', res, 'SW INTERNAL'));
-app.post('/api/sw/internal/batch', (req, res) => saveAssetsBatch('asset_sw_internal', req.body, res, 'SW INTERNAL BATCH'));
-
-app.get('/api/sw/external', (req, res) => fetchAssets('asset_sw_external', res, 'SW EXTERNAL'));
-app.post('/api/sw/external/batch', (req, res) => saveAssetsBatch('asset_sw_external', req.body, res, 'SW EXTERNAL BATCH'));
-
-// 3. Other Assets
-app.get('/api/survey', (req, res) => fetchAssets('asset_survey', res, 'SURVEY'));
-app.post('/api/survey/batch', (req, res) => saveAssetsBatch('asset_survey', req.body, res, 'SURVEY BATCH'));
-
-app.get('/api/pc-parts', (req, res) => fetchAssets('asset_pc_parts', res, 'PC PARTS'));
-app.post('/api/pc-parts/batch', (req, res) => saveAssetsBatch('asset_pc_parts', req.body, res, 'PC PARTS BATCH'));
-
-app.get('/api/equipment', (req, res) => fetchAssets('asset_equipment', res, 'EQUIPMENT'));
-app.post('/api/equipment/batch', (req, res) => saveAssetsBatch('asset_equipment', req.body, res, 'EQUIPMENT BATCH'));
-
-app.get('/api/office-supplies', (req, res) => fetchAssets('asset_office_supplies', res, 'OFFICE SUPPLIES'));
-app.post('/api/office-supplies/batch', (req, res) => saveAssetsBatch('asset_office_supplies', req.body, res, 'OFFICE SUPPLIES BATCH'));
-
-app.get('/api/cloud', (req, res) => fetchAssets('asset_cloud', res, 'CLOUD'));
-app.post('/api/cloud/batch', (req, res) => saveAssetsBatch('asset_cloud', req.body, res, 'CLOUD BATCH'));
-
-app.get('/api/domain', (req, res) => fetchAssets('asset_domain', res, 'DOMAIN'));
-app.post('/api/domain/batch', (req, res) => saveAssetsBatch('asset_domain', req.body, res, 'DOMAIN BATCH'));
-
-app.get('/api/cost', (req, res) => fetchAssets('asset_cost', res, 'COST'));
-app.post('/api/cost/batch', (req, res) => saveAssetsBatch('asset_cost', req.body, res, 'COST BATCH'));
-
-app.get('/api/vip', (req, res) => fetchAssets('asset_vip', res, 'VIP'));
-app.post('/api/vip/batch', (req, res) => saveAssetsBatch('asset_vip', req.body, res, 'VIP BATCH'));
+// 동적 라우팅 생성 (Dynamic Routing)
+Object.entries(routeMap).forEach(([route, { table, context }]) => {
+ app.get(route, (req, res) => fetchAssets(table, res, context));
+ app.post(`${route}/batch`, (req, res) => saveAssetsBatch(table, req.body, res, `${context} BATCH`));
+});
// 4. Legacy/Auxiliary (History & Assignment)
app.get('/api/asset/history', (req, res) => fetchAssets('asset_history', res, 'HISTORY'));
@@ -160,9 +136,6 @@ app.post('/api/asset/history/batch', async (req, res) => {
} catch (err) { await connection.rollback(); handleError(res, err, 'BATCH HISTORY'); } finally { connection.release(); }
});
-app.get('/api/asset/software/assignment', (req, res) => fetchAssets('asset_software_assignment', res, 'SW ASSIGN'));
-app.post('/api/asset/software/assignment/batch', (req, res) => saveAssetsBatch('asset_software_assignment', req.body, res, 'SW ASSIGN BATCH'));
-
// 5. Utility
app.get('/api/generate-asset-code', async (req, res) => {
try {
diff --git a/src/components/Modal/DomainModal.ts b/src/components/Modal/DomainModal.ts
index 3aedd02..d0702dd 100644
--- a/src/components/Modal/DomainModal.ts
+++ b/src/components/Modal/DomainModal.ts
@@ -5,6 +5,7 @@ import { generateOptionsHTML, setEditLock } from './ModalUtils';
import { createIcons, X, Save, Database, CalendarClock, Edit2 } from 'lucide';
import { formatExcelDate } from '../../core/excelHandler';
import { UI_TEXT } from '../../core/schema';
+import { API_BASE_URL } from '../../core/utils';
let currentItem: any = null;
diff --git a/src/components/Modal/SWModal.ts b/src/components/Modal/SWModal.ts
index ebdf65f..1e43401 100644
--- a/src/components/Modal/SWModal.ts
+++ b/src/components/Modal/SWModal.ts
@@ -4,6 +4,7 @@ import { openSwUserModal } from './SWUserModal';
import { createIcons, History, Plus, X, Save, Edit2, RotateCcw, Calendar } from 'lucide';
import { CORP_LIST } from './SharedData';
import { ASSET_SCHEMA, UI_TEXT } from '../../core/schema';
+import { API_BASE_URL } from '../../core/utils';
import {
generateOptionsHTML,
setFieldValue,
@@ -433,7 +434,7 @@ export function initSwModal(onSave: () => void, closeModals: () => void) {
};
// Call generic API for logs (could be added to state.ts)
- await fetch(`http://${location.hostname}:3000/api/asset/history/batch`, {
+ await fetch(`${API_BASE_URL}/api/asset/history/batch`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify([...state.masterData.logs, log])
diff --git a/src/core/dummyDataGenerator.ts b/src/core/dummyDataGenerator.ts
deleted file mode 100644
index fde0f2e..0000000
--- a/src/core/dummyDataGenerator.ts
+++ /dev/null
@@ -1,200 +0,0 @@
-import { MasterAssetData, HardwareAsset, SoftwareAsset, SWUser } from './excelHandler';
-
-const corps = ['한맥', '삼안', '바론'];
-const users = ['홍길동', '김철수', '이영희', '박지훈', '김팀장', '신유진', '윤대웅', '마리아'];
-const depts = ['설계팀', '기술팀', '경영지원팀', '영업팀'];
-
-function rand(arr: any[]) {
- return arr[Math.floor(Math.random() * arr.length)];
-}
-
-function randDate(startYear: number, endYear: number) {
- const y = Math.floor(Math.random() * (endYear - startYear + 1)) + startYear;
- const m = String(Math.floor(Math.random() * 12) + 1).padStart(2, '0');
- const d = String(Math.floor(Math.random() * 28) + 1).padStart(2, '0');
- return `${y}-${m}-${d}`;
-}
-
-function randUser() { // 25% 확률로 유휴자산 할당
- return Math.random() < 0.25 ? '' : rand(users);
-}
-
-export function generateDummyData(): MasterAssetData {
- const pc: HardwareAsset[] = [];
- const server: HardwareAsset[] = [];
- const storage: HardwareAsset[] = [];
- const equip: HardwareAsset[] = [];
- const mobile: HardwareAsset[] = [];
- const subSw: SoftwareAsset[] = [];
- const permSw: SoftwareAsset[] = [];
- const swUsers: any[] = [];
- const logs: any[] = [];
-
- // 1. 개인PC 50개
- for (let i = 1; i <= 50; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017;
- pc.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '개인PC',
- 법인: rand(corps),
- 자산코드: `HM-PC-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: '',
- 위치: `${rand(['본사', '지사'])} ${Math.floor(Math.random()*5)+1}층`,
- 사용자: randUser(),
- CPU: rand(['i5-10400', 'i7-12700', 'Ryzen 5', 'Ryzen 7']),
- GPU: rand(['-', 'GTX 1660', 'RTX 3060', 'RTX 4070']),
- RAM: rand(['16GB', '32GB']),
- SSD1: rand(['256GB', '512GB', '1TB']),
- SSD2: '',
- HDD1: rand(['-', '1TB', '2TB']),
- HDD2: '',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: String(Math.floor(Math.random()*100 + 50) * 10000).replace(/\B(?=(\d{3})+(?!\d))/g, ','),
- 구매업체: rand(['다나와', '컴퓨존', '오피스디포']),
- 품의서명: '',
- 관리자: '', IP주소: '', MACaddress: '', OS: '', HW사양: ''
- });
- }
-
- // 2. 서버 20개
- for (let i = 1; i <= 20; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017;
- server.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '서버',
- 법인: rand(corps),
- 자산코드: `HM-SV-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: `웹/DB 서버 #${i}`,
- 용도: rand(['웹 서버', 'DB 서버', '백업 서버', '개발 서버']),
- storage유형: rand(['물리', 'VM']),
- 위치: rand(['IDC 1센터', 'IDC 2센터', '본사 전산실']),
- 관리자: rand(users),
- 담당자_정: rand(users),
- 담당자_부: rand(users),
- IP주소: `192.168.10.${i}`,
- 원격접속: `ssh://192.168.10.${i}:22`,
- MACaddress: '00:11:22:33:44:' + String(i).padStart(2, '0'),
- OS: rand(['Windows Server 2019', 'Ubuntu 22.04 LTS', 'CentOS 7']),
- 모델명: rand(['Dell PowerEdge R740', 'HP ProLiant DL380', 'Lenovo ThinkSystem']),
- CPU: rand(['Xeon Silver 4210', 'Xeon Gold 6248', 'EPYC 7702']),
- RAM: rand(['64GB', '128GB', '256GB']),
- GPU: rand(['-', 'RTX A4000', 'Tesla V100']),
- SSD1: rand(['512GB SSD', '1TB NVMe']),
- SSD2: rand(['-', '1TB SSD', '2TB SSD']),
- HDD1: rand(['-', '4TB HDD', '8TB HDD']),
- 모니터링: rand(['Zabbix', 'Grafana', 'PRTG']),
- 비고: i % 5 === 0 ? '정기 점검 대상' : '-',
- HW사양: 'Xeon 16Core, 64GB RAM',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '5,000,000',
- 구매업체: '서버뱅크',
- 품의서명: ''
- });
- }
-
- // 3. 스토리지 10개
- for (let i = 1; i <= 10; i++) {
- const purchaseYear = Math.floor(Math.random() * 10) + 2017;
- storage.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '스토리지',
- 법인: rand(corps),
- storage유형: rand(['NAS', 'DAS']),
- 자산코드: `HM-ST-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: `백업 스토리지 #${i}`,
- 위치: '전산실',
- 모델명: rand(['Synology DS920+', 'QNAP TS-453D']),
- 용량: rand(['16TB', '32TB', '64TB']),
- 담당자_정: randUser(),
- 담당자_부: rand(users),
- IP주소: `192.168.20.${i}`,
- MACaddress: '',
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '1,500,000',
- 구매업체: '스토리지넷',
- 품의서명: '',
- 관리자: '', OS: '', HW사양: ''
- });
- }
-
- // 4. 전산비품 15개
- for (let i = 1; i <= 15; i++) {
- const purchaseYear = Math.floor(Math.random() * 8) + 2019;
- equip.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '전산비품',
- 법인: rand(corps),
- 비품유형: rand(['프린터', '모니터', 'UPS']),
- 자산코드: `HM-EQ-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: `비품 #${i}`,
- 위치: rand(['본사', '지사']),
- 관리자: randUser(),
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '300,000',
- 구매업체: '오피스공구',
- 품의서명: '',
- IP주소: '', MACaddress: '', OS: '', HW사양: ''
- });
- }
-
- // 5. 모바일기기 10개
- for (let i = 1; i <= 10; i++) {
- const purchaseYear = Math.floor(Math.random() * 5) + 2022;
- mobile.push({
- id: Math.random().toString(36).substring(2, 9),
- type: '모바일기기',
- 법인: rand(corps),
- 자산코드: `HM-MO-${purchaseYear}-${String(i).padStart(3, '0')}`,
- 명칭: rand(['아이폰 15', '갤럭시 S24', '아이패드 에어']),
- 위치: '개인 지급',
- 관리자: randUser(),
- OS: rand(['iOS', 'Android', 'iPadOS']),
- 구매일: randDate(purchaseYear, purchaseYear),
- 금액: '1,200,000',
- 구매업체: '통신사',
- 품의서명: '',
- IP주소: '', MACaddress: '', HW사양: '', 비고: ''
- });
- }
-
- // 6. 구독 SW 20개
- for (let i = 1; i <= 20; i++) {
- const swId = Math.random().toString(36).substring(2, 9);
- subSw.push({
- id: swId,
- type: '구독SW',
- 분야: rand(['업무공통', '개발S/W']),
- 법인: rand(corps),
- 제품명: rand(['Adobe CC', 'M365']),
- 구매일: '2024-01-01',
- 만료일: '2025-01-01',
- 금액: '100,000',
- 수량: 5,
- 계정명: `admin${i}@hm.com`,
- 구매업체: '총판',
- 비고: ''
- });
- swUsers.push({ sw_id: swId, userData: [[rand(corps), rand(depts), '사원', rand(users), '2024.01~12', '신청완료']] });
- }
-
- // 7. 영구 SW 20개
- for (let i = 1; i <= 20; i++) {
- const swId = Math.random().toString(36).substring(2, 9);
- permSw.push({
- id: swId,
- type: '영구SW',
- 분야: rand(['설계S/W']),
- 법인: rand(corps),
- 제품명: rand(['AutoCAD', '한컴오피스']),
- 구매일: '2023-01-01',
- 라이선스키: `KEY-${swId}`,
- 금액: '500,000',
- 수량: 2,
- 계정명: `license${i}`,
- 구매업체: '총판',
- 비고: ''
- });
- }
-
- return { pc, server, storage, equip, mobile, subSw, permSw, cloud: [], swUsers, logs, sw: [], hw: [] };
-}
diff --git a/src/core/state.ts b/src/core/state.ts
index 51962c5..864737b 100644
--- a/src/core/state.ts
+++ b/src/core/state.ts
@@ -1,4 +1,5 @@
import { HardwareAsset, SoftwareAsset, SWUser, HardwareLog } from './excelHandler';
+import { API_BASE_URL } from './utils';
// --- State Definitions ---
export interface MasterAssetData {
@@ -79,8 +80,7 @@ export async function loadMasterDataFromDB() {
{ key: 'logs', url: '/api/asset/history' }
];
- const host = `http://${location.hostname}:3000`;
- const results = await Promise.all(endpoints.map(e => fetch(host + e.url)));
+ const results = await Promise.all(endpoints.map(e => fetch(API_BASE_URL + e.url)));
for (let i = 0; i < endpoints.length; i++) {
if (results[i].ok) {
@@ -148,7 +148,7 @@ export async function saveAsset(category: string, asset: any) {
'vip': '/api/vip/batch'
};
- const url = `http://${location.hostname}:3000${endpointMap[category]}`;
+ const url = `${API_BASE_URL}${endpointMap[category]}`;
const currentList = [...(state.masterData as any)[category]];
const idx = currentList.findIndex(a => a.id === asset.id);
@@ -194,7 +194,7 @@ export async function deleteAsset(category: string, assetId: string) {
'vip': '/api/vip/batch'
};
- const url = `http://${location.hostname}:3000${endpointMap[category]}`;
+ const url = `${API_BASE_URL}${endpointMap[category]}`;
const currentList = [...(state.masterData as any)[category]];
const filteredList = currentList.filter(a => a.id !== assetId);
diff --git a/src/core/utils.ts b/src/core/utils.ts
index 28d0bbc..ecfa10a 100644
--- a/src/core/utils.ts
+++ b/src/core/utils.ts
@@ -1,5 +1,7 @@
import { PAGE_DESCRIPTIONS } from './schema';
+export const API_BASE_URL = `http://${location.hostname}:3000`;
+
/**
* ITAM 공통 유틸리티 함수
*/
diff --git a/temp_sw.txt b/temp_sw.txt
deleted file mode 100644
index 7da9bab..0000000
Binary files a/temp_sw.txt and /dev/null differ