RL Logo
Live Race Display
KODE: {{ sessionSlug || currentSessionId }}
{{ raceName || 'Ruang Lari Official Race' }}
{{ raceCategory }}
Pengaturan Tampilan Jam TV
Ukuran Jam Timer {{ tvTimerSizeScale }}%
50% 180%
RUANG LARI RACE TIMER
{{ tvTimerParts.main }} {{ tvTimerParts.ms }}
Scan Live Results
{{ tvResultsShortUrl }}
BARU SAJA FINISH
#{{ tvLatestFinisher.bib }} {{ tvLatestFinisher.name }}
Waktu: {{ tvLatestFinisher.time }} Peringkat: #{{ tvLatestFinisher.rank }}
Top 5 Finisher Leaderboard
Live Auto-Update
{{ idx + 1 }}
#{{ p.bib }} {{ p.name }}
{{ formatTime(p.totalTime) }}
{{ top5Results.length + i }}
Menunggu Finisher...

Race Master Pro

Data tersimpan: {{ raceName || 'Race tanpa nama' }}  • {{ participants.length }} peserta
Melanjutkan sesi sebelumnya. Untuk memulai lomba baru yang berbeda, klik “Mulai Race Baru”.

Sinkronisasi Multi-Admin (Live Room Sync)

Hubungkan Admin 1 (TV Display), Admin 2 (Kamera Gate), Admin 3 (Spotter Numpad), dan Admin 4 (Marshal) ke sesi balap yang sama dari laptop/HP masing-masing.

Live Sync Aktif ({{ sessionSyncLastUpdated }})
Sesi Lomba Saat Ini: Running Jeda / Selesai Standby (00:00:00)
{{ sessionSlug || currentSessionId }}
{{ formattedTime }}
Sesi belum dibuat. Buat sesi terlebih dahulu untuk membagikan link ke Layar TV & Admin sebelum timer jalan.
Link TV Display akan langsung membuka layar TV fullscreen saat dibuka.
Gabung ke Sesi Lain (Satellite Admin):
{{ sessionSyncError }}
Untuk laptop TV atau admin kedua yang ingin bergabung ke sesi lomba yang sudah dibuat master.

Impor Peserta dari Event EO RuangLari

Pilih event yang kamu kelola untuk mengimpor seluruh peserta resmi beserta nomor BIB secara otomatis ke Race Master.

Memuat Event...
{{ ev.name }}
Tanggal: {{ ev.start_at || 'Belum ada tanggal' }} • {{ ev.location }}
{{ ev.categories.length }} Kategori
Tidak ada event yang sesuai dengan pencarian "{{ eoEventSearchQuery }}".

Load Existing Race

1. Konfigurasi Race

Disimpan ke database saat Start Race.
Logo preview
{{ raceLogoFileName }}
Dipakai untuk hitung pace/kecepatan pada poster.
Total Peserta Terdaftar:
{{ participants.length }} Peserta

2. Tambah Peserta & Biometrik Wajah

Daftarkan peserta secara manual satu per satu, impor massal via file CSV, atau gunakan biometrik wajah AI.

Impor Massal Peserta via CSV

Punya daftar peserta di Excel / Spreadsheet? Download format CSV, isi kolomnya, lalu upload langsung ke sini.

Avatar {{ enrolledAngleCount }}
Biometrik Wajah AI Multi-Angle 3 Sudut (Optimal) {{ enrolledAngleCount }} Sudut
Memuat AI Face Model...
Mengekstrak Biometrik Wajah...
Terdaftar {{ enrolledAngleCount }} Sudut (Depan, Kanan, Kiri)
Ambil 3 sudut (depan, kanan, kiri) agar deteksi saat finish tetap akurat.
: :
Foto
#{{ p.bib }} {{ p.name }}
Prediksi: {{ p.predictedTimeMs ? formatTime(p.predictedTimeMs) : '-' }} • 3 Sudut AI • 1 Sudut AI
Belum ada peserta terdaftar.

Preview BIB (A5 Landscape 21 x 14.5 cm)

Format standar nomor dada lomba lari horisontal siap cetak.

