├── .gitignore ├── renderer ├── public │ ├── favicon.ico │ ├── icons │ │ ├── favicon.ico │ │ ├── apple-icon.png │ │ ├── icon-96x96.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── ms-icon-70x70.png │ │ ├── apple-icon-57x57.png │ │ ├── apple-icon-60x60.png │ │ ├── apple-icon-72x72.png │ │ ├── apple-icon-76x76.png │ │ ├── ms-icon-144x144.png │ │ ├── ms-icon-150x150.png │ │ ├── ms-icon-310x310.png │ │ ├── android-icon-36x36.png │ │ ├── android-icon-48x48.png │ │ ├── android-icon-72x72.png │ │ ├── android-icon-96x96.png │ │ ├── apple-icon-114x114.png │ │ ├── apple-icon-120x120.png │ │ ├── apple-icon-144x144.png │ │ ├── apple-icon-152x152.png │ │ ├── apple-icon-180x180.png │ │ ├── android-icon-144x144.png │ │ ├── android-icon-192x192.png │ │ └── apple-icon-precomposed.png │ ├── sw.js │ └── manifest.json ├── src │ ├── assets │ │ ├── bg.png │ │ ├── logo.png │ │ ├── duck_jump.gif │ │ ├── card_black.jpg │ │ ├── up_diamond.png │ │ ├── card_backside.png │ │ ├── card_diamond.jpg │ │ └── svelte.svg │ ├── vite-env.d.ts │ ├── lib │ │ ├── Counter.svelte │ │ └── Card.svelte │ ├── main.ts │ ├── app.css │ ├── App.svelte │ └── styles │ │ └── mymk.css ├── vite.config.ts ├── tsconfig.node.json ├── svelte.config.js ├── .gitignore ├── package.json ├── tsconfig.json ├── README.md ├── index.html └── pnpm-lock.yaml ├── scraper ├── Gemfile ├── data.json ├── Gemfile.lock ├── main.rb └── history.ndjson ├── README.md └── .github └── workflows └── scrape.yml /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /renderer/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/favicon.ico -------------------------------------------------------------------------------- /renderer/src/assets/bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/bg.png -------------------------------------------------------------------------------- /renderer/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/logo.png -------------------------------------------------------------------------------- /renderer/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | -------------------------------------------------------------------------------- /renderer/public/icons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon.ico -------------------------------------------------------------------------------- /renderer/src/assets/duck_jump.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/duck_jump.gif -------------------------------------------------------------------------------- /renderer/src/assets/card_black.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_black.jpg -------------------------------------------------------------------------------- /renderer/src/assets/up_diamond.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/up_diamond.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon.png -------------------------------------------------------------------------------- /renderer/public/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/icon-96x96.png -------------------------------------------------------------------------------- /renderer/src/assets/card_backside.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_backside.png -------------------------------------------------------------------------------- /renderer/src/assets/card_diamond.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/src/assets/card_diamond.jpg -------------------------------------------------------------------------------- /renderer/public/icons/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-16x16.png -------------------------------------------------------------------------------- /renderer/public/icons/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-32x32.png -------------------------------------------------------------------------------- /renderer/public/icons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/favicon-96x96.png -------------------------------------------------------------------------------- /renderer/public/icons/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-70x70.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-57x57.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-60x60.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-72x72.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-76x76.png -------------------------------------------------------------------------------- /renderer/public/icons/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-144x144.png -------------------------------------------------------------------------------- /renderer/public/icons/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-150x150.png -------------------------------------------------------------------------------- /renderer/public/icons/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/ms-icon-310x310.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-36x36.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-48x48.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-72x72.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-96x96.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-114x114.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-120x120.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-144x144.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-152x152.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-180x180.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-144x144.png -------------------------------------------------------------------------------- /renderer/public/icons/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/android-icon-192x192.png -------------------------------------------------------------------------------- /renderer/public/icons/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/narze/emkay/HEAD/renderer/public/icons/apple-icon-precomposed.png -------------------------------------------------------------------------------- /scraper/Gemfile: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | source "https://rubygems.org" 4 | 5 | gem 'debug' 6 | gem 'playwright-ruby-client', require: "playwright" 7 | gem 'rubocop' 8 | -------------------------------------------------------------------------------- /renderer/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import { svelte } from '@sveltejs/vite-plugin-svelte' 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [svelte()], 7 | }) 8 | -------------------------------------------------------------------------------- /renderer/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler" 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /renderer/src/lib/Counter.svelte: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | -------------------------------------------------------------------------------- /scraper/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "มนัสศานติ์ มนูญชัย", 3 | "card_number": "5325531097527638", 4 | "expire_date": "2026-12-31", 5 | "today_points": 0, 6 | "redeemable_points": 8517, 7 | "acc_points": 622, 8 | "updated_at": "2025-12-19T00:36:14+00:00" 9 | } -------------------------------------------------------------------------------- /renderer/svelte.config.js: -------------------------------------------------------------------------------- 1 | import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' 2 | 3 | export default { 4 | // Consult https://svelte.dev/docs#compile-time-svelte-preprocess 5 | // for more information about preprocessors 6 | preprocess: vitePreprocess(), 7 | } 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # emkay 2 | 3 | Share your member card without hassle 4 | 5 | image 6 | 7 | ## Usage 8 | 9 | - Prepare environment variables `MK_USERNAME`, and `MK_PASSWORD` 10 | - Run scraper to update `data.json` 11 | - Build renderer to create a website 12 | -------------------------------------------------------------------------------- /renderer/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /renderer/src/main.ts: -------------------------------------------------------------------------------- 1 | // import './app.css' 2 | import "./styles/app.css" 3 | import "./styles/mymk.css" 4 | // import "./styles/all.min.css" 5 | // import "./styles/splide.min.css" 6 | 7 | import App from "./App.svelte" 8 | import { mount } from "svelte"; 9 | 10 | const app = mount(App, { 11 | target: document.getElementById("app"), 12 | }) 13 | 14 | export default app 15 | -------------------------------------------------------------------------------- /renderer/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "renderer", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "check": "svelte-check --tsconfig ./tsconfig.json" 11 | }, 12 | "devDependencies": { 13 | "@sveltejs/vite-plugin-svelte": "^5.0.3", 14 | "@tsconfig/svelte": "^5.0.4", 15 | "canvas-circular-countdown": "^1.8.0", 16 | "svelte": "^5.28.2", 17 | "svelte-check": "^4.1.6", 18 | "tslib": "^2.8.1", 19 | "typescript": "^5.8.3", 20 | "vite": "^6.3.3" 21 | }, 22 | "dependencies": { 23 | "date-fns": "^4.1.0", 24 | "qrcode": "^1.5.4" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /renderer/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/svelte/tsconfig.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "module": "ESNext", 7 | "resolveJsonModule": true, 8 | /** 9 | * Typecheck JS in `.svelte` and `.js` files by default. 10 | * Disable checkJs if you'd like to use dynamic types in JS. 11 | * Note that setting allowJs false does not prevent the use 12 | * of JS in `.svelte` files. 13 | */ 14 | "allowJs": true, 15 | "checkJs": true, 16 | "isolatedModules": true 17 | }, 18 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], 19 | "references": [{ "path": "./tsconfig.node.json" }] 20 | } 21 | -------------------------------------------------------------------------------- /renderer/public/sw.js: -------------------------------------------------------------------------------- 1 | // Minimal Service Worker for eMKay PWA - No Caching 2 | // This service worker does not cache or provide offline functionality 3 | // It only exists to allow PWA installation 4 | 5 | // Skip waiting on install 6 | self.addEventListener("install", (event) => { 7 | self.skipWaiting() 8 | console.log("Service Worker installed") 9 | }) 10 | 11 | // Clear any previous caches 12 | self.addEventListener("activate", (event) => { 13 | event.waitUntil( 14 | caches 15 | .keys() 16 | .then((cacheNames) => { 17 | return Promise.all( 18 | cacheNames.map((cacheName) => { 19 | console.log("Deleting cache:", cacheName) 20 | return caches.delete(cacheName) 21 | }) 22 | ) 23 | }) 24 | .then(() => { 25 | console.log("Service Worker activated and caches cleared") 26 | return self.clients.claim() 27 | }) 28 | ) 29 | }) 30 | 31 | // Handle fetch events without caching 32 | self.addEventListener("fetch", (event) => { 33 | // Just pass through to the network 34 | // No caching or offline functionality 35 | }) 36 | -------------------------------------------------------------------------------- /renderer/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eMKay", 3 | "short_name": "eMKay", 4 | "description": "MK Restaurant Card App", 5 | "start_url": "/", 6 | "display": "standalone", 7 | "background_color": "#ffffff", 8 | "theme_color": "#ffffff", 9 | "icons": [ 10 | { 11 | "src": "/icons/android-icon-72x72.png", 12 | "sizes": "72x72", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "/icons/android-icon-96x96.png", 17 | "sizes": "96x96", 18 | "type": "image/png" 19 | }, 20 | { 21 | "src": "/icons/android-icon-128x128.png", 22 | "sizes": "128x128", 23 | "type": "image/png" 24 | }, 25 | { 26 | "src": "/icons/android-icon-144x144.png", 27 | "sizes": "144x144", 28 | "type": "image/png" 29 | }, 30 | { 31 | "src": "/icons/android-icon-152x152.png", 32 | "sizes": "152x152", 33 | "type": "image/png" 34 | }, 35 | { 36 | "src": "/icons/android-icon-192x192.png", 37 | "sizes": "192x192", 38 | "type": "image/png" 39 | }, 40 | { 41 | "src": "/icons/icon-384x384.png", 42 | "sizes": "384x384", 43 | "type": "image/png" 44 | }, 45 | { 46 | "src": "/icons/icon-512x512.png", 47 | "sizes": "512x512", 48 | "type": "image/png" 49 | } 50 | ] 51 | } 52 | -------------------------------------------------------------------------------- /.github/workflows/scrape.yml: -------------------------------------------------------------------------------- 1 | name: Scrape 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | schedule: 9 | - cron: "0 0 * * *" 10 | 11 | permissions: 12 | contents: write 13 | 14 | jobs: 15 | build: 16 | runs-on: ubuntu-latest 17 | 18 | defaults: 19 | run: 20 | working-directory: ./scraper 21 | 22 | steps: 23 | - uses: actions/checkout@v4 24 | 25 | - name: Set up Ruby 26 | uses: ruby/setup-ruby@v1 27 | with: 28 | ruby-version: "3.2" 29 | bundler-cache: true 30 | working-directory: ./scraper 31 | 32 | - uses: actions/setup-node@v4 33 | with: 34 | node-version: 20 35 | 36 | - name: Setup Playwright 37 | run: npx playwright@1.52.0 install 38 | 39 | - name: Scrape 40 | env: 41 | MK_USERNAME: ${{ secrets.MK_USERNAME }} 42 | MK_PASSWORD: ${{ secrets.MK_PASSWORD }} 43 | run: ruby main.rb 44 | 45 | - name: Commit and push 46 | run: | 47 | git diff 48 | git config --global user.email "notbarze@users.noreply.github.com" 49 | git config --global user.name "narze's bot" 50 | git add data.json 51 | git add history.ndjson 52 | git commit -m "Update data" || exit 0 53 | git push 54 | -------------------------------------------------------------------------------- /renderer/src/app.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | -webkit-text-size-adjust: 100%; 15 | } 16 | 17 | a { 18 | font-weight: 500; 19 | color: #646cff; 20 | text-decoration: inherit; 21 | } 22 | a:hover { 23 | color: #535bf2; 24 | } 25 | 26 | body { 27 | margin: 0; 28 | display: flex; 29 | place-items: center; 30 | min-width: 320px; 31 | min-height: 100vh; 32 | } 33 | 34 | h1 { 35 | font-size: 3.2em; 36 | line-height: 1.1; 37 | } 38 | 39 | .card { 40 | padding: 2em; 41 | } 42 | 43 | #app { 44 | max-width: 1280px; 45 | margin: 0 auto; 46 | padding: 2rem; 47 | text-align: center; 48 | } 49 | 50 | button { 51 | border-radius: 8px; 52 | border: 1px solid transparent; 53 | padding: 0.6em 1.2em; 54 | font-size: 1em; 55 | font-weight: 500; 56 | font-family: inherit; 57 | background-color: #1a1a1a; 58 | cursor: pointer; 59 | transition: border-color 0.25s; 60 | } 61 | button:hover { 62 | border-color: #646cff; 63 | } 64 | button:focus, 65 | button:focus-visible { 66 | outline: 4px auto -webkit-focus-ring-color; 67 | } 68 | 69 | @media (prefers-color-scheme: light) { 70 | :root { 71 | color: #213547; 72 | background-color: #ffffff; 73 | } 74 | a:hover { 75 | color: #747bff; 76 | } 77 | button { 78 | background-color: #f9f9f9; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /scraper/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | ast (2.4.2) 5 | base64 (0.1.1) 6 | concurrent-ruby (1.2.2) 7 | debug (1.8.0) 8 | irb (>= 1.5.0) 9 | reline (>= 0.3.1) 10 | io-console (0.6.0) 11 | irb (1.8.3) 12 | rdoc 13 | reline (>= 0.3.8) 14 | json (2.6.3) 15 | language_server-protocol (3.17.0.3) 16 | mime-types (3.5.1) 17 | mime-types-data (~> 3.2015) 18 | mime-types-data (3.2023.1003) 19 | parallel (1.23.0) 20 | parser (3.2.2.4) 21 | ast (~> 2.4.1) 22 | racc 23 | playwright-ruby-client (1.38.0) 24 | concurrent-ruby (>= 1.1.6) 25 | mime-types (>= 3.0) 26 | psych (5.1.1) 27 | stringio 28 | racc (1.7.1) 29 | rainbow (3.1.1) 30 | rdoc (6.5.0) 31 | psych (>= 4.0.0) 32 | regexp_parser (2.8.2) 33 | reline (0.3.9) 34 | io-console (~> 0.5) 35 | rexml (3.2.6) 36 | rubocop (1.57.1) 37 | base64 (~> 0.1.1) 38 | json (~> 2.3) 39 | language_server-protocol (>= 3.17.0) 40 | parallel (~> 1.10) 41 | parser (>= 3.2.2.4) 42 | rainbow (>= 2.2.2, < 4.0) 43 | regexp_parser (>= 1.8, < 3.0) 44 | rexml (>= 3.2.5, < 4.0) 45 | rubocop-ast (>= 1.28.1, < 2.0) 46 | ruby-progressbar (~> 1.7) 47 | unicode-display_width (>= 2.4.0, < 3.0) 48 | rubocop-ast (1.29.0) 49 | parser (>= 3.2.1.0) 50 | ruby-progressbar (1.13.0) 51 | stringio (3.0.8) 52 | unicode-display_width (2.5.0) 53 | 54 | PLATFORMS 55 | arm64-darwin-22 56 | arm64-darwin-23 57 | arm64-darwin-24 58 | x86_64-linux 59 | 60 | DEPENDENCIES 61 | debug 62 | playwright-ruby-client 63 | rubocop 64 | 65 | BUNDLED WITH 66 | 2.4.20 67 | -------------------------------------------------------------------------------- /renderer/src/assets/svelte.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /scraper/main.rb: -------------------------------------------------------------------------------- 1 | require 'bundler' 2 | Bundler.require 3 | 4 | require 'date' 5 | 6 | def login!(page) 7 | puts 'Open login page' 8 | page.goto('https://www.thisismymk.com/th/login') 9 | 10 | puts 'Fill username & password' 11 | page.fill('#username', ENV.fetch('MK_USERNAME', 'foo')) 12 | page.fill('#password', ENV.fetch('MK_PASSWORD', 'bar')) 13 | 14 | puts 'Click login button' 15 | page.click('button[type=submit]') 16 | 17 | if page.query_selector('#loginFailed') 18 | puts 'ERROR: Login failed' 19 | exit 1 20 | end 21 | 22 | page.wait_for_load_state 23 | end 24 | 25 | def get_card_data(page) 26 | name = page.query_selector('.card-body h4').inner_text 27 | card_number, expire_date, today_points, redeemable_points = page.query_selector_all('.detail-profile .txt-red').map(&:inner_text).map(&:strip) 28 | acc_points = page.get_by_text("คะแนนปรับระดับสะสม").locator(".txt-red").first.inner_text 29 | 30 | { 31 | name:, 32 | card_number:, 33 | expire_date: Date.parse(expire_date), 34 | today_points: today_points.gsub(',', '').to_i, 35 | redeemable_points: redeemable_points.gsub(',', '').to_i, 36 | acc_points: acc_points.gsub(',', '').to_i, 37 | } 38 | end 39 | 40 | def write_to_file(card_data) 41 | data = card_data.merge(updated_at: DateTime.now.to_s) 42 | 43 | puts "Write to data.json: #{data}" 44 | 45 | File.write('data.json', JSON.pretty_generate(data)) 46 | 47 | File.open('history.ndjson', 'a') do |f| 48 | f.puts JSON.generate(data) 49 | end 50 | end 51 | 52 | Playwright.create(playwright_cli_executable_path: 'npx playwright@1.52.0') do |playwright| 53 | # Playwright.create(playwright_cli_executable_path: 'npx playwright') do |playwright| 54 | playwright.chromium.launch(headless: ENV.has_key?("CI")) do |browser| 55 | context = browser.new_context # Prepare new window. 56 | page = context.new_page # Open new window and new tab here. (about:blank) 57 | 58 | login!(page) 59 | card_data = get_card_data(page) 60 | 61 | write_to_file(card_data) 62 | end 63 | end 64 | -------------------------------------------------------------------------------- /renderer/README.md: -------------------------------------------------------------------------------- 1 | # Svelte + TS + Vite 2 | 3 | This template should help get you started developing with Svelte and TypeScript in Vite. 4 | 5 | ## Recommended IDE Setup 6 | 7 | [VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). 8 | 9 | ## Need an official Svelte framework? 10 | 11 | Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. 12 | 13 | ## Technical considerations 14 | 15 | **Why use this over SvelteKit?** 16 | 17 | - It brings its own routing solution which might not be preferable for some users. 18 | - It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. 19 | 20 | This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. 21 | 22 | Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. 23 | 24 | **Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** 25 | 26 | Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. 27 | 28 | **Why include `.vscode/extensions.json`?** 29 | 30 | Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. 31 | 32 | **Why enable `allowJs` in the TS template?** 33 | 34 | While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. 35 | 36 | **Why is HMR not preserving my local component state?** 37 | 38 | HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). 39 | 40 | If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. 41 | 42 | ```ts 43 | // store.ts 44 | // An extremely simple external store 45 | import { writable } from 'svelte/store' 46 | export default writable(0) 47 | ``` 48 | -------------------------------------------------------------------------------- /renderer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | MyMK หน้าแรก 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 29 | 34 | 39 | 44 | 49 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 68 | 73 | 78 | 83 | 88 | 93 | 98 | 99 | 100 |
101 | 102 | 103 | 104 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /renderer/src/lib/Card.svelte: -------------------------------------------------------------------------------- 1 | 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 | 144 |
145 |
146 |
147 |
{card_number}
148 |
149 |
150 |
154 | ไม่รับ QR Code ที่ได้มาจากการ Screen Capture 155 |
156 |
157 | {timestamp_display} 158 |
159 |
160 |
161 |
162 | 163 |
164 |
165 |
166 | 167 |
168 |
169 |
170 |
171 | 172 |
173 |
174 |
175 | 180 |
181 |
182 |
183 |
184 | {card_number} 185 |
186 |
187 |
188 |
192 | ไม่รับ QR Code ที่ได้มาจากการ Screen Capture 193 |
194 |
198 | {timestamp_display} 199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 | -------------------------------------------------------------------------------- /renderer/src/App.svelte: -------------------------------------------------------------------------------- 1 | 147 | 148 | {#if !hide} 149 |
150 |
151 | 235 |
236 |
237 |
242 |
243 |
244 | 477 | 478 |
479 |
480 |
481 |
482 |
483 | 552 | 553 | 554 | {#if showInstallPrompt} 555 |
556 |
557 |
558 | เพิ่ม eMKay ลงหน้าจอหลัก 559 |

เข้าถึงบัตรสมาชิกได้ง่ายขึ้น

560 |
561 |
562 | 565 | 570 |
571 |
572 |
573 | {/if} 574 |
575 | {/if} 576 | 577 | 627 | -------------------------------------------------------------------------------- /renderer/src/styles/mymk.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'NotoSansThai'; 3 | src: url('/fonts/NotoSansThai-Regular.ttf'); 4 | font-weight: normal; 5 | font-style: normal; 6 | } 7 | .logo { 8 | position: relative; 9 | top: 15%; 10 | left: 50%; 11 | /* transform: translate(-50%, -50%); */ 12 | } 13 | 14 | .bottom-shadow{ 15 | box-shadow: 0 4px 2px -2px rgba(0,0,0,0.12);; 16 | } 17 | 18 | .bg-footer { 19 | background-image: url("/imgs/home-bg.png"); 20 | /* background-color: #cccccc; */ 21 | } 22 | .bg-grey { 23 | background: linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%); 24 | background: -moz-linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%); 25 | background: -webkit-linear-gradient(to bottom, #ffffff 49%, #A9A9A9 108%); 26 | filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#cfddac', endColorstr='#ffffff'); 27 | background: -o-linear-gradient(rgb(255,255,255),rgb(169,169,169)); 28 | } 29 | .bg-main { 30 | background-image: url("/imgs/bg-main.png"); 31 | background-repeat: repeat; 32 | } 33 | .footer-images img{ 34 | vertical-align:bottom; 35 | border:0; 36 | } 37 | 38 | .loginfm { 39 | background-color: #f1f1f1; 40 | } 41 | .pdpafm { 42 | background-color: #737373; 43 | } 44 | .historyfm { 45 | background-color: #dfdfdf; 46 | } 47 | 48 | /* #wrap{ 49 | background:url("/imgs/home-bg.png") no-repeat center bottom; 50 | } */ 51 | 52 | .bt-home { 53 | font-size:14px; 54 | color: #fff; 55 | background-color: #ec1c24; 56 | border-radius:20px; 57 | box-shadow: 0 2px 2px #A9A9A9; 58 | font-weight: lighter; 59 | width: 200px; 60 | /* padding: 3px 10px; */ 61 | /* background-image: linear-gradient(#335b71 45%, #03324c 55%); */ 62 | } 63 | 64 | 65 | /* #footer { 66 | background-repeat: no-repeat; 67 | background-color: #e6e6e6; 68 | background-size: contain; 69 | background-position: bottom right; 70 | background:url("/imgs/home-bg.png"); 71 | } */ 72 | /* #footer { 73 | position: absolute; 74 | bottom: 0; 75 | left: 0; 76 | width: 50%; 77 | height: 100%; 78 | z-index: -1; 79 | background:url("/imgs/home-bg.png") no-repeat center bottom; 80 | } */ 81 | 82 | /* .footer { 83 | position: absolute; 84 | bottom: 0; 85 | width: 100%; 86 | height: 60px; 87 | background-color: #f5f5f5; 88 | z-index: -1; 89 | } */ 90 | 91 | input:not(:placeholder-shown):not(input[type=checkbox]):not(input[type=text]:disabled) { 92 | background-color: #f1f1f1!important; 93 | } 94 | input:placeholder-shown:not(input[type=checkbox]):not(input[type=text]:disabled) { 95 | background-color: #f1f1f1!important; 96 | } 97 | 98 | select:not(:placeholder-shown) { 99 | background-color: #f1f1f1!important; 100 | } 101 | 102 | select:placeholder-shown { 103 | background-color: #f1f1f1!important; 104 | } 105 | 106 | .btn-login { 107 | font-size:14px; 108 | color: #fff; 109 | background-color: #00a551; 110 | border-radius:20px; 111 | box-shadow: 0 2px 2px #A9A9A9; 112 | font-weight: lighter; 113 | width: 230px; 114 | } 115 | 116 | .popup-paymentsuccess { 117 | font-size:14px; 118 | color: #fff; 119 | background-color: #00a551; 120 | border-radius:20px; 121 | box-shadow: 0 2px 2px #A9A9A9; 122 | font-weight: lighter; 123 | width: 140px; 124 | } 125 | 126 | .btn-back-paymentsuccess { 127 | font-size:14px; 128 | border-color: #000; 129 | border-radius:20px; 130 | font-weight: lighter; 131 | width: 140px; 132 | } 133 | 134 | .btn-back { 135 | font-size:14px; 136 | border-color: #000; 137 | border-radius:20px; 138 | font-weight: lighter; 139 | width: 230px; 140 | } 141 | 142 | .btn-pdpa { 143 | font-size:14px; 144 | color: #00a551; 145 | font-weight: bold; 146 | background-color: #fff; 147 | border-color: #00a551; 148 | border-radius:20px; 149 | box-shadow: 0 2px 2px #A9A9A9; 150 | width: 230px; 151 | } 152 | 153 | .btn-pdpa:disabled { 154 | font-size:14px; 155 | color: #A9A9A9; 156 | font-weight: bold; 157 | background-color: #fff; 158 | border-color: #A9A9A9; 159 | border-radius:20px; 160 | box-shadow: 0 2px 2px #A9A9A9; 161 | width: 230px; 162 | } 163 | 164 | a { 165 | text-decoration: none; 166 | color: #000; 167 | } 168 | .nav-item .active { 169 | color: red !important; 170 | } 171 | .footer-font { 172 | font-size: 12px; 173 | } 174 | #nav-icon1, #nav-icon2, #nav-icon3, #nav-icon4 { 175 | width: 60px; 176 | height: 45px; 177 | position: relative; 178 | margin: 50px auto; 179 | -webkit-transform: rotate(0deg); 180 | -moz-transform: rotate(0deg); 181 | -o-transform: rotate(0deg); 182 | transform: rotate(0deg); 183 | -webkit-transition: .5s ease-in-out; 184 | -moz-transition: .5s ease-in-out; 185 | -o-transition: .5s ease-in-out; 186 | transition: .5s ease-in-out; 187 | cursor: pointer; 188 | } 189 | 190 | #nav-icon1 span, #nav-icon3 span, #nav-icon4 span { 191 | display: block; 192 | position: absolute; 193 | height: 9px; 194 | width: 100%; 195 | background: #d3531a; 196 | border-radius: 9px; 197 | opacity: 1; 198 | left: 0; 199 | -webkit-transform: rotate(0deg); 200 | -moz-transform: rotate(0deg); 201 | -o-transform: rotate(0deg); 202 | transform: rotate(0deg); 203 | -webkit-transition: .25s ease-in-out; 204 | -moz-transition: .25s ease-in-out; 205 | -o-transition: .25s ease-in-out; 206 | transition: .25s ease-in-out; 207 | } 208 | 209 | #nav-icon1 span:nth-child(1) { 210 | top: 0px; 211 | } 212 | 213 | #nav-icon1 span:nth-child(2) { 214 | top: 18px; 215 | } 216 | 217 | #nav-icon1 span:nth-child(3) { 218 | top: 36px; 219 | } 220 | 221 | #nav-icon1.open span:nth-child(1) { 222 | top: 18px; 223 | -webkit-transform: rotate(135deg); 224 | -moz-transform: rotate(135deg); 225 | -o-transform: rotate(135deg); 226 | transform: rotate(135deg); 227 | } 228 | 229 | #nav-icon1.open span:nth-child(2) { 230 | opacity: 0; 231 | left: -60px; 232 | } 233 | 234 | #nav-icon1.open span:nth-child(3) { 235 | top: 18px; 236 | -webkit-transform: rotate(-135deg); 237 | -moz-transform: rotate(-135deg); 238 | -o-transform: rotate(-135deg); 239 | transform: rotate(-135deg); 240 | } 241 | 242 | /* Icon 2 */ 243 | 244 | #nav-icon2 { 245 | } 246 | 247 | #nav-icon2 span { 248 | display: block; 249 | position: absolute; 250 | height: 9px; 251 | width: 50%; 252 | background: #d3531a; 253 | opacity: 1; 254 | -webkit-transform: rotate(0deg); 255 | -moz-transform: rotate(0deg); 256 | -o-transform: rotate(0deg); 257 | transform: rotate(0deg); 258 | -webkit-transition: .25s ease-in-out; 259 | -moz-transition: .25s ease-in-out; 260 | -o-transition: .25s ease-in-out; 261 | transition: .25s ease-in-out; 262 | } 263 | 264 | #nav-icon2 span:nth-child(even) { 265 | left: 50%; 266 | border-radius: 0 9px 9px 0; 267 | } 268 | 269 | #nav-icon2 span:nth-child(odd) { 270 | left:0px; 271 | border-radius: 9px 0 0 9px; 272 | } 273 | 274 | #nav-icon2 span:nth-child(1), #nav-icon2 span:nth-child(2) { 275 | top: 0px; 276 | } 277 | 278 | #nav-icon2 span:nth-child(3), #nav-icon2 span:nth-child(4) { 279 | top: 18px; 280 | } 281 | 282 | #nav-icon2 span:nth-child(5), #nav-icon2 span:nth-child(6) { 283 | top: 36px; 284 | } 285 | 286 | #nav-icon2.open span:nth-child(1),#nav-icon2.open span:nth-child(6) { 287 | -webkit-transform: rotate(45deg); 288 | -moz-transform: rotate(45deg); 289 | -o-transform: rotate(45deg); 290 | transform: rotate(45deg); 291 | } 292 | 293 | #nav-icon2.open span:nth-child(2),#nav-icon2.open span:nth-child(5) { 294 | -webkit-transform: rotate(-45deg); 295 | -moz-transform: rotate(-45deg); 296 | -o-transform: rotate(-45deg); 297 | transform: rotate(-45deg); 298 | } 299 | 300 | #nav-icon2.open span:nth-child(1) { 301 | left: 5px; 302 | top: 7px; 303 | } 304 | 305 | #nav-icon2.open span:nth-child(2) { 306 | left: calc(50% - 5px); 307 | top: 7px; 308 | } 309 | 310 | #nav-icon2.open span:nth-child(3) { 311 | left: -50%; 312 | opacity: 0; 313 | } 314 | 315 | #nav-icon2.open span:nth-child(4) { 316 | left: 100%; 317 | opacity: 0; 318 | } 319 | 320 | #nav-icon2.open span:nth-child(5) { 321 | left: 5px; 322 | top: 29px; 323 | } 324 | 325 | #nav-icon2.open span:nth-child(6) { 326 | left: calc(50% - 5px); 327 | top: 29px; 328 | } 329 | 330 | /* Icon 3 */ 331 | 332 | #nav-icon3 span:nth-child(1) { 333 | top: 0px; 334 | } 335 | 336 | #nav-icon3 span:nth-child(2),#nav-icon3 span:nth-child(3) { 337 | top: 18px; 338 | } 339 | 340 | #nav-icon3 span:nth-child(4) { 341 | top: 36px; 342 | } 343 | 344 | #nav-icon3.open span:nth-child(1) { 345 | top: 18px; 346 | width: 0%; 347 | left: 50%; 348 | } 349 | 350 | #nav-icon3.open span:nth-child(2) { 351 | -webkit-transform: rotate(45deg); 352 | -moz-transform: rotate(45deg); 353 | -o-transform: rotate(45deg); 354 | transform: rotate(45deg); 355 | } 356 | 357 | #nav-icon3.open span:nth-child(3) { 358 | -webkit-transform: rotate(-45deg); 359 | -moz-transform: rotate(-45deg); 360 | -o-transform: rotate(-45deg); 361 | transform: rotate(-45deg); 362 | } 363 | 364 | #nav-icon3.open span:nth-child(4) { 365 | top: 18px; 366 | width: 0%; 367 | left: 50%; 368 | } 369 | 370 | /* Icon 4 */ 371 | 372 | #nav-icon4 { 373 | } 374 | 375 | #nav-icon4 span:nth-child(1) { 376 | top: 0px; 377 | -webkit-transform-origin: left center; 378 | -moz-transform-origin: left center; 379 | -o-transform-origin: left center; 380 | transform-origin: left center; 381 | } 382 | 383 | #nav-icon4 span:nth-child(2) { 384 | top: 18px; 385 | -webkit-transform-origin: left center; 386 | -moz-transform-origin: left center; 387 | -o-transform-origin: left center; 388 | transform-origin: left center; 389 | } 390 | 391 | #nav-icon4 span:nth-child(3) { 392 | top: 36px; 393 | -webkit-transform-origin: left center; 394 | -moz-transform-origin: left center; 395 | -o-transform-origin: left center; 396 | transform-origin: left center; 397 | } 398 | 399 | #nav-icon4.open span:nth-child(1) { 400 | -webkit-transform: rotate(45deg); 401 | -moz-transform: rotate(45deg); 402 | -o-transform: rotate(45deg); 403 | transform: rotate(45deg); 404 | top: -3px; 405 | left: 8px; 406 | } 407 | 408 | #nav-icon4.open span:nth-child(2) { 409 | width: 0%; 410 | opacity: 0; 411 | } 412 | 413 | #nav-icon4.open span:nth-child(3) { 414 | -webkit-transform: rotate(-45deg); 415 | -moz-transform: rotate(-45deg); 416 | -o-transform: rotate(-45deg); 417 | transform: rotate(-45deg); 418 | top: 39px; 419 | left: 8px; 420 | } 421 | 422 | /* Custom Bootstrap Css */ 423 | .modal-backdrop { 424 | position: fixed; 425 | top: 0; 426 | left: 0; 427 | z-index: 1040; 428 | width: 100vw; 429 | height: 100vh; 430 | background-color: #000; 431 | } 432 | 433 | .offcanvas-end { 434 | top: 0; 435 | right: 0; 436 | width: 250px; 437 | border-left: 1px solid rgba(0, 0, 0, 0.2); 438 | transform: translateX(100%); 439 | } 440 | 441 | #card { 442 | border: none !important; 443 | } 444 | 445 | #input-group { 446 | margin-left: -30px !important; 447 | border-top-left-radius: 0; 448 | border-bottom-left-radius: 0; 449 | z-index: 1; 450 | } 451 | 452 | /* End Custom Bootstrap Css */ 453 | 454 | .digit-group input { 455 | width: 50px; 456 | height: 50px; 457 | border-radius: 0.25rem; 458 | border: 1px solid #ced4da; 459 | line-height: 50px; 460 | text-align: center; 461 | font-size: 24px; 462 | font-family: 'Raleway', sans-serif; 463 | font-weight: 200; 464 | color: #000; 465 | margin: 0 2px; 466 | } 467 | 468 | .digit-group .splitter { 469 | padding: 0 5px; 470 | color: white; 471 | font-size: 24px; 472 | } 473 | 474 | .scrollable{ 475 | overflow-y: auto; 476 | max-height: 500px; 477 | } 478 | 479 | /* ::-webkit-scrollbar { 480 | width: 3px; 481 | } */ 482 | 483 | /* Track */ 484 | /* ::-webkit-scrollbar-track { 485 | background: #f1f1f1; 486 | } */ 487 | 488 | /* Handle */ 489 | /* ::-webkit-scrollbar-thumb { 490 | background: red; 491 | } */ 492 | 493 | /* Handle on hover */ 494 | /* ::-webkit-scrollbar-thumb:hover { 495 | background: #555; 496 | } */ 497 | 498 | .carousel-indicators { 499 | bottom: 67%; 500 | } 501 | 502 | .carousel-inner { 503 | margin-bottom:50px; 504 | } 505 | 506 | .carousel-indicators .active{ 507 | background-color: #f00; 508 | } 509 | 510 | .carousel-indicators > button { 511 | height: 30px; 512 | width: 30px; 513 | border-radius: 15px; 514 | } 515 | 516 | /* div > label { 517 | font-size: 14px !important; 518 | } */ 519 | 520 | input[type='radio']:checked:after { 521 | width: 15px; 522 | height: 15px; 523 | border-radius: 15px; 524 | top: -2px; 525 | left: -1px; 526 | position: relative; 527 | background-color: red; 528 | content: ''; 529 | display: inline-block; 530 | visibility: visible; 531 | border: 2px solid white; 532 | } 533 | 534 | .title-second { 535 | font-size: 18px; 536 | } 537 | 538 | .avatar { 539 | width: 300px; 540 | margin-top: -60px; 541 | } 542 | .card-radius { 543 | border-top-left-radius: 40px !important; 544 | border-top-right-radius: 40px !important; 545 | } 546 | @media only screen and (min-width:491px) and (max-width: 540px) { 547 | .numpoint { 548 | position: relative; 549 | text-align: right; 550 | bottom: 0px; 551 | right: 0px; 552 | margin-right: 22.5% !important; 553 | margin-top: -60px !important; 554 | } 555 | .txtpoint { 556 | position: relative; 557 | text-align: right; 558 | bottom: 0px; 559 | right:0px; 560 | margin-right: 23% !important; 561 | margin-top: -8px !important; 562 | font-size: 8px !important; 563 | } 564 | .txtnext { 565 | position: relative; 566 | text-align: right; 567 | bottom: 0px; 568 | right:0px; 569 | margin-right: 22% !important; 570 | margin-top: 0px !important; 571 | font-size: 6px !important; 572 | } 573 | .carousel-indicators { 574 | bottom: 69% !important; 575 | } 576 | } 577 | 578 | @media only screen and (max-width: 490px) { 579 | .numpoint { 580 | position: relative; 581 | text-align: right; 582 | bottom: 0px; 583 | right: 0px; 584 | margin-right: 15% !important; 585 | margin-top: -60px !important; 586 | } 587 | .txtpoint { 588 | position: relative; 589 | text-align: right; 590 | bottom: 0px; 591 | right:0px; 592 | margin-right: 52px !important; 593 | margin-top: -8px !important; 594 | font-size: 8px !important; 595 | } 596 | .txtnext { 597 | position: relative; 598 | text-align: right; 599 | bottom: 0px; 600 | right:0px; 601 | margin-right: 14% !important; 602 | margin-top: 0px !important; 603 | font-size: 6px !important; 604 | } 605 | .carousel-indicators { 606 | bottom: 69% !important; 607 | } 608 | } 609 | /* @media (max-width:540px) { 610 | .carousel-indicators { 611 | bottom: 69% !important; 612 | } 613 | } */ 614 | @media (max-width:768px) { 615 | .avatar { 616 | width: 260px; 617 | margin-top: -60px; 618 | } 619 | .back-card { 620 | margin-top: -100px; 621 | } 622 | /* .carousel-indicators { 623 | bottom: 74%; 624 | } */ 625 | .carousel-indicators .newcard { 626 | bottom: 20% !important; 627 | } 628 | .coupon-valid, .coupon-use, .coupon-expire { 629 | width: 250px; 630 | margin: 0.1rem; 631 | } 632 | .contact-bg { 633 | background-image: url("/imgs/contact-bg.png"); 634 | background-repeat: no-repeat; 635 | background-size:contain; 636 | margin-top:86px; 637 | /* background-position:center; */ 638 | /* margin-top:85px; */ 639 | /* background-image:url('https://www.mkrestaurant.com/public/assets/img/bg/bg__contact.jpg'); 640 | background-repeat:no-repeat; 641 | background-size:contain; 642 | background-position:center; */ 643 | } 644 | .numpoint { 645 | position: relative; 646 | text-align: right; 647 | bottom: 0px; 648 | right:0px; 649 | margin-right: 25%; 650 | margin-top: -60px; 651 | } 652 | .txtpoint { 653 | position: relative; 654 | text-align: right; 655 | bottom: 0px; 656 | right:0px; 657 | margin-right: 123px; 658 | margin-top: -8px; 659 | font-size: 8px; 660 | } 661 | .txtnext { 662 | position: relative; 663 | text-align: right; 664 | bottom: 0px; 665 | right:0px; 666 | margin-right: 112px; 667 | margin-top: 0px; 668 | font-size: 8px; 669 | } 670 | } 671 | 672 | @media (min-width:768px) { 673 | .avatar { 674 | width: 500px; 675 | margin-top: -60px; 676 | } 677 | 678 | .back-card { 679 | margin-top: -255px; 680 | } 681 | .carousel-indicators { 682 | bottom: 55%; 683 | } 684 | .carousel-indicators .newcard { 685 | /* bottom:645px; */ 686 | bottom: 20% !important; 687 | } 688 | .coupon-valid, .coupon-use, .coupon-expire { 689 | width: 350px; 690 | margin: 0.1rem; 691 | } 692 | .contact-bg { 693 | background-image: url("/imgs/contact-bg.png"); 694 | background-repeat: no-repeat; 695 | background-size:contain; 696 | margin-top:86px; 697 | /* background-position:center; */ 698 | /* margin-top:85px; */ 699 | /* background-image:url('https://www.mkrestaurant.com/public/assets/img/bg/bg__contact.jpg'); 700 | background-repeat:no-repeat; 701 | background-size:contain; 702 | background-position:center; */ 703 | } 704 | .numpoint { 705 | position: relative; 706 | text-align: right; 707 | bottom: 0px; 708 | right:0px; 709 | margin-right: 25%; 710 | margin-top: -60px; 711 | } 712 | .txtpoint { 713 | position: relative; 714 | text-align: right; 715 | bottom: 0px; 716 | right:0px; 717 | margin-right: 123px; 718 | margin-top: -8px; 719 | font-size: 8px; 720 | } 721 | .txtnext { 722 | position: relative; 723 | text-align: right; 724 | bottom: 0px; 725 | right:0px; 726 | margin-right: 117px; 727 | margin-top: 0px; 728 | font-size: 8px; 729 | } 730 | } 731 | 732 | .area1 { 733 | border-top-left-radius: 14px !important; 734 | border-top-right-radius: 14px !important; 735 | padding-top: 70px !important 736 | } 737 | 738 | .list-inline .p-divider { 739 | border-right:2px solid grey; 740 | margin:0px 20px; 741 | padding-right:25px; 742 | } 743 | .txt-red { 744 | color: #FF0000; 745 | } 746 | 747 | .centered { 748 | position: absolute; 749 | top: 50%; 750 | left: 50%; 751 | transform: translate(-50%, -50%); 752 | } 753 | 754 | .detail-profile { 755 | border: 1px solid #000; 756 | border-radius: 15px; 757 | margin: 5px; 758 | } 759 | 760 | #backdrop { 761 | position:absolute; 762 | top:0; 763 | width: 100%; 764 | height: 100%; 765 | z-index: 999; 766 | background-color: rgb(0,0,0,0.2); 767 | } 768 | 769 | .flip-card { 770 | background-color: transparent; 771 | perspective: 1000px; 772 | } 773 | 774 | .flip-card-inner { 775 | position: relative; 776 | width: 100%; 777 | height: 100%; 778 | transition: transform 0.6s; 779 | transform-style: preserve-3d; 780 | /* box-shadow: 0 8px 10px 0 rgba(90,90,90,0.2) */ 781 | } 782 | 783 | 784 | .flip-card.flipped .flip-card-inner { 785 | transform: rotateY(180deg); 786 | } 787 | 788 | .flip-card-front { 789 | /* position: absolute; */ 790 | width: 100%; 791 | height: 100%; 792 | /* backface-visibility: hidden; */ 793 | -webkit-backface-visibility: hidden; 794 | backface-visibility: hidden; 795 | } 796 | .flip-card-back { 797 | position: absolute; 798 | width: 100%; 799 | height: 100%; 800 | backface-visibility: hidden; 801 | -webkit-backface-visibility: hidden; 802 | /* backface-visibility: hidden; */ 803 | } 804 | 805 | .flip-card-back { 806 | transform: rotateY(180deg); 807 | } 808 | 809 | .mycoupon-fm { 810 | background-color: #FFF; 811 | border-top-left-radius: 40px !important; 812 | border-top-right-radius: 40px !important; 813 | } 814 | .redeem-fm { 815 | background-color: #f1f1f1; 816 | border-top-left-radius: 40px !important; 817 | border-top-right-radius: 40px !important; 818 | } 819 | .list-item-fm { 820 | background-color: #FFF; 821 | border-radius: 20px !important; 822 | border-radius: 20px !important; 823 | } 824 | .redeem-pot { 825 | margin-top:-80px; 826 | } 827 | .mycoupon-bg { 828 | background-image: url("/imgs/red-white2.png"); 829 | /* background-repeat: repeat-x; */ 830 | background-size: 400px 250px; 831 | } 832 | .redeem-bg { 833 | background-image: url("/imgs/red-white2.png"); 834 | /* background-repeat: repeat-x; */ 835 | background-size: 400px 250px; 836 | } 837 | 838 | .expired { 839 | position: absolute; 840 | background-image: url("/imgs/mk/expired.png"); 841 | } 842 | 843 | #fixedbutton { 844 | position: fixed; 845 | top: 120px; 846 | right: 20px; 847 | display: none; 848 | border-color:#A9A9A9; 849 | 850 | } 851 | 852 | .btn-circle.btn-lg { 853 | width: 50px; 854 | height: 50px; 855 | padding: 5px 5px; 856 | /* font-size: 8px; */ 857 | line-height: 1; 858 | border-radius: 25px; 859 | color: #FF0000; 860 | } 861 | 862 | .btn-circle.btn-xl { 863 | width: 70px; 864 | height: 70px; 865 | padding: 10px 16px; 866 | font-size: 34px; 867 | line-height: 1.33; 868 | border-radius: 35px; 869 | color: #FF0000; 870 | } 871 | #txt-small { 872 | font-size:0.6rem; 873 | color: #000; 874 | } 875 | 876 | .minus:hover{ 877 | background-color: #717fe0 !important; 878 | } 879 | .plus:hover{ 880 | background-color: #717fe0 !important; 881 | } 882 | #count { 883 | width: 110px; 884 | padding: 0.25rem 0.5rem; 885 | font-size: 0.7875rem; 886 | } 887 | input[type=text]:disabled { 888 | background: #c2c2c2; 889 | } 890 | .contact-bottom { 891 | background-color: #cecece; 892 | } 893 | 894 | .loader { 895 | width: 48px; 896 | height: 48px; 897 | border: 5px solid #FFF; 898 | border-bottom-color: #FF3D00; 899 | border-radius: 50%; 900 | display: inline-block; 901 | box-sizing: border-box; 902 | animation: rotation 1s linear infinite; 903 | } 904 | 905 | @keyframes rotation { 906 | 0% { 907 | transform: rotate(0deg); 908 | } 909 | 100% { 910 | transform: rotate(360deg); 911 | } 912 | } 913 | 914 | .myspinner { 915 | position: absolute; 916 | height: 100vh; 917 | display:flex; 918 | flex-direction: column; 919 | justify-content: center; 920 | align-items: center; 921 | } 922 | 923 | .close-right { 924 | position: absolute; 925 | right:0; 926 | padding: 20px 12px; 927 | font-size: 18px; 928 | } 929 | 930 | #img-fluid { 931 | max-width: 80%; 932 | height: auto; 933 | } 934 | 935 | .timecout-d { 936 | position: absolute; 937 | top:0; 938 | right: 0; 939 | margin: -10px 50px; 940 | } 941 | 942 | .timecout-m { 943 | position: absolute; 944 | top:0; 945 | right: 0; 946 | margin: -10px 30px; 947 | } 948 | 949 | #countdown-container { 950 | width: 100%; 951 | max-width: 500px; 952 | } 953 | 954 | .pot-icon-value { 955 | position: absolute; 956 | left:0; 957 | right:0; 958 | margin-top:-80px; 959 | font-size:22px; 960 | color:red; 961 | } 962 | 963 | .pot-icon-txt { 964 | position: absolute; 965 | left:0; 966 | right:0; 967 | margin-top:-50px; 968 | font-size:15px; 969 | } 970 | 971 | #outer { 972 | width: 500px; 973 | height: 150px; 974 | vertical-align: bottom; 975 | } 976 | /* .numpoint { 977 | position: relative; 978 | text-align: right; 979 | bottom: 0px; 980 | right:0px; 981 | margin-right: 52px; 982 | margin-top: -60px; 983 | } 984 | .txtpoint { 985 | position: relative; 986 | text-align: right; 987 | bottom: 0px; 988 | right:0px; 989 | margin-right: 52px; 990 | margin-top: -8px; 991 | font-size: 8px; 992 | } 993 | .txtnext { 994 | position: relative; 995 | text-align: right; 996 | bottom: 0px; 997 | right:0px; 998 | margin-right: 40px; 999 | margin-top: 0px; 1000 | font-size: 8px; 1001 | } */ 1002 | 1003 | .carousel-control-prev, 1004 | .carousel-control-next{ 1005 | bottom: 75%; 1006 | } 1007 | 1008 | .order-price { 1009 | position: absolute !important; 1010 | right: 0; 1011 | bottom: 0; 1012 | margin-right: 15px; 1013 | margin-bottom: 80px; 1014 | font-size: 14px; 1015 | } 1016 | 1017 | .btn-orderhistory { 1018 | font-size:14px; 1019 | color: #fff; 1020 | background-color: #00a551; 1021 | border-radius:20px; 1022 | box-shadow: 0 2px 2px #A9A9A9; 1023 | font-weight: lighter; 1024 | width: 150px; 1025 | position: absolute; 1026 | right: 0; 1027 | bottom: 0; 1028 | margin-right: 15px; 1029 | margin-bottom: 15px; 1030 | } 1031 | 1032 | .invoice { 1033 | box-shadow: 0px 3px 6px #00000029 !important; 1034 | } 1035 | .invoice-st { 1036 | background-color: #f1f1f1; 1037 | border: none !important; 1038 | } 1039 | .invoice-font { 1040 | font-size: 12px; 1041 | } 1042 | .btn-invoice-download { 1043 | font-size:14px; 1044 | color: #fff; 1045 | background-color: #ec1c24; 1046 | border-radius:20px; 1047 | box-shadow: 0 2px 2px #A9A9A9; 1048 | font-weight: lighter; 1049 | width: 230px; 1050 | } 1051 | .btn-invoice-data { 1052 | font-size:14px; 1053 | color: #fff; 1054 | background-color: #00a551; 1055 | border-radius:20px; 1056 | box-shadow: 0 2px 2px #A9A9A9; 1057 | font-weight: lighter; 1058 | width: 170px; 1059 | } 1060 | .logo-line { 1061 | background-image: url("/imgs/line_h.png"); 1062 | background-repeat: repeat-x; 1063 | background-position: center bottom 40 !important; 1064 | 1065 | /* background-size:100%; */ 1066 | margin: 15px 0 0 0; 1067 | } 1068 | .head-landing { 1069 | font-size: 1.5rem; 1070 | font-weight:500; 1071 | } 1072 | 1073 | .landing-control { 1074 | bottom: 0% !important; 1075 | } 1076 | 1077 | .forgot-form { 1078 | width: 560px; 1079 | border-radius: 10px; 1080 | -webkit-box-shadow: 0 3px 6px rgb(0 0 0 / 16%); 1081 | box-shadow: 0 3px 6pxrgba(0,0,0,.16); 1082 | border: 1px solidrgba(0,0,0,.125) !important; 1083 | } 1084 | 1085 | .term-form { 1086 | border-radius: 10px; 1087 | -webkit-box-shadow: 0 3px 6px rgb(0 0 0 / 16%); 1088 | box-shadow: 0 3px 6pxrgba(0,0,0,.16); 1089 | border: 1px solidrgba(0,0,0,.125) !important; 1090 | } 1091 | 1092 | .overlay { 1093 | position: fixed; 1094 | width: 100%; 1095 | height: 100%; 1096 | z-index: 1000; 1097 | top: 0; 1098 | left: 0px; 1099 | opacity: 0.5; 1100 | filter: alpha(opacity=50); 1101 | background-color: #EFEFEF; 1102 | 1103 | /* height: 100%; 1104 | width: 100%; 1105 | position: fixed; 1106 | z-index: 1000; 1107 | left: 0; 1108 | top: 0; 1109 | opacity: 0.5; 1110 | filter: alpha(opacity=50); 1111 | background-color: #EFEFEF; */ 1112 | 1113 | 1114 | } -------------------------------------------------------------------------------- /scraper/history.ndjson: -------------------------------------------------------------------------------- 1 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7633,"acc_points":12504,"updated_at":"2025-07-04T17:21:58+00:00"} 2 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7633,"acc_points":12504,"updated_at":"2025-07-05T00:33:14+00:00"} 3 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7678,"acc_points":12549,"updated_at":"2025-07-06T00:38:47+00:00"} 4 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7678,"acc_points":12549,"updated_at":"2025-07-07T00:37:53+00:00"} 5 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7199,"acc_points":12670,"updated_at":"2025-07-08T00:34:54+00:00"} 6 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7227,"acc_points":12698,"updated_at":"2025-07-09T00:35:55+00:00"} 7 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7252,"acc_points":12723,"updated_at":"2025-07-10T00:35:14+00:00"} 8 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7332,"acc_points":12803,"updated_at":"2025-07-11T00:35:34+00:00"} 9 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7379,"acc_points":12850,"updated_at":"2025-07-12T00:35:55+00:00"} 10 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7426,"acc_points":12897,"updated_at":"2025-07-13T00:39:53+00:00"} 11 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7453,"acc_points":12924,"updated_at":"2025-07-14T00:38:24+00:00"} 12 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-15T00:36:59+00:00"} 13 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-16T00:36:11+00:00"} 14 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7515,"acc_points":12986,"updated_at":"2025-07-17T00:36:25+00:00"} 15 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7564,"acc_points":13035,"updated_at":"2025-07-18T00:36:00+00:00"} 16 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7578,"acc_points":13049,"updated_at":"2025-07-19T00:35:40+00:00"} 17 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7714,"acc_points":13185,"updated_at":"2025-07-20T00:40:48+00:00"} 18 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7714,"acc_points":13185,"updated_at":"2025-07-21T00:39:24+00:00"} 19 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7738,"acc_points":13209,"updated_at":"2025-07-22T00:36:49+00:00"} 20 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7764,"acc_points":13235,"updated_at":"2025-07-23T00:37:01+00:00"} 21 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7764,"acc_points":13235,"updated_at":"2025-07-24T00:36:58+00:00"} 22 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7799,"acc_points":13270,"updated_at":"2025-07-25T00:36:44+00:00"} 23 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7799,"acc_points":13270,"updated_at":"2025-07-26T00:35:19+00:00"} 24 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7893,"acc_points":13364,"updated_at":"2025-07-27T00:40:45+00:00"} 25 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7958,"acc_points":13429,"updated_at":"2025-07-28T00:39:48+00:00"} 26 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7980,"acc_points":13451,"updated_at":"2025-07-29T00:40:19+00:00"} 27 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8038,"acc_points":13509,"updated_at":"2025-07-30T00:37:15+00:00"} 28 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8060,"acc_points":13531,"updated_at":"2025-07-31T00:36:53+00:00"} 29 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8070,"acc_points":13541,"updated_at":"2025-08-01T00:42:15+00:00"} 30 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7331,"acc_points":13602,"updated_at":"2025-08-02T00:35:28+00:00"} 31 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7331,"acc_points":13602,"updated_at":"2025-08-03T00:41:24+00:00"} 32 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7424,"acc_points":13695,"updated_at":"2025-08-04T00:40:43+00:00"} 33 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7447,"acc_points":13718,"updated_at":"2025-08-05T00:37:55+00:00"} 34 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7467,"acc_points":13738,"updated_at":"2025-08-06T00:37:56+00:00"} 35 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7491,"acc_points":13762,"updated_at":"2025-08-07T00:41:55+00:00"} 36 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7502,"acc_points":13773,"updated_at":"2025-08-08T00:37:23+00:00"} 37 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7580,"acc_points":13851,"updated_at":"2025-08-09T00:34:04+00:00"} 38 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-10T00:40:17+00:00"} 39 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-11T00:38:54+00:00"} 40 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7637,"acc_points":13908,"updated_at":"2025-08-12T00:34:36+00:00"} 41 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7672,"acc_points":13943,"updated_at":"2025-08-13T00:35:37+00:00"} 42 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7672,"acc_points":13943,"updated_at":"2025-08-14T00:34:55+00:00"} 43 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7700,"acc_points":13971,"updated_at":"2025-08-15T00:35:49+00:00"} 44 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7780,"acc_points":14051,"updated_at":"2025-08-16T00:33:13+00:00"} 45 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7780,"acc_points":14051,"updated_at":"2025-08-17T00:38:23+00:00"} 46 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7797,"acc_points":14068,"updated_at":"2025-08-18T00:38:02+00:00"} 47 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-19T00:34:10+00:00"} 48 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-20T00:32:30+00:00"} 49 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7877,"acc_points":14148,"updated_at":"2025-08-21T00:32:05+00:00"} 50 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7930,"acc_points":14201,"updated_at":"2025-08-22T00:33:02+00:00"} 51 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7930,"acc_points":14201,"updated_at":"2025-08-23T00:32:03+00:00"} 52 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7940,"acc_points":14211,"updated_at":"2025-08-24T00:36:57+00:00"} 53 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8032,"acc_points":14303,"updated_at":"2025-08-25T00:34:49+00:00"} 54 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8063,"acc_points":14334,"updated_at":"2025-08-26T00:33:18+00:00"} 55 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8063,"acc_points":14334,"updated_at":"2025-08-27T00:32:48+00:00"} 56 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8133,"acc_points":14404,"updated_at":"2025-08-28T00:32:31+00:00"} 57 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8198,"acc_points":14469,"updated_at":"2025-08-29T00:32:32+00:00"} 58 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8198,"acc_points":14469,"updated_at":"2025-08-30T00:30:45+00:00"} 59 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8281,"acc_points":14552,"updated_at":"2025-08-31T00:35:27+00:00"} 60 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8320,"acc_points":14591,"updated_at":"2025-09-01T00:40:12+00:00"} 61 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8324,"acc_points":14595,"updated_at":"2025-09-02T00:32:42+00:00"} 62 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8324,"acc_points":14595,"updated_at":"2025-09-03T00:30:35+00:00"} 63 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8357,"acc_points":14628,"updated_at":"2025-09-04T00:30:55+00:00"} 64 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8508,"acc_points":14779,"updated_at":"2025-09-05T00:31:50+00:00"} 65 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-06T00:30:23+00:00"} 66 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-06T16:51:42+00:00"} 67 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7608,"acc_points":14879,"updated_at":"2025-09-07T00:35:05+00:00"} 68 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7655,"acc_points":14926,"updated_at":"2025-09-08T00:34:13+00:00"} 69 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7722,"acc_points":14993,"updated_at":"2025-09-09T00:32:08+00:00"} 70 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7781,"acc_points":15052,"updated_at":"2025-09-10T00:31:18+00:00"} 71 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7806,"acc_points":15077,"updated_at":"2025-09-11T00:31:44+00:00"} 72 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7806,"acc_points":15077,"updated_at":"2025-09-12T00:31:08+00:00"} 73 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7953,"acc_points":15224,"updated_at":"2025-09-13T00:29:02+00:00"} 74 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8008,"acc_points":15279,"updated_at":"2025-09-14T00:34:06+00:00"} 75 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8008,"acc_points":15279,"updated_at":"2025-09-15T00:34:40+00:00"} 76 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8094,"acc_points":15365,"updated_at":"2025-09-16T00:31:11+00:00"} 77 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8160,"acc_points":15431,"updated_at":"2025-09-17T00:31:36+00:00"} 78 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8230,"acc_points":15501,"updated_at":"2025-09-18T00:30:39+00:00"} 79 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8261,"acc_points":15532,"updated_at":"2025-09-19T00:31:57+00:00"} 80 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-20T00:30:05+00:00"} 81 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-21T00:35:06+00:00"} 82 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-22T00:35:34+00:00"} 83 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8355,"acc_points":15626,"updated_at":"2025-09-23T00:31:38+00:00"} 84 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6802,"acc_points":15673,"updated_at":"2025-09-24T00:32:28+00:00"} 85 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6865,"acc_points":15736,"updated_at":"2025-09-25T00:32:18+00:00"} 86 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6972,"acc_points":15843,"updated_at":"2025-09-26T00:31:35+00:00"} 87 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":6975,"acc_points":15846,"updated_at":"2025-09-27T00:30:38+00:00"} 88 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7042,"acc_points":15913,"updated_at":"2025-09-28T00:36:02+00:00"} 89 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7141,"acc_points":16012,"updated_at":"2025-09-29T00:33:30+00:00"} 90 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7286,"acc_points":16157,"updated_at":"2025-09-30T00:32:33+00:00"} 91 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7346,"acc_points":16217,"updated_at":"2025-10-01T00:36:46+00:00"} 92 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-02T00:31:01+00:00"} 93 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-03T00:31:00+00:00"} 94 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7459,"acc_points":16330,"updated_at":"2025-10-04T00:29:54+00:00"} 95 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7554,"acc_points":16425,"updated_at":"2025-10-05T00:35:18+00:00"} 96 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7554,"acc_points":16425,"updated_at":"2025-10-06T00:32:47+00:00"} 97 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7697,"acc_points":16568,"updated_at":"2025-10-07T00:31:38+00:00"} 98 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-08T00:31:29+00:00"} 99 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-09T00:31:41+00:00"} 100 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7723,"acc_points":16594,"updated_at":"2025-10-10T00:31:54+00:00"} 101 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7736,"acc_points":16607,"updated_at":"2025-10-11T00:30:27+00:00"} 102 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7821,"acc_points":16692,"updated_at":"2025-10-12T00:33:59+00:00"} 103 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":7934,"acc_points":16805,"updated_at":"2025-10-13T00:34:54+00:00"} 104 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8050,"acc_points":16921,"updated_at":"2025-10-14T00:31:17+00:00"} 105 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8050,"acc_points":16921,"updated_at":"2025-10-15T00:33:17+00:00"} 106 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8110,"acc_points":16981,"updated_at":"2025-10-16T00:33:15+00:00"} 107 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8182,"acc_points":17053,"updated_at":"2025-10-17T00:32:47+00:00"} 108 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8182,"acc_points":17053,"updated_at":"2025-10-18T00:30:34+00:00"} 109 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8220,"acc_points":17091,"updated_at":"2025-10-19T00:36:40+00:00"} 110 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8267,"acc_points":17138,"updated_at":"2025-10-20T00:35:42+00:00"} 111 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8292,"acc_points":17163,"updated_at":"2025-10-21T00:33:23+00:00"} 112 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8292,"acc_points":17163,"updated_at":"2025-10-22T00:34:18+00:00"} 113 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8315,"acc_points":17186,"updated_at":"2025-10-23T00:33:03+00:00"} 114 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8315,"acc_points":17186,"updated_at":"2025-10-24T00:30:45+00:00"} 115 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8318,"acc_points":17189,"updated_at":"2025-10-25T00:32:10+00:00"} 116 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8366,"acc_points":17237,"updated_at":"2025-10-26T00:35:36+00:00"} 117 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-27T00:36:29+00:00"} 118 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-28T00:32:23+00:00"} 119 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8394,"acc_points":17265,"updated_at":"2025-10-29T00:34:34+00:00"} 120 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8525,"acc_points":17396,"updated_at":"2025-10-30T00:34:27+00:00"} 121 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8579,"acc_points":17450,"updated_at":"2025-10-31T00:33:15+00:00"} 122 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8625,"acc_points":17496,"updated_at":"2025-11-01T00:36:10+00:00"} 123 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":17531,"updated_at":"2025-11-02T00:36:40+00:00"} 124 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":17531,"updated_at":"2025-11-03T00:36:12+00:00"} 125 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8739,"acc_points":17610,"updated_at":"2025-11-04T00:33:26+00:00"} 126 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8768,"acc_points":17639,"updated_at":"2025-11-05T00:34:41+00:00"} 127 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-06T00:33:56+00:00"} 128 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-07T00:33:57+00:00"} 129 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8947,"acc_points":17818,"updated_at":"2025-11-08T00:31:56+00:00"} 130 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9196,"acc_points":18067,"updated_at":"2025-11-09T00:36:42+00:00"} 131 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8506,"acc_points":18177,"updated_at":"2025-11-10T00:36:12+00:00"} 132 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-11T00:34:43+00:00"} 133 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-12T00:34:17+00:00"} 134 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8535,"acc_points":18206,"updated_at":"2025-11-13T00:34:02+00:00"} 135 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8570,"acc_points":18241,"updated_at":"2025-11-14T00:34:20+00:00"} 136 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8570,"acc_points":18241,"updated_at":"2025-11-15T00:33:22+00:00"} 137 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8610,"acc_points":18281,"updated_at":"2025-11-16T00:37:18+00:00"} 138 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8610,"acc_points":18281,"updated_at":"2025-11-17T00:35:54+00:00"} 139 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8660,"acc_points":18331,"updated_at":"2025-11-18T00:34:07+00:00"} 140 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8718,"acc_points":18389,"updated_at":"2025-11-19T00:34:52+00:00"} 141 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8718,"acc_points":18389,"updated_at":"2025-11-20T00:33:40+00:00"} 142 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8795,"acc_points":18466,"updated_at":"2025-11-21T00:34:16+00:00"} 143 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8809,"acc_points":18480,"updated_at":"2025-11-22T00:33:08+00:00"} 144 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8846,"acc_points":18517,"updated_at":"2025-11-23T00:39:35+00:00"} 145 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8846,"acc_points":18517,"updated_at":"2025-11-24T00:37:15+00:00"} 146 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":8942,"acc_points":18613,"updated_at":"2025-11-25T00:33:23+00:00"} 147 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9029,"acc_points":18700,"updated_at":"2025-11-26T00:34:43+00:00"} 148 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9315,"acc_points":18986,"updated_at":"2025-11-27T00:34:11+00:00"} 149 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-28T00:33:40+00:00"} 150 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-29T00:33:11+00:00"} 151 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5323531295652494","expire_date":"2025-11-30","today_points":0,"redeemable_points":9495,"acc_points":19166,"updated_at":"2025-11-30T00:39:08+00:00"} 152 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9495,"acc_points":0,"updated_at":"2025-12-01T00:42:48+00:00"} 153 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9504,"acc_points":9,"updated_at":"2025-12-02T00:35:41+00:00"} 154 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9504,"acc_points":9,"updated_at":"2025-12-03T00:35:09+00:00"} 155 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9559,"acc_points":64,"updated_at":"2025-12-04T00:35:38+00:00"} 156 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9599,"acc_points":104,"updated_at":"2025-12-05T00:35:56+00:00"} 157 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9721,"acc_points":226,"updated_at":"2025-12-06T00:33:30+00:00"} 158 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9776,"acc_points":281,"updated_at":"2025-12-07T00:39:28+00:00"} 159 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9878,"acc_points":383,"updated_at":"2025-12-08T00:36:07+00:00"} 160 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9922,"acc_points":427,"updated_at":"2025-12-09T00:35:36+00:00"} 161 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9922,"acc_points":427,"updated_at":"2025-12-10T00:36:29+00:00"} 162 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9972,"acc_points":477,"updated_at":"2025-12-11T00:36:16+00:00"} 163 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":9972,"acc_points":477,"updated_at":"2025-12-12T00:36:20+00:00"} 164 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":10003,"acc_points":508,"updated_at":"2025-12-13T00:34:31+00:00"} 165 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8418,"acc_points":523,"updated_at":"2025-12-14T00:39:36+00:00"} 166 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-15T00:38:49+00:00"} 167 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-16T00:36:33+00:00"} 168 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8454,"acc_points":559,"updated_at":"2025-12-17T00:34:59+00:00"} 169 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8493,"acc_points":598,"updated_at":"2025-12-18T00:32:58+00:00"} 170 | {"name":"มนัสศานติ์ มนูญชัย","card_number":"5325531097527638","expire_date":"2026-12-31","today_points":0,"redeemable_points":8517,"acc_points":622,"updated_at":"2025-12-19T00:36:14+00:00"} 171 | -------------------------------------------------------------------------------- /renderer/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | date-fns: 12 | specifier: ^4.1.0 13 | version: 4.1.0 14 | qrcode: 15 | specifier: ^1.5.4 16 | version: 1.5.4 17 | devDependencies: 18 | '@sveltejs/vite-plugin-svelte': 19 | specifier: ^5.0.3 20 | version: 5.0.3(svelte@5.28.2)(vite@6.3.3) 21 | '@tsconfig/svelte': 22 | specifier: ^5.0.4 23 | version: 5.0.4 24 | canvas-circular-countdown: 25 | specifier: ^1.8.0 26 | version: 1.8.0 27 | svelte: 28 | specifier: ^5.28.2 29 | version: 5.28.2 30 | svelte-check: 31 | specifier: ^4.1.6 32 | version: 4.1.6(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3) 33 | tslib: 34 | specifier: ^2.8.1 35 | version: 2.8.1 36 | typescript: 37 | specifier: ^5.8.3 38 | version: 5.8.3 39 | vite: 40 | specifier: ^6.3.3 41 | version: 6.3.3 42 | 43 | packages: 44 | 45 | '@ampproject/remapping@2.3.0': 46 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 47 | engines: {node: '>=6.0.0'} 48 | 49 | '@esbuild/aix-ppc64@0.25.3': 50 | resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} 51 | engines: {node: '>=18'} 52 | cpu: [ppc64] 53 | os: [aix] 54 | 55 | '@esbuild/android-arm64@0.25.3': 56 | resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} 57 | engines: {node: '>=18'} 58 | cpu: [arm64] 59 | os: [android] 60 | 61 | '@esbuild/android-arm@0.25.3': 62 | resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} 63 | engines: {node: '>=18'} 64 | cpu: [arm] 65 | os: [android] 66 | 67 | '@esbuild/android-x64@0.25.3': 68 | resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} 69 | engines: {node: '>=18'} 70 | cpu: [x64] 71 | os: [android] 72 | 73 | '@esbuild/darwin-arm64@0.25.3': 74 | resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} 75 | engines: {node: '>=18'} 76 | cpu: [arm64] 77 | os: [darwin] 78 | 79 | '@esbuild/darwin-x64@0.25.3': 80 | resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} 81 | engines: {node: '>=18'} 82 | cpu: [x64] 83 | os: [darwin] 84 | 85 | '@esbuild/freebsd-arm64@0.25.3': 86 | resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} 87 | engines: {node: '>=18'} 88 | cpu: [arm64] 89 | os: [freebsd] 90 | 91 | '@esbuild/freebsd-x64@0.25.3': 92 | resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} 93 | engines: {node: '>=18'} 94 | cpu: [x64] 95 | os: [freebsd] 96 | 97 | '@esbuild/linux-arm64@0.25.3': 98 | resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} 99 | engines: {node: '>=18'} 100 | cpu: [arm64] 101 | os: [linux] 102 | 103 | '@esbuild/linux-arm@0.25.3': 104 | resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} 105 | engines: {node: '>=18'} 106 | cpu: [arm] 107 | os: [linux] 108 | 109 | '@esbuild/linux-ia32@0.25.3': 110 | resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} 111 | engines: {node: '>=18'} 112 | cpu: [ia32] 113 | os: [linux] 114 | 115 | '@esbuild/linux-loong64@0.25.3': 116 | resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} 117 | engines: {node: '>=18'} 118 | cpu: [loong64] 119 | os: [linux] 120 | 121 | '@esbuild/linux-mips64el@0.25.3': 122 | resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} 123 | engines: {node: '>=18'} 124 | cpu: [mips64el] 125 | os: [linux] 126 | 127 | '@esbuild/linux-ppc64@0.25.3': 128 | resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} 129 | engines: {node: '>=18'} 130 | cpu: [ppc64] 131 | os: [linux] 132 | 133 | '@esbuild/linux-riscv64@0.25.3': 134 | resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} 135 | engines: {node: '>=18'} 136 | cpu: [riscv64] 137 | os: [linux] 138 | 139 | '@esbuild/linux-s390x@0.25.3': 140 | resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} 141 | engines: {node: '>=18'} 142 | cpu: [s390x] 143 | os: [linux] 144 | 145 | '@esbuild/linux-x64@0.25.3': 146 | resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} 147 | engines: {node: '>=18'} 148 | cpu: [x64] 149 | os: [linux] 150 | 151 | '@esbuild/netbsd-arm64@0.25.3': 152 | resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} 153 | engines: {node: '>=18'} 154 | cpu: [arm64] 155 | os: [netbsd] 156 | 157 | '@esbuild/netbsd-x64@0.25.3': 158 | resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} 159 | engines: {node: '>=18'} 160 | cpu: [x64] 161 | os: [netbsd] 162 | 163 | '@esbuild/openbsd-arm64@0.25.3': 164 | resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} 165 | engines: {node: '>=18'} 166 | cpu: [arm64] 167 | os: [openbsd] 168 | 169 | '@esbuild/openbsd-x64@0.25.3': 170 | resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} 171 | engines: {node: '>=18'} 172 | cpu: [x64] 173 | os: [openbsd] 174 | 175 | '@esbuild/sunos-x64@0.25.3': 176 | resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} 177 | engines: {node: '>=18'} 178 | cpu: [x64] 179 | os: [sunos] 180 | 181 | '@esbuild/win32-arm64@0.25.3': 182 | resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} 183 | engines: {node: '>=18'} 184 | cpu: [arm64] 185 | os: [win32] 186 | 187 | '@esbuild/win32-ia32@0.25.3': 188 | resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} 189 | engines: {node: '>=18'} 190 | cpu: [ia32] 191 | os: [win32] 192 | 193 | '@esbuild/win32-x64@0.25.3': 194 | resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} 195 | engines: {node: '>=18'} 196 | cpu: [x64] 197 | os: [win32] 198 | 199 | '@jridgewell/gen-mapping@0.3.8': 200 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 201 | engines: {node: '>=6.0.0'} 202 | 203 | '@jridgewell/resolve-uri@3.1.2': 204 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 205 | engines: {node: '>=6.0.0'} 206 | 207 | '@jridgewell/set-array@1.2.1': 208 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 209 | engines: {node: '>=6.0.0'} 210 | 211 | '@jridgewell/sourcemap-codec@1.5.0': 212 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 213 | 214 | '@jridgewell/trace-mapping@0.3.25': 215 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 216 | 217 | '@rollup/rollup-android-arm-eabi@4.40.0': 218 | resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} 219 | cpu: [arm] 220 | os: [android] 221 | 222 | '@rollup/rollup-android-arm64@4.40.0': 223 | resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} 224 | cpu: [arm64] 225 | os: [android] 226 | 227 | '@rollup/rollup-darwin-arm64@4.40.0': 228 | resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} 229 | cpu: [arm64] 230 | os: [darwin] 231 | 232 | '@rollup/rollup-darwin-x64@4.40.0': 233 | resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} 234 | cpu: [x64] 235 | os: [darwin] 236 | 237 | '@rollup/rollup-freebsd-arm64@4.40.0': 238 | resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} 239 | cpu: [arm64] 240 | os: [freebsd] 241 | 242 | '@rollup/rollup-freebsd-x64@4.40.0': 243 | resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} 244 | cpu: [x64] 245 | os: [freebsd] 246 | 247 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 248 | resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} 249 | cpu: [arm] 250 | os: [linux] 251 | 252 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 253 | resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} 254 | cpu: [arm] 255 | os: [linux] 256 | 257 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 258 | resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} 259 | cpu: [arm64] 260 | os: [linux] 261 | 262 | '@rollup/rollup-linux-arm64-musl@4.40.0': 263 | resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} 264 | cpu: [arm64] 265 | os: [linux] 266 | 267 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 268 | resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} 269 | cpu: [loong64] 270 | os: [linux] 271 | 272 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 273 | resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} 274 | cpu: [ppc64] 275 | os: [linux] 276 | 277 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 278 | resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} 279 | cpu: [riscv64] 280 | os: [linux] 281 | 282 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 283 | resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} 284 | cpu: [riscv64] 285 | os: [linux] 286 | 287 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 288 | resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} 289 | cpu: [s390x] 290 | os: [linux] 291 | 292 | '@rollup/rollup-linux-x64-gnu@4.40.0': 293 | resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} 294 | cpu: [x64] 295 | os: [linux] 296 | 297 | '@rollup/rollup-linux-x64-musl@4.40.0': 298 | resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} 299 | cpu: [x64] 300 | os: [linux] 301 | 302 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 303 | resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} 304 | cpu: [arm64] 305 | os: [win32] 306 | 307 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 308 | resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} 309 | cpu: [ia32] 310 | os: [win32] 311 | 312 | '@rollup/rollup-win32-x64-msvc@4.40.0': 313 | resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} 314 | cpu: [x64] 315 | os: [win32] 316 | 317 | '@sveltejs/acorn-typescript@1.0.5': 318 | resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} 319 | peerDependencies: 320 | acorn: ^8.9.0 321 | 322 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1': 323 | resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} 324 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 325 | peerDependencies: 326 | '@sveltejs/vite-plugin-svelte': ^5.0.0 327 | svelte: ^5.0.0 328 | vite: ^6.0.0 329 | 330 | '@sveltejs/vite-plugin-svelte@5.0.3': 331 | resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} 332 | engines: {node: ^18.0.0 || ^20.0.0 || >=22} 333 | peerDependencies: 334 | svelte: ^5.0.0 335 | vite: ^6.0.0 336 | 337 | '@tsconfig/svelte@5.0.4': 338 | resolution: {integrity: sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==} 339 | 340 | '@types/estree@1.0.7': 341 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 342 | 343 | acorn@8.14.1: 344 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 345 | engines: {node: '>=0.4.0'} 346 | hasBin: true 347 | 348 | ansi-regex@5.0.1: 349 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 350 | engines: {node: '>=8'} 351 | 352 | ansi-styles@4.3.0: 353 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 354 | engines: {node: '>=8'} 355 | 356 | aria-query@5.3.2: 357 | resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 358 | engines: {node: '>= 0.4'} 359 | 360 | axobject-query@4.1.0: 361 | resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 362 | engines: {node: '>= 0.4'} 363 | 364 | camelcase@5.3.1: 365 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 366 | engines: {node: '>=6'} 367 | 368 | canvas-circular-countdown@1.8.0: 369 | resolution: {integrity: sha512-LKZCfTdp3qkC6VqBt2lBfEYf/xGuPGn6aHcIKp9sIVE1DD0GPVFcnsd+EUJrZ4V79Y//aJ2fKqfASag8ZfJDSg==} 370 | 371 | chokidar@4.0.3: 372 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 373 | engines: {node: '>= 14.16.0'} 374 | 375 | cliui@6.0.0: 376 | resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} 377 | 378 | clsx@2.1.1: 379 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 380 | engines: {node: '>=6'} 381 | 382 | color-convert@2.0.1: 383 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 384 | engines: {node: '>=7.0.0'} 385 | 386 | color-name@1.1.4: 387 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 388 | 389 | date-fns@4.1.0: 390 | resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} 391 | 392 | debug@4.4.0: 393 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 394 | engines: {node: '>=6.0'} 395 | peerDependencies: 396 | supports-color: '*' 397 | peerDependenciesMeta: 398 | supports-color: 399 | optional: true 400 | 401 | decamelize@1.2.0: 402 | resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} 403 | engines: {node: '>=0.10.0'} 404 | 405 | deepmerge@4.3.1: 406 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 407 | engines: {node: '>=0.10.0'} 408 | 409 | dijkstrajs@1.0.3: 410 | resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} 411 | 412 | emoji-regex@8.0.0: 413 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 414 | 415 | esbuild@0.25.3: 416 | resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} 417 | engines: {node: '>=18'} 418 | hasBin: true 419 | 420 | esm-env@1.2.2: 421 | resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} 422 | 423 | esrap@1.4.6: 424 | resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} 425 | 426 | fdir@6.4.4: 427 | resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} 428 | peerDependencies: 429 | picomatch: ^3 || ^4 430 | peerDependenciesMeta: 431 | picomatch: 432 | optional: true 433 | 434 | find-up@4.1.0: 435 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 436 | engines: {node: '>=8'} 437 | 438 | fsevents@2.3.3: 439 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 440 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 441 | os: [darwin] 442 | 443 | get-caller-file@2.0.5: 444 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 445 | engines: {node: 6.* || 8.* || >= 10.*} 446 | 447 | is-fullwidth-code-point@3.0.0: 448 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 449 | engines: {node: '>=8'} 450 | 451 | is-reference@3.0.3: 452 | resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} 453 | 454 | kleur@4.1.5: 455 | resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} 456 | engines: {node: '>=6'} 457 | 458 | locate-character@3.0.0: 459 | resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} 460 | 461 | locate-path@5.0.0: 462 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 463 | engines: {node: '>=8'} 464 | 465 | magic-string@0.30.17: 466 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 467 | 468 | mri@1.2.0: 469 | resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} 470 | engines: {node: '>=4'} 471 | 472 | ms@2.1.3: 473 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 474 | 475 | nanoid@3.3.11: 476 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 477 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 478 | hasBin: true 479 | 480 | p-limit@2.3.0: 481 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 482 | engines: {node: '>=6'} 483 | 484 | p-locate@4.1.0: 485 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 486 | engines: {node: '>=8'} 487 | 488 | p-try@2.2.0: 489 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 490 | engines: {node: '>=6'} 491 | 492 | path-exists@4.0.0: 493 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 494 | engines: {node: '>=8'} 495 | 496 | picocolors@1.1.1: 497 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 498 | 499 | picomatch@4.0.2: 500 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 501 | engines: {node: '>=12'} 502 | 503 | pngjs@5.0.0: 504 | resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} 505 | engines: {node: '>=10.13.0'} 506 | 507 | postcss@8.5.3: 508 | resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} 509 | engines: {node: ^10 || ^12 || >=14} 510 | 511 | qrcode@1.5.4: 512 | resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} 513 | engines: {node: '>=10.13.0'} 514 | hasBin: true 515 | 516 | readdirp@4.1.2: 517 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 518 | engines: {node: '>= 14.18.0'} 519 | 520 | require-directory@2.1.1: 521 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 522 | engines: {node: '>=0.10.0'} 523 | 524 | require-main-filename@2.0.0: 525 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 526 | 527 | rollup@4.40.0: 528 | resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} 529 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 530 | hasBin: true 531 | 532 | sade@1.8.1: 533 | resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} 534 | engines: {node: '>=6'} 535 | 536 | set-blocking@2.0.0: 537 | resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} 538 | 539 | source-map-js@1.2.1: 540 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 541 | engines: {node: '>=0.10.0'} 542 | 543 | string-width@4.2.3: 544 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 545 | engines: {node: '>=8'} 546 | 547 | strip-ansi@6.0.1: 548 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 549 | engines: {node: '>=8'} 550 | 551 | svelte-check@4.1.6: 552 | resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==} 553 | engines: {node: '>= 18.0.0'} 554 | hasBin: true 555 | peerDependencies: 556 | svelte: ^4.0.0 || ^5.0.0-next.0 557 | typescript: '>=5.0.0' 558 | 559 | svelte@5.28.2: 560 | resolution: {integrity: sha512-FbWBxgWOpQfhKvoGJv/TFwzqb4EhJbwCD17dB0tEpQiw1XyUEKZJtgm4nA4xq3LLsMo7hu5UY/BOFmroAxKTMg==} 561 | engines: {node: '>=18'} 562 | 563 | tinyglobby@0.2.13: 564 | resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} 565 | engines: {node: '>=12.0.0'} 566 | 567 | tslib@2.8.1: 568 | resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 569 | 570 | typescript@5.8.3: 571 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 572 | engines: {node: '>=14.17'} 573 | hasBin: true 574 | 575 | vite@6.3.3: 576 | resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} 577 | engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} 578 | hasBin: true 579 | peerDependencies: 580 | '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 581 | jiti: '>=1.21.0' 582 | less: '*' 583 | lightningcss: ^1.21.0 584 | sass: '*' 585 | sass-embedded: '*' 586 | stylus: '*' 587 | sugarss: '*' 588 | terser: ^5.16.0 589 | tsx: ^4.8.1 590 | yaml: ^2.4.2 591 | peerDependenciesMeta: 592 | '@types/node': 593 | optional: true 594 | jiti: 595 | optional: true 596 | less: 597 | optional: true 598 | lightningcss: 599 | optional: true 600 | sass: 601 | optional: true 602 | sass-embedded: 603 | optional: true 604 | stylus: 605 | optional: true 606 | sugarss: 607 | optional: true 608 | terser: 609 | optional: true 610 | tsx: 611 | optional: true 612 | yaml: 613 | optional: true 614 | 615 | vitefu@1.0.6: 616 | resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} 617 | peerDependencies: 618 | vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 619 | peerDependenciesMeta: 620 | vite: 621 | optional: true 622 | 623 | which-module@2.0.1: 624 | resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} 625 | 626 | wrap-ansi@6.2.0: 627 | resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} 628 | engines: {node: '>=8'} 629 | 630 | y18n@4.0.3: 631 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 632 | 633 | yargs-parser@18.1.3: 634 | resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} 635 | engines: {node: '>=6'} 636 | 637 | yargs@15.4.1: 638 | resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} 639 | engines: {node: '>=8'} 640 | 641 | zimmerframe@1.1.2: 642 | resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} 643 | 644 | snapshots: 645 | 646 | '@ampproject/remapping@2.3.0': 647 | dependencies: 648 | '@jridgewell/gen-mapping': 0.3.8 649 | '@jridgewell/trace-mapping': 0.3.25 650 | 651 | '@esbuild/aix-ppc64@0.25.3': 652 | optional: true 653 | 654 | '@esbuild/android-arm64@0.25.3': 655 | optional: true 656 | 657 | '@esbuild/android-arm@0.25.3': 658 | optional: true 659 | 660 | '@esbuild/android-x64@0.25.3': 661 | optional: true 662 | 663 | '@esbuild/darwin-arm64@0.25.3': 664 | optional: true 665 | 666 | '@esbuild/darwin-x64@0.25.3': 667 | optional: true 668 | 669 | '@esbuild/freebsd-arm64@0.25.3': 670 | optional: true 671 | 672 | '@esbuild/freebsd-x64@0.25.3': 673 | optional: true 674 | 675 | '@esbuild/linux-arm64@0.25.3': 676 | optional: true 677 | 678 | '@esbuild/linux-arm@0.25.3': 679 | optional: true 680 | 681 | '@esbuild/linux-ia32@0.25.3': 682 | optional: true 683 | 684 | '@esbuild/linux-loong64@0.25.3': 685 | optional: true 686 | 687 | '@esbuild/linux-mips64el@0.25.3': 688 | optional: true 689 | 690 | '@esbuild/linux-ppc64@0.25.3': 691 | optional: true 692 | 693 | '@esbuild/linux-riscv64@0.25.3': 694 | optional: true 695 | 696 | '@esbuild/linux-s390x@0.25.3': 697 | optional: true 698 | 699 | '@esbuild/linux-x64@0.25.3': 700 | optional: true 701 | 702 | '@esbuild/netbsd-arm64@0.25.3': 703 | optional: true 704 | 705 | '@esbuild/netbsd-x64@0.25.3': 706 | optional: true 707 | 708 | '@esbuild/openbsd-arm64@0.25.3': 709 | optional: true 710 | 711 | '@esbuild/openbsd-x64@0.25.3': 712 | optional: true 713 | 714 | '@esbuild/sunos-x64@0.25.3': 715 | optional: true 716 | 717 | '@esbuild/win32-arm64@0.25.3': 718 | optional: true 719 | 720 | '@esbuild/win32-ia32@0.25.3': 721 | optional: true 722 | 723 | '@esbuild/win32-x64@0.25.3': 724 | optional: true 725 | 726 | '@jridgewell/gen-mapping@0.3.8': 727 | dependencies: 728 | '@jridgewell/set-array': 1.2.1 729 | '@jridgewell/sourcemap-codec': 1.5.0 730 | '@jridgewell/trace-mapping': 0.3.25 731 | 732 | '@jridgewell/resolve-uri@3.1.2': {} 733 | 734 | '@jridgewell/set-array@1.2.1': {} 735 | 736 | '@jridgewell/sourcemap-codec@1.5.0': {} 737 | 738 | '@jridgewell/trace-mapping@0.3.25': 739 | dependencies: 740 | '@jridgewell/resolve-uri': 3.1.2 741 | '@jridgewell/sourcemap-codec': 1.5.0 742 | 743 | '@rollup/rollup-android-arm-eabi@4.40.0': 744 | optional: true 745 | 746 | '@rollup/rollup-android-arm64@4.40.0': 747 | optional: true 748 | 749 | '@rollup/rollup-darwin-arm64@4.40.0': 750 | optional: true 751 | 752 | '@rollup/rollup-darwin-x64@4.40.0': 753 | optional: true 754 | 755 | '@rollup/rollup-freebsd-arm64@4.40.0': 756 | optional: true 757 | 758 | '@rollup/rollup-freebsd-x64@4.40.0': 759 | optional: true 760 | 761 | '@rollup/rollup-linux-arm-gnueabihf@4.40.0': 762 | optional: true 763 | 764 | '@rollup/rollup-linux-arm-musleabihf@4.40.0': 765 | optional: true 766 | 767 | '@rollup/rollup-linux-arm64-gnu@4.40.0': 768 | optional: true 769 | 770 | '@rollup/rollup-linux-arm64-musl@4.40.0': 771 | optional: true 772 | 773 | '@rollup/rollup-linux-loongarch64-gnu@4.40.0': 774 | optional: true 775 | 776 | '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': 777 | optional: true 778 | 779 | '@rollup/rollup-linux-riscv64-gnu@4.40.0': 780 | optional: true 781 | 782 | '@rollup/rollup-linux-riscv64-musl@4.40.0': 783 | optional: true 784 | 785 | '@rollup/rollup-linux-s390x-gnu@4.40.0': 786 | optional: true 787 | 788 | '@rollup/rollup-linux-x64-gnu@4.40.0': 789 | optional: true 790 | 791 | '@rollup/rollup-linux-x64-musl@4.40.0': 792 | optional: true 793 | 794 | '@rollup/rollup-win32-arm64-msvc@4.40.0': 795 | optional: true 796 | 797 | '@rollup/rollup-win32-ia32-msvc@4.40.0': 798 | optional: true 799 | 800 | '@rollup/rollup-win32-x64-msvc@4.40.0': 801 | optional: true 802 | 803 | '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': 804 | dependencies: 805 | acorn: 8.14.1 806 | 807 | '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3))(svelte@5.28.2)(vite@6.3.3)': 808 | dependencies: 809 | '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.28.2)(vite@6.3.3) 810 | debug: 4.4.0 811 | svelte: 5.28.2 812 | vite: 6.3.3 813 | transitivePeerDependencies: 814 | - supports-color 815 | 816 | '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3)': 817 | dependencies: 818 | '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.28.2)(vite@6.3.3))(svelte@5.28.2)(vite@6.3.3) 819 | debug: 4.4.0 820 | deepmerge: 4.3.1 821 | kleur: 4.1.5 822 | magic-string: 0.30.17 823 | svelte: 5.28.2 824 | vite: 6.3.3 825 | vitefu: 1.0.6(vite@6.3.3) 826 | transitivePeerDependencies: 827 | - supports-color 828 | 829 | '@tsconfig/svelte@5.0.4': {} 830 | 831 | '@types/estree@1.0.7': {} 832 | 833 | acorn@8.14.1: {} 834 | 835 | ansi-regex@5.0.1: {} 836 | 837 | ansi-styles@4.3.0: 838 | dependencies: 839 | color-convert: 2.0.1 840 | 841 | aria-query@5.3.2: {} 842 | 843 | axobject-query@4.1.0: {} 844 | 845 | camelcase@5.3.1: {} 846 | 847 | canvas-circular-countdown@1.8.0: {} 848 | 849 | chokidar@4.0.3: 850 | dependencies: 851 | readdirp: 4.1.2 852 | 853 | cliui@6.0.0: 854 | dependencies: 855 | string-width: 4.2.3 856 | strip-ansi: 6.0.1 857 | wrap-ansi: 6.2.0 858 | 859 | clsx@2.1.1: {} 860 | 861 | color-convert@2.0.1: 862 | dependencies: 863 | color-name: 1.1.4 864 | 865 | color-name@1.1.4: {} 866 | 867 | date-fns@4.1.0: {} 868 | 869 | debug@4.4.0: 870 | dependencies: 871 | ms: 2.1.3 872 | 873 | decamelize@1.2.0: {} 874 | 875 | deepmerge@4.3.1: {} 876 | 877 | dijkstrajs@1.0.3: {} 878 | 879 | emoji-regex@8.0.0: {} 880 | 881 | esbuild@0.25.3: 882 | optionalDependencies: 883 | '@esbuild/aix-ppc64': 0.25.3 884 | '@esbuild/android-arm': 0.25.3 885 | '@esbuild/android-arm64': 0.25.3 886 | '@esbuild/android-x64': 0.25.3 887 | '@esbuild/darwin-arm64': 0.25.3 888 | '@esbuild/darwin-x64': 0.25.3 889 | '@esbuild/freebsd-arm64': 0.25.3 890 | '@esbuild/freebsd-x64': 0.25.3 891 | '@esbuild/linux-arm': 0.25.3 892 | '@esbuild/linux-arm64': 0.25.3 893 | '@esbuild/linux-ia32': 0.25.3 894 | '@esbuild/linux-loong64': 0.25.3 895 | '@esbuild/linux-mips64el': 0.25.3 896 | '@esbuild/linux-ppc64': 0.25.3 897 | '@esbuild/linux-riscv64': 0.25.3 898 | '@esbuild/linux-s390x': 0.25.3 899 | '@esbuild/linux-x64': 0.25.3 900 | '@esbuild/netbsd-arm64': 0.25.3 901 | '@esbuild/netbsd-x64': 0.25.3 902 | '@esbuild/openbsd-arm64': 0.25.3 903 | '@esbuild/openbsd-x64': 0.25.3 904 | '@esbuild/sunos-x64': 0.25.3 905 | '@esbuild/win32-arm64': 0.25.3 906 | '@esbuild/win32-ia32': 0.25.3 907 | '@esbuild/win32-x64': 0.25.3 908 | 909 | esm-env@1.2.2: {} 910 | 911 | esrap@1.4.6: 912 | dependencies: 913 | '@jridgewell/sourcemap-codec': 1.5.0 914 | 915 | fdir@6.4.4(picomatch@4.0.2): 916 | optionalDependencies: 917 | picomatch: 4.0.2 918 | 919 | find-up@4.1.0: 920 | dependencies: 921 | locate-path: 5.0.0 922 | path-exists: 4.0.0 923 | 924 | fsevents@2.3.3: 925 | optional: true 926 | 927 | get-caller-file@2.0.5: {} 928 | 929 | is-fullwidth-code-point@3.0.0: {} 930 | 931 | is-reference@3.0.3: 932 | dependencies: 933 | '@types/estree': 1.0.7 934 | 935 | kleur@4.1.5: {} 936 | 937 | locate-character@3.0.0: {} 938 | 939 | locate-path@5.0.0: 940 | dependencies: 941 | p-locate: 4.1.0 942 | 943 | magic-string@0.30.17: 944 | dependencies: 945 | '@jridgewell/sourcemap-codec': 1.5.0 946 | 947 | mri@1.2.0: {} 948 | 949 | ms@2.1.3: {} 950 | 951 | nanoid@3.3.11: {} 952 | 953 | p-limit@2.3.0: 954 | dependencies: 955 | p-try: 2.2.0 956 | 957 | p-locate@4.1.0: 958 | dependencies: 959 | p-limit: 2.3.0 960 | 961 | p-try@2.2.0: {} 962 | 963 | path-exists@4.0.0: {} 964 | 965 | picocolors@1.1.1: {} 966 | 967 | picomatch@4.0.2: {} 968 | 969 | pngjs@5.0.0: {} 970 | 971 | postcss@8.5.3: 972 | dependencies: 973 | nanoid: 3.3.11 974 | picocolors: 1.1.1 975 | source-map-js: 1.2.1 976 | 977 | qrcode@1.5.4: 978 | dependencies: 979 | dijkstrajs: 1.0.3 980 | pngjs: 5.0.0 981 | yargs: 15.4.1 982 | 983 | readdirp@4.1.2: {} 984 | 985 | require-directory@2.1.1: {} 986 | 987 | require-main-filename@2.0.0: {} 988 | 989 | rollup@4.40.0: 990 | dependencies: 991 | '@types/estree': 1.0.7 992 | optionalDependencies: 993 | '@rollup/rollup-android-arm-eabi': 4.40.0 994 | '@rollup/rollup-android-arm64': 4.40.0 995 | '@rollup/rollup-darwin-arm64': 4.40.0 996 | '@rollup/rollup-darwin-x64': 4.40.0 997 | '@rollup/rollup-freebsd-arm64': 4.40.0 998 | '@rollup/rollup-freebsd-x64': 4.40.0 999 | '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 1000 | '@rollup/rollup-linux-arm-musleabihf': 4.40.0 1001 | '@rollup/rollup-linux-arm64-gnu': 4.40.0 1002 | '@rollup/rollup-linux-arm64-musl': 4.40.0 1003 | '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 1004 | '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 1005 | '@rollup/rollup-linux-riscv64-gnu': 4.40.0 1006 | '@rollup/rollup-linux-riscv64-musl': 4.40.0 1007 | '@rollup/rollup-linux-s390x-gnu': 4.40.0 1008 | '@rollup/rollup-linux-x64-gnu': 4.40.0 1009 | '@rollup/rollup-linux-x64-musl': 4.40.0 1010 | '@rollup/rollup-win32-arm64-msvc': 4.40.0 1011 | '@rollup/rollup-win32-ia32-msvc': 4.40.0 1012 | '@rollup/rollup-win32-x64-msvc': 4.40.0 1013 | fsevents: 2.3.3 1014 | 1015 | sade@1.8.1: 1016 | dependencies: 1017 | mri: 1.2.0 1018 | 1019 | set-blocking@2.0.0: {} 1020 | 1021 | source-map-js@1.2.1: {} 1022 | 1023 | string-width@4.2.3: 1024 | dependencies: 1025 | emoji-regex: 8.0.0 1026 | is-fullwidth-code-point: 3.0.0 1027 | strip-ansi: 6.0.1 1028 | 1029 | strip-ansi@6.0.1: 1030 | dependencies: 1031 | ansi-regex: 5.0.1 1032 | 1033 | svelte-check@4.1.6(picomatch@4.0.2)(svelte@5.28.2)(typescript@5.8.3): 1034 | dependencies: 1035 | '@jridgewell/trace-mapping': 0.3.25 1036 | chokidar: 4.0.3 1037 | fdir: 6.4.4(picomatch@4.0.2) 1038 | picocolors: 1.1.1 1039 | sade: 1.8.1 1040 | svelte: 5.28.2 1041 | typescript: 5.8.3 1042 | transitivePeerDependencies: 1043 | - picomatch 1044 | 1045 | svelte@5.28.2: 1046 | dependencies: 1047 | '@ampproject/remapping': 2.3.0 1048 | '@jridgewell/sourcemap-codec': 1.5.0 1049 | '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) 1050 | '@types/estree': 1.0.7 1051 | acorn: 8.14.1 1052 | aria-query: 5.3.2 1053 | axobject-query: 4.1.0 1054 | clsx: 2.1.1 1055 | esm-env: 1.2.2 1056 | esrap: 1.4.6 1057 | is-reference: 3.0.3 1058 | locate-character: 3.0.0 1059 | magic-string: 0.30.17 1060 | zimmerframe: 1.1.2 1061 | 1062 | tinyglobby@0.2.13: 1063 | dependencies: 1064 | fdir: 6.4.4(picomatch@4.0.2) 1065 | picomatch: 4.0.2 1066 | 1067 | tslib@2.8.1: {} 1068 | 1069 | typescript@5.8.3: {} 1070 | 1071 | vite@6.3.3: 1072 | dependencies: 1073 | esbuild: 0.25.3 1074 | fdir: 6.4.4(picomatch@4.0.2) 1075 | picomatch: 4.0.2 1076 | postcss: 8.5.3 1077 | rollup: 4.40.0 1078 | tinyglobby: 0.2.13 1079 | optionalDependencies: 1080 | fsevents: 2.3.3 1081 | 1082 | vitefu@1.0.6(vite@6.3.3): 1083 | optionalDependencies: 1084 | vite: 6.3.3 1085 | 1086 | which-module@2.0.1: {} 1087 | 1088 | wrap-ansi@6.2.0: 1089 | dependencies: 1090 | ansi-styles: 4.3.0 1091 | string-width: 4.2.3 1092 | strip-ansi: 6.0.1 1093 | 1094 | y18n@4.0.3: {} 1095 | 1096 | yargs-parser@18.1.3: 1097 | dependencies: 1098 | camelcase: 5.3.1 1099 | decamelize: 1.2.0 1100 | 1101 | yargs@15.4.1: 1102 | dependencies: 1103 | cliui: 6.0.0 1104 | decamelize: 1.2.0 1105 | find-up: 4.1.0 1106 | get-caller-file: 2.0.5 1107 | require-directory: 2.1.1 1108 | require-main-filename: 2.0.0 1109 | set-blocking: 2.0.0 1110 | string-width: 4.2.3 1111 | which-module: 2.0.1 1112 | y18n: 4.0.3 1113 | yargs-parser: 18.1.3 1114 | 1115 | zimmerframe@1.1.2: {} 1116 | --------------------------------------------------------------------------------