diff --git a/.gitignore b/.gitignore index 1a3c8296..e69ea461 100644 --- a/.gitignore +++ b/.gitignore @@ -9,8 +9,8 @@ # next.js /.next/ -/out/ .next +/out/ # production /build @@ -50,4 +50,6 @@ bower_components psd thumb -sketch \ No newline at end of file +sketch +# Sentry Config File +.env.sentry-build-plugin diff --git a/README.md b/README.md index cf913378..ab51bf9a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,322 @@ -part 4 frontend +## 대리 여행 중개 플랫폼 -[양가현, 김은효, 방신철, 현준배] +![logo](https://i.imgur.com/bvVO9xc.png) + +> 2025.01.07 - 2025.02.26
+> 코드잇 스프린트 풀스택 2기 고급 프로젝트 2팀 (Frontend) +>
> [Backend Github 바로가기 🔗](https://github.com/GoHawaiiForMe/backend) + +
+ +- [니가가라 하와이] 홈페이지: https://www.go-for-me.kro.kr +- 🗂️ 팀 문서: https://spotless-file-76e.notion.site/2-15f9b6a2707e806ba711ff1f83c499d3?pvs=4 +- 🔍 API 명세: https://www.goforme.duckdns.org/docs + +
+ +## 🛠️ 기술스택 + +![Typescript](https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge&logo=typescript&logoColor=white) + +![github](https://img.shields.io/badge/GitHub-100000?style=for-the-badge&logo=github&logoColor=white) ![slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge&logo=slack&logoColor=white) ![discord](https://img.shields.io/badge/Discord-7289DA?style=for-the-badge&logo=discord&logoColor=white) ![notion](https://img.shields.io/badge/Notion-000000?style=for-the-badge&logo=notion&logoColor=white) ![Swagger](https://img.shields.io/badge/-Swagger-%23Clojure?style=for-the-badge&logo=swagger&logoColor=white) ...etc + + +
+ +## 💁 구성원 + +| 양가현 | 김은효 | 방신철 | 현준배 | +| :--------------------------------------------------------------: | :---------------------------------------------------------: | :--------------------------------------------------------------: | :---------------------------------------------------------: | +| | | | | +| **프론트엔드장** | | +| 중간 발표 자료 제작, AWS 배포 및 관리, 발표 자료 정리, 발표 | 프론트엔드 GitHub 관리 | AWS 배포 및 관리, 시연 영상 제작 | 회의록 관리, 노션 관리 | +| [Github 바로가기 🔗](https://github.com/gahyeon-yang) | [Github 바로가기 🔗](https://github.com/kirinkiri) | [Github 바로가기 🔗](https://github.com/bangsinchur) | [Github 바로가기 🔗](https://github.com/junbaehyun) | + + +
+ +## 📋 팀원별 구현 기능 상세 + +### [양가현] + +- 초기세팅 +- 로그인, 회원가입, 간편로그인 페이지 +- Dreamer 프로필 등록 및 수정 페이지 +- Maker 기본정보 수정 페이지 +- 여행 요청 페이지 +- Maker 상세페이지 +- 찜한 Maker 페이지 +- 네비게이션바, 유저메뉴, 사이드바 +- 랜딩 페이지(지역 통계) + +- 404 페이지 + +- 알림, 실시간 알림 +- 실시간 채팅(웹소켓) +- 시스템 로그 페이지 +- AWS 배포 + + +### [김은효] + +- Dreamer 플랜 관리 페이지 + - 플랜 네브바 + - 플랜 상세 페이지 - 플랜 삭제하기 + - 견적 상세 페이지 - 견적 확정하기 +- Dreamer 리뷰 관리 페이지 + - 리뷰 네브바 + - 여행 완료 페이지 + - 리뷰 작성 페이지 - 리뷰 작성하기 모달 + - 작성한 리뷰 페이지 + +- FE README.md + +### [방신철] + +- Maker 프로필 등록 및 수정 +- 플랜 목록(받은 플랜, 전체 플랜) +- 견적 보내기 / 반려하기 모달 +- Maker 견적 관리 + - 보낸 견적 조회 + - 취소된 견적 + - 상세 페이지 +- Maker 마이페이지 +- 코코넛 충전하기(PortOne) +- SNS 공유하기 +- 랜딩 페이지 + +- AWS 배포 + +- 시연 영상 제작 + +### [현준배] + +- Maker 찾기 페이지 + +- 회의록 작성 및 노션 팀 문서 관리 + +
+ +## ⚓️ 프론트엔드 전략 + +Next.js와 Type script를 기반으로 한 프론트엔드는, 빠르고 안정적이면서도 다양한 기능으로 유저의 사용 편의성을 극대화 시키며 완성도를 높였습니다. Zustand와 React Query를 활용하여 상태 관리 및 데이터 관리를 효율적으로 처리하며, Tailwind CSS와 Styled-Components를 통해 스타일링을 구현합니다. 또한, 실시간 알림과 결제 기능을 통합하여 사용자 경험을 향상시킵니다. + +- **프레임워크**: Next.js +- **프로그래밍 언어**: TypeScript +- **스타일링**: Tailwind CSS, Styled-Components +- **상태 관리**: Zustand +- **데이터 관리**: React Query +- **주요 기능**: + - **인증**: 사용자 인증 및 권한 관리 + - **검색 및 필터링**: 다양한 필터 옵션을 통한 Maker 검색 + - **무한 스크롤**: React Query를 활용한 무한 스크롤 구현 + - **팔로우 기능**: Maker 팔로우 및 관리 + - **반응형 디자인**: 다양한 디바이스에 대응하는 반응형 UI + - **이미지 관리**: Next.js Image 컴포넌트를 활용한 최적화된 이미지 처리 + - **알림 기능**: 실시간 알림을 통해 사용자에게 중요한 정보를 전달 + - **결제 기능**: 안전하고 신뢰할 수 있는 결제 시스템 통합 +- **설계 특징**: + - **컴포넌트 기반 설계**: 재사용 가능한 컴포넌트 구조 + - **API 연동**: Axios를 통한 서버와의 통신 + - **CI/CD**: GitHub Actions를 통한 자동화된 배포 및 테스트 + - **코드 품질 관리**: Prettier를 통한 코드 스타일 및 품질 유지 + - **환경 설정**: Vercel을 통한 배포 및 환경 설정 + - **웹 접근성**: 모든 사용자가 접근할 수 있도록 웹 접근성 고려 + +
+ +## 🍰 프로젝트 회고 + +- 프론트엔드 결과물: https://www.go-for-me.kro.kr +- 발표 자료 및 시연 영상 : https://drive.google.com/drive/folders/1UQssCDbmnRkehWDOo0fyqkM-jvmzNdUU + +
+ +## 📁 파일 구조 + +``` +public +├── assets +| └── images +├── favicon. ico +└── korea-topo.json +src +├── components +| ├── Common +| | ├── Bubble.tsx +| | ├── Button.tsx +| | ├── Calander.tsx +| | ├── CardFindMaker.tsx +| | ├── ClipboardCopy.tsx +| | ├── CompleteTrip.tsx +| | ├── ConfirmedPlan.tsx +| | ├── DreamerFilter.tsx +| | ├── DropdownSort.tsx +| | ├── FollowedCard.tsx +| | ├── ImageModal.tsx +| | ├── Input.tsx +| | ├── Label.tsx +| | ├── Layout.tsx +| | ├── ModalLayout.tsx +| | ├── Pagination.tsx +| | ├── ReviewForm.tsx +| | ├── SearchBar.tsx +| | ├── Selector.tsx +| | ├── ShareSNS.tsx +| | └── SocialLogin.tsx +| ├── Gnb +| | ├── ChargeModal.tsx +| | ├── NavBar.tsx +| | ├── Notification.tsx +| | └── UserMenu.tsx +| ├── Landing +| | ├── FeatureCard.tsx +| | ├── Features.tsx +| | ├── Hero.tsx +| | └── MapMarker.tsx +| ├── MyPlans +| | ├── Cards +| | | ├── PlanCard.tsx +| | | ├── QuotationCard.tsx +| | | └── QuotationCardCompleted.tsx +| | ├── MyPlanDetail.tsx +| | ├── MyPlanDetailCompleted.tsx +| | ├── MyPlanList.tsx +| | ├── MyPlanNav.tsx +| | ├── QuotationCardList.tsx +| | └── QuotationCardListCompleted.tsx +| ├── MyReviews +| | ├── Cards +| | | ├── ReviewCard.tsx +| | | └── TripCard.tsx +| | ├── MyCompletedTripList.tsx +| | ├── MyReviewList.tsx +| | └── MyReviewNav.tsx +| └── Receive +| ├── CheckFilter.tsx +| ├── CustomerInput.tsx +| ├── FastDropdown.tsx +| ├── ModalFilter.tsx +| ├── Quotation.tsx +| ├── QuotationDetailsContainer.tsx +| ├── ReceiveModalLayout.tsx +| ├── Reject.tsx +| ├── RequestDetails.tsx +| ├── ReviewGraph.tsx +| ├── SendQuotation.tsx +| └── StarRating.tsx +├── features +| ├── ChattingForm.tsx +| ├── DetailMaker.tsx +| ├── FollowedMaker.tsx +| ├── InformEditMaker.tsx +| ├── LoginForm.tsx +| ├── OAuthSignupForm.tsx +| ├── PlanRequest.tsx +| ├── ProfileDreamer.tsx +| ├── ProfileEditDreamer.tsx +| ├── ProfileEditMaker.tsx +| ├── ProfileMaker.tsx +| ├── SignupForm.tsx +| └── SystemLog.tsx +├── pages +| ├── 404 +| | └── index.tsx +| ├── activity-logs +| | └── index.tsx +| ├── all-receive-plan +| | └── index.tsx +| ├── chatting +| | └── index.tsx +| ├── finding-maker +| | └── index.tsx +| ├── follow-maker +| | └── index.tsx +| ├── login +| | └── index.tsx +| ├── maker-detail +| | └── index.tsx +| ├── managequo +| | └── index.tsx +| ├── myreview-manage +| | ├── completed-trip +| | | └── index.tsx +| | ├── reviewable-trip +| | | └── index.tsx +| | └── reviewed-trip +| | └── index.tsx +| ├── mytrip-manage +| | ├── completed-plan +| | | └── index.tsx +| | ├── ongoing-plan +| | | └── index.tsx +| | ├── overdue-plan +| | | └── index.tsx +| | └── quotationdetail-dreamer +| | └── [planId].tsx +| ├── plan-detail +| | └── [id].tsx +| ├── plan-request +| | └── index.tsx +| ├── profile +| | ├── dreamer +| | | ├── edit +| | | | └── [id].tsx +| | | └── index.tsx +| | └── maker +| | | ├── edit +| | | | ├── profileEdit +| | | | | └── [id].tsx +| | | | └── informEdit.tsx +| | | ├── mypage +| | | | └── [id].tsx +| | | └── index.tsx +| ├── quotation-detail +| | └── [id].tsx +| ├── receive +| | └── index.tsx +| ├── reject-list +| | └── index.tsx +| ├── signup +| | ├── index.tsx +| | └── oauth.tsx +| ├── _app.tsx +| ├── _document.tsx +| └── index.tsx +├── services +| ├── api.ts +| ├── apiClient.ts +| ├── authService.ts +| ├── chargeService.ts +| ├── chatService.ts +| ├── followService.ts +| ├── notificationService.ts +| ├── planService.ts +| ├── quotationService.ts +| ├── quotationServiceDreamer.ts +| ├── requestService.ts +| ├── reviewService.ts +| └── userService.ts +├── stores +| ├── SignUpContext.tsx +| ├── useAuthStore.tsx +| ├── useRealTimeNotification.ts +| └── withAuthAccess.tsx +├── styles +| └── globals.css +├── types +| ├── chatData.ts +| ├── facebook.d.ts +| ├── kakao.d.ts +| └── planData.ts +└── utils + ├── errorStatus.ts + ├── formatDate.ts + ├── formatImage.ts + ├── formatRegion.ts + ├── formatTripType.ts + ├── random.ts + ├── tokenUtils.ts + └── validate.ts + +``` diff --git a/next.config.ts b/next.config.ts index 39151635..e3a6f7fc 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,8 +1,17 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + trailingSlash: true, reactStrictMode: true, + images: { + unoptimized: true, + remotePatterns: [ + { + protocol: "https", + hostname: "images.unsplash.com", + }, + ], + }, }; export default nextConfig; diff --git a/package-lock.json b/package-lock.json index 65828bef..a35712d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,9 @@ "dependencies": { "@hookform/resolvers": "^3.9.1", "@portone/browser-sdk": "^0.0.12", + "@sentry/browser": "^9.0.1", "@tanstack/react-query": "^5.62.10", + "@types/react-simple-maps": "^3.0.6", "autoprefixer": "^10.4.20", "axios": "^1.7.9", "cookie": "^1.0.2", @@ -20,12 +22,14 @@ "nookies": "^2.5.2", "nprogress": "^0.2.0", "postcss": "^8.4.49", - "react": "^19.0.0", + "react": "^18.3.1", "react-calendar": "^5.1.0", "react-daum-postcode": "^3.2.0", - "react-dom": "^19.0.0", + "react-dom": "^18.2.0", "react-hook-form": "^7.54.2", "react-intersection-observer": "^9.15.1", + "react-simple-maps": "^3.0.0", + "recharts": "^2.15.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.14", "tailwindcss": "^3.4.17", @@ -59,6 +63,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@babel/runtime": { + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", @@ -866,6 +881,16 @@ "node": ">=12.4.0" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -892,6 +917,81 @@ "integrity": "sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==", "dev": true }, + "node_modules/@sentry-internal/browser-utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-9.1.0.tgz", + "integrity": "sha512-S1uT+kkFlstWpwnaBTIJSwwAID8PS3aA0fIidOjNezeoUE5gOvpsjDATo9q+sl6FbGWynxMz6EnYSrq/5tuaBQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-9.1.0.tgz", + "integrity": "sha512-jTDCqkqH3QDC8m9WO4mB06hqnBRsl3p7ozoh0E774UvNB6blOEZjShhSGMMEy5jbbJajPWsOivCofUtFAwbfGw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "9.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-9.1.0.tgz", + "integrity": "sha512-E2xrUoms90qvm0BVOuaZ8QfkMoTUEgoIW/35uOeaqNcL7uOIj8c5cSEQQKit2Dr7CL6W+Ci5c6Khdyd5C0NL5w==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.1.0", + "@sentry/core": "9.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-9.1.0.tgz", + "integrity": "sha512-gxredVe+mOgfNqDJ3dTLiRON3FK1rZ8d0LHp7TICK/umLkWFkuso0DbNeyKU+3XCEjCr9VM7ZRqTDMzmY6zyVg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "9.1.0", + "@sentry/core": "9.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/browser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-9.1.0.tgz", + "integrity": "sha512-G55e5j77DqRW3LkalJLAjRRfuyKrjHaKTnwIYXa6ycO+Q1+l14pEUxu+eK5Abu2rtSdViwRSb5/G6a/miSUlYA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "9.1.0", + "@sentry-internal/feedback": "9.1.0", + "@sentry-internal/replay": "9.1.0", + "@sentry-internal/replay-canvas": "9.1.0", + "@sentry/core": "9.1.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/core": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-9.1.0.tgz", + "integrity": "sha512-djWEzSBpMgqdF3GQuxO+kXCUX+Mgq42G4Uah/HSUBvPDHKipMmyWlutGRoFyVPPOnCDgpHu3wCt83wbpEyVmDw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@socket.io/component-emitter": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", @@ -934,6 +1034,95 @@ "react": "^18 || ^19" } }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" + }, + "node_modules/@types/d3-geo": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-2.0.7.tgz", + "integrity": "sha512-RIXlxPdxvX+LAZFv+t78CuYpxYag4zuw9mZc+AwfB8tZpKU90rMEn2il2ADncmeZlb7nER9dDsJpRisA3lRvjA==", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-2.0.5.tgz", + "integrity": "sha512-71BorcY0yXl12S7lvb01JdaN9TpeUHBDb4RRhSq8U8BEkX/nIk5p7Byho+ZRTsx5nYLMpAbY3qt5EhqFzfGJlw==" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" + }, + "node_modules/@types/d3-zoom": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-2.0.7.tgz", + "integrity": "sha512-JWke4E8ZyrKUQ68ESTWSK16fVb0OYnaiJ+WXJRYxKLn4aXU0o4CLYxMWBEiouUfO3TTCoyroOrGPcBG6u1aAxA==", + "dependencies": { + "@types/d3-interpolate": "^2", + "@types/d3-selection": "^2" + } + }, + "node_modules/@types/d3-zoom/node_modules/@types/d3-color": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-2.0.6.tgz", + "integrity": "sha512-tbaFGDmJWHqnenvk3QGSvD3RVwr631BjKRD7Sc7VLRgrdX5mk5hTyoeBL6rXZaeoXzmZwIl1D2HPogEdt1rHBg==" + }, + "node_modules/@types/d3-zoom/node_modules/@types/d3-interpolate": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-2.0.5.tgz", + "integrity": "sha512-UINE41RDaUMbulp+bxQMDnhOi51rh5lA2dG+dWZU0UY/IwQiG/u2x8TfnWYU9+xwGdXsJoAvrBYUEQl0r91atg==", + "dependencies": { + "@types/d3-color": "^2" + } + }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", @@ -946,6 +1135,11 @@ "integrity": "sha512-iaiDuDI2aIFft7XkcwMzDWLqo7LVDixd2sR6B4wxJut9xcp/Ev9bO4EFg4rm6S9QxATLBj5OPxdeocgmhjwKaw==", "dev": true }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -971,7 +1165,6 @@ "version": "19.0.8", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.8.tgz", "integrity": "sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==", - "devOptional": true, "dependencies": { "csstype": "^3.0.2" } @@ -985,6 +1178,17 @@ "@types/react": "^19.0.0" } }, + "node_modules/@types/react-simple-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/react-simple-maps/-/react-simple-maps-3.0.6.tgz", + "integrity": "sha512-hR01RXt6VvsE41FxDd+Bqm1PPGdKbYjCYVtCgh38YeBPt46z3SwmWPWu2L3EdCAP6bd6VYEgztucihRw1C0Klg==", + "dependencies": { + "@types/d3-geo": "^2", + "@types/d3-zoom": "^2", + "@types/geojson": "*", + "@types/react": "*" + } + }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", @@ -1906,6 +2110,219 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "node_modules/d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", + "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", + "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "dependencies": { + "d3-array": "^2.5.0" + } + }, + "node_modules/d3-geo/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-geo/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "dependencies": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + }, + "peerDependencies": { + "d3-selection": "2" + } + }, + "node_modules/d3-transition/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-transition/node_modules/d3-ease": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + }, + "node_modules/d3-transition/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/d3-transition/node_modules/d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "node_modules/d3-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", + "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "node_modules/d3-zoom/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-zoom/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -1985,6 +2402,11 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2064,6 +2486,15 @@ "node": ">=0.10.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2130,9 +2561,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.0.tgz", - "integrity": "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==", + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -2758,12 +3189,25 @@ "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.31.tgz", "integrity": "sha512-4IJSItgS/41IxN5UVAVuAyczwZF7ZIEsM1XAoUzIHA6A+xzusEZUutdXz2Nr+MQPLxfTiCvqE79/C8HT8fKFvA==" }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-equals": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -3307,6 +3751,14 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -3734,11 +4186,14 @@ } }, "node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "optional": true, + "peer": true, "bin": { - "jiti": "bin/jiti.js" + "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-tokens": { @@ -3874,6 +4329,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4698,7 +5158,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", @@ -4739,9 +5198,12 @@ ] }, "node_modules/react": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", - "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } @@ -4779,14 +5241,15 @@ } }, "node_modules/react-dom": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", - "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { - "scheduler": "^0.25.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" }, "peerDependencies": { - "react": "^19.0.0" + "react": "^18.2.0" } }, "node_modules/react-hook-form": { @@ -4821,8 +5284,52 @@ "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-simple-maps": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-simple-maps/-/react-simple-maps-3.0.0.tgz", + "integrity": "sha512-vKNFrvpPG8Vyfdjnz5Ne1N56rZlDfHXv5THNXOVZMqbX1rWZA48zQuYT03mx6PAKanqarJu/PDLgshIZAfHHqw==", + "dependencies": { + "d3-geo": "^2.0.2", + "d3-selection": "^2.0.0", + "d3-zoom": "^2.0.0", + "topojson-client": "^3.1.0" + }, + "peerDependencies": { + "prop-types": "^15.7.2", + "react": "^16.8.0 || 17.x || 18.x", + "react-dom": "^16.8.0 || 17.x || 18.x" + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } }, "node_modules/read-cache": { "version": "1.0.0", @@ -4843,6 +5350,41 @@ "node": ">=8.10.0" } }, + "node_modules/recharts": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz", + "integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/recharts/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -4865,6 +5407,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -5006,9 +5553,12 @@ } }, "node_modules/scheduler": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz", - "integrity": "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "7.7.0", @@ -5690,6 +6240,14 @@ "node": ">=14.0.0" } }, + "node_modules/tailwindcss/node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -5718,6 +6276,11 @@ "node": ">=0.8" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5729,6 +6292,24 @@ "node": ">=8.0" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, "node_modules/ts-api-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.0.1.tgz", @@ -5941,6 +6522,27 @@ "uuid": "dist/esm/bin/uuid" } }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/warning": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", diff --git a/package.json b/package.json index 607dffe9..e04a5f2e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "dependencies": { "@hookform/resolvers": "^3.9.1", "@portone/browser-sdk": "^0.0.12", + "@sentry/browser": "^9.0.1", "@tanstack/react-query": "^5.62.10", + "@types/react-simple-maps": "^3.0.6", "autoprefixer": "^10.4.20", "axios": "^1.7.9", "cookie": "^1.0.2", @@ -21,12 +23,14 @@ "nookies": "^2.5.2", "nprogress": "^0.2.0", "postcss": "^8.4.49", - "react": "^19.0.0", + "react": "^18.3.1", "react-calendar": "^5.1.0", "react-daum-postcode": "^3.2.0", - "react-dom": "^19.0.0", + "react-dom": "^18.2.0", "react-hook-form": "^7.54.2", "react-intersection-observer": "^9.15.1", + "react-simple-maps": "^3.0.0", + "recharts": "^2.15.1", "socket.io-client": "^4.8.1", "styled-components": "^6.1.14", "tailwindcss": "^3.4.17", diff --git a/public/assets/Landing-img/img_01.jpg b/public/assets/Landing-img/img_01.jpg new file mode 100644 index 00000000..64127fef Binary files /dev/null and b/public/assets/Landing-img/img_01.jpg differ diff --git a/public/assets/Landing-img/img_02.jpg b/public/assets/Landing-img/img_02.jpg new file mode 100644 index 00000000..1c6bed6f Binary files /dev/null and b/public/assets/Landing-img/img_02.jpg differ diff --git a/public/assets/Landing-img/img_03.jpg b/public/assets/Landing-img/img_03.jpg new file mode 100644 index 00000000..2bd33bd0 Binary files /dev/null and b/public/assets/Landing-img/img_03.jpg differ diff --git a/public/assets/Landing-img/img_04.jpg b/public/assets/Landing-img/img_04.jpg new file mode 100644 index 00000000..d491cc49 Binary files /dev/null and b/public/assets/Landing-img/img_04.jpg differ diff --git a/public/assets/Landing-img/img_05.jpg b/public/assets/Landing-img/img_05.jpg new file mode 100644 index 00000000..2195cfe5 Binary files /dev/null and b/public/assets/Landing-img/img_05.jpg differ diff --git a/public/assets/Landing-img/img_06.jpg b/public/assets/Landing-img/img_06.jpg new file mode 100644 index 00000000..b3fefa02 Binary files /dev/null and b/public/assets/Landing-img/img_06.jpg differ diff --git a/public/assets/Landing-img/img_07.jpg b/public/assets/Landing-img/img_07.jpg new file mode 100644 index 00000000..9ff40a05 Binary files /dev/null and b/public/assets/Landing-img/img_07.jpg differ diff --git a/public/assets/Landing-img/img_featuer_01.png b/public/assets/Landing-img/img_featuer_01.png new file mode 100644 index 00000000..9ba1fbac Binary files /dev/null and b/public/assets/Landing-img/img_featuer_01.png differ diff --git a/public/assets/Landing-img/img_featuer_02.jpg b/public/assets/Landing-img/img_featuer_02.jpg new file mode 100644 index 00000000..a2eae418 Binary files /dev/null and b/public/assets/Landing-img/img_featuer_02.jpg differ diff --git a/public/assets/Landing-img/img_featuer_03.jpg b/public/assets/Landing-img/img_featuer_03.jpg new file mode 100644 index 00000000..c23522c5 Binary files /dev/null and b/public/assets/Landing-img/img_featuer_03.jpg differ diff --git a/public/assets/Landing-img/img_featuer_04.jpg b/public/assets/Landing-img/img_featuer_04.jpg new file mode 100644 index 00000000..f4c5456a Binary files /dev/null and b/public/assets/Landing-img/img_featuer_04.jpg differ diff --git a/public/assets/Landing-img/img_sp_01.jpg b/public/assets/Landing-img/img_sp_01.jpg new file mode 100644 index 00000000..b8b3a466 Binary files /dev/null and b/public/assets/Landing-img/img_sp_01.jpg differ diff --git a/public/assets/Landing-img/img_sp_02.jpg b/public/assets/Landing-img/img_sp_02.jpg new file mode 100644 index 00000000..61e55d5a Binary files /dev/null and b/public/assets/Landing-img/img_sp_02.jpg differ diff --git a/public/assets/Landing-img/img_sp_03.jpg b/public/assets/Landing-img/img_sp_03.jpg new file mode 100644 index 00000000..ae1010f6 Binary files /dev/null and b/public/assets/Landing-img/img_sp_03.jpg differ diff --git a/public/assets/icon_blueinfo.svg b/public/assets/icon_blueinfo.svg new file mode 100644 index 00000000..00bb3886 --- /dev/null +++ b/public/assets/icon_blueinfo.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/assets/icon_download.png b/public/assets/icon_download.png new file mode 100644 index 00000000..8dda2f08 Binary files /dev/null and b/public/assets/icon_download.png differ diff --git a/public/assets/icon_logo_img_remove.png b/public/assets/icon_logo_img_remove.png new file mode 100644 index 00000000..cd31caee Binary files /dev/null and b/public/assets/icon_logo_img_remove.png differ diff --git a/public/assets/icon_luggage_frown.svg b/public/assets/icon_luggage_frown.svg new file mode 100644 index 00000000..483424df --- /dev/null +++ b/public/assets/icon_luggage_frown.svg @@ -0,0 +1,35 @@ + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/icon_luggage_smile.svg b/public/assets/icon_luggage_smile.svg new file mode 100644 index 00000000..32f0f310 --- /dev/null +++ b/public/assets/icon_luggage_smile.svg @@ -0,0 +1,35 @@ + + + Layer 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/icon_refresh.svg b/public/assets/icon_refresh.svg new file mode 100644 index 00000000..9a8b7b7d --- /dev/null +++ b/public/assets/icon_refresh.svg @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/public/assets/label_activity.svg b/public/assets/label_activity.svg index edad1ee0..59e91543 100644 --- a/public/assets/label_activity.svg +++ b/public/assets/label_activity.svg @@ -1,5 +1,36 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/label_more.svg b/public/assets/label_more.svg new file mode 100644 index 00000000..d43036ce --- /dev/null +++ b/public/assets/label_more.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/favicon.ico b/public/favicon.ico index 718d6fea..1c88b1c9 100644 Binary files a/public/favicon.ico and b/public/favicon.ico differ diff --git a/public/korea-topo.json b/public/korea-topo.json new file mode 100644 index 00000000..a0e5a79a --- /dev/null +++ b/public/korea-topo.json @@ -0,0 +1,6749 @@ +{ + "type": "Topology", + "transform": { + "scale": [0.0001661836365833942, 0.00014033182837829716], + "translate": [124.59517657361513, 33.10915894430296] + }, + "objects": { + "provinces-geo": { + "type": "GeometryCollection", + "geometries": [ + { + "arcs": [[[0]], [[1]], [[2]], [[3]]], + "type": "MultiPolygon", + "properties": { + "code": "39", + "name": "제주특별자치도", + "name_eng": "Jeju-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [[4]], + [[5]], + [[6]], + [[7]], + [[8]], + [[9]], + [[10]], + [[11]], + [[12]], + [[13]], + [[14]], + [[15]], + [[16]], + [[17]], + [[18]], + [[19]], + [[20]], + [[21]], + [[22, 23, 24, 25, 26, 27, 28, 29, 30, 31]] + ], + "type": "MultiPolygon", + "properties": { + "code": "38", + "name": "경상남도", + "name_eng": "Gyeongsangnam-do", + "base_year": "2012" + } + }, + { + "arcs": [[[32, -24, 33, -32, 34, 35, 36, 37, 38, 39]], [[40]]], + "type": "MultiPolygon", + "properties": { + "code": "37", + "name": "경상북도", + "name_eng": "Gyeongsangbuk-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [[41]], + [[42]], + [[43]], + [[44]], + [[45]], + [[46]], + [[47]], + [[48]], + [[49]], + [[50]], + [[51]], + [[52]], + [[53]], + [[54]], + [[55]], + [[56]], + [[57]], + [[58]], + [[59]], + [[60]], + [[61]], + [[62]], + [[63]], + [[64]], + [[65]], + [[66]], + [[67]], + [[68]], + [[69]], + [[70]], + [[71]], + [[72]], + [[73]], + [[74]], + [[75]], + [[76]], + [[77]], + [[78]], + [[79]], + [[80]], + [[81]], + [[82]], + [[83]], + [[84]], + [[85]], + [[86]], + [[87]], + [[88]], + [[89]], + [[90]], + [[91]], + [[92]], + [[93]], + [[94]], + [[95]], + [[96]], + [[97]], + [[98]], + [[99]], + [[100]], + [[101]], + [[102]], + [[103]], + [[104]], + [[105]], + [[106]], + [[107]], + [[108]], + [[109]], + [[110]], + [[111]], + [[112]], + [[113]], + [[114]], + [[115]], + [[116]], + [[117]], + [[118]], + [[119]], + [[120]], + [[121]], + [[122]], + [[123]], + [[124]], + [[125]], + [[126]], + [[127]], + [[128]], + [[129]], + [[130]], + [[131]], + [[132]], + [[133]], + [[134]], + [[135]], + [[136]], + [[137]], + [[138]], + [[139]], + [[140]], + [[-30, 141, 142], [143], [144]], + [[145]] + ], + "type": "MultiPolygon", + "properties": { + "code": "36", + "name": "전라남도", + "name_eng": "Jeollanam-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [[146]], + [[147]], + [[148]], + [[149]], + [[150]], + [[151]], + [[152, -35, -31, -143, 153, 154]] + ], + "type": "MultiPolygon", + "properties": { + "code": "35", + "name": "전라북도", + "name_eng": "Jeollabuk-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [[155]], + [[156]], + [[157]], + [[158]], + [[159]], + [[160]], + [[161]], + [[162]], + [ + [ + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, -155, 207 + ] + ] + ], + "type": "MultiPolygon", + "properties": { + "code": "34", + "name": "충청남도", + "name_eng": "Chungcheongnam-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [ + -38, 208, -36, -153, -207, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, -165, + 219, 220 + ] + ], + "type": "Polygon", + "properties": { + "code": "33", + "name": "충청북도", + "name_eng": "Chungcheongbuk-do", + "base_year": "2012" + } + }, + { + "arcs": [[-39, -221, 221, 222]], + "type": "Polygon", + "properties": { + "code": "32", + "name": "강원도", + "name_eng": "Gangwon-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [[223]], + [[224]], + [[225]], + [[226]], + [ + [ + -220, -164, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, + 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, -222 + ] + ] + ], + "type": "MultiPolygon", + "properties": { + "code": "31", + "name": "경기도", + "name_eng": "Gyeonggi-do", + "base_year": "2012" + } + }, + { + "arcs": [ + [ + -219, -218, 255, 256, 257, 258, -213, 259, -211, 260, -203, 261, -201, 262, -199, 263, + -197, 264, -195, 265, -193, 266, -191, 267, 268, -188, 269, -186, 270, -184, 271, + -182, 272, -180, 273, -178, 274, 275, -175, 276, 277, -172, 278, -170, 279, -168, 280, + -166 + ] + ], + "type": "Polygon", + "properties": { + "code": "29", + "name": "세종특별자치시", + "name_eng": "Sejongsi", + "base_year": "2012" + } + }, + { + "arcs": [[281, 282, -25, -33]], + "type": "Polygon", + "properties": { + "code": "26", + "name": "울산광역시", + "name_eng": "Ulsan", + "base_year": "2012" + } + }, + { + "arcs": [[-206, 283, -204, -261, -210]], + "type": "Polygon", + "properties": { + "code": "25", + "name": "대전광역시", + "name_eng": "Daejeon", + "base_year": "2012" + } + }, + { + "arcs": [[-144]], + "type": "Polygon", + "properties": { + "code": "24", + "name": "광주광역시", + "name_eng": "Gwangju", + "base_year": "2012" + } + }, + { + "arcs": [ + [[284]], + [[285]], + [[286]], + [[287]], + [[288]], + [[289]], + [[290]], + [[291]], + [[292]], + [[293]], + [[294]], + [[295]], + [[296]], + [[297]], + [[298]], + [[299]], + [ + [ + 300, -242, 301, -234, -233, 302, -231, 303, -229, 304, -252, 305, -250, 306, -248, + 307, -246, 308, -244 + ] + ], + [[309]], + [[310]], + [[311]], + [[312]], + [[313]], + [[314]], + [[315]], + [[316]], + [[-254, 317]], + [[318]], + [[319]] + ], + "type": "MultiPolygon", + "properties": { + "code": "23", + "name": "인천광역시", + "name_eng": "Incheon", + "base_year": "2012" + } + }, + { + "arcs": [[-23, -34]], + "type": "Polygon", + "properties": { + "code": "22", + "name": "대구광역시", + "name_eng": "Daegu", + "base_year": "2012" + } + }, + { + "arcs": [[[320]], [[321, -28, 322, -26, -283]]], + "type": "MultiPolygon", + "properties": { + "code": "21", + "name": "부산광역시", + "name_eng": "Busan", + "base_year": "2012" + } + }, + { + "arcs": [[323, -239, 324, -237, 325, -235, -302, -241]], + "type": "Polygon", + "properties": { + "code": "11", + "name": "서울특별시", + "name_eng": "Seoul", + "base_year": "2012" + } + } + ] + } + }, + "arcs": [ + [ + [10101, 458], + [51, -66], + [-63, -45], + [-39, 68], + [51, 43] + ], + [ + [14215, 2945], + [64, -77], + [31, -92], + [-27, -89], + [-116, 24], + [-40, 81], + [11, 48], + [77, 105] + ], + [ + [13163, 3241], + [116, -73], + [86, 42], + [83, -20], + [19, -98], + [70, -76], + [58, -10], + [31, -52], + [86, 34], + [184, -39], + [31, -104], + [50, -72], + [-67, -103], + [46, -99], + [144, 4], + [23, -82], + [-82, -70], + [-16, -100], + [80, -66], + [-30, -48], + [-96, 17], + [-49, -135], + [-6, -105], + [-97, -30], + [-106, -110], + [-32, -56], + [3, -76], + [-89, -104], + [-54, -36], + [28, -55], + [-81, -120], + [-165, -53], + [-180, 39], + [-200, -205], + [-79, 4], + [-243, -67], + [-196, 12], + [-106, -42], + [-7, -54], + [-97, -42], + [-31, -73], + [-127, -39], + [-74, 59], + [-92, -3], + [-136, -45], + [-163, 24], + [-70, -76], + [-125, -1], + [-109, -53], + [-120, 125], + [-115, -58], + [-113, 87], + [-57, -12], + [-111, -78], + [-89, -20], + [-52, 45], + [-144, 0], + [-27, 36], + [-78, -14], + [-134, -109], + [-30, -115], + [-42, -48], + [-84, -42], + [-69, 47], + [14, 64], + [-82, 25], + [-99, 153], + [-79, 52], + [-117, 29], + [-106, 93], + [-77, 108], + [-7, 52], + [-54, 78], + [39, 48], + [-22, 68], + [24, 61], + [-30, 48], + [37, 160], + [44, 14], + [22, 63], + [69, 55], + [62, 9], + [76, 73], + [57, 106], + [86, 35], + [158, 168], + [-16, 106], + [105, 69], + [69, 1], + [97, 50], + [18, 106], + [119, 20], + [46, -16], + [146, 94], + [56, -6], + [100, 75], + [55, -38], + [174, 81], + [49, -9], + [205, 86], + [85, 24], + [80, 83], + [129, -36], + [79, 21], + [71, 81], + [55, -72], + [197, 46], + [95, 75], + [80, -7], + [69, 23], + [65, -11], + [65, 130], + [86, -33], + [37, -57], + [67, 61], + [255, 26], + [50, 36], + [78, -24], + [103, 6], + [61, 58], + [87, 2] + ], + [ + [10496, 6018], + [27, -78], + [-88, -6], + [19, -102], + [-57, -4], + [-69, 122], + [41, 51], + [52, -20], + [75, 37] + ], + [ + [21927, 10963], + [68, 7], + [103, -42], + [47, -68], + [105, 34], + [34, -56], + [-115, -99], + [-92, 51], + [-20, -40], + [-95, 13], + [-113, 93], + [66, 58], + [12, 49] + ], + [ + [22021, 11155], + [5, -53], + [-121, 2], + [33, 49], + [83, 2] + ], + [ + [21562, 11397], + [89, -2], + [43, -32], + [24, -113], + [-115, 0], + [-64, 39], + [-31, 55], + [54, 53] + ], + [ + [23299, 11568], + [37, -45], + [-59, -92], + [40, -58], + [-37, -34], + [-88, 39], + [65, 49], + [-21, 81], + [63, 60] + ], + [ + [23478, 11672], + [86, -130], + [-118, 5], + [-52, 49], + [84, 76] + ], + [ + [23648, 11787], + [46, -61], + [98, 27], + [74, -12], + [7, -73], + [-49, -13], + [-130, 57], + [-118, 21], + [13, 56], + [59, -2] + ], + [ + [23413, 12139], + [51, -115], + [11, -125], + [98, -19], + [-11, -91], + [-105, -67], + [-118, 26], + [8, 105], + [-76, 86], + [19, 73], + [57, 41], + [-44, 72], + [22, 30], + [88, -16] + ], + [ + [23771, 12204], + [20, -60], + [-68, -94], + [-50, 14], + [43, 122], + [55, 18] + ], + [ + [21305, 12279], + [61, -29], + [-48, -57], + [-64, 47], + [51, 39] + ], + [ + [21929, 12315], + [76, -111], + [84, -46], + [-105, -131], + [-133, 9], + [-66, 39], + [-81, 118], + [70, 51], + [30, 57], + [125, 14] + ], + [ + [21680, 12457], + [88, -58], + [76, 1], + [56, -58], + [-156, -10], + [-64, -96], + [-85, -19], + [-32, 83], + [-57, 26], + [21, 84], + [153, 47] + ], + [ + [20702, 12878], + [-42, -122], + [-58, -56], + [-33, -188], + [84, -3], + [-30, 68], + [63, 117], + [39, 35], + [112, -105], + [68, -96], + [-41, -172], + [79, -6], + [70, -61], + [-130, -46], + [-58, 56], + [-44, -19], + [-130, 78], + [-10, -53], + [-124, -22], + [-92, 3], + [-112, 51], + [-47, 145], + [3, 42], + [102, 73], + [106, 213], + [67, 69], + [137, 19], + [21, -20] + ], + [ + [23311, 12889], + [60, -87], + [-64, -16], + [4, 103] + ], + [ + [19872, 13070], + [136, -48], + [58, -81], + [16, -98], + [-45, -108], + [17, -56], + [-72, -20], + [-92, -115], + [31, -95], + [124, -204], + [47, 21], + [64, -50], + [10, -120], + [61, -32], + [69, 25], + [-2, 60], + [77, 24], + [70, 89], + [255, -19], + [170, -60], + [33, -65], + [-27, -95], + [-62, -33], + [-7, -78], + [27, -102], + [14, -172], + [-126, -100], + [-2, -68], + [52, -49], + [-127, -100], + [-13, 68], + [29, 60], + [-72, 36], + [-36, -93], + [-42, 38], + [-93, -38], + [-176, -11], + [-5, 91], + [-57, 75], + [-2, 125], + [21, 193], + [-121, -10], + [-67, -53], + [-83, -20], + [40, -110], + [13, -99], + [-41, -65], + [-117, -39], + [-117, 31], + [-71, 124], + [-115, 48], + [-2, 51], + [97, 85], + [-43, 128], + [-52, 27], + [-9, 84], + [-133, 227], + [-2, 94], + [-35, 68], + [64, 83], + [58, 36], + [22, 161], + [120, 44], + [84, 8], + [-46, 63], + [-13, 92], + [96, 118], + [150, 29] + ], + [ + [23746, 13195], + [-101, -61], + [75, -97], + [-65, -101], + [-71, 88], + [31, 46], + [-2, 89], + [-33, 37], + [42, 85], + [84, -22], + [40, -64] + ], + [ + [20291, 13325], + [51, -13], + [63, -80], + [-90, -14], + [-24, 107] + ], + [ + [24595, 13737], + [85, -68], + [110, 13], + [55, -101], + [-54, -93], + [-62, 7], + [-43, -191], + [21, -58], + [171, -172], + [0, -61], + [-49, -16], + [-9, -92], + [38, -60], + [-42, -105], + [-58, -7], + [-67, -68], + [-1, -59], + [111, -46], + [59, 87], + [64, 29], + [51, -165], + [-83, -66], + [38, -104], + [-62, -22], + [-51, 60], + [-93, -63], + [52, -84], + [55, -28], + [9, -66], + [119, -165], + [-189, 15], + [31, 53], + [-33, 71], + [-76, -36], + [16, -68], + [-67, 3], + [22, 69], + [-109, 42], + [-39, -146], + [45, -51], + [-100, -84], + [-70, 30], + [-47, -108], + [87, -144], + [94, 21], + [91, -57], + [-192, -28], + [-77, 9], + [-94, -20], + [60, -95], + [-138, -127], + [-118, 53], + [-52, -41], + [-45, 32], + [34, 63], + [139, 75], + [14, 62], + [-108, 10], + [-65, 31], + [11, 142], + [135, 41], + [-74, 62], + [-65, 20], + [-85, -90], + [-57, 5], + [-15, 64], + [-54, -3], + [-30, 95], + [163, 42], + [84, 2], + [34, 54], + [-7, 108], + [54, 62], + [-38, 44], + [-50, 154], + [-91, -81], + [10, -57], + [-119, -1], + [-97, -89], + [-73, -96], + [-89, 103], + [-1, 75], + [-118, 51], + [-43, 151], + [-16, 109], + [71, 81], + [75, 120], + [115, 35], + [71, 99], + [106, -64], + [18, -46], + [152, -65], + [-14, 67], + [75, 40], + [78, -101], + [96, 9], + [36, -72], + [45, 46], + [-107, 134], + [-78, 172], + [-6, 63], + [34, 47], + [-13, 67], + [53, 35], + [83, -57], + [97, 25], + [63, -23], + [21, 119], + [-249, -33], + [30, 85], + [46, -3], + [58, 161], + [97, 69], + [51, -38], + [-33, -66], + [18, -116], + [87, 134], + [44, 177], + [33, 62] + ], + [ + [23826, 13953], + [53, -23], + [18, -103], + [-54, 7], + [-80, 110], + [63, 9] + ], + [ + [22733, 17808], + [65, -32], + [107, 66], + [194, 49], + [89, 110], + [88, 17], + [53, -31], + [90, -6], + [122, 25], + [37, 36], + [-19, 79], + [6, 139], + [104, 55] + ], + [ + [23669, 18315], + [0, -58], + [69, -163], + [-18, -53], + [10, -144], + [132, -64], + [7, -80], + [47, -16], + [105, -107], + [132, -41], + [130, 41], + [46, -15], + [55, 70], + [77, 27], + [200, -24], + [30, -82], + [43, -31], + [131, 15], + [214, -90], + [50, 17], + [107, -31], + [65, 68], + [20, 89], + [68, 12], + [69, 47], + [61, 7], + [56, -59], + [64, 55], + [28, 66], + [84, 106], + [4, 85], + [118, -18], + [115, 54], + [155, -24], + [137, -109], + [130, -83], + [129, 90] + ], + [ + [26539, 17872], + [107, -37], + [30, -102], + [-36, -116], + [-44, -10], + [-104, -100], + [-148, -59], + [59, -105], + [73, 14], + [32, -62], + [-22, -73], + [173, -28], + [138, -76], + [79, 11], + [58, -65], + [132, -61], + [96, -25], + [17, -107], + [47, -28], + [25, -69], + [85, -69], + [25, -53], + [126, -99], + [102, -21], + [112, 52], + [36, -54], + [5, -78], + [43, -9], + [57, -75], + [-101, -152] + ], + [ + [27741, 16216], + [-56, -41], + [34, -45], + [-35, -106], + [-114, -67], + [-158, 90], + [-107, 1], + [25, -79], + [-45, -58], + [-94, -259], + [-136, -40], + [-92, -92], + [-83, 38], + [-48, -53], + [-10, -58], + [-67, -29], + [-70, 24], + [-90, -43], + [-16, -101], + [-74, -176], + [-91, -40], + [-181, -31], + [-46, 25], + [-128, -84], + [-64, 44], + [-48, -49], + [-125, -12], + [-83, -85], + [68, -141], + [-6, -157], + [-93, -12], + [6, 61], + [-117, -11], + [-68, -48] + ], + [ + [25529, 14582], + [-2, -3] + ], + [ + [25527, 14579], + [-56, -17], + [-60, 33], + [-131, -17], + [49, -115], + [80, -66], + [100, -22], + [60, -160], + [-33, -36], + [-83, -23] + ], + [ + [25453, 14156], + [-18, -47], + [-127, -20], + [-26, -69], + [-76, 46], + [67, 86], + [-80, 35], + [-164, -67], + [-82, 40], + [-33, -55], + [-109, 78], + [-72, 15], + [-26, -48], + [-64, 35], + [74, 92], + [-71, 243], + [-36, 23], + [-70, -82], + [35, -124], + [-68, -41], + [-16, 85], + [-85, 53], + [-84, 82], + [-60, -49], + [-67, 18], + [-54, 111], + [-65, 82], + [-48, 268], + [-128, -179], + [34, -68], + [54, -16], + [17, -58], + [57, -47], + [1, -58], + [55, -118], + [13, -208], + [120, -97], + [10, -52], + [-99, -28], + [52, -46], + [54, 19], + [65, -55], + [-162, -60], + [-34, -30], + [-160, -26], + [-21, 95], + [-84, 32], + [9, 100], + [89, 48], + [-184, 44], + [-70, 114], + [-93, -109], + [-87, 5], + [-51, 61], + [-44, 5], + [-46, -60], + [-78, -7], + [-50, 58], + [-71, -57], + [110, -86], + [-27, -100], + [-58, 19], + [-68, -17], + [-79, -120], + [-97, 49], + [-60, -49], + [-126, -45], + [-36, -63], + [47, -24], + [-117, -134], + [64, -16], + [86, 59], + [8, 81], + [105, 60], + [68, -3], + [165, 60], + [-20, 62], + [35, 69], + [75, -46], + [48, 39], + [88, -32], + [-2, -82], + [-66, -85], + [89, -17], + [-24, -52], + [123, -121], + [-146, -155], + [-92, -37], + [-144, 45], + [-190, 1], + [58, -50], + [144, -29], + [13, -63], + [-19, -83], + [-53, -38], + [15, -179], + [-28, -26], + [9, -100], + [-62, -138], + [16, -100], + [53, -23], + [28, 88], + [45, 44], + [42, 138], + [33, -50], + [-5, -62], + [57, -6], + [21, -80], + [-16, -117], + [-115, -40], + [44, -77], + [-12, -58], + [-175, -96], + [111, -46], + [-13, -94], + [16, -77], + [-47, -98], + [8, -68], + [-68, -63], + [6, -36], + [-113, -23], + [-54, 52], + [-49, 144], + [-155, 47], + [102, 68], + [-11, 67], + [-135, 63], + [-149, 0], + [92, 113], + [70, -3], + [69, -38], + [36, -58], + [59, 49], + [-52, 48], + [2, 85], + [99, 85], + [98, -22], + [16, 29], + [-169, 28], + [-59, 92], + [-69, -83], + [-157, 53], + [-54, -13], + [-39, 63], + [-64, 5], + [-9, 51], + [-69, 74], + [57, 44], + [147, 1], + [107, -24], + [34, 25], + [-61, 108], + [6, 62], + [-76, 83], + [-18, 63], + [-84, 52], + [23, -118], + [-38, -43], + [-87, -16], + [14, -65], + [-11, -103], + [-105, -56], + [-106, 59], + [-29, 78], + [53, 74], + [-64, 41], + [-61, -17], + [-45, 46], + [-88, -20], + [-22, 37], + [-80, -54], + [-82, -13], + [47, -93], + [-42, -79], + [34, -131], + [-154, 7], + [-90, 28], + [-125, 12], + [-3, -56], + [-48, -37], + [-66, 119], + [-64, 6], + [-58, 70], + [3, 70], + [-123, 13], + [-30, -24], + [-128, 36], + [-73, 67], + [-81, 132], + [96, 77], + [36, 78], + [-71, 78], + [-6, 86], + [64, 109], + [-65, 139], + [3, 143], + [80, 168], + [-119, -79], + [14, -44], + [-52, -54], + [30, -36], + [-32, -116], + [-107, -68], + [1, -74], + [53, -39], + [-11, -112], + [-157, -22], + [15, -49], + [-55, -32], + [-62, 61], + [-68, 12], + [-80, -81], + [-97, 115], + [67, 40], + [-93, 105], + [-62, -112], + [8, -71], + [-41, -25], + [-52, -98], + [6, -85], + [-134, -38], + [-41, -43], + [-229, 19], + [-310, -67], + [-121, 232], + [76, 109] + ], + [ + [19164, 13367], + [53, 148], + [3, 60], + [-91, 87], + [-20, 150], + [-170, 82], + [-18, 115], + [-111, 25], + [-64, 84], + [-83, 69], + [4, 190], + [-131, 140], + [-84, 64], + [-85, 21], + [-29, 70], + [-56, 39], + [-58, 81], + [-26, 157], + [21, 20], + [-14, 174], + [-50, 176], + [-86, 44], + [-84, 171], + [-28, 24], + [1, 96] + ], + [ + [17958, 15654], + [90, 18], + [79, 53], + [16, 45], + [75, 51], + [14, 82], + [-65, 86], + [-11, 70], + [73, 53], + [17, 82], + [90, 144], + [52, 16], + [79, 67], + [31, 224], + [-136, 14], + [-53, 88], + [6, 115], + [96, 51], + [-41, 90], + [-117, 188], + [-14, 66], + [-87, 46], + [-112, 98], + [-22, 79], + [44, 64], + [96, 76], + [-18, 72], + [29, 86], + [94, 79], + [5, 48], + [-52, 125], + [48, 144], + [65, 52], + [35, 203], + [98, 83], + [-4, 184], + [19, 66], + [-13, 98], + [22, 72], + [86, 4], + [34, 60], + [92, 79], + [116, 60], + [115, 211], + [-5, 55], + [46, 61], + [72, -47], + [88, 16], + [95, 90], + [125, 14], + [67, 42], + [67, 73], + [60, -20], + [23, 63], + [49, 36], + [-8, 62], + [94, 104], + [123, 75] + ], + [ + [19825, 19970], + [-16, -154], + [50, -45], + [137, 37], + [87, -98], + [11, -159], + [60, -11], + [52, 50], + [123, -72], + [84, 44], + [73, -139], + [88, -64], + [118, 49], + [115, -46], + [118, 81], + [153, -57], + [78, -62], + [92, -11], + [-14, -132], + [43, -103], + [65, -38], + [76, 14], + [70, -70], + [2, -96], + [138, -61], + [86, -224], + [-3, -118], + [21, -63], + [-14, -93], + [-106, -36], + [-29, -40], + [-94, -3], + [-25, -44], + [23, -97], + [127, 31], + [84, -62], + [13, -38], + [107, -25], + [102, 3], + [0, 75], + [47, 32], + [106, -93], + [104, 65], + [166, 24], + [182, -74], + [112, -16], + [49, -99], + [-4, -119], + [51, -5] + ], + [ + [29227, 18091], + [-128, 34], + [-96, 59], + [-191, 51], + [-43, -9], + [-56, 63], + [-63, 7], + [-208, -158], + [-53, 19], + [-47, -84], + [-66, -23], + [-45, 45], + [-88, -4], + [-56, 24], + [-38, 84], + [34, 48], + [17, 133], + [-52, 71], + [-120, 15], + [-162, 128], + [-56, -33], + [-69, 17], + [-57, -27], + [-98, -4], + [-90, 70], + [-63, -91], + [-72, -32], + [-130, -9], + [-77, -29], + [-72, -71], + [-44, -82], + [-10, -152], + [79, -85], + [-42, -52], + [-59, 44], + [-102, 27], + [-60, -126], + [-61, 28], + [-117, -68], + [-27, -47] + ], + [ + [23669, 18315], + [33, 7], + [10, 150], + [-32, 66], + [94, 39], + [218, 142], + [56, -51], + [37, 39], + [127, -2], + [-38, -83], + [41, -62], + [-19, -44], + [55, -51], + [89, 17], + [158, 104], + [116, 10], + [51, 75], + [22, 182], + [-55, 81], + [-24, 147], + [90, 31], + [115, 83], + [-46, 148], + [99, 73], + [5, 144], + [73, -45], + [81, 45], + [69, 191], + [-33, 85], + [-6, 136], + [-59, 31], + [-51, 65], + [40, 112], + [-40, 87], + [46, 104], + [-88, 101], + [23, 56], + [-58, 85], + [-209, 70], + [-141, -4], + [-98, -46], + [-42, 21], + [-161, -29], + [-82, -127], + [-84, -71], + [-108, -7], + [-94, -51], + [-40, -59], + [-44, 89], + [-92, 7], + [47, -257], + [-9, -57], + [-60, -99], + [-109, -106], + [-4, -97], + [-71, 49], + [-105, -7], + [-48, 81], + [37, 65], + [13, 145], + [-91, 18], + [-116, -25], + [-98, -51], + [-41, -47], + [-89, -230], + [-58, -43], + [-50, -127], + [28, -106], + [197, 7], + [224, -72], + [105, -100], + [4, -96], + [-54, -37], + [-294, 6], + [-78, -91], + [-44, -121], + [-82, -116], + [-2, -59], + [39, -68], + [131, -57], + [109, -86], + [4, -160], + [-92, -70], + [-239, 61], + [-111, 41], + [-52, -32], + [27, -157], + [48, -71], + [109, -112], + [128, -95], + [-7, -70], + [-98, -143], + [-88, -6] + ], + [ + [19825, 19970], + [-32, 94], + [158, 96], + [18, 59], + [-45, 36], + [-45, 125], + [-10, 92], + [-115, 83], + [7, 184] + ], + [ + [19761, 20739], + [42, 69], + [118, 48], + [13, 50], + [65, 58], + [116, -24], + [154, 126], + [2, 103], + [-23, 86], + [64, 88], + [-10, 79], + [121, 74], + [2, 133], + [60, 54] + ], + [ + [20485, 21683], + [-3, 2] + ], + [ + [20482, 21685], + [-80, 104], + [7, 52], + [-54, 79], + [62, 87], + [70, 40], + [96, 22], + [77, -24], + [72, -84], + [85, 49], + [-12, 103], + [-48, 14], + [-19, 85], + [-56, 79], + [101, 117], + [-124, 80], + [-96, 30], + [-58, -41], + [-111, -15], + [-19, -73], + [-67, -24], + [-112, 43], + [-12, 75], + [-56, 14], + [-42, 65], + [-54, 4], + [-90, 52], + [-12, 116], + [-78, -73], + [-26, -98], + [-48, -24], + [-123, 18], + [-48, -13], + [-25, 173], + [-37, 68], + [58, 79], + [8, 69], + [177, 104], + [58, 89], + [-49, 117], + [8, 42], + [-50, 79], + [-65, 6], + [-9, 81], + [57, 20], + [57, 113], + [-57, 112], + [11, 80], + [45, 88], + [-11, 141], + [-37, 19], + [2, 76], + [85, -5], + [107, 103], + [-37, 120], + [-41, 39], + [-122, 58], + [-1, 121], + [-71, 93], + [-80, 23], + [-145, -4], + [-117, 76], + [-43, 70], + [5, 77], + [49, 6], + [104, 67], + [101, -30], + [54, 32], + [-9, 147], + [88, 10], + [47, 65], + [22, 82], + [90, -108], + [2, -77], + [122, -27], + [65, -157], + [27, 84], + [40, 18], + [41, 236], + [-42, 18], + [5, 82], + [-83, 20], + [-34, 70], + [-187, 41], + [34, 56], + [168, 19], + [98, -5], + [0, 93], + [105, -3], + [-4, 87], + [78, 134], + [72, -81], + [81, -58], + [95, -6], + [44, 88], + [74, -22], + [156, -125], + [140, -7], + [-15, 102], + [-151, 117], + [-68, 67], + [-2, 51], + [74, 118], + [26, 107], + [38, 50], + [22, 163], + [56, -4], + [97, -82], + [136, 12], + [33, 94], + [99, 38], + [66, 71], + [154, -101], + [64, 8], + [232, -60], + [24, 14], + [-28, 241], + [119, -6], + [2, 57], + [48, 122], + [161, -89], + [85, -25], + [84, -159], + [74, -40], + [73, -97], + [79, 12], + [105, -44], + [21, -45], + [71, -29], + [89, 97], + [234, -18], + [62, 83], + [20, 78], + [88, 98], + [-5, 119], + [-55, 61], + [-88, 24], + [16, 92], + [81, 89], + [30, 113], + [-21, 73], + [108, 46], + [20, 93], + [88, 74], + [144, 70], + [71, 64], + [6, 73], + [181, 41], + [63, 41], + [8, 52], + [90, 73], + [9, 42], + [-46, 69], + [68, 28], + [44, 60], + [135, -8], + [14, 70], + [64, -21], + [68, -76], + [85, 164], + [46, 25] + ], + [ + [24427, 28172], + [30, -30], + [109, -18], + [81, -40], + [68, -85], + [53, -14], + [61, 34], + [94, -27], + [103, -84], + [59, 49], + [-5, 58], + [-53, 101], + [28, 68], + [50, -22], + [76, 135], + [45, 34], + [107, -17], + [35, -56], + [110, 4], + [32, -73], + [86, -112], + [175, -52], + [16, 62], + [108, -62], + [7, 93], + [74, 63], + [76, 181], + [134, 21], + [95, -126], + [136, 50], + [299, -67], + [194, -52], + [5, 77], + [64, 104], + [117, 52], + [77, -49], + [61, -4], + [52, -58], + [80, -22], + [88, -84], + [67, -3], + [25, -63], + [147, -142], + [60, 29], + [52, -15], + [115, 13], + [-23, 96], + [26, 44], + [-46, 66], + [91, 82], + [54, 78], + [98, 46], + [36, 104], + [136, -18], + [57, 100], + [216, 120], + [146, 8] + ], + [ + [28711, 28749], + [55, -80], + [2, -73], + [47, -34], + [-31, -71], + [20, -71], + [153, -162], + [133, -96], + [-74, -79], + [4, -137], + [-31, -69], + [53, -127], + [-6, -100], + [-56, -86], + [66, -206], + [1, -229], + [-25, -69], + [33, -89], + [-35, -60], + [38, -108], + [-10, -38], + [56, -141], + [89, -96], + [9, -54], + [72, -85], + [2, -88], + [32, -105], + [94, -143], + [-66, -72], + [17, -95], + [40, -85], + [-30, -64], + [23, -179], + [-68, -89], + [-118, -68], + [-48, -49], + [-54, -153], + [-64, -64], + [-34, -120], + [24, -125], + [-34, -73], + [16, -73], + [60, -108], + [106, -125], + [-3, -129], + [39, -217], + [-17, -105], + [-58, -38], + [22, -144], + [-27, -160], + [17, -83], + [-34, -137], + [-33, -28], + [-176, -284], + [-37, -130], + [-62, -104], + [20, -72], + [-30, -111], + [14, -96], + [-31, -37], + [39, -100], + [-33, -36], + [-17, -107], + [72, -101], + [-20, -86], + [30, -35], + [-15, -79], + [-70, -37], + [27, -124], + [96, -73], + [40, -106], + [5, -77], + [-32, -93], + [15, -42], + [169, -151], + [90, -20], + [-1, -76], + [-77, -28], + [-56, -55], + [10, -85], + [-113, -51], + [-22, -37], + [-101, -28], + [-29, -74], + [48, -144], + [100, -62], + [125, -142], + [49, -30], + [134, -38], + [22, 60], + [111, 93], + [115, 42], + [59, 48], + [7, 78], + [69, 55], + [66, 98], + [41, -3], + [66, 121], + [17, 75], + [135, -60], + [47, -177], + [38, -44], + [-34, -73], + [32, -112], + [-26, -84], + [-68, -70], + [-2, -61], + [-66, 7], + [-29, -92], + [17, -70], + [-122, -224], + [-92, -66], + [51, -155], + [-10, -122], + [-34, -112], + [46, -65], + [-8, -75], + [-36, -30], + [-65, -180], + [29, -54], + [-87, -109], + [7, -56], + [-56, -44], + [32, -108], + [-32, -82], + [6, -61], + [-51, -69], + [13, -90], + [-81, -183], + [16, -123], + [-52, -52], + [-22, -94], + [-59, -26], + [-22, -79] + ], + [ + [37990, 31619], + [37, -79], + [-22, -67], + [61, -105], + [-20, -48], + [-13, -179], + [-70, -54], + [-106, -28], + [-88, -88], + [-111, 36], + [-117, 17], + [-48, 45], + [-67, 7], + [-69, 79], + [18, 136], + [-76, 72], + [50, 73], + [76, -10], + [107, 36], + [97, 60], + [129, 11], + [43, 41], + [108, -11], + [81, 56] + ], + [ + [16331, 6773], + [122, -71], + [-15, -52], + [-69, -39], + [-38, 162] + ], + [ + [16249, 6777], + [25, -227], + [34, -9], + [75, -114], + [-89, -12], + [-118, 155], + [4, 116], + [69, 91] + ], + [ + [12008, 7132], + [101, -57], + [5, -40], + [-122, 6], + [16, 91] + ], + [ + [3017, 7021], + [100, -20], + [58, -81], + [1, -43], + [62, -89], + [88, -87], + [-68, -44], + [-75, 1], + [-40, 32], + [-19, 83], + [-108, 44], + [1, 204] + ], + [ + [3571, 6973], + [3, -109], + [-71, 31], + [-6, 126], + [26, 48], + [65, -30], + [-17, -66] + ], + [ + [13853, 7311], + [50, -26], + [16, -88], + [-193, -12], + [-49, 83], + [96, 64], + [80, -21] + ], + [ + [11771, 7605], + [82, -66], + [130, 0], + [117, -18], + [34, -40], + [54, 21], + [35, -64], + [-53, -55], + [-59, 75], + [-158, -15], + [-13, -89], + [-77, -19], + [-101, -107], + [-139, -41], + [-121, 117], + [25, 128], + [-27, 38], + [67, 66], + [99, 42], + [50, 48], + [55, -21] + ], + [ + [12444, 7714], + [125, -68], + [3, -68], + [-145, -23], + [-9, -45], + [72, -24], + [7, -93], + [72, 5], + [-6, -80], + [-52, 9], + [2, -81], + [-58, -128], + [-77, 46], + [-6, 41], + [-89, 37], + [-9, 86], + [-34, 35], + [122, 160], + [-84, 83], + [67, 76], + [33, 72], + [66, -40] + ], + [ + [11539, 7749], + [-29, -107], + [-62, 64], + [56, 81], + [35, -38] + ], + [ + [13060, 7834], + [35, -54], + [3, -98], + [-34, -11], + [-14, -84], + [-74, 79], + [33, 151], + [51, 17] + ], + [ + [13835, 7867], + [120, -63], + [-49, -31], + [64, -120], + [63, -83], + [-39, -61], + [-19, -84], + [-135, -3], + [-57, -20], + [-112, 105], + [-59, -40], + [-50, 100], + [97, 191], + [56, 67], + [69, 43], + [51, -1] + ], + [ + [11885, 7996], + [112, -74], + [56, 23], + [116, -80], + [58, -95], + [-91, -47], + [40, -111], + [-75, -50], + [-104, -9], + [-160, 47], + [9, 72], + [-84, 0], + [105, 212], + [-68, 110], + [86, 2] + ], + [ + [16028, 8115], + [8, -100], + [28, -70], + [-35, -117], + [-45, 28], + [-134, 20], + [36, 136], + [57, 4], + [85, 99] + ], + [ + [12182, 8110], + [56, -83], + [-93, -39], + [-111, 7], + [5, 56], + [63, 53], + [80, 6] + ], + [ + [8115, 8068], + [85, -24], + [-103, -85], + [-60, 1], + [-18, 49], + [27, 72], + [69, -13] + ], + [ + [14581, 8030], + [-50, 103], + [69, -2], + [-19, -101] + ], + [ + [8770, 8141], + [67, -33], + [24, -69], + [-55, -68], + [-68, 2], + [-55, -65], + [-32, 100], + [61, -4], + [53, 39], + [5, 98] + ], + [ + [8014, 8173], + [-32, -73], + [-109, -19], + [22, 89], + [119, 3] + ], + [ + [15222, 8301], + [-2, -57], + [-71, -15], + [9, 76], + [64, -4] + ], + [ + [14576, 8336], + [39, -75], + [-65, -15], + [-13, 63], + [39, 27] + ], + [ + [8421, 8314], + [26, -88], + [60, -1], + [-40, -88], + [-52, 13], + [-87, 143], + [93, 21] + ], + [ + [16606, 8392], + [76, -50], + [-81, -67], + [-19, 87], + [24, 30] + ], + [ + [16882, 8425], + [-1, -83], + [-78, 51], + [79, 32] + ], + [ + [8708, 8598], + [32, -64], + [58, -39], + [151, 26], + [37, -62], + [49, -157], + [-125, 32], + [-47, -46], + [-70, -9], + [-39, 65], + [-120, 3], + [-43, 137], + [69, 27], + [-3, 80], + [51, 7] + ], + [ + [14398, 8753], + [80, -8], + [96, -53], + [1, -67], + [-50, -7], + [-23, -57], + [-189, -90], + [-89, 83], + [3, 119], + [66, 65], + [105, 15] + ], + [ + [8647, 8753], + [141, -61], + [31, -60], + [-124, -11], + [-87, 59], + [-17, -55], + [-60, -10], + [-88, 44], + [10, 85], + [67, -39], + [49, 44], + [78, 4] + ], + [ + [13517, 8842], + [50, -55], + [67, -1], + [62, 38], + [47, -27], + [15, -65], + [103, 53], + [6, -94], + [-98, -17], + [36, -51], + [-21, -86], + [-100, 36], + [-66, -45], + [-65, -77], + [-56, 58], + [-26, 122], + [-139, 18], + [-60, -55], + [-113, 65], + [-70, 4], + [116, 138], + [91, -98], + [83, 24], + [12, 81], + [99, 73], + [27, -39] + ], + [ + [8539, 8894], + [58, -19], + [29, -103], + [-74, 8], + [-13, 114] + ], + [ + [14693, 9006], + [118, -109], + [128, 18], + [92, -35], + [-2, -74], + [72, -68], + [-35, -26], + [-86, 11], + [-160, -53], + [-109, -135], + [-10, 113], + [81, 21], + [13, 75], + [-120, 18], + [-77, 72], + [-62, -23], + [-113, 47], + [-5, 53], + [105, -33], + [24, 130], + [146, -2] + ], + [ + [15046, 9125], + [19, -53], + [-28, -61], + [-75, -8], + [-38, 81], + [122, 41] + ], + [ + [14762, 9139], + [28, -60], + [-101, 4], + [18, 58], + [55, -2] + ], + [ + [12585, 9193], + [101, -28], + [111, -79], + [75, -81], + [-19, -98], + [41, -138], + [48, -50], + [28, -109], + [46, -42], + [86, -14], + [-64, -145], + [-72, -8], + [-72, 72], + [-23, -103], + [-87, 71], + [-86, 2], + [-55, -32], + [-102, 156], + [-170, 134], + [-27, 75], + [-8, 164], + [-27, 109], + [64, 77], + [138, 28], + [74, 39] + ], + [ + [14150, 9264], + [36, -74], + [-50, -109], + [40, -138], + [-92, 23], + [-73, -34], + [-24, -71], + [-135, 34], + [-61, 39], + [-89, 15], + [-39, 33], + [9, 80], + [41, 77], + [80, 63], + [33, -24], + [81, 16], + [73, -79], + [87, -6], + [70, 83], + [13, 72] + ], + [ + [15964, 9276], + [91, -80], + [63, -158], + [-130, 37], + [19, 126], + [-58, 12], + [15, 63] + ], + [ + [4221, 9130], + [55, 22], + [67, -38], + [-31, -80], + [-83, -1], + [-8, 97] + ], + [ + [13489, 9476], + [68, -95], + [-42, -124], + [77, 37], + [86, -189], + [-73, 17], + [-108, -63], + [-270, -22], + [-109, -189], + [-46, 42], + [56, 154], + [-117, 36], + [18, 55], + [58, 35], + [-25, 50], + [66, 111], + [82, 82], + [77, -11], + [111, 54], + [91, 20] + ], + [ + [4171, 9405], + [35, -62], + [-28, -44], + [-59, 89], + [52, 17] + ], + [ + [14770, 9583], + [43, 12], + [67, -51], + [57, -159], + [-1, -57], + [-51, -122], + [-48, 64], + [-71, 7], + [-64, 68], + [-24, 184], + [-59, 47], + [151, 7] + ], + [ + [19331, 9608], + [-23, -47], + [55, -57], + [-8, -151], + [-82, -62], + [-60, 13], + [70, 244], + [48, 60] + ], + [ + [4241, 9556], + [0, -93], + [-79, 9], + [79, 84] + ], + [ + [17272, 9688], + [54, -49], + [163, 18], + [135, -69], + [19, -42], + [72, -26], + [-12, -136], + [-31, -50], + [-71, 8], + [-153, -82], + [-35, 44], + [44, 56], + [-17, 51], + [-92, -4], + [-65, 55], + [116, 40], + [-67, 47], + [-114, 20], + [0, 145], + [54, -26] + ], + [ + [15826, 9839], + [46, -46], + [26, -84], + [-31, -85], + [-46, -56], + [-8, -81], + [-48, -80], + [-146, -14], + [-125, 35], + [-136, -44], + [-124, 16], + [-94, 116], + [-66, 132], + [83, 70], + [77, 95], + [25, -76], + [48, -37], + [68, 56], + [53, -18], + [129, 94], + [59, 18], + [67, -46], + [98, 58], + [45, -23] + ], + [ + [8818, 9865], + [7, -59], + [73, -50], + [-137, -118], + [-50, -57], + [-34, 49], + [35, 39], + [-12, 83], + [51, 109], + [67, 4] + ], + [ + [19446, 9883], + [-68, -49], + [73, -53], + [-74, -51], + [-50, 84], + [39, 58], + [80, 11] + ], + [ + [15306, 10020], + [-36, -91], + [-199, 24], + [12, 34], + [87, 59], + [31, -46], + [58, 62], + [47, -42] + ], + [ + [17243, 10214], + [103, -24], + [19, -40], + [-104, -187], + [179, -17], + [64, -94], + [-28, -68], + [-54, 31], + [-42, -44], + [-68, 20], + [-107, -54], + [-48, 128], + [86, 43], + [-18, 59], + [-51, 44], + [-78, 13], + [117, 178], + [30, 12] + ], + [ + [18944, 10265], + [93, -2], + [44, -89], + [-10, -35], + [109, -114], + [98, -185], + [-40, -44], + [-112, 3], + [-25, 60], + [-106, 52], + [-79, 6], + [5, 60], + [-72, 25], + [-76, 98], + [5, 67], + [65, 56], + [101, 42] + ], + [ + [18851, 10455], + [-28, -84], + [-64, 8], + [0, 53], + [92, 23] + ], + [ + [18446, 10496], + [76, -36], + [-10, -37], + [160, 1], + [9, -88], + [-105, 45], + [-123, -117], + [-72, 42], + [1, 61], + [-50, 57], + [114, 72] + ], + [ + [9975, 10525], + [97, -53], + [53, 5], + [169, -82], + [38, -56], + [-18, -78], + [95, -57], + [88, 14], + [134, -139], + [55, -85], + [50, -16], + [29, -56], + [-56, -30], + [37, -57], + [-11, -58], + [-103, -10], + [1, -68], + [69, -52], + [-81, -71], + [44, -94], + [-83, -84], + [-1, -35], + [-86, -75], + [-5, -111], + [-94, 91], + [-37, -55], + [-132, 26], + [-19, -105], + [89, -38], + [22, -110], + [-59, -35], + [-112, 20], + [34, 71], + [-3, 95], + [-116, 21], + [-26, -28], + [9, -106], + [-114, 0], + [-26, -58], + [-66, 21], + [-44, -43], + [-119, -65], + [-168, -40], + [-165, 52], + [-68, -2], + [-2, 105], + [52, 73], + [-77, 4], + [-24, -49], + [-71, 20], + [-33, 100], + [-70, 64], + [-50, 102], + [78, 164], + [97, 87], + [36, 77], + [56, 7], + [71, 73], + [98, 55], + [67, 9], + [33, 121], + [74, 90], + [-11, -128], + [83, -3], + [-27, 83], + [35, 53], + [117, 9], + [-69, 72], + [83, 63], + [178, 11], + [36, 81], + [-36, 81], + [-85, 68], + [60, 144] + ], + [ + [18887, 10566], + [-9, -43], + [83, -47], + [-56, -48], + [-79, 97], + [61, 41] + ], + [ + [8318, 10607], + [25, -149], + [-58, -17], + [-5, 82], + [38, 84] + ], + [ + [15144, 10591], + [-111, -19], + [-15, 62], + [58, 51], + [68, -94] + ], + [ + [17766, 10737], + [116, -41], + [-19, -75], + [-78, -49], + [-110, 53], + [-49, 70], + [25, 31], + [86, -41], + [29, 52] + ], + [ + [18314, 10774], + [57, -31], + [-9, -57], + [-68, -33], + [-50, 51], + [13, 51], + [57, 19] + ], + [ + [7598, 10816], + [33, -185], + [-115, -52], + [-93, 26], + [-28, -46], + [-66, 14], + [5, 184], + [54, -51], + [70, 50], + [140, 60] + ], + [ + [8448, 10819], + [41, 1], + [36, -76], + [-42, -81], + [-92, 54], + [57, 102] + ], + [ + [8877, 10853], + [62, -77], + [27, -77], + [120, -56], + [-24, -65], + [72, -52], + [-90, -111], + [38, -134], + [-102, -4], + [7, -58], + [-40, -37], + [-94, -24], + [-7, -33], + [-90, -28], + [-47, 33], + [-93, 13], + [26, 60], + [81, -42], + [46, 70], + [-11, 46], + [-64, 21], + [48, 58], + [113, -30], + [94, 120], + [-72, 107], + [-33, 115], + [-91, -6], + [8, 146], + [116, 45] + ], + [ + [8549, 10922], + [38, -37], + [-77, -41], + [-31, 56], + [70, 22] + ], + [ + [8261, 10903], + [80, -102], + [-11, -65], + [-141, 134], + [72, 33] + ], + [ + [5333, 10995], + [-46, -93], + [-99, 2], + [49, 98], + [96, -7] + ], + [ + [8759, 11024], + [26, -65], + [-11, -67], + [-84, -185], + [18, -69], + [98, -18], + [51, -135], + [-23, -84], + [-39, -31], + [-84, 5], + [-132, -31], + [8, 76], + [-35, 82], + [65, 66], + [-86, 69], + [33, 96], + [-39, 92], + [110, 32], + [0, 79], + [92, 120], + [32, -32] + ], + [ + [9353, 11129], + [52, -7], + [90, -62], + [80, -14], + [22, -72], + [-26, -61], + [43, -82], + [-174, -115], + [-46, 17], + [-157, 12], + [-101, 136], + [-20, 53], + [56, 126], + [152, 71], + [29, -2] + ], + [ + [8968, 11203], + [18, -110], + [-45, -182], + [-55, 0], + [-37, 82], + [-7, 146], + [12, 66], + [90, 50], + [24, -52] + ], + [ + [4826, 11296], + [-9, -48], + [-139, -178], + [-63, 64], + [123, 76], + [88, 86] + ], + [ + [9642, 11356], + [50, -41], + [-43, -119], + [-93, -76], + [-122, 52], + [-42, 52], + [33, 44], + [217, 88] + ], + [ + [5109, 11317], + [139, -50], + [-26, -86], + [-78, -5], + [-19, -126], + [-105, -30], + [17, -107], + [-94, -37], + [-5, -115], + [-66, 3], + [-60, 39], + [-50, 106], + [11, 77], + [70, 164], + [59, 61], + [31, 93], + [176, 13] + ], + [ + [18849, 11470], + [17, -87], + [70, -17], + [-32, -59], + [-88, 45], + [33, 118] + ], + [ + [3722, 11396], + [8, -115], + [-60, -108], + [-56, -6], + [-32, -109], + [-76, 58], + [15, 78], + [61, 11], + [74, 145], + [66, 46] + ], + [ + [18989, 11555], + [224, -119], + [32, -108], + [-69, -38], + [16, -52], + [-36, -57], + [52, -80], + [60, 9], + [0, -76], + [63, 4], + [-53, -106], + [22, -115], + [-59, -66], + [10, -73], + [62, -71], + [20, -76], + [-122, -34], + [-90, 18], + [-43, 39], + [-82, -5], + [-81, 93], + [-94, 51], + [-63, 72], + [58, 43], + [28, 59], + [-34, 60], + [27, 71], + [82, 34], + [66, 69], + [61, 137], + [-25, 60], + [20, 87], + [-63, 32], + [-44, 137], + [55, 1] + ], + [ + [8276, 11527], + [47, -60], + [126, -17], + [12, 89], + [93, -151], + [-38, -185], + [-123, -44], + [-46, -41], + [5, -61], + [-90, -54], + [-72, 15], + [-40, 56], + [-93, 9], + [-25, 70], + [-74, 0], + [-3, 234], + [132, 43], + [29, -19], + [114, 171], + [46, -55] + ], + [ + [5189, 11623], + [131, -101], + [-63, -26], + [-44, -79], + [-51, 80], + [31, 31], + [-4, 95] + ], + [ + [8580, 11787], + [66, -60], + [-27, -137], + [37, -81], + [-81, -29], + [-37, 77], + [-4, 132], + [46, 98] + ], + [ + [8835, 11713], + [-26, -88], + [-93, 85], + [85, 44], + [34, -41] + ], + [ + [8954, 11876], + [94, -53], + [29, 20], + [134, 11], + [41, -94], + [46, -30], + [148, 0], + [75, -65], + [66, -101], + [44, -23], + [16, -88], + [-37, -56], + [-104, -79], + [-113, -28], + [-52, -74], + [-60, 8], + [-94, -33], + [-66, 95], + [-49, -2], + [-51, 63], + [-111, 25], + [-37, 64], + [8, 132], + [23, 81], + [43, 43], + [-63, 72], + [-10, 63], + [80, 49] + ], + [ + [10631, 11873], + [95, -53], + [-21, -90], + [-61, -48], + [-79, -10], + [0, 67], + [80, 1], + [-14, 133] + ], + [ + [10426, 11934], + [34, -18], + [-70, -180], + [-81, 39], + [6, 107], + [111, 52] + ], + [ + [8448, 12060], + [25, -82], + [-33, -95], + [32, -49], + [-15, -93], + [-129, -53], + [-117, -9], + [-97, 10], + [56, -131], + [-51, -91], + [-143, -50], + [-54, 8], + [-93, 76], + [-41, 74], + [24, 69], + [-17, 135], + [51, 61], + [70, 20], + [167, -2], + [184, 109], + [42, 83], + [139, 10] + ], + [ + [10444, 12138], + [49, -114], + [-45, -39], + [-98, 0], + [21, 132], + [73, 21] + ], + [ + [9490, 12050], + [-6, -96], + [37, -35], + [-2, -161], + [-87, -11], + [-150, 11], + [-74, 123], + [-144, -14], + [-48, 57], + [50, 50], + [99, 1], + [100, 49], + [103, 104], + [39, 64], + [55, -16], + [28, -126] + ], + [ + [8761, 12205], + [104, -85], + [35, 2], + [28, -88], + [-180, 104], + [13, 67] + ], + [ + [18296, 12375], + [-72, -3], + [-46, 69], + [119, 91], + [80, -96], + [-81, -61] + ], + [ + [10745, 12588], + [-79, -94], + [-38, 50], + [117, 44] + ], + [ + [9155, 12619], + [141, -56], + [48, 26], + [23, -144], + [-87, 26], + [-11, -41], + [105, -79], + [-10, -42], + [-98, -53], + [-51, 27], + [-62, -72], + [53, -103], + [-16, -63], + [-118, -41], + [-48, 102], + [-115, 87], + [16, 34], + [-108, 153], + [88, 7], + [55, 64], + [125, -60], + [74, -3], + [5, 54], + [-42, 71], + [33, 106] + ], + [ + [18801, 12733], + [63, -43], + [107, -15], + [33, -94], + [-29, -36], + [-111, 7], + [-60, -43], + [-102, 53], + [-56, 70], + [39, 51], + [116, 50] + ], + [ + [10249, 12896], + [54, -18], + [37, -73], + [148, 1], + [42, -106], + [-106, -30], + [-31, -100], + [26, -106], + [69, 20], + [124, -1], + [89, -119], + [-5, -71], + [-79, -162], + [-156, 29], + [46, 142], + [-30, 69], + [-257, 47], + [-90, 6], + [-67, -102], + [-63, -9], + [-91, 55], + [-73, 13], + [29, 106], + [57, -39], + [133, 1], + [105, 59], + [-20, 41], + [18, 100], + [70, -43], + [65, 42], + [-9, 45], + [-130, 121], + [95, 82] + ], + [ + [9849, 13008], + [53, -34], + [96, -16], + [-37, -93], + [-85, -59], + [-69, 43], + [-21, 62], + [63, 97] + ], + [ + [8842, 12994], + [41, 11], + [64, -56], + [3, -60], + [68, 16], + [7, -80], + [67, -78], + [-50, -184], + [-63, -83], + [-148, -66], + [-63, -7], + [-40, -75], + [-70, 106], + [-210, 52], + [-88, -26], + [-32, 79], + [73, 34], + [97, 143], + [49, 116], + [106, -29], + [54, 70], + [60, -56], + [48, 62], + [27, 111] + ], + [ + [18919, 13075], + [8, -108], + [162, 0], + [117, -117], + [-2, -208], + [-50, 1], + [-93, 48], + [-9, 92], + [-146, 6], + [-184, 40], + [-8, 132], + [56, 2], + [74, 121], + [75, -9] + ], + [ + [19057, 13170], + [48, -54], + [5, -136], + [-145, 5], + [-24, 120], + [116, 65] + ], + [ + [10112, 13239], + [94, -87], + [68, -141], + [-48, -31], + [-33, 62], + [-137, 138], + [56, 59] + ], + [ + [9758, 13355], + [73, -2], + [22, -44], + [-23, -106], + [-62, -93], + [-22, -110], + [-70, -133], + [-39, -22], + [-40, 223], + [78, 225], + [37, 60], + [46, 2] + ], + [ + [9967, 13500], + [74, -7], + [54, -107], + [-1, -105], + [-97, -21], + [-32, 48], + [2, 192] + ], + [ + [9270, 13646], + [123, -5], + [67, -27], + [40, -58], + [95, -200], + [-14, -92], + [-65, -197], + [-100, -58], + [-207, 93], + [70, 119], + [-12, 241], + [-105, -42], + [-107, 41], + [72, 65], + [33, 61], + [110, 59] + ], + [ + [9349, 13868], + [71, -32], + [60, 16], + [103, -97], + [93, -28], + [-30, -99], + [-171, 57], + [-115, 8], + [-93, 126], + [82, 49] + ], + [ + [8599, 14162], + [57, -68], + [-44, -78], + [-75, 51], + [2, 97], + [60, -2] + ], + [ + [9677, 14502], + [-56, -109], + [-53, 76], + [109, 33] + ], + [ + [9440, 14475], + [-100, -44], + [-104, -150], + [-42, -140], + [14, -149], + [-46, -67], + [17, -36], + [-81, -44], + [-21, -60], + [-66, 38], + [-75, 3], + [-34, 52], + [-148, 9], + [-39, 173], + [58, 61], + [-16, 62], + [113, 10], + [106, 55], + [199, 222], + [141, 3], + [71, 34], + [53, -32] + ], + [ + [9315, 15592], + [61, -59], + [21, -99], + [-41, -52], + [-94, 78], + [53, 132] + ], + [ + [8591, 16049], + [48, -66], + [50, -21], + [18, -64], + [-49, -43], + [-64, -8], + [-31, 41], + [28, 161] + ], + [ + [19164, 13367], + [-79, -71], + [-25, -87], + [-139, -76], + [-55, -14], + [-110, -127], + [-58, -31], + [-10, -65], + [-48, -49], + [-240, -173], + [-65, -32], + [-93, 111], + [-42, 101], + [-116, 70], + [-46, -49], + [142, -190], + [-148, -124], + [126, -182], + [98, -64], + [-1, -76], + [98, 5], + [112, 100], + [51, -53], + [58, 54], + [92, 144], + [22, -39], + [134, -4], + [78, -29], + [169, 72], + [78, -36], + [0, -159], + [-43, -44], + [14, -134], + [-27, -92], + [-38, 4], + [-22, -110], + [-61, -67], + [52, -92], + [-36, -109], + [47, -43], + [-108, -52], + [-22, -68], + [-58, 15], + [-125, -43], + [-118, 97], + [-16, 48], + [-73, 37], + [-71, 69], + [-57, -154], + [-43, -51], + [-11, -84], + [-102, -44], + [7, -154], + [71, -176], + [-39, -50], + [68, -69], + [-29, -49], + [-90, 5], + [-185, 87], + [-40, 1], + [-78, -60], + [-33, 78], + [-79, 57], + [18, 115], + [-23, 75], + [32, 148], + [-47, 20], + [116, 110], + [68, 35], + [68, 175], + [-63, 30], + [-86, 219], + [-43, 38], + [-6, 64], + [-65, 23], + [-53, -33], + [-84, 31], + [13, 90], + [76, 66], + [-94, 130], + [-37, 100], + [-13, 101], + [-73, -26], + [-76, -123], + [17, -74], + [-55, -43], + [-65, 28], + [-133, -38], + [-93, 3], + [-16, -34], + [-189, -72], + [-70, 27], + [-41, 52], + [-95, -36], + [104, -38], + [48, -80], + [35, 15], + [134, -38], + [-44, -62], + [-106, -44], + [-43, -60], + [-8, -64], + [88, -81], + [-24, -78], + [-100, -44], + [-44, -64], + [34, -101], + [82, -66], + [-11, -48], + [101, -48], + [46, 15], + [127, -58], + [95, -26], + [-51, -90], + [35, -77], + [170, 3], + [-36, -79], + [14, -44], + [78, -18], + [-61, -122], + [90, 8], + [35, -152], + [51, -75], + [0, -88], + [-117, -97], + [-94, -11], + [-87, 49], + [-72, -50], + [-102, 62], + [-53, -22], + [-43, 56], + [-97, -23], + [-9, -40], + [81, -145], + [74, -60], + [82, -2], + [-62, -151], + [8, -142], + [-68, 60], + [-74, -109], + [-78, 17], + [-54, -29], + [75, -100], + [-90, -20], + [-21, -41], + [-77, 83], + [-45, -71], + [-120, -20], + [-15, -38], + [55, -135], + [-5, -66], + [-101, -28], + [-95, 50], + [18, 67], + [-68, 51], + [-63, 85], + [-118, 38], + [10, 43], + [82, 65], + [-55, 36], + [-101, 119], + [-69, -27], + [-91, 18], + [-61, 115], + [-65, -96], + [-91, 84], + [-94, -10], + [-58, -63], + [-44, 15], + [-156, -5], + [-78, 39], + [-6, 76], + [-59, 52], + [7, 89], + [61, 73], + [126, 102], + [2, 80], + [109, -34], + [53, 37], + [5, 224], + [84, 98], + [80, 52], + [47, -138], + [88, 34], + [33, 72], + [2, 126], + [29, 132], + [63, 52], + [-17, 95], + [62, 70], + [110, 15], + [57, 51], + [47, -151], + [1, -51], + [-42, -129], + [43, -40], + [59, 10], + [110, -26], + [29, 44], + [-12, 76], + [70, 113], + [27, 74], + [-58, 312], + [-123, -18], + [-65, -135], + [-133, 72], + [-55, -62], + [-57, 73], + [-1, 44], + [-81, 137], + [-58, -38], + [-22, -66], + [-95, -110], + [13, -51], + [-80, -175], + [-43, -17], + [-63, -80], + [-131, -6], + [-108, 19], + [-78, 59], + [-77, -62], + [-47, -120], + [-70, -52], + [-49, -3], + [-152, -87], + [-51, -107], + [-250, -127], + [-104, -9], + [-3, -59], + [88, -66], + [-95, -80], + [-6, -86], + [-59, -84], + [39, -62], + [-7, -154], + [-94, 22], + [-81, -87], + [87, -101], + [-65, -106], + [30, -73], + [56, -30], + [16, -69], + [-72, -6], + [-78, -47], + [-57, 95], + [-44, -47], + [23, -103], + [33, -43], + [-60, -60], + [-69, 33], + [-294, 29], + [63, -200], + [-223, 130], + [-68, 21], + [-116, -8], + [-91, 72], + [-19, 71], + [-67, -16], + [-23, 68], + [35, 89], + [-10, 138], + [-23, 35], + [29, 137], + [-16, 155], + [25, 115], + [-44, 51], + [18, 67], + [-49, 26], + [-9, 239], + [-54, -54], + [10, -93], + [-35, -283], + [16, -60], + [-26, -150], + [-31, -56], + [16, -165], + [-22, -65], + [-104, -40], + [45, -116], + [-124, -189], + [-101, -46], + [-78, 7], + [-100, -97], + [-22, -72], + [-65, 51], + [-88, -13], + [-18, -58], + [-86, -13], + [-102, -68], + [27, -40], + [-58, -72], + [49, -49], + [-1, -151], + [-104, -82], + [0, -161], + [19, -55], + [-47, -30], + [-76, 54], + [-172, 11], + [-78, -130], + [-164, -34], + [-32, 149], + [89, 107], + [-40, 76], + [-3, 115], + [-54, 29], + [-55, -36], + [-124, -10], + [-18, 81], + [18, 83], + [84, 55], + [-38, 53], + [10, 48], + [88, 14], + [71, 63], + [-52, 89], + [32, 42], + [-42, 54], + [-67, -64], + [-36, 24], + [-77, -57], + [-111, 164], + [56, 88], + [-72, 104], + [51, 39], + [-10, 98], + [-38, 39], + [93, 40], + [-46, 81], + [-115, 74], + [93, 24], + [-167, 88], + [-13, 78], + [-73, -21], + [-99, -59], + [11, -39], + [-88, -48], + [-23, 78], + [24, 68], + [-55, 74], + [-104, -14], + [-61, 47], + [-110, 41], + [-120, -47], + [-58, 72], + [52, 66], + [-44, 33], + [-93, 11], + [-69, 31], + [51, 66], + [-40, 53], + [27, 119], + [-90, 26], + [-46, 187], + [-46, 31], + [30, 62], + [-30, 41], + [43, 58], + [-26, 53], + [98, 127], + [1, 120], + [58, 138], + [13, 75], + [84, 25], + [95, -96], + [117, -74], + [-25, -122], + [52, -15], + [66, -113], + [-63, -59], + [-15, -72], + [26, -76], + [66, -81], + [94, -162], + [48, -156], + [23, -3], + [178, -120], + [148, -76], + [88, -15], + [61, 68], + [-140, 3], + [-57, 42], + [11, 69], + [-239, 145], + [-90, 69], + [-68, 143], + [2, 70], + [153, 136], + [-55, 17], + [-31, -53], + [-94, -79], + [-87, 69], + [45, 74], + [101, 16], + [44, 112], + [53, 40], + [25, 77], + [-131, 51], + [-4, 64], + [87, 40], + [-8, 101], + [138, 52], + [142, 34], + [47, -10], + [95, 40], + [-47, 116], + [-128, -60], + [-81, -9], + [-33, -47], + [-83, -19], + [-113, 4], + [-42, 74], + [51, 156], + [108, 168], + [51, 9], + [62, 98], + [-73, 123], + [41, 78], + [-59, 17], + [-14, 54], + [68, 74], + [23, 78], + [-78, 61], + [-27, 192], + [42, 105], + [-92, 68], + [7, 118], + [-70, 11], + [-14, -56], + [30, -60], + [-55, -47], + [69, -62], + [-3, -114], + [-38, -98], + [16, -60], + [-96, 18], + [-61, -54], + [-79, 38], + [-22, 76], + [-63, 46], + [32, 47], + [-76, 42], + [-83, 113], + [24, 83], + [45, 68], + [162, -112], + [90, 36], + [65, 77], + [-10, 47], + [-109, 27], + [31, 39], + [108, 50], + [163, 111], + [-7, 80], + [-40, 76], + [-55, -2], + [-125, -56], + [-28, 69], + [13, 54], + [-67, 51], + [37, 51], + [-40, 79], + [-57, 50], + [-67, -13], + [6, -64], + [-40, -128], + [22, -44], + [-84, -42], + [-58, 84], + [-55, 15], + [-25, -51], + [-107, -9], + [25, -77], + [60, -33], + [-110, -179], + [-88, 46], + [-75, -11], + [-14, 42], + [52, 148], + [-15, 63], + [-61, 34], + [-93, -22], + [-130, 22], + [-33, 55], + [-114, 10], + [21, 126], + [-45, 35], + [59, 102], + [142, 64], + [116, -68], + [51, 24], + [86, -58], + [77, 82], + [5, 82], + [67, 146], + [88, 29], + [59, -79], + [77, 32], + [83, -15], + [40, -39], + [59, 16], + [57, 108], + [64, 11], + [12, -99], + [-24, -55], + [9, -98], + [-53, -90], + [-3, -80], + [62, -29], + [48, -60], + [88, -56], + [72, 31], + [25, -40], + [75, 48], + [63, -93], + [-41, -141], + [-7, -78], + [164, -35], + [-51, 99], + [31, 45], + [110, 54], + [65, 124], + [-71, 79], + [119, 54], + [28, 56], + [-113, 43], + [-158, 13], + [-100, 198], + [-40, -10], + [-59, 64], + [-23, 65], + [-122, 107], + [-61, 103], + [-64, 25], + [-8, 54], + [-138, -88], + [-63, -15], + [-53, 71], + [35, 91], + [-29, 69], + [-10, 120], + [39, 126], + [43, 67], + [77, -14], + [49, 106], + [-44, 23], + [-9, 124], + [124, 35], + [87, -26], + [117, 117], + [-14, 40], + [17, 126], + [55, 106], + [-1, 66], + [63, 115], + [95, -42], + [47, 36], + [-68, 58], + [-14, 86], + [-34, 11], + [41, 102], + [-19, 35], + [96, 135], + [156, 10] + ], + [ + [11159, 16515], + [27, -20], + [160, -20], + [62, -91], + [8, -119], + [-52, -65], + [11, -37], + [77, -45], + [-2, -118], + [71, 28], + [75, -83], + [-11, -169], + [77, -133], + [121, 43], + [133, -28], + [88, -71], + [23, 41], + [-66, 136], + [17, 34], + [90, 8], + [32, 37], + [125, -101], + [121, -9], + [86, 100], + [8, 74], + [38, 50], + [92, -31], + [103, 18], + [32, 110], + [90, -1], + [69, 81], + [-8, 131], + [88, 100], + [46, 102], + [-1, 93], + [-82, 93], + [59, 8], + [97, 112], + [109, 31], + [35, -19], + [154, 7], + [3, 102], + [73, 24], + [30, -44], + [72, -30], + [45, -71], + [109, -32], + [92, -75], + [77, -21], + [47, -50], + [-41, -57], + [66, -117], + [129, -76], + [16, -77], + [130, 11], + [54, -14], + [82, 62], + [-31, 73], + [-9, 98], + [57, -5], + [33, 71], + [76, 67], + [10, 107], + [81, -21], + [131, 53], + [-1, -129], + [18, -82], + [67, -33], + [2, -67], + [-44, -164], + [-61, 16], + [-7, -81], + [96, -92], + [61, 53], + [82, -131], + [-3, -102], + [-27, -108], + [-79, 25], + [-33, -155], + [92, -9], + [235, -107], + [89, -17], + [87, 70], + [90, -3], + [8, 46], + [132, 119], + [90, -29], + [22, -40], + [83, -47], + [84, 2], + [7, 93], + [40, 54], + [72, -46], + [158, -133], + [167, 18], + [99, -76], + [93, 13], + [63, 70], + [151, 43], + [128, -74], + [44, -53], + [89, 68], + [10, 86], + [87, 89], + [53, 110], + [42, 47], + [140, 10], + [102, 41], + [88, -59], + [92, 3], + [175, -153], + [145, -107], + [82, -29], + [55, -66] + ], + [ + [13925, 15297], + [-106, -85], + [-93, 23], + [-85, -70], + [-95, -26], + [-31, -46], + [-141, -40], + [-60, -41], + [-117, 24], + [-114, 68], + [-71, 18], + [0, 66], + [50, 76], + [-165, -18], + [-100, -177], + [-12, -105], + [-91, -31], + [-95, 53], + [-57, -94], + [3, -60], + [-110, -13], + [69, -159], + [-103, -35], + [-15, -133], + [20, -66], + [-20, -115], + [34, -51], + [73, -9], + [54, -45], + [52, 43], + [134, -21], + [187, -15], + [85, -107], + [46, -6], + [54, -149], + [-28, -35], + [16, -71], + [57, -14], + [101, 57], + [51, -63], + [92, 1], + [47, 71], + [97, 20], + [77, 92], + [97, -27], + [80, 51], + [127, 6], + [27, 46], + [69, 10], + [62, -112], + [116, -10], + [90, 117], + [125, 33], + [61, 146], + [69, 70], + [12, 102], + [-19, 115], + [78, 88], + [-26, 86], + [-89, 61], + [-158, -9], + [-41, -40], + [-61, 87], + [40, 51], + [-98, 131], + [19, 41], + [-58, 82], + [-60, 32], + [-10, 78], + [-142, 53] + ], + [ + [11021, 11619], + [-100, -2], + [-60, -23], + [-44, -65], + [-15, -73], + [202, -47], + [22, -76], + [86, 53], + [78, -27], + [28, -78], + [-37, -57], + [121, -201], + [47, 147], + [91, -101], + [138, -54], + [153, -22], + [-27, 77], + [89, 46], + [45, 70], + [-59, 18], + [-68, -18], + [-66, 179], + [-70, 58], + [-108, 143], + [-54, 25], + [-112, -2], + [-71, -66], + [-49, 8], + [-150, -37], + [-10, 125] + ], + [ + [11627, 11040], + [-144, 33], + [18, 64], + [126, -97] + ], + [ + [10295, 17883], + [57, -53], + [-54, -125], + [-94, -35], + [-54, -86], + [-82, -25], + [-90, 28], + [-17, 47], + [132, 20], + [-12, 48], + [43, 56], + [114, 2], + [57, 123] + ], + [ + [10393, 18960], + [76, -64], + [19, -66], + [-87, -3], + [-44, 113], + [36, 20] + ], + [ + [11099, 19230], + [0, -70], + [-77, -55], + [-68, 36], + [46, 61], + [64, -32], + [35, 60] + ], + [ + [11136, 19383], + [71, -10], + [32, -45], + [112, -13], + [18, -68], + [-73, -17], + [-78, 27], + [-90, 90], + [8, 36] + ], + [ + [10901, 19382], + [56, -11], + [11, -163], + [-85, -6], + [65, 104], + [-47, 76] + ], + [ + [11818, 20897], + [-36, -80], + [-45, 58], + [81, 22] + ], + [ + [18321, 21066], + [42, -13], + [59, -74], + [30, -119], + [79, 13], + [-21, 64], + [95, 81], + [71, -39], + [-1, -108], + [56, -57], + [152, -5], + [51, -49], + [143, -16], + [-19, -68], + [167, 4], + [78, 88], + [100, 9], + [79, 51], + [137, 29], + [72, -100], + [70, -18] + ], + [ + [11159, 16515], + [-35, 42], + [-77, 17], + [79, 111], + [131, 234], + [59, 141], + [59, 93], + [74, -55], + [29, 91], + [113, 65], + [103, -15], + [32, -28], + [124, 100], + [245, 8], + [44, 88], + [36, 14], + [5, 92], + [88, 21], + [96, -22], + [101, -105], + [45, 119], + [-3, 63], + [-146, 78], + [-68, 14], + [-114, -60], + [-252, 37], + [-94, -33], + [-111, 18], + [-78, -63], + [-104, -1], + [-115, 49], + [-30, 70], + [-116, 60], + [-38, 87], + [54, 22], + [-31, 103], + [70, 67], + [46, 87], + [97, 13], + [81, 67], + [41, 68], + [55, 21], + [18, 58], + [169, 81], + [58, -26], + [86, 94], + [103, 83], + [58, 120], + [92, 83], + [-26, 287], + [59, 83], + [64, -19], + [339, 12], + [108, -39], + [66, 1], + [251, -118], + [-13, 56], + [54, 115], + [-262, 122], + [-64, 65], + [-141, 87], + [-84, 21], + [42, 63], + [166, 59], + [67, 47], + [344, -12], + [64, 62], + [13, 144], + [147, 33], + [-36, 69], + [-122, -9], + [-90, -32], + [-85, -95], + [-42, 17], + [-160, 1], + [-68, -41], + [-156, 57], + [-137, 6], + [-53, -80], + [-160, 7], + [-123, 28], + [-33, -16], + [-28, 218], + [27, 185], + [-119, 35], + [-342, -39], + [-60, -13], + [-32, 68], + [-11, 151], + [287, 19], + [-2, 16], + [447, 21], + [142, 37], + [82, 109], + [145, 3], + [128, -33], + [56, 41] + ], + [ + [12887, 20585], + [84, 162], + [160, 57], + [122, -8], + [88, 25], + [118, 92], + [203, 98], + [40, 61], + [29, 159], + [-10, 153], + [65, 139], + [49, 59], + [76, 20], + [111, -30], + [121, 100], + [82, 22], + [71, -41], + [128, -41], + [80, 30], + [87, -28], + [35, -62], + [157, 41], + [6, -80], + [60, -42], + [-18, -57], + [22, -169], + [122, -111], + [167, -38], + [81, -67], + [65, 46], + [21, 123], + [84, 22], + [36, -46], + [70, 3], + [64, 73], + [121, -58], + [32, 102], + [178, -41], + [71, 1], + [0, 71], + [32, 58], + [131, -37], + [128, 38], + [12, 67], + [58, 24], + [50, -51], + [59, 83], + [85, 2], + [36, -89], + [64, -69], + [-43, -71], + [73, -63], + [7, -258], + [72, -70], + [7, -66], + [63, -91], + [99, -97], + [151, 132], + [50, 9], + [17, -132], + [43, -16], + [21, -96], + [47, -69], + [74, 28], + [39, -46], + [78, -23], + [69, 68], + [40, -51], + [116, 39], + [52, 45], + [39, 139], + [-23, 69], + [10, 83], + [180, -22], + [44, -51], + [97, 15], + [118, -162], + [43, 37], + [-5, 75], + [62, 97], + [19, 66], + [-71, 7], + [6, 140], + [27, 38], + [80, 12] + ], + [ + [10616, 23109], + [20, -86], + [52, -40], + [-54, -56], + [-121, 31], + [67, 74], + [36, 77] + ], + [ + [11070, 23330], + [16, -47], + [142, -177], + [-87, 4], + [-76, 42], + [-214, 46], + [-68, -10], + [4, 105], + [283, 37] + ], + [ + [10518, 23465], + [57, 10], + [36, -49], + [-66, -52], + [-38, -92], + [-96, 65], + [80, 134], + [27, -16] + ], + [ + [10636, 24947], + [95, -49], + [51, 2], + [66, -77], + [17, -94], + [-41, -130], + [-34, -37], + [27, -60], + [35, -223], + [109, -222], + [76, -185], + [7, -131], + [42, -179], + [-53, -76], + [-48, -20], + [-74, 63], + [-89, -14], + [-61, 42], + [-64, -55], + [-120, 97], + [-18, 88], + [-62, 18], + [-68, 208], + [45, 168], + [-11, 111], + [-41, 107], + [19, 35], + [-14, 141], + [-30, 83], + [-66, 74], + [2, 117], + [60, 19], + [18, 80], + [100, 67], + [125, 32] + ], + [ + [9554, 25313], + [5, -90], + [-168, -83], + [-48, 24], + [86, 65], + [122, 28], + [3, 56] + ], + [ + [10431, 27104], + [42, 6], + [85, -81], + [-91, -21], + [-36, 96] + ], + [ + [10738, 27201], + [54, -69], + [-80, -18], + [-25, 40], + [51, 47] + ], + [ + [11042, 28168], + [3, -36], + [132, -39], + [2, -60], + [-167, -16], + [-20, 147], + [50, 4] + ], + [ + [13934, 27028], + [52, 3], + [156, 90], + [178, 59], + [136, 66], + [123, -7], + [95, -44], + [174, 80], + [80, -8], + [74, 67], + [62, 2], + [5, 85], + [97, 89], + [101, -52], + [85, 45], + [125, -68], + [44, 8], + [107, -73], + [70, -6], + [111, -155], + [143, -92], + [157, -30], + [119, -138] + ], + [ + [16228, 26949], + [109, -61], + [20, -108], + [-32, -50], + [182, -60], + [-17, -171], + [135, -16], + [65, -83], + [89, -21], + [122, -132], + [-41, -79], + [42, -61], + [61, -24], + [53, -91], + [-53, -16], + [-45, -78], + [-47, 5], + [-56, 87], + [-92, -7], + [-47, 23], + [-51, -35], + [-117, -28], + [27, -145], + [-95, 1], + [-101, -82], + [-1, -114], + [-136, -100] + ], + [ + [16202, 25503], + [-73, 31], + [-81, -19], + [-71, 17], + [-94, 100], + [-148, 70], + [-23, 43], + [-245, 62], + [-69, -49] + ], + [ + [15398, 25758], + [-3, -2] + ], + [ + [15395, 25756], + [-39, -66], + [-64, -29], + [-2, -47], + [55, -107], + [107, 3], + [21, -97], + [-58, -96], + [34, -61], + [-38, -27], + [22, -121], + [-18, -77], + [5, -132], + [111, -73], + [46, -4], + [68, -104], + [90, -15], + [-29, -80], + [-56, -19], + [-127, -204], + [54, -99], + [-66, -74], + [76, -132], + [68, -27], + [-25, -72], + [22, -70] + ], + [ + [15652, 23926], + [3, -6] + ], + [ + [15655, 23920], + [24, -23] + ], + [ + [15679, 23897], + [5, 2] + ], + [ + [15684, 23899], + [25, -55] + ], + [ + [15709, 23844], + [-2, -5] + ], + [ + [15707, 23839], + [0, -5] + ], + [ + [15707, 23834], + [-11, -18] + ], + [ + [15696, 23816], + [-2, -1] + ], + [ + [15694, 23815], + [-2, -4] + ], + [ + [15692, 23811], + [-5, -4] + ], + [ + [15687, 23807], + [-6, -3] + ], + [ + [15681, 23804], + [-3, -6] + ], + [ + [15678, 23798], + [6, -7] + ], + [ + [15684, 23791], + [37, -101], + [73, -20], + [81, -82] + ], + [ + [15875, 23588], + [3, -2] + ], + [ + [15878, 23586], + [49, -25], + [64, -83], + [51, 16] + ], + [ + [16042, 23494], + [1, 0] + ], + [ + [16043, 23494], + [2, 12] + ], + [ + [16045, 23506], + [0, 2] + ], + [ + [16045, 23508], + [2, 32] + ], + [ + [16047, 23540], + [6, 4] + ], + [ + [16053, 23544], + [3, 1] + ], + [ + [16056, 23545], + [12, 5] + ], + [ + [16068, 23550], + [6, 0] + ], + [ + [16074, 23550], + [27, -3] + ], + [ + [16101, 23547], + [2, 0] + ], + [ + [16103, 23547], + [10, -4] + ], + [ + [16113, 23543], + [2, -1] + ], + [ + [16115, 23542], + [8, -4] + ], + [ + [16123, 23538], + [2, -2] + ], + [ + [16125, 23536], + [1, -1] + ], + [ + [16126, 23535], + [3, -1] + ], + [ + [16129, 23534], + [27, 0] + ], + [ + [16156, 23534], + [0, 2] + ], + [ + [16156, 23536], + [26, -3] + ], + [ + [16182, 23533], + [-22, -126], + [14, -157], + [-60, -96], + [42, -88], + [-64, -72], + [4, -55], + [-50, -28], + [-12, -99], + [9, -122], + [-66, -23], + [8, -68], + [190, -129], + [0, -133] + ], + [ + [16175, 22337], + [0, -1] + ], + [ + [16175, 22336], + [11, -77], + [57, -44], + [138, -59], + [50, -130], + [50, -11], + [-1, -124], + [54, 36], + [74, 161], + [70, 58], + [-2, 226], + [-24, 89], + [75, 58], + [100, -53], + [-18, -100], + [28, -57], + [-19, -59], + [77, -10], + [45, -144], + [127, -54], + [81, -80], + [72, 48], + [-9, 42], + [92, 58], + [-6, 60], + [135, 75], + [17, 31] + ], + [ + [17449, 22276], + [153, 18], + [78, 58], + [109, -67], + [-16, -66], + [91, -1], + [105, 22], + [112, -112], + [9, -92], + [-39, -66], + [32, -77], + [22, -163], + [-49, -61], + [-21, -136], + [85, -122], + [35, 13], + [47, -96], + [1, -82], + [88, -85], + [30, -95] + ], + [ + [12887, 20585], + [-85, -3], + [-101, 40], + [-170, 18], + [-55, -30], + [-35, 47], + [9, 115], + [32, 32], + [-65, 102], + [-75, 69], + [-71, 1], + [6, 265], + [-12, 47], + [-86, 18], + [-58, -22], + [-8, 74], + [-87, 132], + [-91, 75], + [-102, -61], + [-64, 84], + [-68, 46], + [-152, 25], + [-88, -78], + [-19, 129], + [90, 10], + [71, 50], + [34, 69], + [-18, 61], + [42, 66], + [59, -23], + [151, -25], + [9, 48], + [-149, 17], + [-79, 175], + [5, 126], + [99, 173], + [-2, 38], + [-114, 200], + [-60, 25], + [-89, 173], + [75, 19], + [87, 68], + [88, 19], + [44, 60], + [-256, 230], + [-173, 19], + [45, 211], + [55, 103], + [-33, 131], + [-54, 52], + [-24, 114], + [-30, 246], + [66, 90], + [-40, 30], + [-94, 133], + [-54, 108], + [7, 56], + [-46, 169], + [28, 79], + [74, 7], + [76, 58], + [-15, 83], + [-103, 64], + [55, 126], + [12, 71], + [-40, 76], + [6, 142], + [-53, 61], + [-69, -185], + [13, -163], + [-87, -255], + [-35, -58], + [-79, 16], + [-12, 38], + [-84, 75], + [-131, 7], + [-51, 53], + [-22, 301], + [-75, 38], + [-1, 156], + [-51, 33], + [5, -233], + [25, -59], + [14, -147], + [51, -92], + [-50, -62], + [-69, -39], + [-93, -111], + [-61, -19], + [-106, -73], + [-64, 86], + [22, 54], + [-4, 107], + [69, 80], + [-10, 121], + [-56, 120], + [-65, 56], + [-68, 18], + [-11, 165], + [65, 60], + [-10, 145], + [-104, -58], + [-106, -8], + [-3, -59], + [42, -34], + [-79, -77], + [-104, -2], + [-58, -56], + [-29, -71], + [-53, -7], + [-94, 33], + [-108, -12], + [-88, -60], + [-60, 1], + [-44, 79], + [41, 62], + [102, -8], + [-4, 120], + [151, 105], + [81, -11], + [60, -65], + [78, -11], + [58, 38], + [23, 74], + [-110, 32], + [49, 55], + [-92, 29], + [-66, 105], + [-120, 32], + [-105, -49], + [32, -73], + [-3, -70], + [-98, -86], + [-67, -16], + [-16, 76], + [69, 99], + [-21, 77], + [-48, 6], + [-54, 84], + [-69, 65], + [166, 10], + [5, 90], + [73, 12], + [48, 98], + [49, 166], + [-77, 95], + [107, 56], + [53, -65], + [6, -189], + [59, 10], + [-10, 85], + [-36, 78], + [109, 96], + [-30, 132], + [8, 73], + [-77, 49], + [111, 22], + [39, 110], + [41, -22], + [158, 67], + [83, 11], + [-41, -163], + [-99, 1], + [-27, -57], + [128, -119], + [36, 18], + [27, 92], + [102, 29], + [86, 141], + [-5, 44], + [60, 144], + [-27, 44], + [7, 117], + [-33, 86], + [73, 52], + [73, 17], + [-8, -86], + [40, -50], + [-66, -76], + [44, -107], + [-48, -52], + [41, -85], + [66, -31], + [3, -96], + [-40, -63], + [-7, -74], + [-49, -46], + [7, -54], + [-56, -46], + [-11, -67], + [135, -30], + [-70, -60], + [-147, -89], + [98, -65], + [244, 64], + [-46, 37], + [-53, 103], + [19, 136], + [41, 46], + [90, -21], + [-26, -82], + [129, 16], + [48, 98], + [-46, 87], + [95, 44], + [111, -12], + [-15, 84], + [53, 29], + [63, -17], + [92, 30], + [-17, 51], + [-106, 10], + [-32, 80], + [75, 83], + [-139, 18], + [-44, -22], + [-34, 102], + [-182, 56], + [-4, 66], + [-94, -10], + [27, 109], + [-79, 132], + [147, 72], + [153, 59], + [196, 0], + [107, 21], + [37, -47], + [113, -16], + [73, -93], + [92, -173], + [52, -178], + [21, 7], + [-41, 181], + [20, 90], + [-45, 100], + [-154, 205], + [197, 188], + [72, 95], + [128, -42], + [57, -112], + [416, -192], + [125, -87], + [124, -46], + [52, 10], + [205, -9], + [135, 9], + [84, -46], + [373, -118], + [-1, -64], + [97, -194], + [-30, -24], + [64, -88], + [61, 4], + [26, -203], + [59, -71], + [32, -176], + [92, 6], + [5, 104], + [83, 20], + [114, 56], + [188, 17], + [-19, 103] + ], + [ + [20482, 21685], + [3, -2] + ], + [ + [17449, 22276], + [-40, 150], + [15, 100], + [52, 96], + [-38, 73], + [51, 59], + [25, 146], + [-14, 54], + [55, 128], + [66, 14], + [33, 115], + [-13, 126], + [57, 47], + [126, 38], + [-63, 87], + [-13, 68], + [-79, -10], + [-82, 21], + [-40, -121], + [-39, 21], + [-80, 175], + [18, 55], + [62, 63], + [-22, 45], + [-118, 16], + [31, 124], + [-32, 16], + [-78, -58], + [-13, -91], + [-65, -46], + [-56, 1], + [-46, 45], + [-203, -7], + [-12, 104], + [22, 93], + [-51, 59] + ], + [ + [16865, 24082], + [67, 23], + [12, 106], + [-45, 100], + [23, 89] + ], + [ + [16922, 24400], + [0, 2] + ], + [ + [16922, 24402], + [-10, 10] + ], + [ + [16912, 24412], + [-2, 0] + ], + [ + [16910, 24412], + [0, 1] + ], + [ + [16910, 24413], + [-3, 5] + ], + [ + [16907, 24418], + [0, 3] + ], + [ + [16907, 24421], + [-116, 21], + [-24, 83], + [-41, 46], + [21, 53], + [-150, -38], + [-85, 6], + [-4, 50], + [-87, 89], + [-32, -3] + ], + [ + [16389, 24728], + [-76, 57], + [19, 81], + [-38, 100], + [-60, 81], + [9, 63], + [-79, -5], + [46, 136], + [81, 30], + [44, 166], + [-133, 66] + ], + [ + [16228, 26949], + [85, 152], + [-50, 98], + [81, 1], + [206, 109], + [38, 59], + [74, -24], + [99, 16], + [55, 89], + [86, 27], + [-102, 118], + [55, 97], + [215, 28], + [119, 116], + [51, 17], + [-2, 164], + [82, 64], + [91, 12], + [77, -46], + [60, 13], + [40, 61], + [89, -17], + [133, -81], + [84, 19], + [-2, 114], + [79, 88], + [95, -10], + [34, 82], + [56, 5], + [126, 72], + [23, 52], + [-6, 128], + [23, 139], + [-55, 91], + [108, -20], + [81, -80], + [165, -33], + [48, 37], + [3, 84], + [55, 55], + [-3, 48], + [80, 122], + [52, -8], + [60, 194], + [68, 49] + ], + [ + [18984, 29250], + [-24, -45], + [61, -244], + [83, -134], + [129, -91], + [154, 14], + [87, 53], + [47, -16], + [149, 35], + [64, 55], + [86, -25], + [91, -64], + [40, 109], + [78, -15], + [72, 77], + [21, 90], + [-25, 133], + [-69, 132], + [160, 150], + [90, 23], + [48, 50], + [86, 8], + [135, -46], + [69, -52], + [3, -77], + [119, -129], + [-57, -94], + [10, -59], + [48, -37], + [122, 34], + [115, 3], + [197, 99], + [82, 96], + [-26, 40], + [35, 57], + [170, -138], + [55, -16], + [54, 39], + [7, 98], + [158, 114], + [45, 3], + [77, -62], + [47, -88], + [146, -1], + [41, -91], + [56, -50], + [91, 16], + [27, 35], + [120, 12], + [42, 47], + [108, -56], + [-46, -133], + [-73, -1], + [-6, -64], + [-101, -35], + [14, -76], + [-132, -1], + [-70, -83], + [53, -93], + [119, -66], + [225, 87], + [38, 54], + [81, 0], + [155, -43], + [50, 45], + [100, -81], + [15, -52], + [-42, -79], + [131, -60], + [32, -54], + [288, -18], + [54, 12], + [38, 61], + [84, -1], + [70, -45], + [14, -74], + [122, -39], + [18, -56], + [104, -23], + [41, 26], + [178, -87], + [104, 6], + [83, 58], + [33, -86], + [145, -69] + ], + [ + [18984, 29250], + [-9, 92], + [15, 127], + [57, 75], + [-18, 99], + [-3, 185], + [83, 71], + [-53, 159], + [-12, 110], + [10, 153], + [108, 31], + [4, 126], + [56, 83], + [43, 168], + [57, 35], + [-33, 93], + [-14, 152], + [21, 62], + [-62, 19], + [-90, 119], + [-88, 13], + [1, 66], + [84, 24], + [136, 124], + [59, 82], + [217, 29], + [42, 101], + [-57, 45], + [-162, 37], + [-20, 62], + [-102, 85], + [-41, -48], + [-118, 31], + [-74, 67], + [-87, -37], + [-115, 25], + [-74, -30], + [-61, 37], + [-9, 62], + [-176, 124], + [-84, 33], + [-155, 144], + [-152, 63], + [-100, -66], + [-37, -64], + [-90, -1], + [-34, -33], + [-64, 34], + [-68, 70], + [95, 132], + [-21, 43], + [5, 128], + [74, 253], + [-62, 52], + [-68, -66], + [-93, 56], + [-87, -66], + [-19, 93], + [33, 49], + [138, 91], + [46, 103], + [-32, 62], + [-102, 127], + [87, 128], + [-3, 59], + [-63, 46], + [26, 106], + [126, 92], + [73, 26], + [41, 78], + [91, 67], + [101, -8], + [100, 227], + [-32, 132], + [8, 102], + [-68, 61], + [3, 51], + [-179, 64], + [-66, -10], + [-108, 39], + [21, 74], + [-49, 158], + [-97, 9], + [-133, -17], + [-25, 29], + [-151, 18], + [-85, 72], + [-44, 162], + [10, 56], + [-52, 87], + [19, 147], + [-35, 203], + [-61, 50], + [-103, -94], + [-62, 76], + [-120, 13], + [-216, -66], + [-63, -62], + [-97, -9], + [-50, 81], + [-9, 67], + [-119, -12], + [-50, 16], + [-46, 144], + [70, 111], + [13, 175], + [-35, 41], + [-75, -6], + [-91, -132], + [-98, -62], + [-28, -47], + [-71, -8], + [-8, -66], + [-113, 111], + [-79, 54], + [-23, 73], + [14, 123], + [-55, -26], + [-78, 106], + [35, 49], + [-16, 53], + [-61, 40], + [18, 91], + [-84, 74], + [-109, -71], + [-95, 26], + [-27, 42], + [24, 165], + [-29, 191] + ], + [ + [15141, 36914], + [169, 126], + [36, 138], + [96, 37], + [52, -80], + [85, -42], + [89, 12], + [281, 141], + [93, -49], + [211, -31], + [37, -52], + [63, -23], + [75, 30], + [92, 78], + [58, -22], + [148, 37], + [92, 41], + [220, -40], + [148, -122], + [99, 23], + [59, -17], + [69, -102], + [131, 0], + [132, 87], + [67, 66], + [280, 106], + [113, 5], + [63, -57], + [126, -26], + [222, 7], + [90, 22], + [59, 73], + [101, -4], + [80, -37], + [100, 75], + [68, -17], + [118, 57], + [97, -161], + [52, -42], + [94, 2], + [155, 30], + [130, 45], + [22, 45], + [93, 8], + [247, -45], + [151, -66], + [133, 3], + [29, -57], + [331, -30], + [99, -24], + [88, 5], + [110, 48], + [121, 78], + [293, 143], + [391, 221], + [165, 144], + [36, 72], + [200, 161], + [116, 263], + [0, 108], + [24, 139], + [47, 59], + [-22, 73], + [9, 154], + [25, 125], + [-27, 196], + [18, 81], + [45, 45], + [179, 29], + [54, -31], + [71, -119], + [153, -182], + [34, -11], + [20, -171], + [103, -136], + [0, -117], + [95, -163], + [6, -41], + [169, -186], + [-72, -31], + [12, -121], + [82, -140], + [158, -183], + [107, -93], + [1, -100], + [62, -137], + [69, -6], + [11, -92], + [69, -74], + [107, -324], + [88, -97], + [39, -92], + [-21, -85], + [64, -228], + [73, -105], + [2, -232], + [55, -97], + [65, -57], + [38, -93], + [160, -171], + [29, -3], + [64, -187], + [149, -175], + [143, -122], + [41, 1], + [17, -135], + [86, -122], + [74, -36], + [-6, -67], + [69, -133], + [105, -71], + [-1, -75], + [209, -194], + [58, -67], + [-26, -95], + [127, -164], + [157, -158], + [10, -70], + [236, -239], + [183, -173], + [105, -114], + [128, -114], + [45, -91], + [102, -95], + [11, -37], + [257, -233], + [4, -107], + [-78, -126], + [60, -155], + [113, -109], + [266, -212], + [28, -136], + [-54, -127], + [75, -100], + [-19, -33], + [119, -183], + [108, -131], + [167, -149], + [34, -102], + [-6, -116], + [34, -66], + [140, -135], + [176, -114], + [4, -125], + [97, -144], + [15, -147], + [196, -134], + [-9, -76], + [171, -92], + [-13, -104], + [125, -123], + [54, -92], + [-94, -70], + [40, -97], + [-47, -125], + [10, -120], + [32, -71], + [66, -64], + [37, -88] + ], + [ + [10805, 28513], + [39, -10], + [-9, -92], + [-83, 39], + [53, 63] + ], + [ + [12208, 28981], + [49, -42], + [-74, -91], + [-9, 93], + [34, 40] + ], + [ + [12125, 29908], + [-147, -100], + [-81, -108], + [160, -124], + [72, 4], + [57, -40], + [-22, -49], + [53, -52], + [-5, -47], + [167, -79], + [-21, -105], + [-111, 52], + [-55, 80], + [-56, 24], + [-63, -41], + [73, -56], + [26, -70], + [-78, -12], + [-139, 93], + [-68, -116], + [-64, -29], + [-81, 43], + [-17, 134], + [16, 61], + [61, 0], + [37, 61], + [15, 99], + [-88, 173], + [72, -20], + [44, 27], + [68, 104], + [200, 136], + [199, 67], + [8, -19], + [-192, -66], + [-40, -25] + ], + [ + [11675, 33267], + [31, -45], + [-125, -17], + [-17, 66], + [54, 63], + [57, -67] + ], + [ + [13934, 27028], + [-25, 150], + [-106, 72], + [-137, -24], + [-11, 115], + [-75, -25], + [-25, 105], + [-122, 193], + [-7, 63], + [-81, -3], + [-67, 27], + [-76, -29], + [-31, 60], + [94, 31], + [-18, 126], + [-33, 25], + [-229, 0], + [-38, 50], + [22, 91], + [88, 98], + [-10, 38], + [54, 247], + [-68, 55], + [59, 124], + [84, 52], + [73, -44], + [38, 69], + [65, 5], + [-45, 86], + [-59, -4], + [18, 94], + [-44, 80], + [-75, -76], + [-189, 6], + [-24, -83], + [-87, -107], + [-238, -162], + [-93, 156], + [57, 77], + [72, 25], + [-72, 58], + [-75, -34], + [-57, 46], + [-29, 81], + [54, 63], + [5, 68], + [126, 74], + [-44, 35], + [-78, 11], + [18, 63], + [49, 43], + [-77, 94], + [-79, 14], + [-14, 64], + [125, -35], + [40, 26], + [61, 116], + [195, -47], + [45, 12], + [45, -53], + [66, 38], + [72, -5], + [64, -48], + [131, -28], + [4, 164], + [123, 93], + [111, -68], + [65, 33], + [-84, 95], + [-115, 64], + [-133, -24], + [-315, 104], + [-57, 31], + [-182, 146], + [-42, 50], + [18, 57], + [75, 43], + [214, 289] + ], + [ + [12898, 30524], + [14, 10] + ], + [ + [12912, 30534], + [1, 0] + ], + [ + [12913, 30534], + [41, 31], + [43, 111] + ], + [ + [12997, 30676], + [4, 2] + ], + [ + [13001, 30678], + [-1, 37], + [94, 36], + [-5, 117], + [61, 50], + [8, 103], + [-70, 46], + [-90, 90], + [-65, 17], + [-4, 158], + [50, 43] + ], + [ + [12979, 31375], + [61, 11], + [6, 162], + [40, 107] + ], + [ + [13086, 31655], + [20, -39], + [124, -35], + [175, -21], + [46, -101], + [-31, -75], + [9, -56], + [-62, -107], + [46, -125], + [104, 0], + [75, 42], + [96, 87], + [78, -157] + ], + [ + [13766, 31068], + [0, -1] + ], + [ + [13766, 31067], + [80, -136], + [52, -132], + [36, -2], + [104, 105], + [81, -89], + [143, 36], + [118, 112], + [124, 75], + [46, -85], + [91, 22], + [63, -13], + [-7, -110], + [100, -90], + [82, 3], + [54, 96], + [46, -9], + [96, 125], + [115, 24], + [92, 41], + [83, 62], + [62, 88], + [28, 81], + [-122, 37], + [39, 118] + ], + [ + [15372, 31426], + [2, 4] + ], + [ + [15374, 31430], + [92, 160], + [95, 11], + [3, 136] + ], + [ + [15564, 31737], + [0, 6] + ], + [ + [15564, 31743], + [-34, 93], + [-311, -109], + [-33, -30], + [-94, 0], + [2, 169], + [47, 6], + [53, 142], + [-6, 94], + [-82, 37], + [45, 55], + [-17, 100], + [-95, 37], + [22, 145], + [-25, 64], + [19, 71], + [-79, 52], + [-101, -47], + [-90, -14], + [-50, 53], + [-64, -17], + [-18, 54], + [-75, 3], + [-41, -44], + [-6, -72], + [-90, -50], + [-1, -90], + [-79, -72], + [32, -126], + [-58, -42], + [-79, 87], + [-47, 84], + [-43, 26], + [-61, -50], + [-148, -55], + [-32, -159], + [-38, -65], + [6, -126], + [-88, -47], + [-68, -64], + [-151, -28], + [-183, 108], + [-90, 92], + [-51, -37], + [23, -68], + [-43, -52] + ], + [ + [13242, 31851], + [-159, 45], + [-93, -60], + [-49, 98], + [-111, -9], + [-57, 79], + [-103, 102], + [-232, 144] + ], + [ + [12438, 32250], + [-5, 5] + ], + [ + [12433, 32255], + [-75, -75], + [-63, 0], + [-52, -149], + [-115, -22], + [-16, -26] + ], + [ + [12112, 31983], + [-6, -5] + ], + [ + [12106, 31978], + [-15, -12] + ], + [ + [12091, 31966], + [-7, -3] + ], + [ + [12084, 31963], + [-18, -10] + ], + [ + [12066, 31953], + [-13, -9] + ], + [ + [12053, 31944], + [-20, -12] + ], + [ + [12033, 31932], + [-16, -6] + ], + [ + [12017, 31926], + [-106, -31] + ], + [ + [11911, 31895], + [-110, 153], + [-28, 127], + [-70, 69], + [-54, 115] + ], + [ + [11649, 32359], + [38, 95], + [-74, 73], + [26, 190], + [-53, 68], + [7, 96], + [38, 85] + ], + [ + [11631, 32966], + [11, 73], + [-80, 133], + [131, 35], + [113, -21], + [70, -92], + [63, -17], + [83, 29], + [111, -35], + [79, 67], + [32, 66], + [67, 49], + [169, 44], + [-30, 40], + [24, 156], + [47, 135], + [111, 73], + [93, 26], + [132, -5], + [169, 56], + [-1, 32], + [-148, 216], + [9, 43], + [-74, 51], + [-56, -10], + [2, 81], + [-96, 41], + [-62, -25], + [-102, 15], + [-27, 48], + [44, 245], + [106, -82], + [144, -28], + [61, 55], + [60, -25], + [61, 54], + [-47, 97], + [67, 97], + [70, -7], + [68, -52], + [-25, -94], + [7, -104], + [33, -38], + [-26, -93], + [52, -69], + [84, -4], + [21, -135], + [72, -30], + [67, 65], + [52, 127], + [38, 267], + [19, 37], + [-140, 20], + [-69, 186], + [34, 29], + [134, -5], + [-39, 134], + [53, 156], + [135, -19], + [32, -35], + [98, -35], + [33, 49], + [-6, 78], + [75, 87], + [-19, 122], + [21, 43], + [-158, 42], + [-101, 104], + [-136, -117], + [-37, 69], + [-90, -7], + [-62, -36], + [-96, 28], + [29, 92], + [-92, 57], + [-14, 56], + [-117, 41], + [0, 51], + [131, 192], + [186, 187], + [151, 123], + [284, 177], + [135, -132], + [183, -7], + [18, 28], + [143, 22], + [75, -91], + [114, 102], + [-44, 71], + [-8, 86], + [93, 19], + [211, 146], + [268, 96], + [186, 133], + [48, 19] + ], + [ + [16907, 24421], + [0, -3] + ], + [ + [16907, 24418], + [3, -5] + ], + [ + [16910, 24413], + [0, -1] + ], + [ + [16910, 24412], + [2, 0] + ], + [ + [16922, 24402], + [0, -2] + ], + [ + [16865, 24082], + [-88, 60], + [-71, -74], + [-61, -30], + [11, -105], + [-48, -162], + [-50, -25], + [-24, -96], + [-84, -64], + [-97, 20], + [-99, -18], + [-72, -55] + ], + [ + [16156, 23536], + [0, -2] + ], + [ + [16129, 23534], + [-3, 1] + ], + [ + [16125, 23536], + [-2, 2] + ], + [ + [16115, 23542], + [-2, 1] + ], + [ + [16103, 23547], + [-2, 0] + ], + [ + [16074, 23550], + [-6, 0] + ], + [ + [16056, 23545], + [-3, -1] + ], + [ + [16053, 23544], + [-6, -4] + ], + [ + [16045, 23508], + [0, -2] + ], + [ + [16043, 23494], + [-1, 0] + ], + [ + [15878, 23586], + [-3, 2] + ], + [ + [15684, 23791], + [-6, 7] + ], + [ + [15681, 23804], + [6, 3] + ], + [ + [15692, 23811], + [2, 4] + ], + [ + [15694, 23815], + [2, 1] + ], + [ + [15707, 23834], + [0, 5] + ], + [ + [15707, 23839], + [2, 5] + ], + [ + [15684, 23899], + [-5, -2] + ], + [ + [15655, 23920], + [-3, 6] + ], + [ + [15395, 25756], + [3, 2] + ], + [ + [29227, 18091], + [-52, -56], + [22, -140], + [78, -69], + [30, -70], + [13, -129], + [-48, -11], + [-25, -88], + [34, -94], + [-77, -259], + [-14, -144], + [-67, -21], + [42, -97], + [-43, -37], + [-76, 9], + [-62, -76], + [-31, 45], + [24, 113], + [-30, 46], + [-143, 2], + [60, -87], + [-29, -89], + [-135, -109], + [-46, -2], + [-27, -81], + [114, -108], + [-89, -48], + [12, -242], + [-57, -22], + [-6, -92], + [63, -18], + [44, -91], + [-26, -40], + [-219, -68], + [-54, -111], + [-55, -7] + ], + [ + [28352, 15800], + [-22, 34], + [-126, 52], + [27, 77], + [-6, 74], + [-109, 169], + [-141, -6], + [-145, -49], + [-89, 65] + ], + [ + [16175, 22336], + [0, 1] + ], + [ + [8410, 27949], + [66, -110], + [-112, 39], + [46, 71] + ], + [ + [8945, 28479], + [55, -97], + [-85, -82], + [-66, 14], + [-21, 76], + [35, 50], + [82, 39] + ], + [ + [10243, 28956], + [115, -50], + [36, -73], + [-91, 9], + [-64, 37], + [4, 77] + ], + [ + [10013, 28995], + [79, -33], + [-11, -71], + [-150, 53], + [82, 51] + ], + [ + [9778, 29050], + [133, -14], + [-71, -66], + [-82, 34], + [20, 46] + ], + [ + [9050, 29039], + [39, -23], + [54, -95], + [-16, -38], + [-96, 13], + [-56, 67], + [75, 76] + ], + [ + [9493, 29323], + [43, -118], + [-53, -10], + [-52, 43], + [16, 64], + [46, 21] + ], + [ + [11607, 29554], + [40, -50], + [-18, -51], + [-85, 56], + [63, 45] + ], + [ + [10195, 29647], + [9, -33], + [169, -35], + [100, -51], + [7, 52], + [86, -26], + [-37, -67], + [-69, -33], + [-165, 57], + [-45, -8], + [-86, 84], + [31, 60] + ], + [ + [9113, 29652], + [25, -105], + [43, -3], + [156, -137], + [95, -24], + [-84, -113], + [64, -25], + [-32, -79], + [-59, 67], + [-149, -36], + [-29, 93], + [-128, 54], + [-11, 124], + [109, 184] + ], + [ + [11300, 29756], + [26, -37], + [84, 5], + [74, -178], + [-120, -58], + [-1, -64], + [-71, -25], + [-69, -85], + [-162, 63], + [22, 140], + [-18, 67], + [35, 67], + [56, -8], + [21, 61], + [123, 52] + ], + [ + [10943, 30637], + [120, -152], + [57, -31], + [-37, -108], + [-131, -30], + [-28, 33], + [-7, 123], + [-48, 93], + [74, 72] + ], + [ + [11946, 31286], + [41, -90], + [-109, -69], + [-100, -26], + [-48, 11], + [-128, -63], + [-83, -24], + [-68, -125], + [-109, -53], + [-218, -142], + [-133, 5], + [-24, 78], + [-123, 97], + [-40, -49], + [-147, 17], + [47, 42], + [-64, 69], + [-34, 71], + [54, 54], + [53, -19], + [353, 227], + [195, -32], + [111, 34], + [67, 85], + [26, 112], + [92, 22], + [76, -54], + [106, -27], + [130, -64], + [77, -87] + ], + [ + [11242, 31586], + [75, -50], + [0, -62], + [-41, -126], + [-97, 56], + [-87, -20], + [-30, 67], + [106, 57], + [74, 78] + ], + [ + [11071, 31586], + [-7, -98], + [-58, -57], + [-12, 107], + [77, 48] + ], + [ + [10321, 31700], + [129, -70], + [41, 11], + [42, -90], + [57, -28], + [190, 12], + [-15, -71], + [-129, 24], + [-78, -20], + [-73, 17], + [-41, 77], + [-119, 107], + [-4, 31] + ], + [ + [12433, 32255], + [5, -5] + ], + [ + [13242, 31851], + [-65, -57], + [-37, -83], + [-54, -56] + ], + [ + [13001, 30678], + [-4, -2] + ], + [ + [12913, 30534], + [-1, 0] + ], + [ + [12898, 30524], + [-44, -55], + [-410, -317], + [-264, -3], + [-59, 32], + [27, 98], + [-3, 402], + [-44, 0], + [66, 145], + [-133, 25], + [20, 67], + [-19, 92], + [45, 127], + [45, 38], + [198, 63], + [-36, 71], + [-49, -60], + [-135, -3], + [-2, 95], + [56, 19], + [-15, 106], + [-68, 40], + [31, 45], + [8, 104], + [-77, 37], + [-71, 86], + [-54, 117] + ], + [ + [12017, 31926], + [16, 6] + ], + [ + [12053, 31944], + [13, 9] + ], + [ + [12084, 31963], + [7, 3] + ], + [ + [12106, 31978], + [6, 5] + ], + [ + [10116, 32210], + [-50, 116], + [53, 32], + [-3, -148] + ], + [ + [9867, 32384], + [126, -16], + [-14, -118], + [-34, -47], + [-80, 51], + [-43, 76], + [45, 54] + ], + [ + [6755, 32553], + [-32, -99], + [-108, -92], + [-58, 2], + [4, 197], + [60, -26], + [64, 26], + [70, -8] + ], + [ + [9641, 32616], + [5, -52], + [91, -105], + [-39, -76], + [-67, 15], + [-99, 79], + [-71, -15], + [-30, 80], + [82, -9], + [128, 83] + ], + [ + [9946, 32837], + [-85, -29], + [-83, 22], + [74, 98], + [94, -91] + ], + [ + [10444, 33051], + [-49, -242], + [155, -121], + [154, -28], + [46, -92], + [-18, -102], + [-203, -174], + [-107, -15], + [-10, 126], + [20, 21], + [-57, 140], + [-193, 104], + [-92, 85], + [89, 67], + [25, 188], + [90, 18], + [121, 55], + [29, -30] + ], + [ + [954, 33258], + [-7, -88], + [-99, 19], + [-72, -29], + [-39, 45], + [102, 40], + [115, 13] + ], + [ + [10065, 33520], + [163, -82], + [77, -12], + [132, 15], + [46, -42], + [-102, -135], + [-9, -39], + [-148, -72], + [-124, 41], + [-76, -40], + [-68, 7], + [-78, -89], + [-48, 0], + [-118, 110], + [90, 160], + [7, 104], + [83, 78], + [173, -4] + ], + [ + [11649, 32359], + [9, -103], + [74, -113], + [28, -127], + [-141, -59], + [15, -84], + [-61, -37], + [-96, 76], + [-121, -47], + [-42, 99], + [-61, -25], + [-165, -10], + [-193, 11], + [-156, 110], + [-35, 167], + [13, 30], + [127, 33], + [59, 64], + [-99, 40], + [43, 58], + [-15, 94], + [-39, 89], + [-56, 44], + [-151, 67], + [-55, 105], + [-10, 198], + [63, -22], + [17, 95], + [-9, 128], + [-27, 110], + [139, 96], + [132, 143], + [119, -6], + [80, 62], + [58, -15], + [169, -188], + [157, -110], + [104, -44], + [37, -85], + [-11, -56], + [87, -112], + [-5, -69] + ], + [ + [591, 33704], + [53, -46], + [11, -139], + [-54, -67], + [-168, -12], + [-26, 120], + [74, 117], + [110, 27] + ], + [ + [456, 34696], + [49, -14], + [72, 33], + [146, -47], + [28, -109], + [-31, -58], + [-100, -60], + [-53, -57], + [0, -55], + [-50, -100], + [-354, 53], + [-74, 217], + [-79, 48], + [-10, 67], + [67, 54], + [104, -60], + [83, 36], + [202, 52] + ], + [ + [26874, 14169], + [57, -33], + [90, -117], + [-20, -58], + [97, -81], + [-28, -64], + [-50, -6], + [-35, 71], + [-42, -4], + [-184, 150], + [-51, 82], + [166, 60] + ], + [ + [28352, 15800], + [-33, -80], + [-66, 9], + [-22, 49], + [-115, -52], + [-75, -341], + [-58, -50], + [57, -33], + [-42, -203], + [-75, -119], + [-19, -133], + [-30, -67], + [-158, -57], + [-15, -94], + [-91, -74], + [-76, 33], + [-94, -54], + [-112, 21], + [-115, -45], + [76, -272], + [-34, -75], + [-166, -5], + [-43, 32], + [-76, 0], + [-46, 29], + [39, 65], + [-50, 44], + [-56, -35], + [-37, 39], + [-55, -110], + [-16, -79], + [-75, -10], + [6, -73], + [-65, -202], + [-62, 101], + [-10, 72], + [-41, 13], + [-11, -140], + [26, -75], + [-56, -27], + [-103, 0], + [-20, -62], + [-64, 49], + [-50, 220], + [28, 150], + [-47, -6], + [-19, -74], + [-75, 28], + [35, 120], + [-30, 11], + [-60, -166], + [-65, -54], + [-152, -2], + [-13, -111], + [-69, -14], + [-8, 135], + [-224, -2], + [93, -203], + [-4, -130], + [-35, -35], + [-48, -112], + [34, -45], + [-38, -87], + [-83, -1], + [28, 139], + [-121, 49], + [37, 139], + [-93, 98], + [85, 44], + [59, 4], + [8, 69], + [54, 18], + [0, 54], + [-129, 11], + [-16, 38], + [155, -7], + [-58, 89] + ], + [ + [25527, 14579], + [2, 3] + ], + [ + [15564, 31743], + [0, -6] + ], + [ + [15374, 31430], + [-2, -4] + ], + [ + [13766, 31067], + [0, 1] + ] + ] +} diff --git a/src/components/Common/CardFindMaker.tsx b/src/components/Common/CardFindMaker.tsx deleted file mode 100644 index 1b60b7cd..00000000 --- a/src/components/Common/CardFindMaker.tsx +++ /dev/null @@ -1,121 +0,0 @@ -import Image from "next/image"; -import Label from '@/components/Common/Label'; -import like from "@public/assets/icon_like_black.svg"; -import like_pink from "@public/assets/icon_like_pink.svg"; -import star from "@public/assets/icon_star_md.svg"; -import default_img from "@public/assets/img_avatar3.svg"; - - -interface CardFindMakerProps { - firstLabelType?: 'SHOPPING' | 'FOOD_TOUR' | 'ACTIVITY' | 'CULTURE' | 'FESTIVAL' | 'RELAXATION' | 'REQUEST' | 'PENDING' | 'CONFIRMED'; - secondLabelType?: 'SHOPPING' | 'FOOD_TOUR' | 'ACTIVITY' | 'CULTURE' | 'FESTIVAL' | 'RELAXATION' | 'REQUEST' | 'PENDING' | 'CONFIRMED'; - labelSize?: 'sm'; - cardSize?: 'sm'; - customLabelContainerClass?: string; - customLabelTextClass?: string; - cardClassName?: string; - titleSize?: string; - innerboxClassName?: string; - profileClassName?: string; - photoSize?: string; - nameSize?: string; - otherText?: string; - starSize?: string; - heartNumberSize?: string; - likeIcon?: 'pink'; - -} -const CardFindMaker = ({ - firstLabelType, - secondLabelType, - labelSize, - cardSize, - cardClassName, - innerboxClassName, - titleSize, - profileClassName, - photoSize = "56", - starSize = "24", - nameSize, - otherText, - heartNumberSize, - customLabelContainerClass, - customLabelTextClass, - likeIcon -}: CardFindMakerProps) => { - - const isSmallScreen = typeof window !== 'undefined' && window.innerWidth < 1023; - const computedPhotoSize = cardSize === 'sm' || isSmallScreen ? "46" : photoSize; - const computedStarSize = cardSize === 'sm' || isSmallScreen ? "20" : starSize; - return ( -
-
-
- -

Dreamer의 여행을 행복하게 이루어 드립니다.

- -
-
- maker 이미지 - 파일이미지 -
-
-
-

김이팀 Maker

-
- heart -

136

-
-
-
-
- 별이미지 - 별이미지 -

5.0

-

(178)

-
-
-
-

경력

-

7년

-
-
-
-

334건

-

확정

-
-
-
-
-
- ); -}; - -export default CardFindMaker; \ No newline at end of file diff --git a/src/components/Common/CompleteTrip.tsx b/src/components/Common/CompleteTrip.tsx deleted file mode 100644 index ec5a7c3f..00000000 --- a/src/components/Common/CompleteTrip.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default function CompleteTrip() { - return ( -
-
-

여행을 완료하시겠습니까?

-
- -
- ); -} diff --git a/src/components/Common/ConfirmedPlan.tsx b/src/components/Common/ConfirmedPlan.tsx deleted file mode 100644 index 4caa5014..00000000 --- a/src/components/Common/ConfirmedPlan.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import Button from "./Button"; -import { useRouter } from "next/router"; -import Image from "next/image"; -import luggage from "@public/assets/icon_luggage.svg"; -import Layout from "./Layout"; - -export default function ConfirmedPlan({ onReset }: { onReset: () => void }) { - const router = useRouter(); - - const handleNewPlanRequest = () => { - onReset(); - router.push("/plan-request"); - }; - - const handleGoToSeePlans = () => { - onReset(); - router.push("/mytrip-manage/ongoing-plan"); - }; - - return ( - <> - - 캐리어 아이콘 -
-
-
-
-
-
-
- - ); -} diff --git a/src/components/Common/DreamerFilter.tsx b/src/components/Common/DreamerFilter.tsx deleted file mode 100644 index 5961ca87..00000000 --- a/src/components/Common/DreamerFilter.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, { useState, useEffect, useRef } from 'react'; -import Image from 'next/image'; -import downBlue from '@public/assets/dropdown_down_blue.svg'; -import downGray from '@public/assets/dropdown_down_gray.svg'; - -const placeholder = '지역'; -const items = ['전체', '서울', '경기', '인천', '강원', '충북', '충남', '세종', '대전', '전북']; -const placeholder2 = '서비스'; -const items2 = ['기념품/쇼핑형', '맛집 탐방형', '액티비티/탐험형', '문화/역사탐방형', '축제참여형', '휴양형']; - -interface DreamerFilterProps { - type: 'location' | 'service'; -} - -const DreamerFilter: React.FC = ({ type }) => { - const [isOpen, setIsOpen] = useState(false); - const [selectedItem, setSelectedItem] = useState(null); - const dropdownRef = useRef(null); - - const toggleDropdown = () => { - setIsOpen(!isOpen); - }; - - const handleClickOutside = (event: MouseEvent) => { - if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { - setIsOpen(false); - } - }; - - useEffect(() => { - document.addEventListener('mousedown', handleClickOutside); - return () => { - document.removeEventListener('mousedown', handleClickOutside); - }; - }, []); - - const itemsToDisplay = type === 'location' ? items : items2; - const placeholderText = type === 'location' ? placeholder : placeholder2; - - return ( -
- - {isOpen && ( -
-
- {itemsToDisplay.map(item => ( - - ))} -
-
- )} -
- ); -}; - -export default DreamerFilter; \ No newline at end of file diff --git a/src/components/Common/Calandar.tsx b/src/components/Common/Feature/Calandar.tsx similarity index 100% rename from src/components/Common/Calandar.tsx rename to src/components/Common/Feature/Calandar.tsx diff --git a/src/components/Common/Feature/CardFindMaker.tsx b/src/components/Common/Feature/CardFindMaker.tsx new file mode 100644 index 00000000..ea5a9757 --- /dev/null +++ b/src/components/Common/Feature/CardFindMaker.tsx @@ -0,0 +1,237 @@ +import Image from "next/image"; +import Label from "@/components/Common/UI/Label"; +import like from "@public/assets/icon_like_black.svg"; +import like_pink from "@public/assets/icon_like_pink.svg"; +import star from "@public/assets/icon_star_md.svg"; +import avatarImages from "@/utils/formatImage"; +import Link from "next/link"; +import link from "@public/assets/icon_link.svg"; +import { ServiceType } from "@/services/userService"; +import React, { useState, useEffect, useRef } from "react"; +import moreIcon from "@public/assets/label_more.svg"; + +interface CardFindMakerProps { + labelSize?: "sm"; + cardSize?: "sm"; + customLabelContainerClass?: string; + customLabelTextClass?: string; + cardClassName?: string; + titleSize?: string; + innerboxClassName?: string; + profileClassName?: string; + photoSize?: string; + nameSize?: string; + otherText?: string; + starSize?: string; + heartNumberSize?: string; + likeIcon?: "pink"; + nickName: string; + image: string; + description: string; + averageRating: number; + totalReviews: number; + totalFollows: number; + totalConfirms: number; + gallery: string; + isFollowed?: boolean; + serviceTypes: ServiceType[]; +} + +const serviceTypeOrder: ServiceType[] = [ + "SHOPPING", + "FOOD_TOUR", + "ACTIVITY", + "CULTURE", + "FESTIVAL", + "RELAXATION", + "REQUEST", + "PENDING", + "CONFIRMED", +]; + +const CardFindMaker = ({ + labelSize, + cardSize, + cardClassName, + innerboxClassName, + titleSize, + profileClassName, + photoSize = "56", + starSize = "24", + nameSize, + otherText, + heartNumberSize, + customLabelContainerClass, + customLabelTextClass, + likeIcon, + nickName, + image, + description, + averageRating, + totalReviews, + totalFollows, + totalConfirms, + isFollowed, + serviceTypes, + gallery, +}: CardFindMakerProps) => { + const avatarImage = avatarImages.find((avatar) => avatar.key === image); + const isSmallScreen = typeof window !== "undefined" && window.innerWidth < 1023; + const computedPhotoSize = cardSize === "sm" || isSmallScreen ? "46" : photoSize; + const computedStarSize = cardSize === "sm" || isSmallScreen ? "20" : starSize; + const computedLinkSize = cardSize === "sm" || isSmallScreen ? "20" : "30"; + const cardRef = useRef(null); + const [cardWidth, setCardWidth] = useState(0); + + useEffect(() => { + const updateCardWidth = () => { + if (cardRef.current) { + setCardWidth(cardRef.current.offsetWidth); + } + }; + + updateCardWidth(); + window.addEventListener("resize", updateCardWidth); + + return () => { + window.removeEventListener("resize", updateCardWidth); + }; + }, []); + + const sortedServiceTypes = [...serviceTypes].sort( + (a, b) => serviceTypeOrder.indexOf(a) - serviceTypeOrder.indexOf(b), + ); + + return ( +
+
+ {sortedServiceTypes + .slice( + 0, + cardWidth < 467 + ? 2 + : cardWidth < 650 + ? 3 + : cardWidth < 778 + ? 4 + : cardWidth < 840 + ? 5 + : sortedServiceTypes.length, + ) + .map((type, index) => ( +
+ +

+ {description} +

+ +
+
+ maker 이미지 + 파일이미지 +
+
+
+

+ {nickName} +

+
+
+ heart +
+

+ {totalFollows} +

+
+
+
+
+ 별이미지 + 별이미지 +

{averageRating}

+

({totalReviews})

+
+
+
+ + 링크이미지 +

SNS

+ +
+
+
+

{totalConfirms}건

+

확정

+
+
+
+
+
+ ); +}; + +export default CardFindMaker; diff --git a/src/components/Common/Feature/CompleteTrip.tsx b/src/components/Common/Feature/CompleteTrip.tsx new file mode 100644 index 00000000..6a1a749d --- /dev/null +++ b/src/components/Common/Feature/CompleteTrip.tsx @@ -0,0 +1,33 @@ +import planService, { Plan } from "@/services/planService"; + +interface CompleteTripProps { + planDetail: Plan; + closeModal: () => void; +} + +export default function CompleteTrip({ planDetail, closeModal }: CompleteTripProps) { + async function handleSubmit() { + try { + await planService.completePlan(planDetail.id); + alert("여행이 완료되었습니다!"); + window.location.reload(); + closeModal(); + } catch (error: any) { + alert(error.message); + } + } + + return ( +
+
+

여행을 완료하시겠습니까?

+
+ +
+ ); +} diff --git a/src/components/Common/Feature/ConfirmedPlan.tsx b/src/components/Common/Feature/ConfirmedPlan.tsx new file mode 100644 index 00000000..bcc54cc3 --- /dev/null +++ b/src/components/Common/Feature/ConfirmedPlan.tsx @@ -0,0 +1,45 @@ +import Button from "../UI/Button"; +import { useRouter } from "next/router"; +import Image from "next/image"; +import luggage from "@public/assets/icon_luggage.svg"; +import Layout from "../Layout/Layout"; + +export default function ConfirmedPlan({ onReset }: { onReset: () => void }) { + const router = useRouter(); + + const handleNewPlanRequest = () => { + onReset(); + router.push("/plan-request"); + }; + + const handleGoToSeePlans = () => { + onReset(); + router.push("/mytrip-manage/ongoing-plan"); + }; + + return ( + <> + +
+ 캐리어 아이콘 +
+
+
+
+
+
+
+
+ + ); +} diff --git a/src/components/Common/FollowedCard.tsx b/src/components/Common/Feature/FollowedCard.tsx similarity index 77% rename from src/components/Common/FollowedCard.tsx rename to src/components/Common/Feature/FollowedCard.tsx index cd9393f4..2941a359 100644 --- a/src/components/Common/FollowedCard.tsx +++ b/src/components/Common/Feature/FollowedCard.tsx @@ -2,7 +2,7 @@ import Image from "next/image"; import like from "@public/assets/icon_like_pink.svg"; import star from "@public/assets/icon_star_md.svg"; import default_img from "@public/assets/icon_default_profile.svg"; -import Label from "./Label"; +import Label from "../UI/Label"; import link from "@public/assets/icon_link.svg"; import Link from "next/link"; import avatarImages from "@/utils/formatImage"; @@ -16,6 +16,8 @@ export interface FollowedCardProps { totalFollows: number; totalConfirms: number; serviceTypes: string[]; + makerId: string; + onClick?: () => void; } export type LabelTypes = @@ -38,18 +40,25 @@ export default function FollowedCard({ totalFollows, totalConfirms, serviceTypes, + makerId, + onClick, }: FollowedCardProps) { const avatarImage = avatarImages.find((avatar) => avatar.key === image); return ( <> -
-
+
+
{serviceTypes.map((serviceType, index) => ( -
-
+
({totalReviews})

-
-

경력

+
- 링크이미지 +
+ 링크이미지 +

SNS

+
diff --git a/src/components/Common/ImageModal.tsx b/src/components/Common/Feature/ImageModal.tsx similarity index 93% rename from src/components/Common/ImageModal.tsx rename to src/components/Common/Feature/ImageModal.tsx index ecd081b1..d0a2cee5 100644 --- a/src/components/Common/ImageModal.tsx +++ b/src/components/Common/Feature/ImageModal.tsx @@ -1,4 +1,4 @@ -import ModalLayout from "./ModalLayout"; +import ModalLayout from "../Layout/ModalLayout"; import Image from "next/image"; import avatarImages from "@/utils/formatImage"; diff --git a/src/components/Common/Input.tsx b/src/components/Common/Form/Input.tsx similarity index 91% rename from src/components/Common/Input.tsx rename to src/components/Common/Form/Input.tsx index 80c0f952..7b959d91 100644 --- a/src/components/Common/Input.tsx +++ b/src/components/Common/Form/Input.tsx @@ -9,9 +9,10 @@ type InputProps = { label?: string; name?: string; onChange?: (e: React.ChangeEvent) => void; + onBlur?: (e: React.FocusEvent) => void; placeholder?: string; className?: string; - error?: boolean; + error?: string | boolean; } & Omit, "type"> & Omit, "type">; @@ -23,6 +24,7 @@ const Input = forwardRef( name, value, onChange, + onBlur = () => {}, placeholder = "", className = "", error = false, @@ -80,6 +82,7 @@ const Input = forwardRef( name={name} value={value} onChange={onChange} + onBlur={onBlur} placeholder={placeholder} {...rest} /> @@ -93,6 +96,9 @@ const Input = forwardRef( )} {inputType} + {typeof error === "string" && error && ( +

{error}

+ )}
); }, diff --git a/src/components/Common/ReviewForm.tsx b/src/components/Common/Form/ReviewForm.tsx similarity index 69% rename from src/components/Common/ReviewForm.tsx rename to src/components/Common/Form/ReviewForm.tsx index 47b1d746..d70b872a 100644 --- a/src/components/Common/ReviewForm.tsx +++ b/src/components/Common/Form/ReviewForm.tsx @@ -1,9 +1,16 @@ import Image from "next/image"; -import img_avatar1 from "@public/assets/img_avatar1.svg"; import { useState } from "react"; -import StarRating from "../Receive/StarRating"; +import StarRating from "@/components/Receive/StarRating"; +import { Plan } from "@/services/planService"; +import { formatToDetailedDate } from "@/utils/formatDate"; +import reviewService from "@/services/reviewService"; -export default function ReviewForm() { +interface ReviewFormProps { + planDetail: Plan; + closeModal: () => void; +} + +export default function ReviewForm({ planDetail, closeModal }: ReviewFormProps) { const [rating, setRating] = useState(0); // 별점을 상태로 관리 const [review, setReview] = useState(""); @@ -15,6 +22,22 @@ export default function ReviewForm() { setReview(event.target.value); }; + async function handleSubmit() { + try { + await reviewService.createReview({ + makerId: planDetail.quotes?.[0].maker.id || "", + rating, + content: review, + planId: planDetail.id, + }); + alert("리뷰가 등록되었습니다!"); + window.location.reload(); + closeModal(); + } catch (error) { + console.error(error); + } + } + const isButtonDisabled = review.length < 10 || rating === 0; return ( @@ -23,7 +46,7 @@ export default function ReviewForm() {
프로필사진
-

김코드 Maker

+

+ {planDetail.quotes?.[0].maker.nickName} +

여행일

-

2024.07.01(월)

+

{formatToDetailedDate(planDetail.tripDate)}

플랜가

-

210,000원

+

{planDetail.quotes?.[0].price}원

@@ -63,6 +88,7 @@ export default function ReviewForm() { diff --git a/src/components/Common/SearchBar.tsx b/src/components/Common/Form/SearchBar.tsx similarity index 97% rename from src/components/Common/SearchBar.tsx rename to src/components/Common/Form/SearchBar.tsx index b4cc6477..54402a60 100644 --- a/src/components/Common/SearchBar.tsx +++ b/src/components/Common/Form/SearchBar.tsx @@ -54,7 +54,7 @@ const SearchBar = ({ onChange={handleChange} onKeyPress={handleKeyPress} placeholder={placeholder} - className="h-[64px] w-full rounded-[16px] border-none bg-color-background-200 pl-[60px] pr-[24px] text-[16px] font-normal leading-[32px] text-color-gray-400" + className="h-[64px] w-full rounded-[16px] border-none bg-color-background-200 pl-[60px] pr-[24px] text-[16px] font-normal leading-[32px] text-black" />
); diff --git a/src/components/Common/Layout.tsx b/src/components/Common/Layout/Layout.tsx similarity index 100% rename from src/components/Common/Layout.tsx rename to src/components/Common/Layout/Layout.tsx diff --git a/src/components/Common/ModalLayout.tsx b/src/components/Common/Layout/ModalLayout.tsx similarity index 100% rename from src/components/Common/ModalLayout.tsx rename to src/components/Common/Layout/ModalLayout.tsx diff --git a/src/components/Common/Bubble.tsx b/src/components/Common/UI/Bubble.tsx similarity index 100% rename from src/components/Common/Bubble.tsx rename to src/components/Common/UI/Bubble.tsx diff --git a/src/components/Common/Button.tsx b/src/components/Common/UI/Button.tsx similarity index 65% rename from src/components/Common/Button.tsx rename to src/components/Common/UI/Button.tsx index 9c7028e0..62053041 100644 --- a/src/components/Common/Button.tsx +++ b/src/components/Common/UI/Button.tsx @@ -16,8 +16,9 @@ const Button = ({ return ( + {isOpen && ( +
+
+ {itemsToDisplay.map((item) => ( + + ))} +
+
+ )} +
+ ); +}; + +export default DreamerFilter; diff --git a/src/components/Common/DropdownSort.tsx b/src/components/Common/UI/DropdownSort.tsx similarity index 66% rename from src/components/Common/DropdownSort.tsx rename to src/components/Common/UI/DropdownSort.tsx index d9212ab5..5b402cec 100644 --- a/src/components/Common/DropdownSort.tsx +++ b/src/components/Common/UI/DropdownSort.tsx @@ -3,9 +3,19 @@ import Image from 'next/image'; import downGray from '@public/assets/dropdown_down_gray.svg'; const placeholder = '리뷰 많은순'; -const items = ['리뷰 많은순','평점 높은순', '경력 높은순', '확정 많은순']; +const items = ['리뷰 많은순', '평점 높은순', '확정 많은순']; -const DropdownSort = () => { +const sortMapping: Record = { + '리뷰 많은순': 'REVIEWS', + '평점 높은순': 'RATINGS', + '확정 많은순': 'CONFIRMS', +}; + +interface DropdownSortProps { + onSort: (sortKey: string) => void; +} + +const DropdownSort = ({ onSort }: DropdownSortProps) => { const [isOpen, setIsOpen] = useState(false); const [selectedItem, setSelectedItem] = useState(placeholder); const dropdownRef = useRef(null); @@ -27,11 +37,18 @@ const DropdownSort = () => { }; }, []); + const handleItemClick = (item: string) => { + setSelectedItem(item); + setIsOpen(false); + const sortKey = sortMapping[item]; + onSort(sortKey); + }; + return ( -
+
{isOpen && ( -
{items.map((item, index) => ( - {paymentStatus.status === "FAILED" && ( - -
-

결제 실패

-
-

{paymentStatus.message}

- -
+ {(paymentStatus.status === "FAILED" || paymentStatus.status === "PAID") && ( +
+
+

+ {paymentStatus.status === "FAILED" ? "결제 실패" : "결제 성공"} +

+

+ {paymentStatus.status === "FAILED" ? paymentStatus.message : "결제에 성공했습니다."} +

+ +
+
)} - -
-

결제 성공

-
-

결제에 성공했습니다.

- -
); diff --git a/src/components/Gnb/NavBar.tsx b/src/components/Gnb/NavBar.tsx index 98573598..686a801f 100644 --- a/src/components/Gnb/NavBar.tsx +++ b/src/components/Gnb/NavBar.tsx @@ -19,6 +19,7 @@ import avatarImages from "@/utils/formatImage"; import { useRef } from "react"; import useRealTimeNotification from "@/stores/useRealTimeNotification"; import ChargeModal from "./ChargeModal"; +import { getAccessToken } from "@/utils/tokenUtils"; interface LinkItem { href: string; @@ -26,16 +27,27 @@ interface LinkItem { group?: string; } +enum NavigationPath { + FINDING_MAKER = "/finding-maker", + PLAN_REQUEST = "/plan-request", + MY_TRIP_MANAGE = "/mytrip-manage/ongoing-plan", + RECEIVE = "/receive", + MANAGE_QUO = "/managequo", + LOGIN = "/login", + CHATTING = "/chatting", + LANDING = "/", +} + const linkItems: Record<"guest" | "DREAMER" | "MAKER", LinkItem[]> = { - guest: [{ href: "/finding-maker", label: "Maker 찾기" }], + guest: [{ href: NavigationPath.FINDING_MAKER, label: "Maker 찾기" }], DREAMER: [ - { href: "/plan-request", label: "여행 요청" }, - { href: "/finding-maker", label: "Maker 찾기" }, - { href: "/mytrip-manage/ongoing-plan", label: "내 여행 관리", group: "mytrip-manage" }, + { href: NavigationPath.PLAN_REQUEST, label: "여행 요청" }, + { href: NavigationPath.FINDING_MAKER, label: "Maker 찾기" }, + { href: NavigationPath.MY_TRIP_MANAGE, label: "내 여행 관리", group: "mytrip-manage" }, ], MAKER: [ - { href: "/receive", label: "받은 요청", group: "receive" }, - { href: "/managequo", label: "내 견적 관리", group: "managequo" }, + { href: NavigationPath.RECEIVE, label: "받은 요청", group: "receive" }, + { href: NavigationPath.MANAGE_QUO, label: "내 견적 관리", group: "managequo" }, ], }; @@ -45,7 +57,8 @@ const getNotification = () => { }; const NavBar = () => { - const { isLoggedIn, nickName, role, coconut, setLogin } = useAuthStore(); + const { isLoggedIn, nickName, role, coconut, setCoconut, email, phoneNumber, setLogin } = + useAuthStore(); const [isOpenSidebar, setIsOpenSidebar] = useState(false); const [isOpenNotification, setIsOpenNotification] = useState(false); const [isOpenUserMenu, setIsOpenUserMenu] = useState(false); @@ -82,9 +95,9 @@ const NavBar = () => { const isLinkActive = (link: LinkItem): boolean => { switch (link.group) { case "receive": - return ["/receive", "/all-receive-plan"].includes(router.pathname); + return [NavigationPath.RECEIVE, "/all-receive-plan"].includes(router.pathname); case "managequo": - return ["/managequo", "/rejectlist"].includes(router.pathname); + return [NavigationPath.MANAGE_QUO, "/reject-list"].includes(router.pathname); case "mytrip-manage": return router.pathname.startsWith("/mytrip-manage/"); default: @@ -136,8 +149,7 @@ const NavBar = () => { }, [isLoggedIn, notificationData]); useEffect(() => { - const accessToken = localStorage.getItem("accessToken"); - + const accessToken = getAccessToken(); if (accessToken) { const fetchUserInfo = async () => { try { @@ -147,7 +159,10 @@ const NavBar = () => { setUserInfo(userData); const avatarImage = avatarImages.find((avatar) => avatar.key === profileData.image); setUserImage(avatarImage ? avatarImage.src : user_img.src); - setLogin(userData.nickName, userData.role, userData.coconut,userData.email,userData.phoneNumber); + setLogin(nickName, role, coconut, email, phoneNumber); + if (userData.coconut !== coconut) { + handleCoconutChange(userData.coconut); + } } catch (error) { console.error(error); } @@ -155,7 +170,7 @@ const NavBar = () => { fetchUserInfo(); } - }, [setLogin]); + }, [setLogin, coconut]); useEffect(() => { const handleOutsideClick = (event: MouseEvent) => { @@ -190,13 +205,18 @@ const NavBar = () => { }; }, [isOpenUserMenu, isOpenNotification, isOpenSidebar]); + const handleCoconutChange = (newCoconut: number) => { + setCoconut(newCoconut); + }; + const hasUnreadNotifications = notificationData.some((notification) => !notification.isRead); + const hasNotifications = realTimeNotifications.length > 0; return ( -
+
-
- +
+ 니가가라하와이 로고
@@ -208,10 +228,10 @@ const NavBar = () => { <>
코코넛 -

{coconut}p

+

{coconut}개

- + 채팅 { ) : ( <> - + @@ -294,28 +314,35 @@ const NavBar = () => {
{/* 사이드바 */} - {isOpenSidebar && ( -
-
-
- 닫기 setIsOpenSidebar(false)} - /> -
-
-
    - {renderLinks()} -
+
+
+
+ 닫기 setIsOpenSidebar(false)} + />
+
+
    + {renderLinks()} +
- )} +
{/* 실시간 알림 */} - {realTimeNotifications.length > 0 && ( + {hasNotifications && (
{realTimeNotifications.map((notification) => (
{ return tripTypeMap[tripType] || "알 수 없는 여행 타입"; }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any const getNotificationMessage = (event: string, payload: any) => { switch (event) { case "ARRIVE_REQUEST": @@ -115,8 +114,10 @@ export default function Notification({ closeModal }: { closeModal: () => void }) patchNotiMutation.mutate(notificationId); }; + const hasNotification = !isLoading && initialNotificationData.length > 0; + useEffect(() => { - if (!isLoading && initialNotificationData.length > 0) { + if (hasNotification) { setNotificationData(initialNotificationData); } }, [isLoading, initialNotificationData]); @@ -145,25 +146,28 @@ export default function Notification({ closeModal }: { closeModal: () => void }) className={`max-h-[300px] overflow-y-auto ${notificationData.length >= 4 ? "h-[300px]" : ""}`} >
    - {notificationData.map((notification, index) => ( -
    -
  • handleRead(notification.id)} - className={`cursor-pointer pt-4 ${notification.isRead ? "bg-[#f1f1f1]" : "bg-color-gray-50"}`} - > -

    - {getNotificationMessage(notification.event, notification.payload)} -

    -

    - {formatRelativeTime(notification.createdAt)} -

    + {notificationData + .slice() + .reverse() + .map((notification, index) => ( +
    +
  • handleRead(notification.id)} + className={`cursor-pointer pt-4 ${notification.isRead ? "bg-[#f1f1f1]" : "bg-color-gray-50"}`} + > +

    + {getNotificationMessage(notification.event, notification.payload)} +

    +

    + {formatRelativeTime(notification.createdAt)} +

    - {index < notificationData.length - 1 && ( -
    - )} -
  • -
    - ))} + {index < notificationData.length - 1 && ( +
    + )} + +
+ ))}
)} diff --git a/src/components/Gnb/UserMenu.tsx b/src/components/Gnb/UserMenu.tsx index b46ed8db..e8c82fc3 100644 --- a/src/components/Gnb/UserMenu.tsx +++ b/src/components/Gnb/UserMenu.tsx @@ -1,7 +1,7 @@ import useAuthStore from "@/stores/useAuthStore"; import Link from "next/link"; import { useRouter } from "next/router"; - +import { removeAccessToken } from "@/utils/tokenUtils"; export interface UserMenuProps { userId: string; @@ -15,6 +15,13 @@ interface MenuItem { onClick?: () => void; } +enum NavigationPath { + DREAMER_PROFILE = "/profile/dreamer/edit/", + FOLLOW_MAKER = "/follow-maker", + COMPLETED_TRIP_REVIEWS = "/myreview-manage/completed-trip", + MAKER_PROFILE = "/profile/maker/mypage/", +} + export default function UserMenu({ userId, closeMenu, onChargeClick }: UserMenuProps) { const { nickName, role, setLogout } = useAuthStore(); const router = useRouter(); @@ -23,16 +30,18 @@ export default function UserMenu({ userId, closeMenu, onChargeClick }: UserMenuP const menuItems: Record = { DREAMER: [ - { href: userId ? `/profile/dreamer/edit/${userId}` : "", label: "프로필 수정" }, - { href: "/follow-maker", label: "찜한 Maker" }, - { href: "/myreview-manage/completed-trip", label: "여행 리뷰" }, + { href: userId ? `${NavigationPath.DREAMER_PROFILE}${userId}` : "", label: "프로필 수정" }, + { href: NavigationPath.FOLLOW_MAKER, label: "찜한 Maker" }, + { href: NavigationPath.COMPLETED_TRIP_REVIEWS, label: "여행 리뷰" }, { - href: "#", + href: "", label: "코코넛 충전", onClick: onChargeClick, }, ], - MAKER: [{ href: userId ? `/profile/maker/mypage/${userId}` : "", label: "마이페이지" }], + MAKER: [ + { href: userId ? `${NavigationPath.MAKER_PROFILE}${userId}` : "", label: "마이페이지" }, + ], }; const renderMenus = () => { @@ -56,9 +65,9 @@ export default function UserMenu({ userId, closeMenu, onChargeClick }: UserMenuP }; const handleLogout = () => { - localStorage.removeItem("accessToken"); - router.reload(); + removeAccessToken(); setLogout(); + router.push("/login"); }; return ( diff --git a/src/components/Landing/FeatureCard.tsx b/src/components/Landing/FeatureCard.tsx new file mode 100644 index 00000000..7fcca4a5 --- /dev/null +++ b/src/components/Landing/FeatureCard.tsx @@ -0,0 +1,25 @@ +import Image, { StaticImageData } from "next/image"; + +interface FeatureCardProps { + imageUrl: string | StaticImageData; + title: string; + description: string; +} + +export default function FeatureCard({ imageUrl, title, description }: FeatureCardProps) { + return ( +
+
+ {title} +
+

{title}

+

{description}

+
+ ); +} diff --git a/src/components/Landing/Features.tsx b/src/components/Landing/Features.tsx new file mode 100644 index 00000000..c5e997a0 --- /dev/null +++ b/src/components/Landing/Features.tsx @@ -0,0 +1,36 @@ +import FeatureCard from "./FeatureCard"; +import img4 from "@public/assets/Landing-img/img_featuer_04.jpg"; +import img_sp2 from "@public/assets/Landing-img/img_sp_02.jpg"; + + +const featureData = [ + { + imageUrl: "https://images.unsplash.com/photo-1542259009477-d625272157b7", + title: "완벽한 대리 여행", + description: "원하시는 모든 여행의 아름다운 순간을 담아드립니다", + }, + { + imageUrl: img4, + title: "실시간 공유", + description: "특별한 순간을 실시간으로 전달받아 현장의 감동을 느껴보세요", + }, + { + imageUrl: img_sp2, + title: "특별한 경험", + description: "현지에서만 경험할 수 있는 특별한 순간을 선사해드립니다", + }, +]; + +export default function Features() { + return ( +
+
+ {featureData.map((feature, index) => ( +
+ +
+ ))} +
+
+ ); +} diff --git a/src/components/Landing/Hero.tsx b/src/components/Landing/Hero.tsx new file mode 100644 index 00000000..af98cb68 --- /dev/null +++ b/src/components/Landing/Hero.tsx @@ -0,0 +1,26 @@ +import Image from "next/image"; +import logo from "@public/assets/icon_logo_img_remove.png"; + +export default function Hero() { + return ( +
+ 로고 + +

+ 시간이 없어도 괜찮아요 +

+ +

+ 당신을 대신해 여행하고, +
+ 특별한 순간들을 공유해드립니다 +

+
+ ); +} diff --git a/src/components/Landing/MapMarker.tsx b/src/components/Landing/MapMarker.tsx new file mode 100644 index 00000000..1f3ea9c2 --- /dev/null +++ b/src/components/Landing/MapMarker.tsx @@ -0,0 +1,213 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { ComposableMap, Geographies, Geography, Marker } from "react-simple-maps"; +import { PieChart, Pie, Tooltip, Cell } from "recharts"; +import planService from "@/services/planService"; +import planData from "@/types/planData"; +import Image from "next/image"; +import refresh_icon from "@public/assets/icon_refresh.svg"; + +const regionNames = planData.locations.reduce( + (acc, { name, mapping }) => { + acc[mapping] = name; + return acc; + }, + {} as Record, +); + +const serviceNames = planData.services.reduce( + (acc, { name, mapping }) => { + acc[mapping] = name; + return acc; + }, + {} as Record, +); + +const markers = [ + { name: "서울", code: "SEOUL", coordinates: [126.978, 37.5665] }, + { name: "부산", code: "BUSAN", coordinates: [129.0756, 35.1796] }, + { name: "인천", code: "INCHEON", coordinates: [126.7052, 37.4563] }, + { name: "대구", code: "DAEGU", coordinates: [128.6014, 35.8684] }, + { name: "대전", code: "DAEJEON", coordinates: [127.3845, 36.3504] }, + { name: "광주", code: "GWANGJU", coordinates: [126.8515, 35.1595] }, + { name: "울산", code: "ULSAN", coordinates: [129.3114, 35.5381] }, + { name: "세종", code: "SEJONG", coordinates: [127.289, 36.4804] }, + { name: "경기", code: "GYEONGGI", coordinates: [127.01, 37.275] }, + { name: "강원", code: "GANGWON", coordinates: [128.208, 37.766] }, + { name: "충북", code: "CHUNGBUK", coordinates: [127.635, 36.6291] }, + { name: "충남", code: "CHUNGNAM", coordinates: [126.775, 36.635] }, + { name: "전북", code: "JEONBUK", coordinates: [127.108, 35.719] }, + { name: "전남", code: "JEONNAM", coordinates: [126.732, 34.814] }, + { name: "경북", code: "GYEONGBUK", coordinates: [128.669, 36.575] }, + { name: "경남", code: "GYEONGNAM", coordinates: [128.673, 35.461] }, + { name: "제주", code: "JEJU", coordinates: [126.501, 33.35] }, +]; + +const COLORS = ["#845ec2", "#d65db1", "#ff6f91", "#ff9671", "#FCC737", "#A7D477", "#00c9a7"]; + +export default function MapMarker() { + const [selectedRegion, setSelectedRegion] = useState<{ + name: string; + totalCount: number; + details: { name: string; value: number; fill: string }[]; + } | null>(null); + + const [geoData, setGeoData] = useState(null); + + const getStatistics = async (serviceArea: string) => { + try { + const data = await planService.getStatistics(serviceArea); + if (data) { + const details = data.groupByCount.map((item: any, index: number) => { + const regionName = regionNames[item.serviceArea]; + + const serviceName = serviceNames[item.tripType]; + + return { + name: regionName || serviceName, + value: item.count, + fill: COLORS[index % COLORS.length], + }; + }); + setSelectedRegion({ + name: serviceArea || "전체", + totalCount: data.totalCount, + details: details, + }); + } + } catch (error) { + console.error("통계 자료 조회 실패", error); + } + }; + + useEffect(() => { + const loadGeoData = async () => { + try { + const response = await fetch("/korea-topo.json"); + const data = await response.json(); + setGeoData(data); + } catch (error) { + console.error("TopoJSON 로드 오류:", error); + } + }; + + loadGeoData(); + }, []); + + useEffect(() => { + getStatistics(""); + }, []); + + const handleMarkerClick = (region: string) => { + const englishRegion = Object.keys(regionNames).find((key) => regionNames[key] === region); + + if (englishRegion) { + getStatistics(englishRegion); + } + }; + + return ( + <> +
+

+ 🛬 사용자 이용현황 🛬 +

+
+
+ {/* 지도 */} +
+ + {geoData && ( + + {({ geographies }) => + geographies.map((geo) => ( + + )) + } + + )} + {markers.map(({ name, coordinates }) => ( + handleMarkerClick(name)} + > + + {name} + + + + ))} + +
+ + {/* 통계 */} +
+ {selectedRegion ? ( + <> +
+

+ {regionNames[selectedRegion.name]} 통계 +

+
+ +
+
+ +

총 서비스 수: {selectedRegion.totalCount}

+ {selectedRegion.totalCount === 0 ? ( +
+

+ 통계 자료가 없습니다! +
+ 여러분의 꿈을 추가해 보세요! 🚀 +

+
+ ) : ( + + + {selectedRegion.details.map((entry, index) => ( + + ))} + + + + )} +

마커를 클릭하면 해당 지역 통계를 볼 수 있습니다.

+ + ) : ( +

마커를 클릭하면 해당 지역 통계를 볼 수 있습니다.

+ )} +
+
+ + ); +} diff --git a/src/components/MyPlans/Cards/PlanCard.tsx b/src/components/MyPlans/Cards/PlanCard.tsx index e39e2426..53845e7f 100644 --- a/src/components/MyPlans/Cards/PlanCard.tsx +++ b/src/components/MyPlans/Cards/PlanCard.tsx @@ -1,4 +1,7 @@ import { Plan } from "@/services/planService"; +import { formatToDetailedDate } from "@/utils/formatDate"; +import { convertRegionToKorean } from "@/utils/formatRegion"; +import Label from "@/components/Common/UI/Label"; interface PlanData { planDetail: Plan; @@ -6,36 +9,57 @@ interface PlanData { export default function PlanCard({ planDetail }: PlanData) { return ( -
-
+
+
-
-
-
-
-