+
+
+
+
Logo
RL
Official Race BIB
{{ raceName || 'RuangLari Race' }}
{{ raceCategory }}
{{ p.bib }}
Scan for Timing
Nama Peserta
{{ p.name }}
ruanglari.com
ID: {{ String(p.id).substring(0, 8) }}
{{ timer.running ? 'Live' : timer.elapsed > 0 ? 'Paused' : 'Ready' }}
Official Race Clock
{{ formattedTime }}
{{ manualValidationAlert.message }}
BIB: #{{ manualValidationAlert.bib }} • Nama: {{ manualValidationAlert.name }} • Waktu: {{ manualValidationAlert.time }}
Prefix:
Auto-Enter:
#
Pilih Pelari ({{ quickBibSuggestions.length }}): 1-Tap untuk Langsung Catat
Cocok: #{{ liveMatchedRunner.bib }} {{ liveMatchedRunner.name }}
{{ liveMatchedRunner.status === 'finished' ? 'Sudah Finish: ' + formatTime(liveMatchedRunner.totalTime) : 'Sedang Berlari' }}
Ditemukan {{ ambiguousRunners.length }} pelari dengan nomor tersebut:
{{ ambiguousRunners.map(r => '#' + r.bib + ' ' + r.name).join(', ') }}. Silakan pilih Prefix di atas.
BIB belum terdaftar
#{{ pendingUnregisteredBib.bib }}
Waktu
{{ pendingUnregisteredBib.formattedTime }}

Nomor ini tidak ditemukan. Tambahkan peserta dan simpan waktu tersebut?

Preset:
Mode OCR: PaddleOCR AI • Global Full Frame • Fast Scan ~450 ms
Memuat AI... AI Ready Standby
{{ camera.fps }} FPS {{ camera.crossingCount }} Crossings
Bentuk Sensor:
Pipeline Vision: {{ raceSettings.aiVisionEngine === 'gpt_preferred' ? 'GPT-4o-mini Vision (Server)' : 'PaddleOCR AI' }} • {{ raceSettings.ocrTriggerMode === 'crossing' ? 'Event Lewat Garis/Kotak (Hemat Token)' : (raceSettings.ocrTriggerMode === 'manual' ? 'Manual Capture Saja' : 'Full Frame 450ms') }} • Sensor: {{ raceSettings.gateType === 'box' ? 'Kotak Gate (Overhead ROI)' : 'Garis Finish' }}
Tarik sudut Kotak Finish Gate (Kamera Tinggi) untuk mengatur area deteksi Tarik titik A atau B untuk menyesuaikan posisi Garis Finish
#{{ bibScan.lastDetected.bib }}
{{ bibScan.lastDetected.name }}
{{ bibScan.lastDetected.time }}
Konfirmasi...
Mencari BIB...
Waktu Tercatat
Sync 500ms
REC {{ formatRecordingDuration }} (Lokal)
{{ camera.lastScanMsg }}
OCR Test Mode Tidak ada waktu yang dicatat {{ ocrTestResult.ts }}
Menunggu hasil scan pertama...
Teks Mentah Terdeteksi (Angka & Huruf)
{{ ocrTestResult.rawText }}
RAW AI: {{ ocrTestResult.debugJson || 'null' }}
Cocok Peserta (Database)
#{{ ocrTestResult.matchedBib }} {{ ocrTestResult.matchedName }}
Tidak ada peserta terdaftar
Score: {{ ocrTestResult.score }} {{ ocrTestResult.latencyMs }}ms
Pengaturan BIB Number Scan Tahap 2: RoI Micro-OCR (~80ms)
Kamera memindai zona target RoI nomor dada secara terfokus dengan kecepatan tinggi tanpa garis visual
Sync Cepat Aktif (500ms)
1 = instan, 3-5 = lebih akurat
Jeda min. per BIB setelah dicatat
Mempengaruhi resolusi OCR
Threshold fuzzy match BIB
Pola BIB Aktif (Dari Data Peserta)
Sistem otomatis menggunakan struktur nomor peserta yang terdaftar sebagai basis deteksi OCR
Pola Aktif ({{ activeBibPattern.totalBibs }} Peserta) Belum Ada Peserta
Panjang Digit
{{ activeBibPattern.digitLengthsText }}
Prefix Terdeteksi
{{ activeBibPattern.prefixesText }}
Rentang Sampel
{{ activeBibPattern.sampleRange }}
Verifikasi Sampel Foto Fisik BIB (Opsional)
Unggah foto cetak BIB untuk menguji keterbacaan OCR terhadap font fisik sebelum start lomba
Memproses... Selesai ({{ bibScan.sampleImages.length }} Foto)
{{ img.extractedBibs && img.extractedBibs.length > 0 ? img.extractedBibs.join(', ') : '...' }}
Live Finish Feed & Snapshot Audit
Finish Snapshot
{{ item.timeFormatted }}
{{ item.matchMethod }} {{ item.allBibs.length }} BIB OCR {{ Math.round(item.ocrConfidence) }}% Ambigu Perlu Verifikasi
Menampilkan {{ paginatedRaceParticipants.length }} dari {{ filteredRaceParticipants.length }} pelari (difilter dari "{{ raceSearchQuery }}")
Hal {{ raceCurrentPage }} / {{ raceTotalPages }}
{{ getInitials(p.name) }}
#{{ p.bib }}
{{ p.name }}
Laps
{{ p.laps.length }}
Last Lap
{{ getLastLapTime(p) }}
RECORDED
BIB Nama Pelari Laps Waktu Terakhir Status Aksi Cepat
#{{ p.bib }} {{ p.name }} {{ p.laps.length }} {{ getLastLapTime(p) }} DNF FINISH ON TRACK
Tidak ada pelari yang cocok dengan filter atau pencarian.
Menampilkan halaman {{ raceCurrentPage }} dari {{ raceTotalPages }}
Klik kartu atau tombol Lap untuk catat waktu manual, atau gunakan kamera Line-Crossing / Numpad Spotter.
Hasil Akhir Perlombaan

{{ raceName || 'Race Master Pro' }} • {{ raceCategory }}

{{ idx + 1 }}
-
#{{ p.bib }} {{ p.name }}
Total {{ p.laps ? p.laps.length : 0 }} Putaran
DNF FINISH RUNNING
Waktu Finish
{{ p.totalTime ? formatTime(p.totalTime) : '-' }}
Average Pace
{{ formatPace(p) }}
Belum ada data hasil perlombaan.

Did Not Finish (DNF) - {{ dnfParticipants.length }} Peserta

#{{ p.bib }} {{ p.name }}

Login Diperlukan

Fitur ini memerlukan akun untuk menyimpan data lomba ke server.

Tanpa login, Race Master tetap berjalan penuh secara offline di browser ini (timer, peserta, hasil).
Login dibutuhkan untuk Sesi Bersama (multi-admin, link TV Display, sinkronisasi antar perangkat).

Perekaman Biometrik Multi-Angle

Ambil 3 sudut wajah pelari agar akurat saat melewati finish gate.

Instruksi: Posisikan wajah lurus menatap kamera Instruksi: Tolehkan wajah sedikit ke kanan (30°) Instruksi: Tolehkan wajah sedikit ke kiri (30°)
Depan
Depan
{{ newFacePhotos.front ? 'Tercatat' : 'Kosong' }}
Kanan
Serong Kanan
{{ newFacePhotos.right ? 'Tercatat' : 'Kosong' }}
Kiri
Serong Kiri
{{ newFacePhotos.left ? 'Tercatat' : 'Kosong' }}

Tetapkan BIB untuk Hasil Finish Ini

Snapshot
Waktu Finish Terdeteksi:
{{ selectedUnassignedFinish?.timeFormatted }}
Hasil Deteksi AI Vision:
#{{ selectedUnassignedFinish.bib }}
BIB Lain Terbaca:
Tidak ada peserta aktif lain yang belum finish.

Kartu Finisher & E-Poster 4:5

Format Instagram Portrait (1080 x 1350 px)

Jika tidak ada foto, sistem otomatis merender desain Energetic Sports Dark Theme dengan logo resmi Ruang Lari.
Finisher Card Preview
Merender Kartu Finisher...
RuangLari Race Master Live
{{ raceName || 'Race Master Pro' }} {{ raceCategory }}
Official Race Clock
{{ tvTimerParts.main }}{{ tvTimerParts.ms }}
Peserta
{{ participants.length }}
Finish
{{ finishedCount }}
On Track
{{ runningCount }}
DNF
{{ dnfCount }}
Finisher Terbaru (Live)
Finish Berhasil
#{{ tvLatestFinisher.bib }} {{ tvLatestFinisher.name }}
Waktu: {{ formatTime(tvLatestFinisher.totalTime) }} • Pace: {{ formatPace(tvLatestFinisher) }}
Menunggu pelari pertama melintasi garis finish...
Top 5 Leaderboard
{{ idx + 1 }} #{{ p.bib }} {{ p.name }}
{{ formatTime(p.totalTime) }}
Belum ada finisher di leaderboard.

Review Video Finish Juri (Slow-Motion)

Verifikasi visual urutan pelari garis finish

Kecepatan:
Frame Step:
File tersimpan di memori browser lokal (0% beban server).

Edit Data Peserta: BIB #{{ editRunnerForm.bib }}

Ubah nama pelari atau koreksi catatan waktu finish.

{{ editRunnerError }}
Total: {{ formatTime(editRunnerCalculatedMs) }}

Waktu resmi peserta di papan peringkat, sertifikat, dan kartu finisher.

Koreksi Waktu Start Sesi

Koreksi tanggal dan jam mulai lomba jika start timer sebelumnya terlambat.

{{ editTimingError }}

Contoh: Jika lomba resmi dimulai tepat pukul 06:00:00 WIB, masukkan jam tersebut. Timer balap dan durasi pelari akan dihitung dari jam tersebut.

Contoh: Jika panitia baru menekan tombol start 5 menit 30 detik setelah pistol start berbunyi, pilih Mundurkan lalu isi 5 menit 30 detik.

Estimasi Waktu Berjalan Sekarang:
{{ previewRecalculatedElapsed() }}
Waktu Start Baru:
{{ previewTargetStartTime() }}