# RR COM 06 MAY 26 001 - REPOSITORY ================================================================================ Project Name: RR COM 06 MAY 26 001 Created: 2026-05-06 13:03:42 Last Updated: 2026-05-06 13:03:58 Source ZIP: RR COM.zip Total Files: 196 Total Folders: 21 ================================================================================ ## FILE STRUCTURE ================================================================================ RR COM 06 MAY 26 001/ └── RR COM/ ├── about.php ├── admin-auth.php ├── admin-support.php ├── ajax-spam-done.php ├── articles/ │ ├── 5-ways-maximize-survey-earnings.php │ ├── best-paid-survey-sites-india.php │ ├── best-survey-platforms-indian-users.php │ ├── complete-guide-survey-beginners-india.php │ ├── earn-money-online-surveys-india-guide.php │ ├── errors.log │ ├── how-to-identify-genuine-survey-websites.php │ ├── online-surveys-india-housewives.php │ ├── online-surveys-india-students.php │ ├── online-surveys-india-upi-payment.php │ ├── paid-surveys-india-earning-potential.php │ ├── paid-surveys-india-faq.php │ ├── paid-surveys-india-mistakes.php │ ├── realistic-earning-expectations-surveys-india.php │ ├── relevant-reflex-review-legit.php │ ├── survey-scams-india.php │ └── time-management-tips-survey-takers.php ├── articles.php ├── assets/ │ ├── css/ │ │ ├── bootstrap.min.css │ │ ├── custom.css │ │ ├── fontawesome.css │ │ ├── fontawesome.min.css │ │ ├── redirect-pages.css │ │ ├── slick-theme.css │ │ ├── slick-theme.min.css │ │ ├── slick.min.css │ │ ├── templatemo.css │ │ └── templatemo.min.css │ ├── img/ │ │ ├── about-hero.svg │ │ ├── ajax-loader.gif │ │ ├── apple-icon.png │ │ ├── banner_img_01.jpg │ │ ├── favicon-16x16.png │ │ ├── favicon-192x192.png │ │ ├── favicon.ico │ │ └── favicon.png │ ├── js/ │ │ ├── bootstrap.bundle.min.js │ │ ├── custom.js │ │ ├── jquery-1.11.0.min.js │ │ ├── jquery-migrate-1.2.1.min.js │ │ ├── slick.min.js │ │ ├── templatemo.js │ │ └── templatemo.min.js │ └── webfonts/ │ ├── fa-brands-400.eot │ ├── fa-brands-400.svg │ ├── fa-brands-400.ttf │ ├── fa-brands-400.woff │ ├── fa-brands-400.woff2 │ ├── fa-regular-400.eot │ ├── fa-regular-400.svg │ ├── fa-regular-400.ttf │ ├── fa-regular-400.woff │ ├── fa-regular-400.woff2 │ ├── fa-solid-900.eot │ ├── fa-solid-900.svg │ ├── fa-solid-900.ttf │ ├── fa-solid-900.woff │ ├── fa-solid-900.woff2 │ ├── slick.eot │ ├── slick.svg │ ├── slick.ttf │ └── slick.woff ├── check-session.php ├── clients/ │ ├── assign-selection-urls.php │ ├── client-config.php │ ├── client-dashboard.php │ ├── client-login.php │ ├── client-portal-footer.php │ ├── client-portal-header.php │ ├── client-session.php │ ├── close-project.php │ ├── create-project.php │ ├── create-selection.php │ ├── data-security.php │ ├── delete-selection.php │ ├── delete-survey-urls.php │ ├── download-redirects.php │ ├── edit-project.php │ ├── estimator.php │ ├── export-batch-urls.php │ ├── export-project-urls.php │ ├── export-project.php │ ├── export-projects.php │ ├── export-selection-urls.php │ ├── export-url-data.php │ ├── feasibility.php │ ├── forgot-password.php │ ├── get-available-samples.php │ ├── get-feasibility-samples.php │ ├── index.php │ ├── invoice-helpers.php │ ├── invoice-pdf.php │ ├── invoices.php │ ├── logout.php │ ├── manage-survey-urls.php │ ├── panel-db-config.php │ ├── privacy-policy.php │ ├── process-survey-urls.php │ ├── projects-list.php │ ├── projects.php │ ├── request-reopen.php │ ├── reset-password.php │ ├── save-selection.php │ ├── selection-actions.php │ ├── selection-survey-urls.php │ ├── send-invitations.php │ ├── sendgrid-config.php │ ├── setup-password.php │ ├── support.php │ ├── terms-and-conditions.php │ ├── update-selection-quota.php │ ├── validate-manual-ids.php │ ├── view-batch-urls.php │ ├── view-project.php │ └── view-selection.php ├── close-project-rewards.php ├── config.php ├── contact.php ├── cron/ │ └── timeout-check.php ├── dashboard.php ├── default.php ├── disclaimer.php ├── doubts.php ├── email.php ├── errors.log ├── fix-rupee.php ├── forgot-password.php ├── google7106e441233c8b50.html ├── gtag.php ├── index.php ├── isec-helper.php ├── login.php ├── logout.php ├── mobile-verification.php ├── my-surveys.php ├── partner-support-creation.php ├── partners/ │ ├── data-security.php │ ├── data-sync.php │ ├── forgot-password.php │ ├── index.php │ ├── logout.php │ ├── members.php │ ├── partner-config.php │ ├── partner-dashboard.php │ ├── partner-login.php │ ├── partner-session.php │ ├── privacy-policy.php │ ├── redemptions.php │ ├── reset-password.php │ ├── setup-password.php │ ├── suspended.php │ └── terms.php ├── path-check.php ├── points-manager.php ├── privacy.php ├── profiler-api.php ├── profiler.php ├── r/ │ ├── index.php │ └── pages/ │ ├── complete.php │ ├── earlyscreenout.php │ ├── latescreenout.php │ ├── partial.php │ ├── quotafull.php │ └── timeout.php ├── redemption.php ├── referral.php ├── reset-password.php ├── robots.txt ├── s/ │ ├── index.php │ ├── on-hold.php │ ├── pages/ │ │ ├── on-hold.php │ │ └── survey-closed.php │ └── survey-closed.php ├── session.php ├── shop-db-config.php ├── signup.php ├── sitemap.xml ├── sms-config.php ├── superlog/ │ ├── banner.php │ ├── exit.php │ └── index.php ├── support-upload-helper.php ├── support.php ├── survey-review.php ├── terms.php ├── test-postmark.php ├── ticket-guide.php ├── update-ticket-status.php ├── uploads/ │ ├── psh-reviews │ └── support/ │ ├── 2026-02 │ ├── 2026-03 │ └── 2026-05 ├── user-support.php ├── verify.php ├── whatsapp-cron.log └── whatsapp-cron.php ================================================================================ ## FILE CONTENTS ================================================================================ ### FILE 1: RR COM/about.php - Type: PHP - Size: 21 KB - Path: RR COM - Name: about.php ------------------------------------------------------------ About Relevant Reflex | Online Survey Platform India Since 2021

Our Mission

At Relevant Reflex, we bridge the gap between Indian consumers and global market research companies. Our mission is to provide a trustworthy platform where your opinions matter and are fairly compensated.

We believe that every voice deserves to be heard, and every opinion has value. That's why we've created a secure, user-friendly platform that makes it easy for people across India to participate in market research and earn money for their time and insights.

Why We Started

Founded in 2021, Relevant Reflex was born out of the need for a reliable, India-focused survey platform. We saw too many people getting frustrated with unreliable survey sites that didn't pay or weren't relevant to the Indian market.

About Relevant Reflex

Our Impact in Numbers

Since our launch, we've grown into a trusted survey platform serving members across India

50,000+
Active Members

Registered users earning money with surveys

₹25,00,000+
Total Paid Out

Cumulative rewards paid to our members

2,50,000+
Surveys Completed

Successful survey completions by our members

98%
Satisfaction Rate

Members who recommend us to friends*

*Based on internal member survey, Q4 2024, n=500

Our Core Values

These principles guide everything we do at Relevant Reflex

Trust & Security

We protect your data with bank-level security and never share your personal information without consent. Your privacy is our priority.

Fair Compensation

Every survey you complete is fairly compensated. We ensure timely payments and transparent reward structures.

Member-Centric

Our members are at the center of everything we do. We continuously improve our platform based on your feedback.

Innovation

We're constantly evolving our platform with new features and better user experiences to serve you better.

Community

We've built more than a platform - we've built a community of engaged Indian consumers making their voices heard.

Local Focus

We understand the Indian market and provide surveys that are relevant to local consumers and culture.

Independently Listed & Verified

Relevant Reflex is independently researched and listed on Paid Survey Hub India — a free third-party directory that verifies paid survey platforms for Indian users. Only platforms with a proven track record of accepting Indian members and making actual payments are listed. Our presence there is not paid or sponsored — it is based on verified legitimacy.

View Our Listing on Paid Survey Hub India ↗

Ready to Share Your Opinions?

Join thousands of Indians who are earning money with their valuable insights!

Join Relevant Reflex Today
-------------------- END OF FILE -------------------- ### FILE 2: RR COM/admin-auth.php - Type: PHP - Size: 48.39 KB - Path: RR COM - Name: admin-auth.php ------------------------------------------------------------ pdo = $db->getConnection(); } catch (Exception $e) { logError('Admin auth database connection failed: ' . $e->getMessage()); throw new Exception('Database connection failed'); } } /** * Expose the PDO connection for shared use (e.g. attachment handler) */ public function getConnection() { return $this->pdo; } public function login($username, $password, $rememberMe = false) { try { // Find admin user $stmt = $this->pdo->prepare(" SELECT id, username, email, password, full_name, role, status, COALESCE(allowed_tabs, 'all') as allowed_tabs, COALESCE(allowed_ticket_types, 'all') as allowed_ticket_types FROM admin_users WHERE (username = ? OR email = ?) AND status = 'active' "); $stmt->execute([$username, $username]); $admin = $stmt->fetch(); if (!$admin || !verifyPassword($password, $admin['password'])) { logError('Admin login failed', ['username' => $username]); return false; } // Create session session_start(); session_regenerate_id(true); $_SESSION['admin_logged_in'] = true; $_SESSION['admin_id'] = $admin['id']; $_SESSION['admin_username'] = $admin['username']; $_SESSION['admin_full_name'] = $admin['full_name']; $_SESSION['admin_role'] = $admin['role']; $_SESSION['admin_login_time'] = time(); // Permissions - super_admin always gets 'all' $_SESSION['admin_allowed_tabs'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_tabs']; $_SESSION['admin_allowed_ticket_types'] = ($admin['role'] === 'super_admin') ? 'all' : $admin['allowed_ticket_types']; // Update last login $stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$admin['id']]); // Handle remember me if ($rememberMe) { $token = generateSecureToken(); $expires = date('Y-m-d H:i:s', strtotime('+30 days')); $stmt = $this->pdo->prepare(" INSERT INTO admin_sessions (admin_id, session_token, expires_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE session_token = ?, expires_at = ? "); $stmt->execute([$admin['id'], $token, $expires, $token, $expires]); setcookie('admin_remember_token', $token, strtotime('+30 days'), '/', '', true, true); } logError('Admin login successful', [ 'admin_id' => $admin['id'], 'username' => $admin['username'], 'role' => $admin['role'] ]); return true; } catch (Exception $e) { logError('Admin login error', ['username' => $username, 'error' => $e->getMessage()]); return false; } } public function logout() { session_start(); if (isset($_SESSION['admin_id'])) { logError('Admin logout', ['admin_id' => $_SESSION['admin_id']]); } // Clear remember token if (isset($_COOKIE['admin_remember_token'])) { try { $stmt = $this->pdo->prepare("DELETE FROM admin_sessions WHERE session_token = ?"); $stmt->execute([$_COOKIE['admin_remember_token']]); } catch (Exception $e) { logError('Error clearing admin remember token', ['error' => $e->getMessage()]); } setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true); } // Clear session $_SESSION = []; session_destroy(); header('Location: support.php'); exit; } public function isLoggedIn() { session_start(); if (isset($_SESSION['admin_logged_in']) && $_SESSION['admin_logged_in'] === true) { return true; } // Check remember me token if (isset($_COOKIE['admin_remember_token'])) { return $this->checkRememberToken($_COOKIE['admin_remember_token']); } return false; } private function checkRememberToken($token) { try { $stmt = $this->pdo->prepare(" SELECT au.id, au.username, au.full_name, au.role FROM admin_sessions ass JOIN admin_users au ON ass.admin_id = au.id WHERE ass.session_token = ? AND ass.expires_at > NOW() AND au.status = 'active' "); $stmt->execute([$token]); $session = $stmt->fetch(); if ($session) { // Restore session $_SESSION['admin_logged_in'] = true; $_SESSION['admin_id'] = $session['id']; $_SESSION['admin_username'] = $session['username']; $_SESSION['admin_full_name'] = $session['full_name']; $_SESSION['admin_role'] = $session['role']; $_SESSION['admin_login_time'] = time(); // Update last login $stmt = $this->pdo->prepare("UPDATE admin_users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$session['id']]); return true; } else { // Invalid or expired token - delete it setcookie('admin_remember_token', '', time() - 3600, '/', '', true, true); } } catch (Exception $e) { logError('Error checking admin remember token', ['error' => $e->getMessage()]); } return false; } public function requireAdmin() { if (!$this->isLoggedIn()) { header('Location: support.php'); exit; } } public function getCurrentAdmin() { if (!$this->isLoggedIn()) { return null; } session_start(); return [ 'id' => $_SESSION['admin_id'], 'username' => $_SESSION['admin_username'], 'full_name' => $_SESSION['admin_full_name'], 'role' => $_SESSION['admin_role'], 'allowed_tabs' => $_SESSION['admin_allowed_tabs'] ?? 'all', 'allowed_ticket_types' => $_SESSION['admin_allowed_ticket_types'] ?? 'all' ]; } /** * Check if current admin has access to a specific tab */ public function hasTabAccess($tabName) { $allowed = $_SESSION['admin_allowed_tabs'] ?? 'all'; if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return true; $tabs = array_map('trim', explode(',', $allowed)); return in_array($tabName, $tabs); } /** * Get allowed ticket sender types for current admin * Returns array like ['member','partner','client'] or ['all'] */ public function getAllowedTicketTypes() { $allowed = $_SESSION['admin_allowed_ticket_types'] ?? 'all'; if ($allowed === 'all' || $_SESSION['admin_role'] === 'super_admin') return ['all']; return array_map('trim', explode(',', $allowed)); } public function createAdmin($username, $email, $password, $fullName, $role = 'admin', $mobile = null, $allowedTabs = 'all', $allowedTicketTypes = 'all') { try { // Check if username or email already exists $stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE username = ? OR email = ?"); $stmt->execute([$username, $email]); if ($stmt->fetch()) { return ['success' => false, 'message' => 'A user with this email already exists.']; } // Create admin user $hashedPassword = hashPassword($password); $stmt = $this->pdo->prepare(" INSERT INTO admin_users (username, email, password, full_name, mobile, role, allowed_tabs, allowed_ticket_types, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'active') "); $result = $stmt->execute([$username, $email, $hashedPassword, $fullName, $mobile, $role, $allowedTabs, $allowedTicketTypes]); if ($result) { logError('Admin user created', ['username' => $username, 'email' => $email, 'role' => $role]); return ['success' => true, 'message' => 'User created successfully.', 'id' => $this->pdo->lastInsertId()]; } return ['success' => false, 'message' => 'Failed to create user.']; } catch (Exception $e) { logError('Error creating admin user', ['username' => $username, 'error' => $e->getMessage()]); return ['success' => false, 'message' => 'Database error: ' . $e->getMessage()]; } } /** * Update an existing admin user */ public function updateAdmin($id, $fullName, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $newPassword = null) { try { // Prevent editing super_admin role away from user ID 1 $stmt = $this->pdo->prepare("SELECT id, role FROM admin_users WHERE id = ?"); $stmt->execute([$id]); $existing = $stmt->fetch(); if (!$existing) return ['success' => false, 'message' => 'User not found.']; // Check email uniqueness (excluding current user) $stmt = $this->pdo->prepare("SELECT id FROM admin_users WHERE email = ? AND id != ?"); $stmt->execute([$email, $id]); if ($stmt->fetch()) return ['success' => false, 'message' => 'Email already in use by another user.']; if ($newPassword) { $hashed = hashPassword($newPassword); $stmt = $this->pdo->prepare(" UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?, allowed_tabs = ?, allowed_ticket_types = ?, password = ?, updated_at = NOW() WHERE id = ? "); $stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $hashed, $id]); } else { $stmt = $this->pdo->prepare(" UPDATE admin_users SET full_name = ?, email = ?, username = ?, mobile = ?, role = ?, allowed_tabs = ?, allowed_ticket_types = ?, updated_at = NOW() WHERE id = ? "); $stmt->execute([$fullName, $email, $email, $mobile, $role, $allowedTabs, $allowedTicketTypes, $id]); } logError('Admin user updated', ['admin_id' => $id, 'email' => $email]); return ['success' => true, 'message' => 'User updated successfully.']; } catch (Exception $e) { logError('Error updating admin user', ['id' => $id, 'error' => $e->getMessage()]); return ['success' => false, 'message' => 'Database error.']; } } /** * Toggle admin user active/inactive */ public function toggleAdminStatus($id) { try { $stmt = $this->pdo->prepare("UPDATE admin_users SET status = IF(status='active','inactive','active'), updated_at = NOW() WHERE id = ? AND id != 1"); $stmt->execute([$id]); return $stmt->rowCount() > 0; } catch (Exception $e) { logError('Error toggling admin status', ['id' => $id, 'error' => $e->getMessage()]); return false; } } /** * Get detailed admin user by ID */ public function getAdminById($id) { try { $stmt = $this->pdo->prepare("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users WHERE id = ?"); $stmt->execute([$id]); return $stmt->fetch(); } catch (Exception $e) { return null; } } /** * Get all admin users with full details (for Users tab) */ public function getAllAdminUsersDetailed() { try { $stmt = $this->pdo->query("SELECT id, username, email, full_name, mobile, role, status, allowed_tabs, allowed_ticket_types, created_at, last_login FROM admin_users ORDER BY id ASC"); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching admin users detailed', ['error' => $e->getMessage()]); return []; } } // SUPPORT TICKET METHODS public function getAllTickets($status = null, $priority = null, $senderType = null, $limit = 50, $offset = 0, $allowedTypes = null) { try { $where = "1=1"; $params = []; if ($status) { $where .= " AND st.status = ?"; $params[] = $status; } if ($priority) { $where .= " AND st.priority = ?"; $params[] = $priority; } if ($senderType) { if ($senderType === 'member') { $where .= " AND (st.sender_type = 'member' OR st.sender_type IS NULL)"; } else { $where .= " AND st.sender_type = ?"; $params[] = $senderType; } } // Permission-based sender_type restriction if ($allowedTypes && !in_array('all', $allowedTypes)) { $typePlaceholders = []; foreach ($allowedTypes as $t) { if ($t === 'member') { $typePlaceholders[] = "(st.sender_type = 'member' OR st.sender_type IS NULL)"; } else { $typePlaceholders[] = "st.sender_type = ?"; $params[] = $t; } } $where .= " AND (" . implode(' OR ', $typePlaceholders) . ")"; } $stmt = $this->pdo->prepare(" SELECT st.*, u.email as user_email, au.full_name as assigned_admin_name, COALESCE(st.sender_type, 'member') as sender_type, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count FROM support_tickets st LEFT JOIN users u ON st.user_id = u.id LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE $where ORDER BY st.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); $tickets = $stmt->fetchAll(); // For partner tickets, fetch partner info from shop database $partnerIds = []; foreach ($tickets as $t) { if ($t['sender_type'] === 'partner' && $t['sender_id']) { $partnerIds[$t['sender_id']] = true; } } if (!empty($partnerIds)) { $partnerInfo = $this->getPartnerInfoFromShop(array_keys($partnerIds)); foreach ($tickets as &$t) { if ($t['sender_type'] === 'partner' && isset($partnerInfo[$t['sender_id']])) { $p = $partnerInfo[$t['sender_id']]; $t['partner_name'] = $p['company_name']; $t['partner_code'] = $p['affiliate_code']; if (empty($t['user_email'])) { $t['user_email'] = $p['email']; } } } unset($t); } // For client tickets, fetch client info from shop database $clientIds = []; foreach ($tickets as $t) { if ($t['sender_type'] === 'client' && $t['sender_id']) { $clientIds[$t['sender_id']] = true; } } if (!empty($clientIds)) { $clientInfo = $this->getClientInfoFromShop(array_keys($clientIds)); foreach ($tickets as &$t) { if ($t['sender_type'] === 'client' && isset($clientInfo[$t['sender_id']])) { $c = $clientInfo[$t['sender_id']]; $t['client_name'] = $c['company_name']; $t['client_code'] = $c['client_code']; $t['client_contact'] = $c['contact_person']; if (empty($t['user_email'])) { $t['user_email'] = $c['email']; } } } unset($t); } return $tickets; } catch (Exception $e) { logError('Error fetching tickets', ['error' => $e->getMessage()]); return []; } } public function getTicketStats($allowedTypes = null) { try { $where = "1=1"; $params = []; // Permission-based filtering if ($allowedTypes && !in_array('all', $allowedTypes)) { $typePlaceholders = []; foreach ($allowedTypes as $t) { if ($t === 'member') { $typePlaceholders[] = "(sender_type = 'member' OR sender_type IS NULL)"; } else { $typePlaceholders[] = "sender_type = ?"; $params[] = $t; } } $where .= " AND (" . implode(' OR ', $typePlaceholders) . ")"; } $stmt = $this->pdo->prepare(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'open' THEN 1 ELSE 0 END) as open, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'resolved' THEN 1 ELSE 0 END) as resolved, SUM(CASE WHEN status = 'closed' THEN 1 ELSE 0 END) as closed, SUM(CASE WHEN sender_type = 'member' OR sender_type IS NULL THEN 1 ELSE 0 END) as member_tickets, SUM(CASE WHEN sender_type = 'partner' THEN 1 ELSE 0 END) as partner_tickets, SUM(CASE WHEN sender_type = 'client' THEN 1 ELSE 0 END) as client_tickets FROM support_tickets WHERE $where "); $stmt->execute($params); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching ticket stats', ['error' => $e->getMessage()]); return ['total' => 0, 'open' => 0, 'pending' => 0, 'resolved' => 0, 'closed' => 0, 'member_tickets' => 0, 'partner_tickets' => 0, 'client_tickets' => 0]; } } public function getTicketById($ticketId) { try { $stmt = $this->pdo->prepare(" SELECT st.*, u.email as user_email, u.gender, u.date_of_birth, u.postcode, au.full_name as assigned_admin_name, COALESCE(st.sender_type, 'member') as sender_type FROM support_tickets st LEFT JOIN users u ON st.user_id = u.id LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.id = ? "); $stmt->execute([$ticketId]); $ticket = $stmt->fetch(); // For partner tickets, fetch partner info from shop database if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) { $partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]); if (isset($partnerInfo[$ticket['sender_id']])) { $p = $partnerInfo[$ticket['sender_id']]; $ticket['partner_name'] = $p['company_name']; $ticket['partner_code'] = $p['affiliate_code']; $ticket['partner_incharge'] = $p['incharge_name']; if (empty($ticket['user_email'])) { $ticket['user_email'] = $p['email']; } } } // For client tickets, fetch client info from shop database if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) { $clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]); if (isset($clientInfo[$ticket['sender_id']])) { $c = $clientInfo[$ticket['sender_id']]; $ticket['client_name'] = $c['company_name']; $ticket['client_code'] = $c['client_code']; $ticket['client_contact'] = $c['contact_person']; if (empty($ticket['user_email'])) { $ticket['user_email'] = $c['email']; } } } return $ticket; } catch (Exception $e) { logError('Error fetching ticket', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return null; } } public function getTicketMessages($ticketId, $includeInternal = false) { try { $where = $includeInternal ? "1=1" : "is_internal = 0"; $stmt = $this->pdo->prepare(" SELECT sm.*, CASE WHEN sm.sender_type = 'user' THEN u.email WHEN sm.sender_type = 'admin' THEN au.full_name END as sender_name FROM support_messages sm LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id WHERE sm.ticket_id = ? AND $where ORDER BY sm.created_at ASC "); $stmt->execute([$ticketId]); $messages = $stmt->fetchAll(); // For partner ticket messages where sender_name is NULL (partner sender_id not in users table) // fetch partner info from shop database $needsPartnerName = false; foreach ($messages as $msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $needsPartnerName = true; break; } } if ($needsPartnerName) { // Get ticket to find partner/client sender_id $stmtT = $this->pdo->prepare("SELECT sender_type, sender_id FROM support_tickets WHERE id = ?"); $stmtT->execute([$ticketId]); $ticket = $stmtT->fetch(); if ($ticket && $ticket['sender_type'] === 'partner' && $ticket['sender_id']) { $partnerInfo = $this->getPartnerInfoFromShop([$ticket['sender_id']]); $partnerName = isset($partnerInfo[$ticket['sender_id']]) ? $partnerInfo[$ticket['sender_id']]['company_name'] : 'Partner'; foreach ($messages as &$msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $msg['sender_name'] = $partnerName; } } unset($msg); } // Client name resolution if ($ticket && $ticket['sender_type'] === 'client' && $ticket['sender_id']) { $clientInfo = $this->getClientInfoFromShop([$ticket['sender_id']]); $clientName = isset($clientInfo[$ticket['sender_id']]) ? $clientInfo[$ticket['sender_id']]['company_name'] : 'Client'; foreach ($messages as &$msg) { if ($msg['sender_type'] === 'user' && empty($msg['sender_name'])) { $msg['sender_name'] = $clientName; } } unset($msg); } } return $messages; } catch (Exception $e) { logError('Error fetching ticket messages', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return []; } } public function updateTicketStatus($ticketId, $status, $adminId) { try { $stmt = $this->pdo->prepare(" UPDATE support_tickets SET status = ?, resolved_at = CASE WHEN ? = 'resolved' COLLATE utf8mb4_unicode_ci THEN NOW() ELSE resolved_at END WHERE id = ? "); $result = $stmt->execute([$status, $status, $ticketId]); if ($result) { logError('Ticket status updated', [ 'ticket_id' => $ticketId, 'status' => $status, 'admin_id' => $adminId ]); } return $result; } catch (Exception $e) { logError('Error updating ticket status', ['ticket_id' => $ticketId, 'error' => $e->getMessage()]); return false; } } /** * Fetch partner info from the shop database (affiliates table is in u752449863_rrshop) * @param array $partnerIds Array of affiliate IDs * @return array Keyed by affiliate ID => [company_name, affiliate_code, email, incharge_name] */ private function getPartnerInfoFromShop($partnerIds) { $result = []; if (empty($partnerIds)) return $result; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $placeholders = implode(',', array_fill(0, count($partnerIds), '?')); $stmt = $shopPdo->prepare("SELECT id, company_name, affiliate_code, email, incharge_name FROM affiliates WHERE id IN ($placeholders)"); $stmt->execute(array_values($partnerIds)); foreach ($stmt->fetchAll() as $row) { $result[$row['id']] = $row; } } catch (Exception $e) { logError('Error fetching partner info from shop DB', ['error' => $e->getMessage()]); } return $result; } /** * Fetch client info from the shop database (clients table is in u752449863_rrshop) * @param array $clientIds Array of client IDs * @return array Keyed by client ID => [company_name, client_code, email, contact_person] */ private function getClientInfoFromShop($clientIds) { $result = []; if (empty($clientIds)) return $result; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); $placeholders = implode(',', array_fill(0, count($clientIds), '?')); $stmt = $shopPdo->prepare("SELECT id, company_name, client_code, email, contact_person FROM clients WHERE id IN ($placeholders)"); $stmt->execute(array_values($clientIds)); foreach ($stmt->fetchAll() as $row) { $result[$row['id']] = $row; } } catch (Exception $e) { logError('Error fetching client info from shop DB', ['error' => $e->getMessage()]); } return $result; } public function assignTicket($ticketId, $adminId) { try { $stmt = $this->pdo->prepare("UPDATE support_tickets SET assigned_to = ?, updated_at = NOW() WHERE id = ?"); return $stmt->execute([$adminId, $ticketId]); } catch (Exception $e) { logError('Error assigning ticket', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]); return false; } } public function addTicketReply($ticketId, $message, $adminId, $isInternal = false) { try { $stmt = $this->pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'admin', ?, ?, ?) "); $result = $stmt->execute([$ticketId, $adminId, $message, $isInternal]); if ($result) { // Capture the inserted message ID BEFORE any other queries $messageId = $this->pdo->lastInsertId(); // Update ticket timestamp $stmt = $this->pdo->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?"); $stmt->execute([$ticketId]); // Return the actual message ID (not boolean) so attachments link correctly return $messageId; } return false; } catch (Exception $e) { logError('Error adding ticket reply', ['ticket_id' => $ticketId, 'admin_id' => $adminId, 'error' => $e->getMessage()]); return false; } } public function getAdminUsers() { try { $stmt = $this->pdo->prepare("SELECT id, username, full_name, role FROM admin_users WHERE status = 'active' ORDER BY full_name"); $stmt->execute(); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching admin users', ['error' => $e->getMessage()]); return []; } } // REDEMPTION MANAGEMENT METHODS public function getAllRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) { try { $where = "1=1"; $params = []; if ($status && $status !== 'all') { $where .= " AND rr.status = ?"; $params[] = $status; } if ($dateFilter) { switch ($dateFilter) { case 'today': $where .= " AND DATE(rr.created_at) = CURDATE()"; break; case 'yesterday': $where .= " AND DATE(rr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)"; break; case 'this_week': $where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)"; break; case 'this_month': $where .= " AND rr.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)"; break; } } $stmt = $this->pdo->prepare(" SELECT rr.*, u.email as user_email, au.full_name as processed_by_name, (SELECT COUNT(*) FROM redemption_requests WHERE user_id = rr.user_id) as user_total_redemptions FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id LEFT JOIN admin_users au ON rr.processed_by = au.id WHERE $where ORDER BY rr.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching redemptions', ['error' => $e->getMessage()]); return []; } } public function getRedemptionStats() { try { $stmt = $this->pdo->query(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed, SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed, SUM(CASE WHEN status = 'cancelled' THEN 1 ELSE 0 END) as cancelled, SUM(CASE WHEN status = 'pending' THEN amount_inr ELSE 0 END) as pending_amount, SUM(CASE WHEN status IN ('processing', 'completed') THEN amount_inr ELSE 0 END) as processed_amount FROM redemption_requests "); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching redemption stats', ['error' => $e->getMessage()]); return [ 'total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'failed' => 0, 'cancelled' => 0, 'pending_amount' => 0, 'processed_amount' => 0 ]; } } public function updateRedemptionStatus($redemptionId, $status, $adminNotes, $adminId, $paymentRef = null, $paymentMode = 'UPI', $disbursalDate = null) { try { $this->pdo->beginTransaction(); // Get redemption details $stmt = $this->pdo->prepare("SELECT * FROM redemption_requests WHERE id = ?"); $stmt->execute([$redemptionId]); $redemption = $stmt->fetch(); if (!$redemption) { throw new Exception('Redemption request not found'); } // Update redemption status with payment fields $stmt = $this->pdo->prepare(" UPDATE redemption_requests SET status = ?, admin_notes = ?, processed_by = ?, processed_at = NOW(), payment_reference = ?, payment_mode = ?, disbursal_date = ?, updated_at = NOW() WHERE id = ? "); $finalDisbursalDate = ($status === 'completed' && $disbursalDate) ? $disbursalDate : null; $finalPaymentRef = ($status === 'completed') ? $paymentRef : null; $stmt->execute([$status, $adminNotes, $adminId, $finalPaymentRef, $paymentMode, $finalDisbursalDate, $redemptionId]); // Update point transaction status $stmt = $this->pdo->prepare(" UPDATE point_transactions SET status = ? WHERE reference_id = ? AND transaction_type = 'redeemed' "); $stmt->execute([$status, $redemption['request_id']]); // If status is failed or cancelled, refund the points if (in_array($status, ['failed', 'cancelled'])) { $stmt = $this->pdo->prepare(" UPDATE user_points SET points = points + ?, total_redeemed = total_redeemed - ? WHERE user_id = ? "); $stmt->execute([$redemption['points_redeemed'], $redemption['points_redeemed'], $redemption['user_id']]); // Add refund transaction $refundDescription = "Refund for {$status} redemption request - " . $redemption['request_id']; $stmt = $this->pdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, 'refund', ?, ?) "); $stmt->execute([$redemption['user_id'], $redemption['points_redeemed'], $refundDescription, $redemption['request_id']]); } $this->pdo->commit(); logError('Redemption status updated', [ 'redemption_id' => $redemptionId, 'request_id' => $redemption['request_id'], 'old_status' => $redemption['status'], 'new_status' => $status, 'admin_id' => $adminId, 'admin_notes' => $adminNotes ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error updating redemption status', [ 'redemption_id' => $redemptionId, 'error' => $e->getMessage() ]); return false; } } public function getRedemptionById($redemptionId) { try { $stmt = $this->pdo->prepare(" SELECT rr.*, u.email as user_email, u.gender, u.date_of_birth, u.postcode, au.full_name as processed_by_name, up.points as user_current_points, up.total_earned, up.total_redeemed FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id LEFT JOIN admin_users au ON rr.processed_by = au.id LEFT JOIN user_points up ON rr.user_id = up.user_id WHERE rr.id = ? "); $stmt->execute([$redemptionId]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return null; } } public function getRecentRedemptions($limit = 5) { try { $stmt = $this->pdo->prepare(" SELECT rr.request_id, rr.amount_inr, rr.status, rr.created_at, u.email as user_email FROM redemption_requests rr LEFT JOIN users u ON rr.user_id = u.id ORDER BY rr.created_at DESC LIMIT ? "); $stmt->execute([$limit]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching recent redemptions', ['error' => $e->getMessage()]); return []; } } // ======================================== // PARTNER REDEMPTION METHODS // ======================================== /** * Get a separate PDO connection to the rrshop database */ private function getShopPdo() { return new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false] ); } /** * Get all partner redemptions with affiliate details */ public function getAllPartnerRedemptions($status = null, $dateFilter = null, $limit = 50, $offset = 0) { try { $shopPdo = $this->getShopPdo(); $where = "1=1"; $params = []; if ($status && $status !== 'all') { $where .= " AND pr.status = ?"; $params[] = $status; } if ($dateFilter) { switch ($dateFilter) { case 'today': $where .= " AND DATE(pr.created_at) = CURDATE()"; break; case 'yesterday': $where .= " AND DATE(pr.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY)"; break; case 'this_week': $where .= " AND pr.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)"; break; case 'this_month': $where .= " AND MONTH(pr.created_at) = MONTH(NOW()) AND YEAR(pr.created_at) = YEAR(NOW())"; break; } } $limit = intval($limit); $offset = intval($offset); $stmt = $shopPdo->prepare(" SELECT pr.*, a.company_name, a.affiliate_code, a.email as partner_email, a.incharge_name, a.mobile FROM partner_redemptions pr LEFT JOIN affiliates a ON pr.affiliate_id = a.id WHERE $where ORDER BY pr.created_at DESC LIMIT $limit OFFSET $offset "); $stmt->execute($params); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching partner redemptions', ['error' => $e->getMessage()]); return []; } } /** * Get a single partner redemption with full affiliate details */ public function getPartnerRedemptionById($redemptionId) { try { $shopPdo = $this->getShopPdo(); $stmt = $shopPdo->prepare(" SELECT pr.*, a.company_name, a.affiliate_code, a.email as partner_email, a.incharge_name, a.mobile, a.commission_balance, a.total_commission_earned, a.total_commission_redeemed, a.total_signups, a.total_verified_signups FROM partner_redemptions pr LEFT JOIN affiliates a ON pr.affiliate_id = a.id WHERE pr.id = ? "); $stmt->execute([$redemptionId]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return null; } } /** * Get partner redemption statistics */ public function getPartnerRedemptionStats() { try { $shopPdo = $this->getShopPdo(); $stmt = $shopPdo->query(" SELECT COUNT(*) as total, SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending, SUM(CASE WHEN status = 'processing' THEN 1 ELSE 0 END) as processing, SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed, SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) as rejected, SUM(CASE WHEN status IN ('pending','processing') THEN amount ELSE 0 END) as pending_amount, SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) as completed_amount FROM partner_redemptions "); $result = $stmt->fetch(); return $result ?: ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0]; } catch (Exception $e) { logError('Error fetching partner redemption stats', ['error' => $e->getMessage()]); return ['total' => 0, 'pending' => 0, 'processing' => 0, 'completed' => 0, 'rejected' => 0, 'pending_amount' => 0, 'completed_amount' => 0]; } } /** * Update partner redemption status with disbursal details * On 'completed': deducts from commission_balance, adds to total_commission_redeemed * On 'rejected': refunds if balance was already deducted */ public function updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $adminId, $paymentMode = 'UPI', $paymentAmount = null, $disbursalDate = null) { try { $shopPdo = $this->getShopPdo(); // Get current redemption $stmt = $shopPdo->prepare("SELECT * FROM partner_redemptions WHERE id = ?"); $stmt->execute([$redemptionId]); $redemption = $stmt->fetch(); if (!$redemption) { logError('Partner redemption not found', ['id' => $redemptionId]); return false; } $oldStatus = $redemption['status']; $amount = floatval($redemption['amount']); $affiliateId = $redemption['affiliate_id']; // Check if admin exists in rrshop.admin_users (FK constraint) $processedBy = null; try { $stmt = $shopPdo->prepare("SELECT id FROM admin_users WHERE id = ?"); $stmt->execute([$adminId]); if ($stmt->fetch()) { $processedBy = $adminId; } } catch (Exception $e) { /* admin_users may not exist */ } $shopPdo->beginTransaction(); // Build rejection reason $rejectionReason = ($newStatus === 'rejected') ? $adminNotes : $redemption['rejection_reason']; // Ensure null for empty optional fields if (empty($disbursalDate)) $disbursalDate = ($newStatus === 'completed') ? date('Y-m-d') : null; if ($paymentAmount === null || $paymentAmount <= 0) $paymentAmount = ($newStatus === 'completed') ? $amount : null; // Update the redemption record $stmt = $shopPdo->prepare(" UPDATE partner_redemptions SET status = ?, payment_reference = ?, payment_mode = ?, payment_amount = ?, disbursal_date = ?, notes = ?, rejection_reason = ?, processed_by = ?, processed_at = NOW(), updated_at = NOW() WHERE id = ? "); $stmt->execute([ $newStatus, $paymentRef ?: null, $paymentMode ?: 'UPI', $paymentAmount, $disbursalDate, $adminNotes ?: null, $rejectionReason, $processedBy, $redemptionId ]); // Handle balance changes if ($newStatus === 'completed' && $oldStatus !== 'completed') { $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_redeemed = COALESCE(total_commission_redeemed, 0) + ? WHERE id = ? "); $stmt->execute([$amount, $affiliateId]); } elseif ($newStatus === 'rejected' && $oldStatus === 'completed') { $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_redeemed = GREATEST(0, COALESCE(total_commission_redeemed, 0) - ?) WHERE id = ? "); $stmt->execute([$amount, $affiliateId]); } // Recalculate commission_balance $stmt = $shopPdo->prepare("SELECT COALESCE(SUM(amount), 0) FROM partner_redemptions WHERE affiliate_id = ? AND status IN ('pending','processing')"); $stmt->execute([$affiliateId]); $pendingSum = floatval($stmt->fetchColumn()); $stmt = $shopPdo->prepare(" UPDATE affiliates SET commission_balance = total_commission_earned - COALESCE(total_commission_redeemed, 0) - ? WHERE id = ? "); $stmt->execute([$pendingSum, $affiliateId]); $shopPdo->commit(); logError('Partner redemption updated', [ 'redemption_id' => $redemptionId, 'old_status' => $oldStatus, 'new_status' => $newStatus, 'amount' => $amount, 'payment_amount' => $paymentAmount, 'admin_id' => $adminId ]); return true; } catch (Exception $e) { if (isset($shopPdo) && $shopPdo->inTransaction()) { $shopPdo->rollBack(); } logError('Error updating partner redemption', ['redemption_id' => $redemptionId, 'error' => $e->getMessage()]); return 'DB Error: ' . $e->getMessage(); } } } // Utility functions function adminJsonResponse($success, $message, $data = null) { header('Content-Type: application/json'); header('Cache-Control: no-cache, no-store, must-revalidate'); header('Pragma: no-cache'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } ?> -------------------- END OF FILE -------------------- ### FILE 3: RR COM/admin-support.php - Type: PHP - Size: 117.75 KB - Path: RR COM - Name: admin-support.php ------------------------------------------------------------ logout(); } // Handle login form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && !$auth->isLoggedIn()) { $username = isset($_POST['username']) ? sanitize($_POST['username']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $rememberMe = isset($_POST['remember_me']); if ($auth->login($username, $password, $rememberMe)) { header('Location: support.php'); exit; } else { $loginError = 'Invalid username or password.'; } } // Handle AJAX requests for logged-in admins if ($auth->isLoggedIn() && $_SERVER['REQUEST_METHOD'] === 'POST') { $action = isset($_POST['action']) ? $_POST['action'] : ''; $admin = $auth->getCurrentAdmin(); switch ($action) { // SUPPORT TICKET ACTIONS case 'update_status': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $status = isset($_POST['status']) ? sanitize($_POST['status']) : ''; if ($ticketId && in_array($status, ['open', 'pending', 'resolved', 'closed'])) { $success = $auth->updateTicketStatus($ticketId, $status, $admin['id']); adminJsonResponse($success, $success ? 'Status updated successfully' : 'Failed to update status'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'assign_ticket': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $adminId = isset($_POST['admin_id']) ? intval($_POST['admin_id']) : 0; if ($ticketId && $adminId) { $success = $auth->assignTicket($ticketId, $adminId); adminJsonResponse($success, $success ? 'Ticket assigned successfully' : 'Failed to assign ticket'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'add_reply': $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $isInternal = isset($_POST['is_internal']) ? (bool)$_POST['is_internal'] : false; if ($ticketId && $message) { $messageId = $auth->addTicketReply($ticketId, $message, $admin['id'], $isInternal); if ($messageId) { // Handle file attachments using the exact message ID returned if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { $pdo = $auth->getConnection(); handleSupportAttachments($pdo, intval($messageId), $_FILES['attachments']); } adminJsonResponse(true, 'Reply added successfully'); } else { adminJsonResponse(false, 'Failed to add reply'); } } else { adminJsonResponse(false, 'Message cannot be empty'); } break; // MEMBER REDEMPTION ACTIONS case 'update_redemption_status': $redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0; $newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : ''; $adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : ''; $paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : null; $paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI'; $disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null; if (!in_array($newStatus, ['pending', 'processing', 'completed', 'failed', 'cancelled'])) { adminJsonResponse(false, 'Invalid status'); } if ($newStatus === 'completed' && empty($paymentRef)) { adminJsonResponse(false, 'Transaction reference is required for completed payments'); } if ($redemptionId && $newStatus) { $success = $auth->updateRedemptionStatus($redemptionId, $newStatus, $adminNotes, $admin['id'], $paymentRef, $paymentMode, $disbursalDate); adminJsonResponse($success, $success ? 'Redemption status updated successfully' : 'Failed to update status'); } else { adminJsonResponse(false, 'Invalid parameters'); } break; // PARTNER REDEMPTION ACTIONS case 'update_partner_redemption_status': $redemptionId = isset($_POST['redemption_id']) ? intval($_POST['redemption_id']) : 0; $newStatus = isset($_POST['status']) ? sanitize($_POST['status']) : ''; $adminNotes = isset($_POST['admin_notes']) ? sanitize($_POST['admin_notes']) : ''; $paymentRef = isset($_POST['payment_reference']) ? sanitize($_POST['payment_reference']) : ''; $paymentMode = isset($_POST['payment_mode']) ? sanitize($_POST['payment_mode']) : 'UPI'; $paymentAmount = isset($_POST['payment_amount']) && $_POST['payment_amount'] !== '' ? floatval($_POST['payment_amount']) : null; $disbursalDate = isset($_POST['disbursal_date']) && $_POST['disbursal_date'] !== '' ? sanitize($_POST['disbursal_date']) : null; if (!in_array($newStatus, ['pending', 'processing', 'completed', 'rejected'])) { adminJsonResponse(false, 'Invalid status'); } if ($newStatus === 'completed' && empty($paymentRef)) { adminJsonResponse(false, 'Transaction number is required for completed payments'); } if ($redemptionId && $newStatus) { $result = $auth->updatePartnerRedemptionStatus($redemptionId, $newStatus, $adminNotes, $paymentRef, $admin['id'], $paymentMode, $paymentAmount, $disbursalDate); if ($result === true) { adminJsonResponse(true, 'Partner redemption updated successfully'); } else { adminJsonResponse(false, is_string($result) ? $result : 'Failed to update status'); } } else { adminJsonResponse(false, 'Invalid parameters'); } break; case 'create_admin': $username = isset($_POST['new_username']) ? sanitize($_POST['new_username']) : ''; $email = isset($_POST['new_email']) ? sanitize($_POST['new_email']) : ''; $password = isset($_POST['new_password']) ? $_POST['new_password'] : ''; $fullName = isset($_POST['new_full_name']) ? sanitize($_POST['new_full_name']) : ''; $role = isset($_POST['new_role']) ? sanitize($_POST['new_role']) : 'admin'; if ($username && $email && $password && $fullName) { $success = $auth->createAdmin($username, $email, $password, $fullName, $role); adminJsonResponse($success, $success ? 'Admin user created successfully' : 'Failed to create admin user (username or email may already exist)'); } else { adminJsonResponse(false, 'All fields are required'); } break; // USER MANAGEMENT ACTIONS (super_admin only) case 'create_user': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : ''; $uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : ''; $uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : ''; $uPassword = isset($_POST['password']) ? $_POST['password'] : ''; $uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin'; $uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all'; $uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all'; if (empty($uName) || empty($uEmail) || empty($uPassword)) { adminJsonResponse(false, 'Name, email and password are required.'); break; } if (strlen($uPassword) < 6) { adminJsonResponse(false, 'Password must be at least 6 characters.'); break; } $result = $auth->createAdmin($uEmail, $uEmail, $uPassword, $uName, $uRole, $uMobile, $uTabs, $uTicketTypes); adminJsonResponse($result['success'], $result['message']); break; case 'update_user': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0; $uName = isset($_POST['full_name']) ? trim($_POST['full_name']) : ''; $uEmail = isset($_POST['email']) ? trim(strtolower($_POST['email'])) : ''; $uMobile = isset($_POST['mobile']) ? trim($_POST['mobile']) : ''; $uRole = isset($_POST['role']) ? sanitize($_POST['role']) : 'admin'; $uTabs = isset($_POST['allowed_tabs']) ? implode(',', $_POST['allowed_tabs']) : 'all'; $uTicketTypes = isset($_POST['allowed_ticket_types']) ? implode(',', $_POST['allowed_ticket_types']) : 'all'; $uPassword = isset($_POST['password']) && !empty($_POST['password']) ? $_POST['password'] : null; if (!$uId || empty($uName) || empty($uEmail)) { adminJsonResponse(false, 'Name and email are required.'); break; } if ($uPassword && strlen($uPassword) < 6) { adminJsonResponse(false, 'Password must be at least 6 characters.'); break; } $result = $auth->updateAdmin($uId, $uName, $uEmail, $uMobile, $uRole, $uTabs, $uTicketTypes, $uPassword); adminJsonResponse($result['success'], $result['message']); break; case 'toggle_user_status': if ($admin['role'] !== 'super_admin') { adminJsonResponse(false, 'Access denied'); break; } $uId = isset($_POST['user_id']) ? intval($_POST['user_id']) : 0; if ($uId) { $success = $auth->toggleAdminStatus($uId); adminJsonResponse($success, $success ? 'Status toggled successfully' : 'Cannot change this user\'s status'); } else { adminJsonResponse(false, 'Invalid user ID'); } break; default: adminJsonResponse(false, 'Invalid action'); } } // If admin is logged in, get data if ($auth->isLoggedIn()) { $admin = $auth->getCurrentAdmin(); $isSuperAdmin = ($admin['role'] === 'super_admin'); $allowedTicketTypes = $auth->getAllowedTicketTypes(); // Get current tab $currentTab = isset($_GET['tab']) ? sanitize($_GET['tab']) : 'tickets'; // Enforce tab permissions (users tab = super_admin only) if ($currentTab === 'users' && !$isSuperAdmin) $currentTab = 'tickets'; if (!$isSuperAdmin && !$auth->hasTabAccess($currentTab)) { // Fallback to first allowed tab $allTabs = ['tickets','redemptions','partner_redemptions']; $currentTab = 'tickets'; foreach ($allTabs as $t) { if ($auth->hasTabAccess($t)) { $currentTab = $t; break; } } } // Get filters from URL $statusFilter = isset($_GET['status']) ? sanitize($_GET['status']) : null; $priorityFilter = isset($_GET['priority']) ? sanitize($_GET['priority']) : null; $senderTypeFilter = isset($_GET['sender_type']) ? sanitize($_GET['sender_type']) : null; $dateFilter = isset($_GET['date_filter']) ? sanitize($_GET['date_filter']) : null; $page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1; $limit = 25; $offset = ($page - 1) * $limit; // Get specific ticket if viewing one $viewTicketId = isset($_GET['ticket']) ? intval($_GET['ticket']) : null; $viewTicket = null; $ticketMessages = []; $messageAttachments = []; if ($viewTicketId) { $viewTicket = $auth->getTicketById($viewTicketId); if ($viewTicket) { $ticketMessages = $auth->getTicketMessages($viewTicketId, true); // Load attachments for all messages if ($supportHelperLoaded && !empty($ticketMessages)) { try { $db = new Database(); $pdo = $db->getConnection(); $msgIds = array_column($ticketMessages, 'id'); if (!empty($msgIds)) { $messageAttachments = getAttachmentsForMessages($pdo, $msgIds); } } catch (Exception $e) { $messageAttachments = []; } } } } // Get specific redemption if viewing one $viewRedemptionId = isset($_GET['redemption']) ? intval($_GET['redemption']) : null; $viewRedemption = null; if ($viewRedemptionId) { if ($currentTab === 'partner_redemptions') { $viewRedemption = $auth->getPartnerRedemptionById($viewRedemptionId); } else { $viewRedemption = $auth->getRedemptionById($viewRedemptionId); } } // Get data based on current tab if ($currentTab === 'redemptions') { $redemptions = $auth->getAllRedemptions($statusFilter, $dateFilter, $limit, $offset); $redemptionStats = $auth->getRedemptionStats(); } elseif ($currentTab === 'partner_redemptions') { $partnerRedemptions = $auth->getAllPartnerRedemptions($statusFilter, $dateFilter, $limit, $offset); $partnerRedemptionStats = $auth->getPartnerRedemptionStats(); } elseif ($currentTab === 'users' && $isSuperAdmin) { $allAdminUsers = $auth->getAllAdminUsersDetailed(); $editUserId = isset($_GET['edit_user']) ? intval($_GET['edit_user']) : null; $editUser = $editUserId ? $auth->getAdminById($editUserId) : null; } else { $tickets = $auth->getAllTickets($statusFilter, $priorityFilter, $senderTypeFilter, $limit, $offset, $allowedTicketTypes); $ticketStats = $auth->getTicketStats($allowedTicketTypes); } $adminUsers = $auth->getAdminUsers(); } ?> Support - Relevant Reflex
RELEVANT REFLEXADMIN PANEL isLoggedIn()): ?>
isLoggedIn()): ?>

Admin Login

Total Tickets
Open
Pending
Resolved
Member
Partner
Client
Total Redemptions
Pending
Processing
Completed
Pending Amount
Total Requests
Pending
Processing
Completed
Pending Amount
Total Users
$u['status'] === 'active')); ?>
Active
$u['role'] === 'super_admin')); ?>
Super Admins
$u['role'] === 'admin')); ?>
Admins

Ticket:

Partner Details:
Company:
Code:
Contact:
Email:
Client Details:
Company:
Client Code:
Contact Person:
Email:

User:

Status:

Priority:

Created:

Conversation
Internal

'; foreach ($messageAttachments[$message['id']] as $att) { $ext = strtolower(pathinfo($att['original_name'], PATHINFO_EXTENSION)); if (in_array($ext, ['jpg','jpeg','png','gif','webp'])) $icon = 'fa-file-image'; elseif ($ext === 'pdf') $icon = 'fa-file-pdf'; elseif (in_array($ext, ['doc','docx'])) $icon = 'fa-file-word'; elseif (in_array($ext, ['xls','xlsx','csv'])) $icon = 'fa-file-excel'; else $icon = 'fa-file-alt'; $sizeMB = number_format(($att['file_size'] ?? 0) / 1024 / 1024, 1); echo ' ' . htmlspecialchars($att['original_name']) . ' (' . $sizeMB . ' MB)'; } echo '
'; } } ?>
No Tickets Found

No support tickets match your current filters.

Subject Type From Priority Status Date Msgs
Back to Redemptions

Redemption Request Details

Request ID:

User:

Amount:

Points: points

UPI ID:

Status:

Created:

Processed:

Processed by:

Txn Ref:

Payment Mode:

Disbursal Date:

Admin Notes:
User Points Summary:
Current Balance: points | Total Earned: points | Total Redeemed: points
No Redemptions Found

No redemption requests match your current filters.

Request ID User Amount Points UPI Status Date
by
Back to Partner Redemptions

Partner Redemption Details PARTNER

Request ID:

Amount:

UPI ID:

Transaction No:

Paid Amount:

Status:

Created:

Payment Mode:

Disbursal Date:

Processed:

Partner Details:
Company:
Code:
Contact:
Email:
Mobile:

Commission Balance: ₹
Total Earned: ₹
Total Redeemed: ₹
Signups: (Verified: )
Admin Notes:
Rejection Reason:
No Partner Redemptions Found

No partner redemption requests match your current filters.

Request ID Partner Amount UPI Status Date
PARTNER
Back to Users
Edit User:
No Users Found
Name Email Mobile Role Menu Access Ticket Types Status Last Login
SUPER ADMIN ADMIN All'; } else { $tabMap = ['tickets'=>'Tickets','redemptions'=>'M. Payouts','partner_redemptions'=>'P. Payouts']; foreach (explode(',', $tabs) as $t) { echo '' . ($tabMap[trim($t)] ?? trim($t)) . ' '; } } ?> All'; } else { foreach (explode(',', $types) as $t) { $t = trim($t); echo '' . ucfirst($t) . ' '; } } ?> Active Inactive
-------------------- END OF FILE -------------------- ### FILE 4: RR COM/ajax-spam-done.php - Type: PHP - Size: 891 B - Path: RR COM - Name: ajax-spam-done.php ------------------------------------------------------------ false]); exit; } if (!isLoggedIn()) { echo json_encode(['success' => false, 'message' => 'Not logged in']); exit; } $user = getCurrentUser(); if (!$user) { echo json_encode(['success' => false, 'message' => 'User not found']); exit; } try { $db = new Database(); $pdo = $db->getConnection(); $pdo->prepare("UPDATE users SET spam_notice_done = 1 WHERE id = ?") ->execute([$user['id']]); echo json_encode(['success' => true]); } catch (Exception $e) { error_log('ajax-spam-done error: ' . $e->getMessage()); echo json_encode(['success' => false, 'message' => 'DB error']); } -------------------- END OF FILE -------------------- ### FILE 5: RR COM/articles.php - Type: PHP - Size: 32.12 KB - Path: RR COM - Name: articles.php ------------------------------------------------------------ Survey Tips, Guides & Articles for India | Relevant Reflex

Articles & Guides

Honest advice, tips and guides to help you earn more from paid surveys in India.

New in April 2026
Earning Guide
April 9, 2026  ·  10 min read

Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

An honest breakdown based on real data from 50,000+ members — beginner to experienced earnings tables, per-survey payouts, and the 5 factors that determine your income.

Read Article →
Platform Review
April 9, 2026  ·  11 min read

Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

We review our own platform honestly — real payout data, member experiences, ratings across 6 dimensions, and a clear-eyed look at our limitations.

Read Article →
Comparison
April 9, 2026  ·  13 min read

Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

Side-by-side comparison of Relevant Reflex, Swagbucks, Toluna, ySense and OpinionWorld — UPI support, minimum payouts, survey volume, pros and cons.

Read Article →
For Students
April 9, 2026  ·  10 min read

Online Surveys India for Students: Earn Pocket Money in College (2026)

Why college students are a valued survey demographic, how to fit surveys into your schedule, what you can realistically earn, and UPI payout tips for students.

Read Article →
For Homemakers
April 10, 2026  ·  10 min read

Online Surveys India for Housewives: Work From Home and Earn in 2026

Why homemakers receive high-value surveys, a practical daily schedule, realistic earnings of ₹1,000–₹3,500/month, and how UPI payout works for financial independence.

Read Article →
Earlier Articles
Complete Guide
April 13, 2026  ·  12 min read

How to Earn Money with Online Surveys in India: The Complete Guide (2026)

Everything you need to know — what surveys are, how much you earn, step-by-step how to start, and pro tips from a platform with 50,000+ verified members.

Read Article →
Avoiding Scams
December 15, 2024  ·  8 min read

How to Identify Genuine Survey Websites in India

Key indicators of legitimate platforms, red flags of scams, and how to verify a survey site before joining. Essential reading for anyone starting with online surveys.

Read Article →
Tips & Tricks
December 10, 2024  ·  7 min read

5 Ways to Maximise Your Survey Earnings in India

Practical strategies to increase your monthly income — profile optimisation, timing, platform selection, and the profiler survey habit that most members overlook.

Read Article →
Getting Started
December 5, 2024  ·  9 min read

Complete Guide for Survey Beginners in India

From registration to your first UPI payout — choosing the right platforms, setting up your profile, understanding survey types, and payment methods in India.

Read Article →
Maximize Earnings
November 28, 2024  ·  8 min read

Realistic Earning Expectations from Surveys in India

Set proper expectations — beginners ₹500–₹1,500/month, active users ₹2,000–₹4,000/month. What factors determine where you fall and how to move up.

Read Article →
India Specific
November 20, 2024  ·  9 min read

Best Survey Platforms for Indian Users

Overview of platforms that work best for Indian users — payment methods, survey availability, UPI support, and which ones suit different types of members.

Read Article →
Tips & Tricks
November 15, 2024  ·  6 min read

Time Management Tips for Survey Takers in India

How to balance survey participation with your daily routine — when to check, how to prioritise higher-paying surveys, and habits that make consistent earners.

Read Article →
Payment Guide
April 22, 2026  ·  7 min read

How to Get Paid via UPI for Online Surveys in India (2026)

How UPI payments work on survey platforms, which apps are supported, minimum thresholds compared, payment timelines and tips to get paid faster.

Read Article →
Tips & Warnings
April 22, 2026  ·  9 min read

10 Common Mistakes That Get You Banned from Paid Survey Sites in India

Rushing surveys, using a VPN, inconsistent answers, multiple accounts — the 10 mistakes that get Indian members suspended and exactly how to avoid them.

Read Article →
FAQ
April 22, 2026  ·  15 min read

Paid Surveys India: 30 Most Asked Questions Answered (2026)

Comprehensive answers to the 30 most common questions about paid surveys in India — earnings, UPI payments, screen-outs, account issues, taxes and more.

Read Article →
Scam Warning
April 22, 2026  ·  10 min read

Survey Scams India 2026: How to Identify and Avoid Fake Survey Sites

8 red flags of fake survey sites, real scam tactics used in India, and how to verify any platform is legitimate before joining. Essential reading for all survey takers.

Read Article →

Ready to Start Earning?

Join 50,000+ Indians already earning with Relevant Reflex. Free to join — UPI payments — ₹500 minimum payout.

Join Free Today How It Works
-------------------- END OF FILE -------------------- ### FILE 6: RR COM/check-session.php - Type: PHP - Size: 976 B - Path: RR COM - Name: check-session.php ------------------------------------------------------------ checkSessionTimeout(120); $isValid = isLoggedIn(); $user = null; if ($isValid) { $user = getCurrentUser(); // If user doesn't exist or is not active, invalidate session if (!$user || $user['status'] !== 'active') { logout(); $isValid = false; } } echo json_encode([ 'valid' => $isValid, 'user_id' => $isValid ? $user['id'] : null, 'email' => $isValid ? $user['email'] : null, 'timestamp' => time() ]); } catch (Exception $e) { logError('Session check error', ['error' => $e->getMessage()]); echo json_encode([ 'valid' => false, 'error' => 'Session check failed', 'timestamp' => time() ]); } ?> -------------------- END OF FILE -------------------- ### FILE 7: RR COM/close-project-rewards.php - Type: PHP - Size: 20.69 KB - Path: RR COM - Name: close-project-rewards.php ------------------------------------------------------------ mailed incentive: member gets higher amount (survey took longer) * - If actual LOI incentive < mailed incentive: member keeps original promise (can't reduce) * - Final reward = max(mailed_incentive, actual_loi_incentive) * * POINTS CONVERSION: * - 1 point = ₹0.50 (i.e. ₹1 = 2 points) * - All incentive calculations are in rupees first, then converted to points for crediting * * Place in: /public_html/close-project-rewards.php * Called by: clients/close-project.php when project status changes to "Closed" */ // Conversion rate: 1 point = ₹0.50, so ₹1 = 2 points define('POINTS_PER_RUPEE', 2); /** * Calculate incentive from LOI (same formula used in send-invitations.php) * Base ₹10 + ₹1 per minute beyond 5 minutes * Returns value in RUPEES */ function calculateIncentiveFromLOI($loiMinutes) { $base = 10; $extra = max(0, floor($loiMinutes) - 5); return $base + $extra; } /** * Convert rupees to points */ function rupeesToPoints($rupees) { return round($rupees * POINTS_PER_RUPEE); } function processProjectCloseRewards($projectNumericId, $shopPdo = null, $panelPdo = null) { $summary = [ 'members_rewarded' => 0, 'total_member_points' => 0, 'total_member_rupees' => 0, 'affiliates_rewarded' => 0, 'total_affiliate_commission' => 0, 'incentive_note' => '', 'errors' => [] ]; try { // Get DB connections if ($shopPdo === null) { if (function_exists('getClientDBConnection')) { $shopPdo = getClientDBConnection(); } elseif (function_exists('getDBConnection')) { $shopPdo = getDBConnection(); } else { throw new Exception('No shop database connection available'); } } if ($panelPdo === null) { if (function_exists('getPanelDBConnection')) { $panelPdo = getPanelDBConnection(); } else { $summary['errors'][] = 'No panel DB connection - member points not credited'; $panelPdo = null; } } // Get project details $stmt = $shopPdo->prepare("SELECT * FROM projects WHERE id = ?"); $stmt->execute([$projectNumericId]); $project = $stmt->fetch(); if (!$project) { $summary['errors'][] = 'Project not found'; return $summary; } $projectCode = $project['project_id']; // e.g. RRIT130226001 $eloi = (int)($project['eloi'] ?? 0); // ===================================================== // CALCULATE ACTUAL AVG LOI FOR THE PROJECT // ===================================================== $actualAvgLoiMinutes = 0; try { $stmt = $shopPdo->prepare(" SELECT AVG(actual_loi_seconds) as avg_loi_seconds, SUM(CASE WHEN actual_loi_seconds IS NOT NULL THEN 1 ELSE 0 END) as with_loi FROM survey_urls WHERE project_id = ? AND status = 'complete' AND quality_flag = 'valid' "); $stmt->execute([$projectCode]); $loiStats = $stmt->fetch(); if ($loiStats && $loiStats['with_loi'] > 0 && $loiStats['avg_loi_seconds'] > 0) { $actualAvgLoiMinutes = round($loiStats['avg_loi_seconds'] / 60, 1); } else { // Fallback to ELOI if no actual LOI data $actualAvgLoiMinutes = $eloi; } } catch (Exception $e) { $actualAvgLoiMinutes = $eloi; } // Calculate actual-LOI-based incentive (in RUPEES) $actualLoiIncentive = calculateIncentiveFromLOI($actualAvgLoiMinutes); // Determine reward per complete from project level (in RUPEES) $rewardPerComplete = floatval($project['reward_per_complete'] ?? 0); // Get all selections for this project $stmt = $shopPdo->prepare("SELECT * FROM project_selections WHERE project_id = ?"); $stmt->execute([$projectNumericId]); $selections = $stmt->fetchAll(); if (empty($selections)) { $summary['errors'][] = 'No selections found'; return $summary; } foreach ($selections as $selection) { $selectionId = $selection['id']; // ===================================================== // DETERMINE MAILED (ORIGINAL) INCENTIVE (in RUPEES) // ===================================================== $mailedIncentive = $rewardPerComplete > 0 ? $rewardPerComplete : floatval($selection['reward_per_complete'] ?? 0); if ($mailedIncentive <= 0) { $mailedIncentive = floatval($selection['incentive_amount'] ?? 0); } // ===================================================== // APPLY INCENTIVE MODEL: max(mailed, actual_loi_based) // Both values are in RUPEES // ===================================================== $finalRewardRupees = max($mailedIncentive, $actualLoiIncentive); // Convert RUPEES to POINTS (₹1 = 2 points) $finalRewardPoints = rupeesToPoints($finalRewardRupees); // Determine the reason/note $rewardNote = ''; if ($actualLoiIncentive > $mailedIncentive && $mailedIncentive > 0) { $rewardNote = ' (Adjusted up: survey avg LOI ' . $actualAvgLoiMinutes . ' min exceeded estimate, incentive increased from ₹' . number_format($mailedIncentive, 0) . ' to ₹' . number_format($finalRewardRupees, 0) . ')'; $summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) exceeded estimate (' . $eloi . ' min). Member incentive adjusted upward.'; } elseif ($actualLoiIncentive < $mailedIncentive && $mailedIncentive > 0) { $rewardNote = ' (Original promised incentive maintained despite lower avg LOI)'; if (empty($summary['incentive_note'])) { $summary['incentive_note'] = 'Actual avg LOI (' . $actualAvgLoiMinutes . ' min) was lower than estimate (' . $eloi . ' min). Original promised incentive of ₹' . number_format($mailedIncentive, 0) . ' maintained for members.'; } } if ($finalRewardRupees <= 0) { $summary['errors'][] = "Selection #{$selectionId}: no reward set - skipping member rewards"; } // Find all selection_members with sample_status = 'complete' $stmt = $shopPdo->prepare(" SELECT sm.* FROM selection_members sm WHERE sm.selection_id = ? AND sm.sample_status = 'complete' "); $stmt->execute([$selectionId]); $completeMembers = $stmt->fetchAll(); foreach ($completeMembers as $member) { $userId = $member['user_id']; try { // ======================================== // 1. CREDIT MEMBER SURVEY REWARD // ======================================== if ($finalRewardRupees > 0 && $panelPdo !== null) { // Check if already credited $alreadyCredited = false; try { $stmt = $shopPdo->prepare("SELECT id FROM survey_rewards_log WHERE user_id = ? AND project_id = ?"); $stmt->execute([$userId, $projectCode]); $alreadyCredited = (bool)$stmt->fetch(); } catch (Exception $e) { /* table might not exist */ } if (!$alreadyCredited) { // Log in shop DB (store POINTS) try { $stmt = $shopPdo->prepare(" INSERT INTO survey_rewards_log (user_id, project_id, selection_id, points_awarded, status) VALUES (?, ?, ?, ?, 'pending') "); $stmt->execute([$userId, $projectCode, $selectionId, $finalRewardPoints]); } catch (Exception $e) { error_log("survey_rewards_log insert: " . $e->getMessage()); } // Credit POINTS in panel DB $stmt = $panelPdo->prepare(" UPDATE user_points SET points = points + ?, total_earned = total_earned + ? WHERE user_id = ? "); $stmt->execute([$finalRewardPoints, $finalRewardPoints, $userId]); if ($stmt->rowCount() === 0) { $stmt = $panelPdo->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? "); $stmt->execute([$userId, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints, $finalRewardPoints]); } // Add transaction record (POINTS) with LOI adjustment note $txnDesc = 'Survey reward: ' . $projectCode . ' - ' . $project['project_name'] . ' (₹' . number_format($finalRewardRupees, 2) . ' = ' . $finalRewardPoints . ' pts)' . $rewardNote; $stmt = $panelPdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, 'survey_reward', ?, ?) "); $stmt->execute([$userId, $finalRewardPoints, $txnDesc, $projectCode]); // Update survey_responses in panel DB // incentive_amount = RUPEES (what was promised), points_awarded = POINTS try { $stmt = $panelPdo->prepare(" INSERT INTO survey_responses (user_id, project_id, selection_id, status, incentive_amount, points_awarded, reward_status, completed_at) VALUES (?, ?, ?, 'complete', ?, ?, 'pending', NOW()) ON DUPLICATE KEY UPDATE points_awarded = ?, reward_status = 'pending' "); $stmt->execute([$userId, $projectCode, $selectionId, $finalRewardRupees, $finalRewardPoints, $finalRewardPoints]); } catch (Exception $e) { /* non-critical */ } // Update selection_members points_awarded (POINTS) try { $stmt = $shopPdo->prepare("UPDATE selection_members SET points_awarded = ? WHERE selection_id = ? AND user_id = ?"); $stmt->execute([$finalRewardPoints, $selectionId, $userId]); } catch (Exception $e) { /* non-critical */ } $summary['members_rewarded']++; $summary['total_member_points'] += $finalRewardPoints; $summary['total_member_rupees'] += $finalRewardRupees; } } // ========================================== // 2. CREDIT AFFILIATE REVENUE SHARE // ========================================== $stmt = $shopPdo->prepare(" SELECT a.id as affiliate_id, a.signup_reward FROM affiliate_signups asu JOIN affiliates a ON asu.affiliate_id = a.id WHERE asu.panel_user_id = ? AND asu.email_verified = 1 LIMIT 1 "); $stmt->execute([$userId]); $affiliateLink = $stmt->fetch(); if ($affiliateLink) { $affiliateId = $affiliateLink['affiliate_id']; $revenueShare = 0; // Try survey_reward column first try { $stmt = $shopPdo->prepare("SELECT survey_reward FROM affiliates WHERE id = ?"); $stmt->execute([$affiliateId]); $row = $stmt->fetch(); $revenueShare = floatval($row['survey_reward'] ?? 0); } catch (Exception $e) { /* column might not exist */ } // Fallback: revenue_share_per_survey if ($revenueShare <= 0) { try { $stmt = $shopPdo->prepare("SELECT revenue_share_per_survey FROM affiliates WHERE id = ?"); $stmt->execute([$affiliateId]); $row = $stmt->fetch(); $revenueShare = floatval($row['revenue_share_per_survey'] ?? 0); } catch (Exception $e) { /* column might not exist */ } } // Fallback: percentage of member reward (use RUPEE value) if ($revenueShare <= 0 && $finalRewardRupees > 0) { $commPct = floatval($project['affiliate_commission_pct'] ?? 10); $revenueShare = round($finalRewardRupees * ($commPct / 100), 2); } if ($revenueShare > 0) { $alreadyCredited = false; try { $stmt = $shopPdo->prepare(" SELECT id FROM partner_commission_log WHERE affiliate_id = ? AND type = 'survey_revenue_share' AND reference_id = ? AND panel_user_id = ? "); $stmt->execute([$affiliateId, $projectCode, $userId]); $alreadyCredited = (bool)$stmt->fetch(); } catch (Exception $e) { /* table might not exist */ } if (!$alreadyCredited) { try { $stmt = $shopPdo->prepare(" INSERT INTO partner_commission_log (affiliate_id, type, amount, reference_id, panel_user_id, description) VALUES (?, 'survey_revenue_share', ?, ?, ?, ?) "); $stmt->execute([$affiliateId, $revenueShare, $projectCode, $userId, 'Survey revenue share: ' . $projectCode . ' - ' . $project['project_name']]); } catch (Exception $e) { error_log("partner_commission_log insert: " . $e->getMessage()); } $stmt = $shopPdo->prepare(" UPDATE affiliates SET total_commission_earned = total_commission_earned + ?, commission_balance = commission_balance + ? WHERE id = ? "); $stmt->execute([$revenueShare, $revenueShare, $affiliateId]); $summary['affiliates_rewarded']++; $summary['total_affiliate_commission'] += $revenueShare; } } } // ========================================== // 3. CREDIT MEMBER REFERRAL SURVEY COMMISSION // ========================================== // Check if this user was referred by another member if ($panelPdo !== null) { try { $refStmt = $panelPdo->prepare(" SELECT id, referrer_user_id FROM member_referral_clicks WHERE referee_user_id = ? AND email_verified = 1 LIMIT 1 "); $refStmt->execute([$userId]); $refRow = $refStmt->fetch(); if ($refRow && $refRow['referrer_user_id'] != $userId) { $mReferrerId = $refRow['referrer_user_id']; $surveyCommPts = 10; // Rs.5 = 10 points $surveyCommRs = 5.00; // Prevent double crediting for same user+project $dupCheck = $panelPdo->prepare(" SELECT COUNT(*) as cnt FROM point_transactions WHERE user_id = ? AND source = 'member_referral_survey' AND reference_id = ? AND description LIKE ? "); $dupCheck->execute([$mReferrerId, $projectCode, '%uid:'.$userId.'%']); $dupRow = $dupCheck->fetch(); if ($dupRow['cnt'] == 0) { // Award points to referrer $panelPdo->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? ")->execute([$mReferrerId, $surveyCommPts, $surveyCommPts, $surveyCommPts, $surveyCommPts]); $panelPdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id, created_at) VALUES (?, 'earned', ?, 'member_referral_survey', ?, ?, NOW()) ")->execute([ $mReferrerId, $surveyCommPts, 'Survey referral reward: your referral completed ' . $projectCode . ' (₹5 = 10 pts, uid:' . $userId . ')', $projectCode ]); // Update survey_commission_earned on the click record $panelPdo->prepare(" UPDATE member_referral_clicks SET survey_commission_earned = survey_commission_earned + ? WHERE id = ? ")->execute([$surveyCommRs, $refRow['id']]); } } } catch (Exception $e) { $summary['errors'][] = "Member referral survey commission (user {$userId}): " . $e->getMessage(); } } } catch (Exception $e) { $summary['errors'][] = "User {$userId}: " . $e->getMessage(); } } } } catch (Exception $e) { $summary['errors'][] = $e->getMessage(); } return $summary; } ?> -------------------- END OF FILE -------------------- ### FILE 8: RR COM/config.php - Type: PHP - Size: 3.88 KB - Path: RR COM - Name: config.php ------------------------------------------------------------ connection = new PDO( "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { error_log("Database connection failed: " . $e->getMessage()); die("Connection failed. Please try again later."); } } public function getConnection() { return $this->connection; } } // Utility functions function sanitize($data) { return htmlspecialchars(strip_tags(trim($data)), ENT_QUOTES, 'UTF-8'); } function generateSecureToken($length = 64) { return bin2hex(random_bytes($length / 2)); } function hashPassword($password) { return password_hash($password, PASSWORD_DEFAULT); } function verifyPassword($password, $hash) { return password_verify($password, $hash); } function validateEmail($email) { return filter_var($email, FILTER_VALIDATE_EMAIL) && preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email); } function validatePassword($password) { // At least 8 characters return strlen($password) >= 8; } function validateDateOfBirth($dob) { $date = DateTime::createFromFormat('Y-m-d', $dob); if (!$date) return false; // Check if user is at least 18 years old $today = new DateTime(); $age = $today->diff($date)->y; return $age >= 18; } function validatePostcode($postcode) { // Indian postal code validation (6 digits) return preg_match('/^[0-9]{6}$/', $postcode); } // JSON response helper function jsonResponse($success, $message, $data = null) { header('Content-Type: application/json'); echo json_encode([ 'success' => $success, 'message' => $message, 'data' => $data ]); exit; } // Error logging function function logError($message, $context = []) { $logMessage = date('Y-m-d H:i:s') . ' - ' . $message; if (!empty($context)) { $logMessage .= ' - Context: ' . json_encode($context); } error_log($logMessage . PHP_EOL, 3, 'errors.log'); } ?> -------------------- END OF FILE -------------------- ### FILE 9: RR COM/contact.php - Type: PHP - Size: 25.44 KB - Path: RR COM - Name: contact.php ------------------------------------------------------------ $name, 'email' => $email, 'subject' => $subject, 'message' => substr($message, 0, 100) . '...' ]); $success_message = 'Thank you for your message! We\'ll get back to you within 24 hours.'; // Clear form data $_POST = []; } } ?> Contact Relevant Reflex | Survey Platform Support India

Email Support

Get help with your account, payments, or technical issues.

support@relevantreflex.com

WhatsApp Support

Message us on WhatsApp for quick support. We typically respond within 24 hours on business days (Mon–Sat, 9am–6pm IST).

Chat on WhatsApp

Update the number in contact.php before going live.

Our Location

Ethirmedu, NH 544
Tamilnadu - 638183
India

Serving All of India

Send Us a Message

Thank you for contacting us!

We'll review your message and get back to you as soon as possible.

Send Another Message Go to Dashboard

Frequently Asked Questions

How long does it take to get approved?

Account approval is typically instant after email verification. You can start taking surveys immediately after verifying your email address.

When do I get paid for completed surveys?

Payments are processed according to each survey provider's schedule. Most rewards are credited within 2-5 business days after survey completion.

Why was I disqualified from a survey?

Survey disqualifications happen when your profile doesn't match the target demographic. This is normal and helps ensure survey quality. Keep trying - there are surveys for all profiles!

How can I increase my survey opportunities?

Complete your profile thoroughly, answer profiling questions honestly, and check your dashboard regularly for new opportunities.

Is Relevant Reflex really free to join?

Yes! Joining Relevant Reflex is completely free. We never charge fees to our members. Legitimate survey companies pay YOU for your opinions, not the other way around.

-------------------- END OF FILE -------------------- ### FILE 10: RR COM/dashboard.php - Type: PHP - Size: 77.79 KB - Path: RR COM - Name: dashboard.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('DB failed: ' . $e->getMessage()); die('System error.'); } // Award onboarding points if (!$user['onboarding_points_awarded']) { try { $pdo->beginTransaction(); $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00")->execute([$user['id']]); $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'onboarding', 'Welcome bonus for joining Relevant Reflex')")->execute([$user['id']]); $pdo->prepare("UPDATE users SET onboarding_points_awarded = 1 WHERE id = ?")->execute([$user['id']]); $pdo->commit(); $user = getCurrentUser(); } catch (Exception $e) { $pdo->rollback(); } } $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) $profilerCompletion[$row['section']] = $row; } catch (Exception $e) {} $completedSections = 0; foreach ($profilerSections as $k => $n) { if (isset($profilerCompletion[$k]) && $profilerCompletion[$k]['is_completed']) $completedSections++; } $mobileVerified = false; $mobileNumber = ''; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $md = $stmt->fetch(); if ($md) { $mobileVerified = $md['is_verified']; $mobileNumber = $md['mobile_number']; } } catch (Exception $e) {} $upiId = ''; try { $stmt = $pdo->prepare("SELECT response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id = 'upi_id'"); $stmt->execute([$user['id']]); $ud = $stmt->fetch(); if ($ud) $upiId = json_decode($ud['response'], true); } catch (Exception $e) {} $panNumber = ''; $panName = ''; $panStatus = ''; try { $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id IN ('pan_number','pan_name','pan_status')"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { $val = json_decode($row['response'], true); if ($row['question_id'] === 'pan_number') $panNumber = $val ?: ''; elseif ($row['question_id'] === 'pan_name') $panName = $val ?: ''; elseif ($row['question_id'] === 'pan_status') $panStatus = $val ?: ''; } if (!empty($panNumber) && empty($panStatus)) $panStatus = 'pending'; } catch (Exception $e) {} if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_upi') { $newUpiId = isset($_POST['upi_id']) ? sanitize($_POST['upi_id']) : ''; if (!empty($newUpiId) && preg_match('/^[\w\.\-]+@[\w\.\-]+$/', $newUpiId)) { try { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'upi_id', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newUpiId); $stmt->execute([$user['id'], $j, $j]); $upiId = $newUpiId; $success_message = "UPI ID updated successfully!"; } catch (Exception $e) { $error_message = "Error updating UPI ID."; } } else { $error_message = "Please enter a valid UPI ID (e.g., yourname@paytm)."; } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_pan') { $newPanNumber = strtoupper(trim($_POST['pan_number'] ?? '')); $newPanName = trim($_POST['pan_name'] ?? ''); if (!empty($newPanNumber) && preg_match('/^[A-Z]{5}[0-9]{4}[A-Z]$/', $newPanNumber) && !empty($newPanName) && strlen($newPanName) >= 3) { try { $pdo->beginTransaction(); $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_number', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newPanNumber); $stmt->execute([$user['id'], $j, $j]); $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_name', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j2 = json_encode($newPanName); $stmt->execute([$user['id'], $j2, $j2]); // Reset status to pending on any edit (admin must re-approve) $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'pan_status', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j3 = json_encode('pending'); $stmt->execute([$user['id'], $j3, $j3]); $pdo->commit(); $panNumber = $newPanNumber; $panName = $newPanName; $panStatus = 'pending'; $success_message = "PAN details saved successfully! Verification is pending."; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); $error_message = "Error saving PAN details."; } } else { $error_message = "Invalid PAN. Must be 10 characters (e.g., ABCDE1234F) and name must be at least 3 characters."; } } $userTickets = []; try { $stmt = $pdo->prepare("SELECT st.*, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count, (SELECT sm.created_at FROM support_messages sm WHERE sm.ticket_id = st.id ORDER BY sm.created_at DESC LIMIT 1) as last_reply FROM support_tickets st WHERE st.user_id = ? ORDER BY st.created_at DESC LIMIT 10"); $stmt->execute([$user['id']]); $userTickets = $stmt->fetchAll(); } catch (Exception $e) {} $userRedemptions = []; try { $stmt = $pdo->prepare("SELECT * FROM redemption_requests WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt->execute([$user['id']]); $userRedemptions = $stmt->fetchAll(); } catch (Exception $e) {} // Survey history from shop DB $surveys = []; $surveyStats = ['total'=>0,'completes'=>0,'pending'=>0,'flagged'=>0]; try { $shopPdo = new PDO("mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4","u752449863_rradmin","S@n@h2016",[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); $cols = array_column($shopPdo->query("SHOW COLUMNS FROM survey_urls")->fetchAll(), 'Field'); $hasQF = in_array('quality_flag', $cols); $hasLoi = in_array('actual_loi_seconds', $cols); $hasCompAt = in_array('completed_at', $cols); $hasQN = in_array('quality_notes', $cols); $pcols = array_column($shopPdo->query("SHOW COLUMNS FROM projects")->fetchAll(), 'Field'); $hasCS = in_array('closure_status', $pcols); $hasSP = in_array('speedster_threshold_pct', $pcols); $qf = $hasQF ? "su.quality_flag" : "'valid' as quality_flag"; $qn = $hasQN ? "su.quality_notes" : "NULL as quality_notes"; $loi = $hasLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $cat = $hasCompAt ? "su.completed_at" : "NULL as completed_at"; $cs = $hasCS ? "p.closure_status" : "'none' as closure_status"; $sp = $hasSP ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.status as url_status, su.clicked_at, su.created_at as sent_at, su.rr_proxy_url, $qf, $qn, $loi, $cat, p.project_id, p.project_name, p.eloi, p.industry, p.status as project_status, $cs, $sp FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC LIMIT 30 "); $stmt->execute([$user['id']]); $surveys = $stmt->fetchAll(); foreach ($surveys as $s) { $surveyStats['total']++; if ($s['url_status']==='complete') { $surveyStats['completes']++; $q=$s['quality_flag']??'valid'; if (in_array($q,['speedster','ip_duplicate','client_flagged'])) $surveyStats['flagged']++; elseif ($s['project_status']!=='Closed') $surveyStats['pending']++; } } } catch (Exception $e) { error_log("Survey stats: ".$e->getMessage()); } // Compute actionable surveys (can be taken right now) $actionableSurveys = []; foreach ($surveys as $s) { if (in_array($s['url_status'], ['sent','clicked']) && $s['project_status'] === 'Live' && !empty($s['rr_proxy_url'])) $actionableSurveys[] = $s; } $actionableCount = count($actionableSurveys); $firstActionable = $actionableCount > 0 ? $actionableSurveys[0] : null; // Get survey-related point transactions from panel DB $surveyPointsByProject = []; try { $stmt = $pdo->prepare("SELECT reference_id, points, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('survey','survey_reward') AND transaction_type = 'earned' ORDER BY created_at DESC"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { if ($row['reference_id']) $surveyPointsByProject[$row['reference_id']] = $row; } } catch (Exception $e) {} // Get full rewards history for Rewards tab $rewardsHistory = []; try { $stmt = $pdo->prepare("SELECT transaction_type, points, source, description, reference_id, status, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 50"); $stmt->execute([$user['id']]); $rewardsHistory = $stmt->fetchAll(); } catch (Exception $e) {} $joinDateFormatted = (new DateTime($user['created_at']))->format('M Y'); $profilePct = round(($completedSections / count($profilerSections)) * 100); $firstName = htmlspecialchars($user['first_name'] ?? explode('@',$user['email'])[0]); $initials = strtoupper(substr($user['first_name']??$user['email'],0,1).substr($user['last_name']??'',0,1)); if (strlen($initials)<2) $initials = strtoupper(substr($user['email'],0,2)); function getSurveyLabel($s) { $st=$s['url_status']; $qf=$s['quality_flag']??'valid'; $ps=$s['project_status']; if ($st==='sent') return ['Invited','label-neutral','You have been invited to this survey. Click "Take Survey" below to participate.']; if ($st==='clicked') return ['In Progress','label-warn','You started this survey but haven\'t completed it yet. Click "Continue Survey" below to resume.']; if (in_array($st,['earlyscreenout','latescreenout'])) return ['Screened Out','label-neutral','You did not qualify based on screening criteria.']; if ($st==='quotafull') return ['Quota Full','label-neutral','The survey quota was filled before your response was recorded.']; if ($st==='timeout') return ['Timed Out','label-neutral','Session expired before completion.']; if ($st==='partial') return ['Partial','label-info','Your response was partially recorded.']; if ($st==='complete') { if (in_array($qf,['speedster','ip_duplicate','client_flagged'])) return ['Under Review','label-danger','Flagged for quality review. Points held pending admin decision.']; if ($ps==='Closed') return ['Approved','label-ok','Survey approved. Check Rewards tab for credited points.']; return ['Pending Approval','label-warn','Completed successfully. Points will credit when the project closes.']; } return [ucfirst($st),'label-neutral','']; } function fmtLoi($s){if(!$s)return'-';$m=floor($s/60);$ss=$s%60;return($m?$m.'m ':'').$ss.'s';} function fmtDt($d){if(!$d)return'-';return date('M d, Y g:i A',strtotime($d));} // ── PSH Review Campaign — load status ───────────────────────────────────── $pshCampStatus = null; $showPshBanner = false; try { $pdo->exec("CREATE TABLE IF NOT EXISTS psh_campaign_status ( user_id INT PRIMARY KEY, campaign_id INT DEFAULT 1, status ENUM('in_progress','completed','screened_out') DEFAULT 'in_progress', reviews_submitted INT DEFAULT 0, banner_closed TINYINT DEFAULT 0, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); $cs2 = $pdo->prepare("SELECT status, reviews_submitted, banner_closed FROM psh_campaign_status WHERE user_id = ?"); $cs2->execute([$user['id']]); $pshCampStatus = $cs2->fetch(); } catch (Exception $e) {} $showPshBanner = !$pshCampStatus || ($pshCampStatus['banner_closed'] == 0 && !in_array($pshCampStatus['status'], ['completed','screened_out'])); ?> Member Area - Relevant Reflex
Overview
English
English Default
Hindi हिन्दी
Bengali বাংলা
Telugu తెలుగు
Marathi मराठी
Tamil தமிழ்
Urdu اردو
Gujarati ગુજરાતી
Kannada ಕನ್ನಡ
Odia ଓଡ଼ିଆ
Malayalam മലയാളം
pts
Refer a Friend
0): ?>
— In Progress
min
Surveys Waiting For You!
Don't miss out — complete them to earn points new
No surveys available right now
We'll notify you when new surveys match your profile
None Available

Welcome back, !

Complete your profile, earn points, and participate in paid surveys.

Earn ₹5 per Review — New Campaign
Share your honest experience about survey platforms you use. Upload a proof screenshot and earn ₹5 per review (up to ₹15 total).
Continue Reviewing — Earn ₹ More
You've submitted review1?'s':''; ?>. more available. Each earns ₹5 after approval.
Important! Read 4 essential rules before taking any survey to protect your account and earn maximum rewards.
📬
Help us reach you faster — Never miss a paid survey!
Our emails sometimes land in your Spam or Junk folder. Follow these steps to make sure survey invitations always reach you:
  1. Open your email inbox at
  2. Look in your Spam, Junk, Promotions or Social folders
  3. Find any email from registration@relevantreflex.com
  4. Click "Not Spam" / "Move to Inbox" — this teaches your email provider to trust us
Available Points
value
Surveys Done
total
Profile
%
sections
Total Earned
Since
🎁
Invite Friends & Earn Cash!
Get ₹5 when they join + ₹5 for every survey they complete
Share & Earn
Complete Profile
Earn up to 70 points
Redeem Rewards
Convert points to cash
Get Help
Support & FAQs
⚠ Read This Before You Take Any Survey
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
0):?>
Total
Completed
Pending
0?'Under Review':'Approved';?>
0?$surveyStats['flagged']:$surveyStats['completes']-$surveyStats['pending']-$surveyStats['flagged'];?>
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). = normal LOI, = slow, = below threshold.
Survey History
$s): list($lbl,$cls,$desc)=getSurveyLabel($s); $eloiSec = intval($s['eloi']??0)*60; $thPct = floatval($s['speedster_threshold_pct']??33.33); $thSec = $eloiSec>0 ? $eloiSec*($thPct/100) : 0; $aLoi = $s['actual_loi_seconds'] ? intval($s['actual_loi_seconds']) : null; $loiPct = ($eloiSec>0 && $aLoi) ? min(100,round(($aLoi/$eloiSec)*100)) : 0; $loiCls = 'loi-ok'; if ($aLoi && $thSec>0 && $aLoi<$thSec) $loiCls='loi-fast'; elseif ($loiPct>150) $loiCls='loi-slow'; $pts = $surveyPointsByProject[$s['project_id']] ?? null; $rewardTxt = '-'; if ($s['url_status']==='complete') { if ($pts) $rewardTxt = number_format($pts['points'],0).' pts (₹'.number_format($pts['points']*0.5,2).')'; elseif (($s['quality_flag']??'valid')!=='valid') $rewardTxt = 'Held for review'; elseif ($s['project_status']==='Closed') $rewardTxt = 'Awaiting credit'; else $rewardTxt = 'Pending project closure'; } ?>
· ·
Invited On
Started At
Completed At
Your LOI
Expected LOI
min
Min Required LOI
0 ? fmtLoi(round($thSec)).' ('.$thPct.'%)' : '-';?>
Project Status
Reward

No surveys yet.

📊

No Surveys Yet

Complete your profile to receive survey invitations.

Know Me Better

Complete all sections to earn up to 70 points!

done
Mobile Verification
10 ptsVerify Now
$sn):$c=$profilerCompletion[$sk]??null;$d=$c&&$c['is_completed'];$pct=$c?$c['completion_percentage']:0;$pa=$c&&$c['points_awarded'];$ic=$d?'done':($pct>0?'part':'empty');$isISEC=$sk==='household_classification';$sectionPts=$isISEC?20:5;$rv=$sectionPts*0.5;$sectionRs=($rv==floor($rv))?number_format($rv,0):number_format($rv,2);?>
':round($pct).'%';?>
IMPORTANT
0?'In progress':($isISEC?'Required for survey matching':'Not started'));?>
ptsView>0?'Continue':'Start · ₹'.$sectionRs);?>
Available
Total Earned
Redeemed
Redeem Points
=500 && !empty($upiId)):?>

Minimum: 500 points (₹250). Cash via UPI to

Redeem Now =500 && empty($upiId)):?>
You have crossed the minimum redemption amount but have not updated your UPI ID in the Profile section. Please add your UPI ID first.
Update UPI in Profile
Need 500 points (₹250) minimum. You have more needed.
Recent Redemptions
# · pts → ₹
to ·
Paid via · Ref: ·
Rewards History
No rewards yet. Complete your profile and participate in surveys to earn points!
pts
Account
Email
Gender
Date of Birth
Postcode
Status
Active Verified
Mobile
+91 verified
Not verified
Verify
UPI Details

For reward payments.

e.g. yourname@paytm, yourname@phonepe
UPI:
PAN Details

Required for processing rewards and filing TDS records with the Income Tax Department.

Members with verified PAN are prioritized by clients for paid surveys & higher-value projects.
PAN Verified ()
PAN Rejected — Please re-submit with correct details.
Pending Verification ()
10-character PAN (e.g. ABCDE1234F)
Must match your PAN card exactly
-------------------- END OF FILE -------------------- ### FILE 11: RR COM/default.php - Type: PHP - Size: 15.99 KB - Path: RR COM - Name: default.php ------------------------------------------------------------ Default page

You Are All Set to Go!

All you have to do now is upload your website files and start your journey. Check out how to do that below:

-------------------- END OF FILE -------------------- ### FILE 12: RR COM/disclaimer.php - Type: PHP - Size: 17.26 KB - Path: RR COM - Name: disclaimer.php ------------------------------------------------------------ Earnings Disclaimer - Relevant Reflex | Important Information About Survey Rewards
Last Updated: March 2026
Important Notice: Please read this Earnings Disclaimer carefully before joining or using Relevant Reflex. Participation in our survey platform does not guarantee any specific level of income or earnings.

1. No Guaranteed Earnings

Relevant Reflex is an online survey platform that connects registered members with paid market research opportunities. We do not guarantee that you will earn any specific amount of money by participating in surveys on our platform.

Earnings from surveys are supplemental in nature and are not intended to replace a primary source of income. The amount you earn depends on many factors that are beyond our control.

2. Factors That Affect Earnings

Your actual earnings will vary based on a number of factors, including but not limited to:

  • The number and types of surveys available at any given time
  • Your demographic profile and how well it matches available survey requirements
  • The frequency and consistency of your participation
  • Your survey qualification rate (not all respondents qualify for every survey)
  • The time you invest in completing surveys
  • Survey availability in your geographic region
  • The specific research needs of our survey clients at any time

3. Member Testimonials and Income Examples

Any testimonials, earnings examples, or income figures shared on this website — including those from our members — represent individual results and are not typical. These are provided for illustrative purposes only.

Typical Results Disclaimer: The earnings mentioned in member stories and example income ranges on this site reflect individual experiences and do not represent average or typical results. Most members earn modest supplemental income. Your results will vary based on your demographics, time commitment, and survey availability.

We do not make any representation that the earnings experiences described by any member are typical, and individual results will vary significantly.

4. Survey Availability Is Not Guaranteed

The availability of surveys on our platform depends on the requirements of our research clients. We cannot guarantee:

  • A minimum number of surveys per day, week, or month
  • Consistent survey availability throughout the year
  • That you will qualify for every survey you attempt
  • That surveys will remain open until you complete them

5. Payment and Reward Terms

Rewards are subject to the payment terms and conditions set out in our Terms and Conditions. Rewards are paid via UPI transfer upon reaching the minimum payout threshold of ₹500. Payment timing is subject to verification and processing periods.

6. Not Financial or Professional Advice

Nothing on the Relevant Reflex website, including this page, constitutes financial advice, investment advice, or professional guidance of any kind. Survey participation is a supplemental earning activity only.

7. Contact Us

If you have any questions about this Earnings Disclaimer, please contact us at:

support@relevantreflex.com
Ethirmedu, NH 544, Tamilnadu - 638183, India

-------------------- END OF FILE -------------------- ### FILE 13: RR COM/doubts.php - Type: PHP - Size: 29.35 KB - Path: RR COM - Name: doubts.php ------------------------------------------------------------ How Online Surveys Work in India | Relevant Reflex

Getting Started is Easy

Follow these simple steps to start earning money with surveys today!

1

Sign Up Free

Create your account with basic information. It takes less than 2 minutes and is completely free.

Sign Up Now
2

Verify Email

Check your email and click the verification link to activate your account and unlock survey opportunities.

3

Complete Profile

Fill out your profile thoroughly to get matched with surveys that fit your demographics and interests.

4

Start Earning

Browse available surveys, complete them honestly, and start earning rewards for your valuable opinions!

View Surveys

Pro Tips for Success

Provide Genuine Details

When you signup, DO NOT provide fake details. Provide your correct details including your gender, age, occupation, company, region etc. Since online paid surveys are sent to almost all age and gender categories and profile types, when you fake your profile, you might not get what you usually get for your actual profile.

Complete Profiler Surveys

Provide as many details as possible about you in the profiler section. This includes your gaming profile, income range, automobile assets, real estate assets, electronics you own and so on. When you attend more profiler surveys, you get more and more surveys related to all these. When you have only a generic profile and not completed the profiler surveys, you will get only those surveys which are based on age and gender.

Choose Languages You Know

Choose the languages that you know. Some people try surveys in other languages. Since you can't translate and understand all languages, you might end up taking more time on the survey than usual duration. When you take such a long duration on any survey, the system might mark you as a fraudulent user.

Be Patient

When you get screened out of many surveys, it means that the survey is not meant for your profile. This also means that there will be surveys targeting you in the future. So, KEEP PARTICIPATING in as many surveys as possible.

Log In Daily

Login every day to see if you have any surveys. Check your mail daily to know if you have any survey invitations. When you don't check the mail or login daily, other users will complete those surveys sooner and you might not get a chance to complete the survey.

Important Guidelines

Avoid Survey Fraud

Never use automated tools, VPNs, or provide inconsistent answers. This can result in account suspension and loss of rewards.

One Account Per Person

Maintain only one account per person. Multiple accounts from the same household or IP address may result in disqualification.

Complete Surveys Promptly

Don't leave surveys incomplete for long periods. Complete them in a reasonable timeframe to maintain your quality score.

Understanding Survey Types

Opinion Surveys

Share your thoughts on products, services, brands, and current topics. These are the most common type of surveys.

5-20 minutes

Product Testing

Test products at home and provide detailed feedback. Higher rewards but limited availability.

1-2 weeks

Focus Groups

Join group discussions on specific topics. These offer the highest rewards but are invitation-only.

1-2 hours

Profile Surveys

Complete these to help us match you with more relevant surveys. Essential for maximizing opportunities.

2-5 minutes

Member Experiences

Real experiences from real people using Relevant Reflex

"Consistent earnings over time"

"I follow all the tips mentioned here and participate regularly. The key is patience and honesty in responses. It's a genuine platform."

- Rajesh K., Software Engineer, Mumbai ✓ Verified Member
"Perfect for students"

"As a college student, this platform helps me earn useful pocket money. I complete surveys between classes and it has been a great experience so far."

- Anjali R., Student, Pune ✓ Verified Member
"Reliable supplemental income"

"Been using Relevant Reflex for over a year. It gives me a reliable supplemental income on the side. Highly recommended for anyone with spare time!"

- Meena T., Homemaker, Bangalore ✓ Verified Member

Disclaimer: These are individual member experiences. Earnings are not guaranteed and will vary based on survey availability, demographic profile, and individual participation. See our Earnings Disclaimer.

Need Help Getting Started?

Our support team is here to help you succeed with online surveys!

-------------------- END OF FILE -------------------- ### FILE 14: RR COM/email.php - Type: PHP - Size: 18.12 KB - Path: RR COM - Name: email.php ------------------------------------------------------------ getVerificationEmailTemplate($verificationUrl); $textBody = $this->getVerificationEmailText($verificationUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } public function sendPasswordResetEmail($email, $token) { $resetUrl = SITE_URL . "/reset-password.php?token=" . $token; $subject = "Password reset request for your Relevant Reflex account"; $htmlBody = $this->getPasswordResetEmailTemplate($resetUrl); $textBody = $this->getPasswordResetEmailText($resetUrl); return $this->sendEmail($email, $subject, $htmlBody, $textBody); } private function sendEmail($to, $subject, $htmlBody, $textBody = '') { $payload = [ 'personalizations' => [[ 'to' => [['email' => $to]], 'subject' => $subject ]], 'from' => ['email' => $this->fromEmail, 'name' => $this->fromName], 'reply_to' => ['email' => 'support@relevantreflex.com', 'name' => 'Relevant Reflex Support'], 'content' => [ ['type' => 'text/plain', 'value' => $textBody ?: strip_tags($htmlBody)], ['type' => 'text/html', 'value' => $htmlBody] ], 'headers' => [ 'List-Unsubscribe' => '', 'List-Unsubscribe-Post' => 'List-Unsubscribe=One-Click', 'X-Mailer' => 'Relevant Reflex Mailer' ], 'categories' => ['transactional', 'member-verification'], 'tracking_settings' => [ 'click_tracking' => ['enable' => false], 'open_tracking' => ['enable' => true] ] ]; $ch = curl_init('https://api.sendgrid.com/v3/mail/send'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $this->apiKey, 'Content-Type: application/json' ], CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($statusCode === 202) { return true; } else { error_log("SendGrid email failed to $to: HTTP $statusCode — $response"); return false; } } // ----------------------------------------------------------------------- // PLAIN TEXT VERSIONS // ----------------------------------------------------------------------- private function getVerificationEmailText($verificationUrl) { return "Relevant Reflex — Email Verification ====================================== Thank you for registering with Relevant Reflex. To activate your account, please verify your email address by visiting the link below: " . $verificationUrl . " This verification link expires in 7 days. If you did not create an account with Relevant Reflex, please ignore this email. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } private function getPasswordResetEmailText($resetUrl) { return "Relevant Reflex — Password Reset ================================== We received a request to reset the password for your Relevant Reflex account. To set a new password, visit the link below: " . $resetUrl . " This link expires in 1 hour. If you did not request a password reset, please ignore this email — your password will not be changed. Need help? Contact us at support@relevantreflex.com — The Relevant Reflex Team relevantreflex.com"; } // ----------------------------------------------------------------------- // HTML TEMPLATES // ----------------------------------------------------------------------- private function getVerificationEmailTemplate($verificationUrl) { return ' Verify Your Email - Relevant Reflex
'; } private function getPasswordResetEmailTemplate($resetUrl) { return ' Password Reset - Relevant Reflex

Relevant Reflex

India\'s Trusted Survey Platform

Password Reset Request

We received a request to reset the password for your Relevant Reflex account. Click the button below to set a new password.

Reset My Password

Note: This password reset link expires in 1 hour. If you did not request this, please ignore it — your password will not change.

If the button above does not work, copy and paste the link below into your browser:

' . $resetUrl . '

 

This is a transactional email sent by Relevant Reflex in response to a password reset request.

Need help? support@relevantreflex.com

'; } } -------------------- END OF FILE -------------------- ### FILE 15: RR COM/errors.log - Type: LOG - Size: 0 B - Path: RR COM - Name: errors.log ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 16: RR COM/fix-rupee.php - Type: PHP - Size: 5.34 KB - Path: RR COM - Name: fix-rupee.php ------------------------------------------------------------ Rupee Fix"; echo "

Rupee Symbol Fix Script

"; if ($dryRun) { echo "

DRY RUN MODE - No changes will be made. Add &apply=yes to URL to apply fixes.

"; } else { echo "

APPLYING FIXES

"; } // The broken sequence: ₹ is what ₹ looks like when UTF-8 bytes are read as Latin1 // UTF-8 for ₹ (U+20B9) is: 0xE2 0x82 0xB9 // When read as Latin1: â (0xE2) ‚ (0x82) ¹ (0xB9) = ₹ $brokenRupee = "\xC3\xA2\xC2\x82\xC2\xB9"; // Double-encoded UTF-8 $brokenRupee2 = "₹"; // As it appears in source $replacement = "₹"; // HTML entity for ₹ - works everywhere // Files to check (relative to this script's directory) $baseDir = __DIR__; $files = [ 'about.php', 'admin-support.php', 'articles.php', 'dashboard.php', 'doubts.php', 'index.php', 'points-manager.php', 'profiler.php', 'redemption.php', 'signup.php', 'terms.php', 'partners/data-sync.php', 'partners/members.php', 'partners/partner-config.php', 'partners/partner-dashboard.php', 'partners/redemptions.php', ]; $totalFixed = 0; echo ""; echo ""; foreach ($files as $relPath) { $fullPath = $baseDir . '/' . $relPath; if (!file_exists($fullPath)) { echo ""; continue; } $content = file_get_contents($fullPath); // Count occurrences of both patterns $count1 = substr_count($content, $brokenRupee); $count2 = substr_count($content, $brokenRupee2); $totalCount = max($count1, $count2); // They may overlap, take the higher count // Also check for raw ₹ that might work but could break during file transfer $rawRupee = "\xE2\x82\xB9"; // Actual UTF-8 bytes for ₹ $rawCount = substr_count($content, $rawRupee); if ($totalCount === 0 && $rawCount === 0) { echo ""; continue; } if ($totalCount > 0) { if (!$dryRun) { // Replace both patterns $newContent = str_replace($brokenRupee, $replacement, $content); $newContent = str_replace($brokenRupee2, $replacement, $newContent); // Also replace raw ₹ with entity for safety $newContent = str_replace($rawRupee, $replacement, $newContent); // Don't double-replace: if ₹ already exists, don't touch it // (the replacements above won't create doubles since we're replacing different patterns) file_put_contents($fullPath, $newContent); echo ""; } else { echo ""; } $totalFixed += $totalCount; } elseif ($rawCount > 0) { if (!$dryRun) { $newContent = str_replace($rawRupee, $replacement, $content); file_put_contents($fullPath, $newContent); echo ""; } else { echo ""; } $totalFixed += $rawCount; } } echo "
FileOccurrencesStatus
$relPath-File not found (skip)
$relPath0Clean
$relPath$totalCount brokenFIXED ✓
$relPath$totalCount brokenWill fix
$relPath$rawCount raw ₹Converted to entity ✓
$relPath$rawCount raw ₹Will convert to entity
"; echo "

Total replacements: $totalFixed

"; if ($dryRun) { echo "

Apply Fixes Now

"; } else { echo "

IMPORTANT: Delete this file now! rm fix-rupee.php

"; } echo ""; -------------------- END OF FILE -------------------- ### FILE 17: RR COM/forgot-password.php - Type: PHP - Size: 10.35 KB - Path: RR COM - Name: forgot-password.php ------------------------------------------------------------ getConnection(); } catch (Exception $e) { logError('Database connection failed in forgot-password.php: ' . $e->getMessage()); jsonResponse(false, 'System error. Please try again later.'); } // Get and sanitize email $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; // Validation if (empty($email)) { jsonResponse(false, 'Please provide your email address.'); } if (!validateEmail($email)) { jsonResponse(false, 'Please provide a valid email address.'); } try { // Check if user exists and is verified $stmt = $pdo->prepare(" SELECT id, email, email_verified, status FROM users WHERE email = ? "); $stmt->execute([$email]); $user = $stmt->fetch(); if (!$user) { // For security, don't reveal if email exists or not jsonResponse(true, 'If an account with this email exists, you will receive a password reset link shortly.'); } if (!$user['email_verified']) { jsonResponse(false, 'Please verify your email address first before resetting your password.'); } if ($user['status'] !== 'active') { jsonResponse(false, 'Your account is currently ' . $user['status'] . '. Please contact support for assistance.'); } // Check if there's already a recent reset request (prevent spam) $stmt = $pdo->prepare(" SELECT created_at FROM password_resets WHERE email = ? AND created_at > DATE_SUB(NOW(), INTERVAL 5 MINUTE) ORDER BY created_at DESC LIMIT 1 "); $stmt->execute([$email]); $recentReset = $stmt->fetch(); if ($recentReset) { jsonResponse(false, 'A password reset email was already sent recently. Please wait a few minutes before requesting another one.'); } // Generate reset token $resetToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . PASSWORD_RESET_EXPIRY_HOURS . ' hours')); // Delete any existing reset tokens for this email $stmt = $pdo->prepare("DELETE FROM password_resets WHERE email = ?"); $stmt->execute([$email]); // Insert new reset token $stmt = $pdo->prepare(" INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, ?) "); $stmt->execute([$email, $resetToken, $expiresAt]); // Send password reset email $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendPasswordResetEmail($email, $resetToken); if ($emailSent) { logError('Password reset email sent', ['email' => $email]); jsonResponse(true, 'Password reset link has been sent to your email address. Please check your inbox and follow the instructions.'); } else { logError('Failed to send password reset email', ['email' => $email]); jsonResponse(false, 'Failed to send password reset email. Please try again later or contact support.'); } } catch (PDOException $e) { logError('Database error during password reset request', [ 'error' => $e->getMessage(), 'email' => $email ]); jsonResponse(false, 'System error. Please try again later.'); } catch (Exception $e) { logError('General error during password reset request', [ 'error' => $e->getMessage(), 'email' => $email ]); jsonResponse(false, 'An unexpected error occurred. Please try again later.'); } } ?> Forgot Password - Relevant Reflex

Reset Your Password

Enter your email address and we'll send you a link to reset your password.

-------------------- END OF FILE -------------------- ### FILE 18: RR COM/google7106e441233c8b50.html - Type: HTML - Size: 53 B - Path: RR COM - Name: google7106e441233c8b50.html ------------------------------------------------------------ google-site-verification: google7106e441233c8b50.html -------------------- END OF FILE -------------------- ### FILE 19: RR COM/gtag.php - Type: PHP - Size: 362 B - Path: RR COM - Name: gtag.php ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 20: RR COM/index.php - Type: PHP - Size: 31.03 KB - Path: RR COM - Name: index.php ------------------------------------------------------------ Paid Surveys India | Earn Money with Online Surveys — Relevant Reflex
You have been logged out successfully. Thank you for using Relevant Reflex!

Welcome back, ! 👋

Ready to participate in surveys? Check out your personalized dashboard for new opportunities.

Earn Rewards with Online Surveys in India

Join thousands of Indians who take paid surveys online and earn rewards for sharing their opinions. Our online surveys India platform connects you with genuine market research opportunities. Survey availability and earnings vary by member profile.

100% Free to Join
Verified Payments
Flexible Timing
India-Focused Surveys
Online Surveys India

Your Survey Dashboard

Access your personalized survey opportunities and track your earnings.

Active Account Status
Profile
Verified
50,000+ Active Members
₹25,00,000+ Rewards Paid
1,000+ Surveys Completed Daily
UPI Direct Payments

Earnings Disclaimer: Results vary. Earnings from surveys are supplemental and not guaranteed. Individual results depend on survey availability, your demographic profile, and participation frequency. See our Earnings Disclaimer for full details.

Why Choose Relevant Reflex?

We're a trusted platform for paid surveys and online surveys in India, dedicated to providing genuine market research earning opportunities.

Trusted & Secure

Your data is protected with industry-standard security measures. We never sell your personal information.

Verified Payments

Rewards transferred via UPI after survey completion and validation.

Flexible Schedule

Take surveys whenever you want, from anywhere. Perfect for students, professionals, and homemakers.

India-Focused

Surveys specifically designed for Indian consumers. Your opinions matter for local and international brands.

Mobile Friendly

Take surveys on your smartphone, tablet, or computer. Our platform works seamlessly across all devices.

24/7 Support

Our dedicated support team is here to help you with any questions or issues you may have.

What Our Members Say

Join thousands of satisfied members who are earning money with Relevant Reflex.

"I've been using Relevant Reflex for 6 months and it helps me cover small expenses. The surveys are interesting and payments are always on time!"
- Priya S., Mumbai
✓ Verified Member   January 2025
"Great platform for students like me. I can take surveys between classes and earn pocket money easily."
- Rahul K., Delhi
✓ Verified Member   February 2025
"Professional platform with genuine surveys. I appreciate how they respect my time and opinions."
- Sneha M., Bangalore
✓ Verified Member   March 2025

Testimonials from real members. Individual results vary. See our Earnings Disclaimer.

Ready to Start Earning?

Join Relevant Reflex today and participate in genuine paid surveys!

Sign Up for Free

Registration takes less than 2 minutes • 100% Free • No spam guaranteed
Earnings vary by member. See Earnings Disclaimer.

-------------------- END OF FILE -------------------- ### FILE 21: RR COM/isec-helper.php - Type: PHP - Size: 8.81 KB - Path: RR COM - Name: isec-helper.php ------------------------------------------------------------ [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10], 'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6], ], 'farmer' => [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'no_formal' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>11,'degree_regular'=>10,'degree_professional'=>10], 'upto_5' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_6_9' => ['no_adult'=>12,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>9], 'class_10_14' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'degree_regular' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'degree_professional'=> ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>5], ], 'worker' => [ 'no_adult' => ['no_adult'=>12,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>8], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>11,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>7], 'class_10_14' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6], 'degree_regular' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4], 'degree_professional'=> ['no_adult'=>8,'no_formal'=>9,'upto_5'=>7,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3], ], 'trader' => [ 'no_adult' => ['no_adult'=>11,'no_formal'=>12,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>6,'degree_professional'=>5], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>11,'class_6_9'=>10,'class_10_14'=>9,'degree_regular'=>8,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>8,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>10,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>5], 'class_10_14' => ['no_adult'=>9,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>4], 'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>3,'degree_professional'=>2], 'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>6,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2], ], 'clerical' => [ 'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>9,'degree_professional'=>8], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>7], 'class_6_9' => ['no_adult'=>10,'no_formal'=>10,'upto_5'=>9,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>7,'degree_professional'=>6], 'class_10_14' => ['no_adult'=>8,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>4], 'degree_regular' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>6,'degree_regular'=>4,'degree_professional'=>3], 'degree_professional'=> ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>2], ], 'managerial' => [ 'no_adult' => ['no_adult'=>10,'no_formal'=>12,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>7,'degree_regular'=>5,'degree_professional'=>5], 'no_formal' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>10,'class_10_14'=>10,'degree_regular'=>8,'degree_professional'=>6], 'upto_5' => ['no_adult'=>11,'no_formal'=>11,'upto_5'=>10,'class_6_9'=>9,'class_10_14'=>8,'degree_regular'=>6,'degree_professional'=>6], 'class_6_9' => ['no_adult'=>9,'no_formal'=>9,'upto_5'=>9,'class_6_9'=>8,'class_10_14'=>7,'degree_regular'=>6,'degree_professional'=>6], 'class_10_14' => ['no_adult'=>7,'no_formal'=>9,'upto_5'=>8,'class_6_9'=>7,'class_10_14'=>5,'degree_regular'=>3,'degree_professional'=>3], 'degree_regular' => ['no_adult'=>6,'no_formal'=>8,'upto_5'=>7,'class_6_9'=>6,'class_10_14'=>4,'degree_regular'=>2,'degree_professional'=>1], 'degree_professional'=> ['no_adult'=>5,'no_formal'=>7,'upto_5'=>6,'class_6_9'=>5,'class_10_14'=>3,'degree_regular'=>1,'degree_professional'=>1], ], ]; } /** * Compute ISEC tier from the 3 profiler responses * * @param string $occupation - Occupation code of CWE * @param string $maleEducation - Education code of highest educated male adult * @param string $femaleEducation - Education code of highest educated female adult * @return int|null - ISEC tier (1-12) or null if cannot compute */ function computeISECTier($occupation, $maleEducation, $femaleEducation) { $grid = getISECGrid(); if (isset($grid[$occupation][$maleEducation][$femaleEducation])) { return $grid[$occupation][$maleEducation][$femaleEducation]; } return null; } /** * Get SEC class label from ISEC tier * * @param int $tier - ISEC tier (1-12) * @return string - SEC class (A/B/C/D/E) with description */ function getISECClass($tier) { if ($tier >= 1 && $tier <= 6) return 'A'; if ($tier >= 7 && $tier <= 8) return 'B'; if ($tier >= 9 && $tier <= 10) return 'C'; if ($tier == 11) return 'D'; if ($tier == 12) return 'E'; return null; } /** * Get full SEC class label with description */ function getISECClassLabel($tier) { $labels = [ 'A' => 'SEC A — High', 'B' => 'SEC B — Upper Middle', 'C' => 'SEC C — Middle', 'D' => 'SEC D — Lower Middle', 'E' => 'SEC E — Low', ]; $class = getISECClass($tier); return $class ? $labels[$class] : null; } -------------------- END OF FILE -------------------- ### FILE 22: RR COM/login.php - Type: PHP - Size: 27.43 KB - Path: RR COM - Name: login.php ------------------------------------------------------------ redirectToDashboard(); } $errors = []; $form_data = []; $resend_success = ''; $show_resend = false; $resend_email = ''; // Handle resend verification request if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'resend_verification') { $resend_email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $form_data['email'] = $resend_email; if (empty($resend_email) || !validateEmail($resend_email)) { $errors[] = 'Please provide a valid email address.'; } else { try { $db = new Database(); $pdo = $db->getConnection(); $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; // Rate limit: max 3 resend attempts per IP per hour try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'resend_verification' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= 3) { $errors[] = 'Too many resend attempts. Please try again later or contact support.'; } } catch (Exception $e) {} if (empty($errors)) { // Find the user $stmt = $pdo->prepare("SELECT id, email, email_verified, status FROM users WHERE email = ?"); $stmt->execute([$resend_email]); $user = $stmt->fetch(); if (!$user) { // Don't reveal if email exists - show generic success $resend_success = 'If an account with that email exists and is unverified, a new verification link has been sent. Please check your inbox and spam folder.'; } elseif ($user['email_verified']) { $resend_success = 'This email is already verified. You can log in directly.'; } else { // Delete old verification tokens $pdo->prepare("DELETE FROM email_verifications WHERE user_id = ?")->execute([$user['id']]); // Generate new token $verificationToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . TOKEN_EXPIRY_HOURS . ' hours')); $stmt = $pdo->prepare("INSERT INTO email_verifications (user_id, token, expires_at, created_at) VALUES (?, ?, ?, NOW())"); $stmt->execute([$user['id'], $verificationToken, $expiresAt]); // Send verification email require_once 'email.php'; $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendVerificationEmail($resend_email, $verificationToken); if ($emailSent) { logError('Verification email resent', ['user_id' => $user['id'], 'email' => $resend_email]); $resend_success = 'A new verification link has been sent to your email. Please check your inbox and spam folder. The link expires in ' . TOKEN_EXPIRY_HOURS . ' hours.'; } else { logError('Failed to resend verification email', ['user_id' => $user['id'], 'email' => $resend_email]); $errors[] = 'Failed to send verification email. Please try again or contact support@relevantreflex.com.'; } } // Log the attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'resend_verification', ?, ?)") ->execute([$clientIP, $resend_email, empty($errors) ? 1 : 0, $_SERVER['HTTP_USER_AGENT'] ?? '']); } catch (Exception $e) {} } } catch (Exception $e) { logError('Error in resend verification: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } } } // Handle login form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['action'])) { // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in login.php: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } if (empty($errors)) { // Get and sanitize form data $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $rememberMe = isset($_POST['remember_me']) ? true : false; // Store email for form repopulation $form_data['email'] = $email; // Validation if (empty($email) || empty($password)) { $errors[] = 'Please provide both email and password.'; } elseif (!validateEmail($email)) { $errors[] = 'Please provide a valid email address.'; } else { try { // Find user by email $stmt = $pdo->prepare(" SELECT id, email, password, email_verified, status, last_login FROM users WHERE email = ? "); $stmt->execute([$email]); $user = $stmt->fetch(); if (!$user) { // Log failed login attempt logError('Login attempt with non-existent email', ['email' => $email]); $errors[] = 'Invalid email or password.'; } elseif (!verifyPassword($password, $user['password'])) { logError('Login attempt with incorrect password', ['email' => $email]); $errors[] = 'Invalid email or password.'; } elseif (!$user['email_verified']) { $errors[] = 'Your email is not yet verified.'; $show_resend = true; $resend_email = $email; } elseif ($user['status'] !== 'active') { $message = 'Your account is currently ' . $user['status'] . '.'; if ($user['status'] === 'suspended') { $message .= ' Please contact support for assistance.'; } $errors[] = $message; } else { // Login successful - create session session_start(); $_SESSION['user_id'] = $user['id']; $_SESSION['user_email'] = $user['email']; $_SESSION['logged_in'] = true; $_SESSION['login_time'] = time(); // Update last login time $stmt = $pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$user['id']]); // Set remember me cookie if requested (30 days) if ($rememberMe) { $sessionToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+30 days')); // Store session token in database $stmt = $pdo->prepare(" INSERT INTO user_sessions (user_id, session_token, expires_at) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE session_token = VALUES(session_token), expires_at = VALUES(expires_at) "); $stmt->execute([$user['id'], $sessionToken, $expiresAt]); // Set cookie setcookie('remember_token', $sessionToken, time() + (30 * 24 * 60 * 60), '/', '', true, true); } // Clean up expired sessions $pdo->prepare("DELETE FROM user_sessions WHERE expires_at < NOW()")->execute(); // Log successful login logError('User login successful', [ 'user_id' => $user['id'], 'email' => $user['email'], 'remember_me' => $rememberMe ]); // Redirect to dashboard header('Location: dashboard.php'); exit; } } catch (PDOException $e) { logError('Database error during login', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'Login failed due to a system error. Please try again later.'; } catch (Exception $e) { logError('General error during login', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } } ?> Login - Relevant Reflex Paid Online Surveys India

Login to your Account!

You can take Online paid Surveys, Redeem your reward points and update profile - all in one place.

-------------------- END OF FILE -------------------- ### FILE 23: RR COM/logout.php - Type: PHP - Size: 387 B - Path: RR COM - Name: logout.php ------------------------------------------------------------ $user['id'], 'email' => $user['email'] ]); } } // Logout the user logout(); // Redirect to home page with logout message header('Location: index.html?logged_out=1'); exit; ?> -------------------- END OF FILE -------------------- ### FILE 24: RR COM/mobile-verification.php - Type: PHP - Size: 26.42 KB - Path: RR COM - Name: mobile-verification.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in mobile-verification.php: ' . $e->getMessage()); die('System error. Please try again later.'); } $errors = []; $success_message = ''; $step = 'enter_mobile'; // enter_mobile, verify_otp, completed // Allow user to go back to enter_mobile via ?step=enter_mobile (Change Number link) $forceEnterMobile = (isset($_GET['step']) && $_GET['step'] === 'enter_mobile'); // Check if mobile is already verified $mobileData = null; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified, otp_code, otp_expires_at, verification_attempts FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $mobileData = $stmt->fetch(); if ($mobileData && $mobileData['is_verified']) { $step = 'completed'; } elseif (!$forceEnterMobile && $mobileData && $mobileData['otp_code'] && $mobileData['otp_expires_at'] > date('Y-m-d H:i:s')) { $step = 'verify_otp'; } } catch (Exception $e) { logError('Error fetching mobile verification data', ['user_id' => $user['id'], 'error' => $e->getMessage()]); } // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['action'])) { if ($_POST['action'] === 'send_otp') { $mobileNumber = isset($_POST['mobile_number']) ? sanitize($_POST['mobile_number']) : ''; // Validate mobile number if (empty($mobileNumber)) { $errors[] = 'Please enter your mobile number.'; } elseif (!preg_match('/^[6-9]\d{9}$/', $mobileNumber)) { $errors[] = 'Please enter a valid 10-digit mobile number starting with 6, 7, 8, or 9.'; } else { // Check if mobile number is already verified by another user try { $stmt = $pdo->prepare("SELECT user_id FROM mobile_verifications WHERE mobile_number = ? AND is_verified = 1 AND user_id != ?"); $stmt->execute([$mobileNumber, $user['id']]); $existingUser = $stmt->fetch(); if ($existingUser) { $errors[] = 'This mobile number is already verified by another account.'; } else { // Generate OTP $otpCode = sprintf('%06d', mt_rand(100000, 999999)); $otpExpiry = date('Y-m-d H:i:s', strtotime('+10 minutes')); // Store OTP in database $stmt = $pdo->prepare("INSERT INTO mobile_verifications (user_id, mobile_number, otp_code, otp_expires_at, verification_attempts) VALUES (?, ?, ?, ?, 0) ON DUPLICATE KEY UPDATE mobile_number = ?, otp_code = ?, otp_expires_at = ?, verification_attempts = 0, updated_at = NOW()"); $stmt->execute([$user['id'], $mobileNumber, $otpCode, $otpExpiry, $mobileNumber, $otpCode, $otpExpiry]); // Send OTP via 2Factor SMS $smsResult = sendOTPSMS($mobileNumber, $otpCode); if ($smsResult['success']) { logError('OTP sent successfully via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $mobileNumber, 'sms_response' => $smsResult['response'] ]); $success_message = 'OTP sent to your mobile number +91-' . $mobileNumber; $step = 'verify_otp'; $mobileData = ['mobile_number' => $mobileNumber]; } else { logError('Failed to send OTP via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $mobileNumber, 'error' => $smsResult['message'] ]); $errors[] = 'Failed to send OTP. Please try again or contact support.'; } } } catch (Exception $e) { logError('Error sending OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error sending OTP. Please try again.'; } } } elseif ($_POST['action'] === 'verify_otp') { $inputOtp = isset($_POST['otp_code']) ? trim($_POST['otp_code']) : ''; if (empty($inputOtp) || !preg_match('/^\d{6}$/', $inputOtp)) { $errors[] = 'Please enter a valid 6-digit OTP code.'; } else { try { $stmt = $pdo->prepare("SELECT * FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $storedData = $stmt->fetch(); if (!$storedData) { $errors[] = 'No OTP request found. Please request a new OTP.'; $step = 'enter_mobile'; } elseif ($storedData['otp_expires_at'] < date('Y-m-d H:i:s')) { $errors[] = 'OTP has expired. Please request a new one.'; $step = 'enter_mobile'; } elseif ($storedData['verification_attempts'] >= 5) { $errors[] = 'Too many failed attempts. Please request a new OTP.'; $step = 'enter_mobile'; } elseif ($storedData['otp_code'] !== $inputOtp) { $stmt = $pdo->prepare("UPDATE mobile_verifications SET verification_attempts = verification_attempts + 1 WHERE user_id = ?"); $stmt->execute([$user['id']]); $remaining = 5 - ($storedData['verification_attempts'] + 1); $errors[] = "Incorrect OTP. $remaining attempts remaining."; $step = 'verify_otp'; $mobileData = $storedData; } else { $pdo->beginTransaction(); $stmt = $pdo->prepare("UPDATE mobile_verifications SET is_verified = 1, otp_code = NULL, otp_expires_at = NULL, updated_at = NOW() WHERE user_id = ?"); $stmt->execute([$user['id']]); $pointsStmt = $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00"); $pointsStmt->execute([$user['id']]); $transStmt = $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'mobile_verification', 'Mobile number verified')"); $transStmt->execute([$user['id']]); $pdo->commit(); $step = 'completed'; $mobileData = array_merge($storedData, ['is_verified' => 1]); } } catch (Exception $e) { $pdo->rollback(); logError('Error verifying OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error verifying OTP. Please try again.'; } } } elseif ($_POST['action'] === 'resend_otp') { try { $stmt = $pdo->prepare("SELECT mobile_number FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $existing = $stmt->fetch(); if ($existing) { // Generate new OTP $otpCode = sprintf('%06d', mt_rand(100000, 999999)); $otpExpiry = date('Y-m-d H:i:s', strtotime('+10 minutes')); $stmt = $pdo->prepare("UPDATE mobile_verifications SET otp_code = ?, otp_expires_at = ?, verification_attempts = 0, updated_at = NOW() WHERE user_id = ?"); $stmt->execute([$otpCode, $otpExpiry, $user['id']]); // Send SMS using 2Factor $smsResult = sendOTPSMS($existing['mobile_number'], $otpCode); if ($smsResult['success']) { logError('OTP resent successfully via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $existing['mobile_number'], 'sms_response' => $smsResult['response'] ]); $success_message = 'New OTP sent to your mobile number +91-' . $existing['mobile_number']; } else { logError('Failed to resend OTP via 2Factor', [ 'user_id' => $user['id'], 'mobile_number' => $existing['mobile_number'], 'error' => $smsResult['message'] ]); $errors[] = 'Failed to resend OTP. Please try again or contact support.'; } $step = 'verify_otp'; $mobileData = $existing; } } catch (Exception $e) { logError('Error resending OTP', ['user_id' => $user['id'], 'error' => $e->getMessage()]); $errors[] = 'Error resending OTP. Please try again.'; } } } } // Get user display info for sidebar $firstName = htmlspecialchars($user['first_name'] ?? explode('@', $user['email'])[0]); $initials = strtoupper(substr($user['first_name'] ?? $user['email'], 0, 1) . substr($user['last_name'] ?? '', 0, 1)); if (strlen($initials) < 2) $initials = strtoupper(substr($user['email'], 0, 2)); $userPoints = ['points' => 0]; try { $stmt = $pdo->prepare("SELECT points FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} ?> Mobile Verification - Relevant Reflex
Mobile Verification
pts
Refer a Friend
Enter Mobile
Verify OTP
Done
'; ?>

Enter Your Mobile Number

We'll send a 6-digit OTP to verify your number

+91
Enter a mobile number that you have access to

Enter OTP Code

Sent to +91

OTP is valid for 10 minutes
| Change Number

Mobile Verified!

You earned 10 points!

Your number +91 is verified.

You'll receive survey notifications and updates on this number.

Continue Profile View My Points

Why Verify Your Mobile?

  • Earn 10 Points — instant reward for verification
  • Survey Notifications — receive SMS alerts for new surveys
  • Quick Support — get faster support via WhatsApp
  • Account Security — extra layer of protection
  • Payment Updates — get notified about reward payments
-------------------- END OF FILE -------------------- ### FILE 25: RR COM/my-surveys.php - Type: PHP - Size: 15.73 KB - Path: RR COM - Name: my-surveys.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } $userId = $user['id']; // Shop DB (survey data) - second connection $surveys = []; try { $shopPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", "u752449863_rradmin", "S@n@h2016", [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Check which columns exist (defensive - works before and after migration) $cols = []; $colCheck = $shopPdo->query("SHOW COLUMNS FROM survey_urls"); foreach ($colCheck->fetchAll() as $c) { $cols[] = $c['Field']; } $hasQualityFlag = in_array('quality_flag', $cols); $hasActualLoi = in_array('actual_loi_seconds', $cols); $hasCompletedAt = in_array('completed_at', $cols); // Check projects columns $projCols = []; $projColCheck = $shopPdo->query("SHOW COLUMNS FROM projects"); foreach ($projColCheck->fetchAll() as $c) { $projCols[] = $c['Field']; } $hasClosureStatus = in_array('closure_status', $projCols); $hasSpeedsterPct = in_array('speedster_threshold_pct', $projCols); // Build query dynamically based on available columns $qualityFlagCol = $hasQualityFlag ? "su.quality_flag" : "'valid' as quality_flag"; $qualityNotesCol = $hasQualityFlag ? "su.quality_notes" : "NULL as quality_notes"; $actualLoiCol = $hasActualLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $completedAtCol = $hasCompletedAt ? "su.completed_at" : "NULL as completed_at"; $closureStatusCol = $hasClosureStatus ? "p.closure_status" : "'none' as closure_status"; $speedsterPctCol = $hasSpeedsterPct ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.unique_identifier, su.status as url_status, $qualityFlagCol, $qualityNotesCol, su.clicked_at, $completedAtCol, $actualLoiCol, su.created_at as sent_at, su.batch_number, p.project_id, p.project_name, p.eloi, p.status as project_status, $closureStatusCol, p.closed_at, $speedsterPctCol FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC "); $stmt->execute([$userId]); $surveys = $stmt->fetchAll(); } catch (Exception $e) { error_log("My Surveys error: " . $e->getMessage()); } // Determine display status for each survey function getSurveyDisplayStatus($survey) { $urlStatus = $survey['url_status']; $qualityFlag = $survey['quality_flag'] ?? 'valid'; $projectStatus = $survey['project_status']; $closureStatus = $survey['closure_status'] ?? 'none'; if ($urlStatus === 'sent') { return ['label' => 'Invitation Sent', 'class' => 'status-sent', 'desc' => 'You have been invited to this survey. Click the link in your email to participate.']; } if ($urlStatus === 'clicked') { return ['label' => 'In Progress', 'class' => 'status-progress', 'desc' => 'You started this survey. Please complete it before it times out.']; } if (in_array($urlStatus, ['earlyscreenout', 'latescreenout'])) { return ['label' => 'Screened Out', 'class' => 'status-screenout', 'desc' => 'You did not qualify for this survey based on the screening criteria.']; } if ($urlStatus === 'quotafull') { return ['label' => 'Quota Full', 'class' => 'status-quotafull', 'desc' => 'The survey reached its quota before your response was recorded.']; } if ($urlStatus === 'timeout') { return ['label' => 'Timed Out', 'class' => 'status-timeout', 'desc' => 'The survey session expired.']; } if ($urlStatus === 'partial') { return ['label' => 'Partial Complete', 'class' => 'status-partial', 'desc' => 'Your response was partially recorded.']; } // Complete status - check quality and project closure if ($urlStatus === 'complete') { if ($qualityFlag === 'speedster') { return ['label' => 'Under Review - Possible Speedster', 'class' => 'status-review', 'desc' => 'Your completion time was below the minimum threshold. This is under review and pending project closure.']; } if ($qualityFlag === 'ip_duplicate') { return ['label' => 'Under Review - Duplicate Detected', 'class' => 'status-review', 'desc' => 'A duplicate response was detected from your connection. This is under review.']; } if ($qualityFlag === 'client_flagged') { return ['label' => 'Under Review - Flagged by Client', 'class' => 'status-review', 'desc' => 'This response has been flagged for review by the research client. Pending admin approval.']; } // Valid complete if ($projectStatus === 'Closed') { return ['label' => 'Approved - Points Credited', 'class' => 'status-approved', 'desc' => 'Survey completed and approved. Points have been credited to your account.']; } if ($closureStatus === 'pending_review') { return ['label' => 'Completed - Pending Approval', 'class' => 'status-pending', 'desc' => 'Survey completed. The project is under review. Points will be credited once approved.']; } return ['label' => 'Completed - Pending Project Closure', 'class' => 'status-pending', 'desc' => 'Survey completed successfully. Points will be credited when the project is closed by the client.']; } return ['label' => ucfirst($urlStatus), 'class' => 'status-default', 'desc' => '']; } function formatLoi($seconds) { if (!$seconds) return '-'; $min = floor($seconds / 60); $sec = $seconds % 60; return ($min > 0 ? $min . 'm ' : '') . $sec . 's'; } // Count stats $totalSurveys = count($surveys); $completes = 0; $pending = 0; $flagged = 0; foreach ($surveys as $s) { if ($s['url_status'] === 'complete') { $completes++; $qf = $s['quality_flag'] ?? 'valid'; if (in_array($qf, ['speedster', 'ip_duplicate', 'client_flagged'])) { $flagged++; } elseif ($s['project_status'] !== 'Closed') { $pending++; } } } ?> My Surveys - Relevant Reflex

My Survey Participations

Track all your survey invitations, completions, and reward status.

Total Surveys
Completed
Pending Approval
0): ?>
Under Review

No Survey Participations Yet

Once you receive and participate in surveys, your history will appear here.

Complete your profile to start receiving survey invitations.

$survey): $displayStatus = getSurveyDisplayStatus($survey); $eloiSec = intval($survey['eloi'] ?? 0) * 60; $thresholdPct = floatval($survey['speedster_threshold_pct'] ?? 33.33); $thresholdSec = $eloiSec > 0 ? $eloiSec * ($thresholdPct / 100) : 0; $loiPct = ($eloiSec > 0 && $survey['actual_loi_seconds']) ? min(100, round(($survey['actual_loi_seconds'] / $eloiSec) * 100)) : 0; $loiClass = 'loi-green'; if ($survey['actual_loi_seconds'] && $thresholdSec > 0 && $survey['actual_loi_seconds'] < $thresholdSec) $loiClass = 'loi-red'; elseif ($loiPct > 150) $loiClass = 'loi-yellow'; ?>
• LOI:
Expected LOI
minutes
Your LOI
Min Required LOI
0 ? formatLoi(round($thresholdSec)) . ' (' . $thresholdPct . '% of ELOI)' : '-'; ?>
Project Status
-------------------- END OF FILE -------------------- ### FILE 26: RR COM/partner-support-creation.php - Type: PHP - Size: 31.26 KB - Path: RR COM - Name: partner-support-creation.php ------------------------------------------------------------ getConnection(); } catch (Exception $e) { logPartnerActivity('Database connection failed: ' . $e->getMessage()); die('System error. Please try again later.'); } $success_message = ''; $error_message = ''; // Check if viewing a specific ticket $viewTicketId = isset($_GET['ticket']) ? intval($_GET['ticket']) : null; $viewTicket = null; $ticketMessages = []; $messageAttachments = []; // -- Handle ticket reply -- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['reply_ticket_id'])) { $replyTicketId = intval($_POST['reply_ticket_id']); $replyMessage = isset($_POST['reply_message']) ? trim($_POST['reply_message']) : ''; if (empty($replyMessage)) { $error_message = 'Reply message cannot be empty.'; } elseif (strlen($replyMessage) > 5000) { $error_message = 'Reply must be 5000 characters or less.'; } else { try { $stmt = $pdo->prepare("SELECT id, status FROM support_tickets WHERE id = ? AND sender_type = 'partner' AND sender_id = ?"); $stmt->execute([$replyTicketId, $partner['id']]); $ticket = $stmt->fetch(); if (!$ticket) { $error_message = 'Ticket not found or access denied.'; } elseif ($ticket['status'] === 'closed') { $error_message = 'Cannot reply to a closed ticket.'; } else { $stmt = $pdo->prepare("INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'user', ?, ?, 0)"); $stmt->execute([$replyTicketId, $partner['id'], $replyMessage]); $messageId = $pdo->lastInsertId(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } // Reopen ticket if resolved/pending if (in_array($ticket['status'], ['resolved', 'pending'])) { $pdo->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ?")->execute([$replyTicketId]); } else { $pdo->prepare("UPDATE support_tickets SET updated_at = NOW() WHERE id = ?")->execute([$replyTicketId]); } $success_message = 'Reply sent successfully!'; $viewTicketId = $replyTicketId; logPartnerActivity('Partner replied to ticket', ['ticket_id' => $replyTicketId]); } } catch (Exception $e) { $error_message = 'Failed to send reply. Please try again.'; logPartnerActivity('Error replying to ticket: ' . $e->getMessage()); } } } // -- Handle ticket creation -- if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_POST['reply_ticket_id'])) { $subject = isset($_POST['subject']) ? trim($_POST['subject']) : ''; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $priority = isset($_POST['priority']) ? $_POST['priority'] : 'medium'; if (empty($subject) || empty($message)) { $error_message = 'Subject and message are required.'; } elseif (strlen($subject) > 255) { $error_message = 'Subject must be 255 characters or less.'; } elseif (strlen($message) > 5000) { $error_message = 'Message must be 5000 characters or less.'; } else { try { $pdo->beginTransaction(); $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(bin2hex(random_bytes(4)), 0, 6)); // user_id NULL for partner tickets (FK references users table) $stmt = $pdo->prepare("INSERT INTO support_tickets (ticket_number, user_id, sender_type, sender_id, subject, status, priority) VALUES (?, NULL, 'partner', ?, ?, 'open', ?)"); $stmt->execute([$ticketNumber, $partner['id'], $subject, $priority]); $ticketId = $pdo->lastInsertId(); $stmt = $pdo->prepare("INSERT INTO support_messages (ticket_id, sender_type, sender_id, message, is_internal) VALUES (?, 'user', ?, ?, 0)"); $stmt->execute([$ticketId, $partner['id'], $message]); $messageId = $pdo->lastInsertId(); $pdo->commit(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } $success_message = "Support ticket created successfully! Ticket Number: $ticketNumber
We will respond to your query shortly."; logPartnerActivity('Support ticket created', ['ticket_number' => $ticketNumber, 'partner_id' => $partner['id'], 'subject' => $subject]); $_POST = []; } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollBack(); logPartnerActivity('Error creating support ticket: ' . $e->getMessage()); $error_message = 'Failed to create support ticket. Please try again.'; } } } // -- Load ticket detail if viewing -- if ($viewTicketId) { try { $stmt = $pdo->prepare("SELECT st.*, au.full_name as assigned_to_name FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.id = ? AND st.sender_type = 'partner' AND st.sender_id = ?"); $stmt->execute([$viewTicketId, $partner['id']]); $viewTicket = $stmt->fetch(); if ($viewTicket) { $stmt = $pdo->prepare("SELECT sm.*, CASE WHEN sm.sender_type = 'admin' THEN COALESCE((SELECT full_name FROM admin_users WHERE id = sm.sender_id), 'Support Team') ELSE ? END as sender_name FROM support_messages sm WHERE sm.ticket_id = ? AND sm.is_internal = 0 ORDER BY sm.created_at ASC"); $stmt->execute([$partner['company_name'], $viewTicketId]); $ticketMessages = $stmt->fetchAll(); // Load attachments for all messages if ($supportHelperLoaded && function_exists('getAttachmentsForMessages') && !empty($ticketMessages)) { $msgIds = array_column($ticketMessages, 'id'); $messageAttachments = getAttachmentsForMessages($pdo, $msgIds); } } } catch (Exception $e) { logPartnerActivity('Error loading ticket: ' . $e->getMessage()); } } // -- Load tickets list -- try { $stmt = $pdo->prepare("SELECT st.*, au.full_name as assigned_to_name, (SELECT COUNT(*) FROM support_messages WHERE ticket_id = st.id AND is_internal = 0) as message_count FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.sender_type = 'partner' AND st.sender_id = ? ORDER BY st.created_at DESC"); $stmt->execute([$partner['id']]); $tickets = $stmt->fetchAll(); } catch (Exception $e) { logPartnerActivity('Error fetching tickets: ' . $e->getMessage()); $tickets = []; } // Helper: get file icon class function getPartnerFileIcon($type, $name) { $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION)); if (in_array($ext, ['jpg','jpeg','png','gif','webp'])) return 'fa-file-image'; if ($ext === 'pdf') return 'fa-file-pdf'; if (in_array($ext, ['doc','docx'])) return 'fa-file-word'; if (in_array($ext, ['xls','xlsx','csv'])) return 'fa-file-excel'; return 'fa-file-alt'; } ?> Partners - Relevant Reflex
RELEVANT REFLEXPARTNERS

Conversation

No messages yet.

' : ' '; ?>
'; foreach ($messageAttachments[$msg['id']] as $att) { $icon = getPartnerFileIcon($att['file_type'], $att['original_name']); $sizeMB = number_format(($att['file_size'] ?? 0) / 1024 / 1024, 1); echo ' ' . htmlspecialchars($att['original_name']) . ' (' . $sizeMB . ' MB)'; } echo '
'; } ?>
Send Reply
Max 3 files, 5MB each.
This ticket is closed. If you need further help, please create a new ticket.

Create New Support Ticket

Maximum 5000 characters
Max 3 files, 5MB each. Accepted: Images, PDF, Word, Excel, Text.

Your Support Tickets ()

No tickets yet

You haven't created any support tickets. Create one above if you need assistance.

-------------------- END OF FILE -------------------- ### FILE 27: RR COM/path-check.php - Type: PHP - Size: 19 B - Path: RR COM - Name: path-check.php ------------------------------------------------------------ pdo = $db->getConnection(); } /** * Award points to a user */ public function awardPoints($userId, $points, $source, $description, $referenceId = null) { try { $this->pdo->beginTransaction(); // Update user points $stmt = $this->pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?"); $stmt->execute([$userId, $points, $points, $points, $points]); // Add transaction record $stmt = $this->pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'earned', ?, ?, ?, ?)"); $stmt->execute([$userId, $points, $source, $description, $referenceId]); $this->pdo->commit(); logError('Points awarded', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'description' => $description ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error awarding points', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'error' => $e->getMessage() ]); return false; } } /** * Deduct points from a user (for redemptions) */ public function deductPoints($userId, $points, $source, $description, $referenceId = null) { try { $this->pdo->beginTransaction(); // Check if user has enough points $stmt = $this->pdo->prepare("SELECT points FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $userPoints = $stmt->fetch(); if (!$userPoints || $userPoints['points'] < $points) { $this->pdo->rollback(); return false; } // Deduct points $stmt = $this->pdo->prepare("UPDATE user_points SET points = points - ?, total_redeemed = total_redeemed + ? WHERE user_id = ?"); $stmt->execute([$points, $points, $userId]); // Add transaction record $stmt = $this->pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id) VALUES (?, 'redeemed', ?, ?, ?, ?)"); $stmt->execute([$userId, $points, $source, $description, $referenceId]); $this->pdo->commit(); logError('Points deducted', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'description' => $description ]); return true; } catch (Exception $e) { $this->pdo->rollback(); logError('Error deducting points', [ 'user_id' => $userId, 'points' => $points, 'source' => $source, 'error' => $e->getMessage() ]); return false; } } /** * Get user's point balance */ public function getUserPoints($userId) { try { $stmt = $this->pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $result = $stmt->fetch(); if (!$result) { return ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; } return $result; } catch (Exception $e) { logError('Error fetching user points', ['user_id' => $userId, 'error' => $e->getMessage()]); return ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; } } /** * Check and award onboarding points */ public function checkOnboardingPoints($userId) { try { $stmt = $this->pdo->prepare("SELECT email_verified, onboarding_completed, onboarding_points_awarded FROM users WHERE id = ?"); $stmt->execute([$userId]); $user = $stmt->fetch(); if ($user && $user['email_verified'] && !$user['onboarding_points_awarded']) { $this->pdo->beginTransaction(); // Award onboarding points $this->awardPoints($userId, 10, 'onboarding', 'Welcome bonus for email verification and first login'); // Mark onboarding as completed $stmt = $this->pdo->prepare("UPDATE users SET onboarding_completed = 1, onboarding_points_awarded = 1 WHERE id = ?"); $stmt->execute([$userId]); $this->pdo->commit(); return true; } return false; } catch (Exception $e) { $this->pdo->rollback(); logError('Error checking onboarding points', ['user_id' => $userId, 'error' => $e->getMessage()]); return false; } } /** * Check and award profiler section completion points */ public function checkProfilerCompletion($userId, $section) { try { // Get section questions count $profilerQuestionCounts = [ 'personal_background' => 6, 'household_family' => 8, 'shopping_lifestyle' => 7, 'technology_digital' => 7, 'travel_transportation' => 7, 'health_fitness' => 7, 'entertainment_media' => 8, 'food_dining' => 8, 'financial_services' => 8, 'communication_payments' => 7, 'household_classification' => 3 ]; if (!isset($profilerQuestionCounts[$section])) { return false; } $totalQuestions = $profilerQuestionCounts[$section]; // Count answered questions $stmt = $this->pdo->prepare("SELECT COUNT(*) as answered FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); $answered = $stmt->fetch()['answered']; $completionPercentage = ($answered / $totalQuestions) * 100; $isCompleted = $completionPercentage >= 100; // Update completion record $stmt = $this->pdo->prepare("INSERT INTO profiler_completion (user_id, section, total_questions, answered_questions, completion_percentage, is_completed, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE answered_questions = ?, completion_percentage = ?, is_completed = ?, completed_at = CASE WHEN ? = 1 THEN NOW() ELSE completed_at END, updated_at = NOW()"); $completedAt = $isCompleted ? date('Y-m-d H:i:s') : null; $stmt->execute([$userId, $section, $totalQuestions, $answered, $completionPercentage, $isCompleted, $completedAt, $answered, $completionPercentage, $isCompleted, $isCompleted]); // Award points if completed and not already awarded if ($isCompleted) { $stmt = $this->pdo->prepare("SELECT points_awarded FROM profiler_completion WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); $completion = $stmt->fetch(); if ($completion && !$completion['points_awarded']) { $pointsToAward = ($section === 'communication_payments') ? 10 : (($section === 'household_classification') ? 20 : 5); $description = ($section === 'communication_payments') ? 'Mobile verification and UPI details completion' : 'Profiler section completion: ' . ucwords(str_replace('_', ' ', $section)); $this->awardPoints($userId, $pointsToAward, 'profiler_' . $section, $description); // Mark points as awarded $stmt = $this->pdo->prepare("UPDATE profiler_completion SET points_awarded = 1 WHERE user_id = ? AND section = ?"); $stmt->execute([$userId, $section]); return $pointsToAward; } } return false; } catch (Exception $e) { logError('Error checking profiler completion', ['user_id' => $userId, 'section' => $section, 'error' => $e->getMessage()]); return false; } } /** * Get user's transaction history */ public function getTransactionHistory($userId, $limit = 50) { try { $stmt = $this->pdo->prepare("SELECT * FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT ?"); $stmt->execute([$userId, $limit]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching transaction history', ['user_id' => $userId, 'error' => $e->getMessage()]); return []; } } /** * Calculate points needed for next redemption tier */ public function getNextRedemptionTier($currentPoints) { $tiers = [500, 1000, 2000, 5000, 10000]; foreach ($tiers as $tier) { if ($currentPoints < $tier) { return [ 'next_tier' => $tier, 'points_needed' => $tier - $currentPoints, 'amount_value' => $tier * 0.5 ]; } } // If user has more than highest tier return [ 'next_tier' => null, 'points_needed' => 0, 'amount_value' => $currentPoints * 0.5 ]; } /** * Get points earning summary for admin */ public function getEarningSummary($dateRange = 30) { try { $stmt = $this->pdo->prepare(" SELECT source, COUNT(*) as transaction_count, SUM(points) as total_points, COUNT(DISTINCT user_id) as unique_users FROM point_transactions WHERE transaction_type = 'earned' AND created_at >= DATE_SUB(NOW(), INTERVAL ? DAY) GROUP BY source ORDER BY total_points DESC "); $stmt->execute([$dateRange]); return $stmt->fetchAll(); } catch (Exception $e) { logError('Error fetching earning summary', ['error' => $e->getMessage()]); return []; } } /** * Validate redemption request */ public function validateRedemption($userId, $points, $upiId) { $errors = []; // Check minimum points if ($points < 500) { $errors[] = 'Minimum redemption amount is 500 points (₹250).'; } // Check if points are in multiples of 10 if ($points % 10 !== 0) { $errors[] = 'Points must be redeemed in multiples of 10.'; } // Check user balance $userPoints = $this->getUserPoints($userId); if ($points > $userPoints['points']) { $errors[] = 'You cannot redeem more points than your available balance.'; } // Validate UPI ID if (empty($upiId)) { $errors[] = 'Please enter your UPI ID.'; } elseif (!preg_match('/^[\w\.-]+@[\w\.-]+$/', $upiId)) { $errors[] = 'Please enter a valid UPI ID (e.g., yourname@paytm).'; } return $errors; } } // Convenience functions for backward compatibility function awardUserPoints($userId, $points, $source, $description, $referenceId = null) { $pm = new PointsManager(); return $pm->awardPoints($userId, $points, $source, $description, $referenceId); } function getUserPointsBalance($userId) { $pm = new PointsManager(); return $pm->getUserPoints($userId); } function checkUserOnboarding($userId) { $pm = new PointsManager(); return $pm->checkOnboardingPoints($userId); } ?> -------------------- END OF FILE -------------------- ### FILE 29: RR COM/privacy.php - Type: PHP - Size: 32.25 KB - Path: RR COM - Name: privacy.php ------------------------------------------------------------ Privacy Policy - Relevant Reflex | Your Data Protection Rights
Last Updated: March 2026

1. Introduction

Welcome to Relevant Reflex ("we," "our," or "us"). We are committed to protecting your privacy and ensuring the security of your personal information. This Privacy Policy explains how we collect, use, disclose, and safeguard your information when you use our online survey platform and related services.

Key Principle: We believe in transparency and will never sell your personal data to third parties for marketing purposes.

By using our services, you agree to the collection and use of information in accordance with this Privacy Policy. If you disagree with any part of this policy, please do not use our services.

2. Information We Collect

2.1 Personal Information

We collect the following types of personal information:

  • Registration Information: Name, email address, date of birth, gender, postal code
  • Profile Information: Occupation, income range, interests, preferences, household information
  • Survey Responses: Your answers to survey questions and research studies
  • Communication Data: Messages you send to our support team

2.2 Technical Information

  • IP address and location data
  • Browser type and version
  • Device information (type, operating system)
  • Usage data (pages visited, time spent, click patterns)
  • Cookies and similar tracking technologies

2.3 Financial Information

For payment processing, we may collect:

  • UPI ID or UPI-linked mobile number (for reward transfers)
  • Bank account details (for direct transfers)
  • Payment method preferences

3. How We Use Your Information

3.1 Primary Uses

  • Survey Matching: To match you with relevant survey opportunities based on your demographics and interests
  • Account Management: To create and maintain your account, process registrations, and provide customer support
  • Payment Processing: To calculate, process, and distribute rewards for completed surveys
  • Communication: To send you survey invitations, account updates, and important service announcements

3.2 Secondary Uses

  • To improve our platform and user experience
  • To prevent fraud and maintain platform security
  • To comply with legal obligations and regulatory requirements
  • To conduct internal research and analytics
Legal Basis: We process your data based on consent, legitimate interests, contract performance, and legal obligations as per applicable Indian data protection laws.

4. Information Sharing and Disclosure

4.1 Survey Partners

We may share anonymized or aggregated survey data with our research partners and clients. Individual responses are never linked to personal identifiers without explicit consent.

4.2 Service Providers

We work with trusted third-party service providers who assist us with:

  • Payment processing
  • Email delivery services
  • Data hosting and security
  • Customer support platforms

4.3 Legal Requirements

We may disclose your information if required by law, court order, or to:

  • Comply with legal processes
  • Protect our rights and property
  • Prevent fraud or security threats
  • Protect the safety of our users

4.4 Business Transfers

In the event of a merger, acquisition, or sale of assets, your information may be transferred as part of the business transaction.

5. Data Security

5.1 Security Measures

We implement industry-standard security measures to protect your information:

  • SSL encryption for all data transmissions
  • Secure database storage with access controls
  • Regular security audits and updates
  • Employee training on data protection
  • Multi-factor authentication for admin access

5.2 Data Breach Response

In the unlikely event of a data breach, we will:

  • Notify affected users within 72 hours
  • Report to relevant authorities as required
  • Take immediate steps to secure the breach
  • Provide guidance on protective measures

6. Your Rights and Choices

Under applicable data protection laws, you have the following rights:

6.1 Access and Portability

  • Request a copy of your personal data
  • Download your data in a portable format
  • View your survey history and earnings

6.2 Correction and Updates

  • Update your profile information
  • Correct inaccurate data
  • Modify communication preferences

6.3 Deletion and Restriction

  • Request deletion of your account and data
  • Restrict processing of certain information
  • Object to specific uses of your data
Exercise Your Rights: To exercise any of these rights, contact us at privacy@relevantreflex.com or through your account settings.

7. Cookies and Tracking Technologies

7.1 Types of Cookies We Use

  • Essential Cookies: Required for basic platform functionality
  • Performance Cookies: Help us analyze platform usage and improve performance
  • Functional Cookies: Remember your preferences and settings
  • Targeting Cookies: Used to deliver relevant survey opportunities

7.2 Advertising and Analytics Cookies

We use third-party advertising and analytics services, including Google Ads and Google Analytics. These services may set cookies on your device to:

  • Measure the effectiveness of our advertising campaigns
  • Show you relevant advertisements on other websites
  • Analyze how visitors use our website

Google's use of advertising cookies enables it to serve ads based on your prior visits to our site. You may opt out of personalized advertising by visiting Google Ad Settings.

For more information on how Google uses data when you use our site, visit: How Google uses data from sites that use Google services.

7.3 Cookie Consent

On your first visit to our website, you will see a cookie consent banner. You may accept all cookies or decline non-essential cookies. Essential cookies required for the platform to function will always remain active. You can change your preferences at any time by clearing your browser cookies.

7.4 Cookie Management

You can control cookies through your browser settings. However, disabling certain cookies may limit platform functionality.

8. Data Retention

We retain your information for the following periods:

  • Active Accounts: Data retained while account is active
  • Inactive Accounts: Data retained for 2 years after last activity
  • Survey Data: Anonymized responses may be retained for research purposes
  • Financial Records: Retained for 7 years as per legal requirements
  • Marketing Communications: Until you unsubscribe

9. Children's Privacy

Our services are not intended for individuals under 18 years of age. We do not knowingly collect personal information from children. If we discover that we have collected information from a child, we will delete it immediately.

Parents or guardians who believe their child has provided information to us should contact us immediately.

10. International Data Transfers

While we primarily operate within India, some of our service providers may be located internationally. When we transfer data outside India, we ensure:

  • Adequate protection through contractual safeguards
  • Compliance with applicable data transfer regulations
  • Use of standard contractual clauses where required

11. Changes to This Privacy Policy

We may update this Privacy Policy periodically to reflect changes in our practices or applicable laws. We will:

  • Notify users of material changes via email
  • Post updates on our website
  • Provide a clear summary of changes
  • Allow reasonable time for review before changes take effect

Continued use of our services after policy updates constitutes acceptance of the changes.

12. Contact Us

If you have questions about this Privacy Policy or our data practices, please contact us:

General Inquiries

support@relevantreflex.com
Ethirmedu, NH 544, Tamilnadu - 638183, India

Privacy-Specific Inquiries

privacy@relevantreflex.com
Data Protection Officer

Response Time: We aim to respond to all privacy-related inquiries within 30 days.
-------------------- END OF FILE -------------------- ### FILE 30: RR COM/profiler-api.php - Type: PHP - Size: 5.66 KB - Path: RR COM - Name: profiler-api.php ------------------------------------------------------------ 'Not authenticated']); exit; } $user = getCurrentUser(); if (!$user) { echo json_encode(['error' => 'User not found']); exit; } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { echo json_encode(['error' => 'Database connection failed']); exit; } $action = isset($_GET['action']) ? $_GET['action'] : ''; switch ($action) { case 'status': getProfilerStatus($pdo, $user['id']); break; case 'points': getUserPointsStatus($user['id']); break; case 'completion': getCompletionSummary($pdo, $user['id']); break; default: echo json_encode(['error' => 'Invalid action']); } function getProfilerStatus($pdo, $userId) { $profilerSections = [ 'personal_background' => 'Personal Background', 'household_family' => 'Household & Family', 'shopping_lifestyle' => 'Shopping & Lifestyle', 'technology_digital' => 'Technology & Digital', 'travel_transportation' => 'Travel & Transportation', 'health_fitness' => 'Health & Fitness', 'entertainment_media' => 'Entertainment & Media', 'food_dining' => 'Food & Dining', 'financial_services' => 'Financial Services', 'communication_payments' => 'Communication & Payments', 'household_classification' => 'Household Classification (ISEC)' ]; $completion = []; $totalCompleted = 0; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$userId]); while ($row = $stmt->fetch()) { $completion[$row['section']] = [ 'name' => $profilerSections[$row['section']], 'percentage' => floatval($row['completion_percentage']), 'completed' => boolval($row['is_completed']), 'points_awarded' => boolval($row['points_awarded']) ]; if ($row['is_completed']) { $totalCompleted++; } } // Add sections not started foreach ($profilerSections as $key => $name) { if (!isset($completion[$key])) { $completion[$key] = [ 'name' => $name, 'percentage' => 0, 'completed' => false, 'points_awarded' => false ]; } } // Check mobile verification status $stmt = $pdo->prepare("SELECT is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$userId]); $mobileVerified = $stmt->fetch(); echo json_encode([ 'success' => true, 'sections' => $completion, 'total_sections' => count($profilerSections), 'completed_sections' => $totalCompleted, 'overall_percentage' => round(($totalCompleted / count($profilerSections)) * 100, 2), 'mobile_verified' => $mobileVerified ? boolval($mobileVerified['is_verified']) : false ]); } catch (Exception $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } } function getUserPointsStatus($userId) { $pm = new PointsManager(); $points = $pm->getUserPoints($userId); $nextTier = $pm->getNextRedemptionTier($points['points']); echo json_encode([ 'success' => true, 'points' => $points, 'next_tier' => $nextTier, 'can_redeem' => $points['points'] >= 500, 'rupee_value' => $points['points'] * 0.5 ]); } function getCompletionSummary($pdo, $userId) { try { // Get overall completion stats $stmt = $pdo->prepare(" SELECT COUNT(*) as total_sections, SUM(CASE WHEN is_completed = 1 THEN 1 ELSE 0 END) as completed_sections, SUM(CASE WHEN points_awarded = 1 THEN 1 ELSE 0 END) as points_awarded_sections FROM profiler_completion WHERE user_id = ? "); $stmt->execute([$userId]); $stats = $stmt->fetch(); if (!$stats) { $stats = ['total_sections' => 0, 'completed_sections' => 0, 'points_awarded_sections' => 0]; } // Get recent transactions $stmt = $pdo->prepare(" SELECT transaction_type, points, source, description, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 5 "); $stmt->execute([$userId]); $recentTransactions = $stmt->fetchAll(); // Get user points $pm = new PointsManager(); $points = $pm->getUserPoints($userId); echo json_encode([ 'success' => true, 'completion_stats' => $stats, 'points_summary' => $points, 'recent_transactions' => $recentTransactions, 'potential_earnings' => [ 'total_possible' => 90, // 10 sections × 5 points + 20 (ISEC) + 10 bonus + 10 mobile 'remaining' => max(0, 70 - $points['total_earned']) ] ]); } catch (Exception $e) { echo json_encode(['error' => 'Database error: ' . $e->getMessage()]); } } ?> -------------------- END OF FILE -------------------- ### FILE 31: RR COM/profiler.php - Type: PHP - Size: 73.74 KB - Path: RR COM - Name: profiler.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in profiler.php: ' . $e->getMessage()); die('System error. Please try again later.'); } // Define all profiler sections with their questions $profilerSections = [ 'personal_background' => [ 'name' => 'Personal Background', 'description' => 'Tell us about your education, work, and personal details', 'questions' => [ 'education_level' => [ 'question' => 'What is your highest level of education?', 'type' => 'single', 'options' => [ 'below_10th' => 'Below 10th Standard', '10th_pass' => '10th Standard', '12th_pass' => '12th Standard/Intermediate', 'diploma' => 'Diploma/ITI', 'graduation' => 'Graduation (Bachelor\'s)', 'post_graduation' => 'Post Graduation (Master\'s)', 'professional' => 'Professional Degree (CA/CS/Engineering/Medical)', 'doctorate' => 'Doctorate/PhD' ] ], 'employment_status' => [ 'question' => 'What is your current employment status?', 'type' => 'single', 'options' => [ 'student' => 'Student', 'employed_private' => 'Employed - Private Sector', 'employed_government' => 'Employed - Government/Public Sector', 'self_employed' => 'Self Employed/Business Owner', 'freelancer' => 'Freelancer/Consultant', 'homemaker' => 'Homemaker', 'retired' => 'Retired', 'unemployed' => 'Currently Unemployed' ] ], 'occupation_sector' => [ 'question' => 'Which sector do you work in? (Skip if not applicable)', 'type' => 'single', 'options' => [ 'it_software' => 'IT/Software', 'banking_finance' => 'Banking/Finance', 'healthcare' => 'Healthcare/Medical', 'education' => 'Education/Teaching', 'manufacturing' => 'Manufacturing', 'retail_sales' => 'Retail/Sales', 'government' => 'Government Services', 'agriculture' => 'Agriculture/Farming', 'media_entertainment' => 'Media/Entertainment', 'other' => 'Other' ] ], 'monthly_income' => [ 'question' => 'What is your monthly personal income range?', 'type' => 'single', 'options' => [ 'no_income' => 'No Income', 'below_15k' => 'Below ₹15,000', '15k_30k' => '₹15,000 - ₹30,000', '30k_50k' => '₹30,000 - ₹50,000', '50k_75k' => '₹50,000 - ₹75,000', '75k_1l' => '₹75,000 - ₹1,00,000', '1l_2l' => '₹1,00,000 - ₹2,00,000', 'above_2l' => 'Above ₹2,00,000' ] ], 'work_experience' => [ 'question' => 'How many years of work experience do you have?', 'type' => 'single', 'options' => [ 'fresher' => 'Fresher (0 years)', '1_2_years' => '1-2 years', '3_5_years' => '3-5 years', '6_10_years' => '6-10 years', '11_15_years' => '11-15 years', 'above_15_years' => 'More than 15 years' ] ], 'language_preference' => [ 'question' => 'Which languages are you comfortable with? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'hindi' => 'Hindi', 'english' => 'English', 'tamil' => 'Tamil', 'telugu' => 'Telugu', 'bengali' => 'Bengali', 'marathi' => 'Marathi', 'gujarati' => 'Gujarati', 'kannada' => 'Kannada', 'malayalam' => 'Malayalam', 'punjabi' => 'Punjabi', 'other' => 'Other' ] ] ] ], 'household_family' => [ 'name' => 'Household & Family', 'description' => 'Share information about your household and family', 'questions' => [ 'family_size' => [ 'question' => 'How many people live in your household?', 'type' => 'single', 'options' => [ '1' => '1 (Just me)', '2' => '2 people', '3' => '3 people', '4' => '4 people', '5' => '5 people', '6_plus' => '6 or more people' ] ], 'marital_status' => [ 'question' => 'What is your marital status?', 'type' => 'single', 'options' => [ 'single' => 'Single', 'married' => 'Married', 'divorced' => 'Divorced', 'widowed' => 'Widowed', 'in_relationship' => 'In a relationship' ] ], 'children' => [ 'question' => 'Do you have children?', 'type' => 'single', 'options' => [ 'no_children' => 'No children', 'expecting' => 'Expecting first child', '1_child' => '1 child', '2_children' => '2 children', '3_children' => '3 children', '4_plus_children' => '4 or more children' ] ], 'children_age_groups' => [ 'question' => 'If you have children, what are their age groups? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'infant' => 'Infant (0-2 years)', 'toddler' => 'Toddler (3-5 years)', 'child' => 'Child (6-12 years)', 'teenager' => 'Teenager (13-18 years)', 'adult' => 'Adult (18+ years)', 'not_applicable' => 'Not applicable' ] ], 'house_type' => [ 'question' => 'What type of housing do you live in?', 'type' => 'single', 'options' => [ 'apartment' => 'Apartment/Flat', 'independent_house' => 'Independent House', 'villa' => 'Villa', 'row_house' => 'Row House/Townhouse', 'rented_room' => 'Rented Room', 'hostel_pg' => 'Hostel/PG', 'other' => 'Other' ] ], 'house_ownership' => [ 'question' => 'Is your house?', 'type' => 'single', 'options' => [ 'owned' => 'Owned by family', 'rented' => 'Rented', 'company_provided' => 'Company provided', 'family_owned' => 'Joint family property', 'other' => 'Other' ] ], 'pet_ownership' => [ 'question' => 'Do you have any pets?', 'type' => 'multiple', 'options' => [ 'dog' => 'Dog', 'cat' => 'Cat', 'bird' => 'Birds', 'fish' => 'Fish', 'other_pet' => 'Other pets', 'no_pets' => 'No pets' ] ], 'household_income' => [ 'question' => 'What is your total monthly household income?', 'type' => 'single', 'options' => [ 'below_15k' => 'Below ₹15,000', '15k_25k' => '₹15,000 - ₹25,000', '25k_50k' => '₹25,000 - ₹50,000', '50k_75k' => '₹50,000 - ₹75,000', '75k_1l' => '₹75,000 - ₹1,00,000', '1l_2l' => '₹1,00,000 - ₹2,00,000', '2l_5l' => '₹2,00,000 - ₹5,00,000', 'above_5l' => 'Above ₹5,00,000', 'prefer_not' => 'Prefer not to say' ] ] ] ], 'shopping_lifestyle' => [ 'name' => 'Shopping & Lifestyle', 'description' => 'Tell us about your shopping habits and lifestyle preferences', 'questions' => [ 'shopping_frequency' => [ 'question' => 'How often do you shop for non-essential items?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'bi_weekly' => 'Bi-weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely' ] ], 'shopping_preference' => [ 'question' => 'Where do you prefer to shop? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'online' => 'Online (e-commerce websites)', 'malls' => 'Shopping malls', 'local_stores' => 'Local stores/markets', 'supermarkets' => 'Supermarkets', 'brand_stores' => 'Brand exclusive stores', 'wholesale_markets' => 'Wholesale markets' ] ], 'monthly_shopping_budget' => [ 'question' => 'What is your monthly shopping budget for non-essential items?', 'type' => 'single', 'options' => [ 'below_2k' => 'Below ₹2,000', '2k_5k' => '₹2,000 - ₹5,000', '5k_10k' => '₹5,000 - ₹10,000', '10k_20k' => '₹10,000 - ₹20,000', '20k_50k' => '₹20,000 - ₹50,000', 'above_50k' => 'Above ₹50,000' ] ], 'brand_consciousness' => [ 'question' => 'How important are brands to you when making purchase decisions?', 'type' => 'single', 'options' => [ 'very_important' => 'Very important - I only buy branded products', 'somewhat_important' => 'Somewhat important - I prefer brands but consider alternatives', 'neutral' => 'Neutral - Brand doesn\'t matter much', 'not_important' => 'Not important - I focus on value and quality', 'avoid_brands' => 'I actively avoid expensive brands' ] ], 'online_shopping_frequency' => [ 'question' => 'How often do you shop online?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'quarterly' => 'Quarterly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'lifestyle_interests' => [ 'question' => 'What are your main lifestyle interests? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'fitness' => 'Fitness and health', 'cooking' => 'Cooking and food', 'travel' => 'Travel and exploration', 'fashion' => 'Fashion and style', 'home_decor' => 'Home decoration', 'gadgets' => 'Technology and gadgets', 'books' => 'Reading and books', 'movies' => 'Movies and entertainment', 'music' => 'Music', 'sports' => 'Sports', 'art' => 'Art and culture' ] ], 'social_media_usage' => [ 'question' => 'Which social media platforms do you actively use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'facebook' => 'Facebook', 'instagram' => 'Instagram', 'twitter' => 'Twitter/X', 'linkedin' => 'LinkedIn', 'youtube' => 'YouTube', 'whatsapp' => 'WhatsApp', 'telegram' => 'Telegram', 'snapchat' => 'Snapchat', 'tiktok' => 'TikTok/Reels', 'none' => 'I don\'t use social media' ] ] ] ], 'technology_digital' => [ 'name' => 'Technology & Digital', 'description' => 'Share your technology usage and digital preferences', 'questions' => [ 'smartphone_brand' => [ 'question' => 'Which smartphone brand do you currently use?', 'type' => 'single', 'options' => [ 'samsung' => 'Samsung', 'apple' => 'Apple iPhone', 'xiaomi' => 'Xiaomi/Mi/Redmi', 'oneplus' => 'OnePlus', 'oppo' => 'Oppo', 'vivo' => 'Vivo', 'realme' => 'Realme', 'google' => 'Google Pixel', 'motorola' => 'Motorola', 'other' => 'Other' ] ], 'internet_usage_hours' => [ 'question' => 'How many hours do you spend on the internet daily?', 'type' => 'single', 'options' => [ '1_2_hours' => '1-2 hours', '3_4_hours' => '3-4 hours', '5_6_hours' => '5-6 hours', '7_8_hours' => '7-8 hours', '9_10_hours' => '9-10 hours', 'more_than_10' => 'More than 10 hours' ] ], 'primary_internet_activity' => [ 'question' => 'What do you primarily use the internet for? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'social_media' => 'Social media', 'entertainment' => 'Entertainment (videos, music)', 'work' => 'Work/Professional', 'shopping' => 'Online shopping', 'news' => 'News and information', 'education' => 'Learning and education', 'gaming' => 'Gaming', 'communication' => 'Communication (calls, messages)', 'banking' => 'Banking and financial services' ] ], 'streaming_services' => [ 'question' => 'Which streaming services do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'netflix' => 'Netflix', 'amazon_prime' => 'Amazon Prime Video', 'hotstar' => 'Disney+ Hotstar', 'youtube_premium' => 'YouTube Premium', 'sony_liv' => 'Sony LIV', 'zee5' => 'ZEE5', 'voot' => 'Voot', 'mx_player' => 'MX Player', 'spotify' => 'Spotify', 'none' => 'None of these' ] ], 'online_payment_methods' => [ 'question' => 'Which online payment methods do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'upi' => 'UPI (PhonePe, GooglePay, Paytm)', 'credit_card' => 'Credit Card', 'debit_card' => 'Debit Card', 'net_banking' => 'Net Banking', 'digital_wallet' => 'Digital Wallets', 'cod' => 'Cash on Delivery', 'bank_transfer' => 'Bank Transfer' ] ], 'tech_comfort_level' => [ 'question' => 'How would you rate your comfort level with technology?', 'type' => 'single', 'options' => [ 'expert' => 'Expert - I\'m very tech-savvy', 'advanced' => 'Advanced - I\'m comfortable with most tech', 'intermediate' => 'Intermediate - I can handle basic to moderate tech tasks', 'beginner' => 'Beginner - I use basic features only', 'minimal' => 'Minimal - I struggle with technology' ] ], 'smart_devices_owned' => [ 'question' => 'Which smart devices do you own? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smart_tv' => 'Smart TV', 'smart_speaker' => 'Smart Speaker (Alexa, Google Home)', 'smartwatch' => 'Smartwatch/Fitness Tracker', 'laptop' => 'Laptop', 'tablet' => 'Tablet', 'gaming_console' => 'Gaming Console', 'smart_home' => 'Smart Home Devices', 'none' => 'None of these' ] ] ] ], 'travel_transportation' => [ 'name' => 'Travel & Transportation', 'description' => 'Tell us about your travel habits and transportation preferences', 'questions' => [ 'travel_frequency' => [ 'question' => 'How often do you travel for leisure/vacation?', 'type' => 'single', 'options' => [ 'monthly' => 'Monthly', 'quarterly' => 'Every 3-4 months', 'twice_yearly' => 'Twice a year', 'annually' => 'Once a year', 'rarely' => 'Rarely (once in 2-3 years)', 'never' => 'Never' ] ], 'travel_destinations' => [ 'question' => 'What type of destinations do you prefer? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'domestic_cities' => 'Domestic cities', 'hill_stations' => 'Hill stations', 'beaches' => 'Beaches', 'historical_places' => 'Historical places', 'religious_places' => 'Religious places', 'international' => 'International destinations', 'adventure_spots' => 'Adventure destinations', 'family_spots' => 'Family-friendly places' ] ], 'accommodation_preference' => [ 'question' => 'What type of accommodation do you prefer while traveling?', 'type' => 'single', 'options' => [ 'luxury_hotels' => 'Luxury hotels (5-star)', 'mid_range_hotels' => 'Mid-range hotels (3-4 star)', 'budget_hotels' => 'Budget hotels', 'resorts' => 'Resorts', 'homestays' => 'Homestays', 'hostels' => 'Hostels', 'airbnb' => 'Airbnb/Rental apartments', 'family_friends' => 'Stay with family/friends' ] ], 'daily_commute_mode' => [ 'question' => 'What is your primary mode of daily transportation?', 'type' => 'single', 'options' => [ 'own_car' => 'Own car', 'own_bike' => 'Own bike/scooter', 'public_transport' => 'Public transport (bus, metro)', 'auto_rickshaw' => 'Auto rickshaw', 'taxi_cab' => 'Taxi/Cab services', 'ride_sharing' => 'Ride sharing (Ola, Uber)', 'walking' => 'Walking', 'cycling' => 'Cycling', 'work_from_home' => 'Work from home (no commute)' ] ], 'vehicle_ownership' => [ 'question' => 'Which vehicles do you own? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'car' => 'Car', 'motorcycle' => 'Motorcycle', 'scooter' => 'Scooter', 'bicycle' => 'Bicycle', 'electric_vehicle' => 'Electric vehicle', 'none' => 'None' ] ], 'fuel_type_preference' => [ 'question' => 'If you own a vehicle, what fuel type do you prefer?', 'type' => 'single', 'options' => [ 'petrol' => 'Petrol', 'diesel' => 'Diesel', 'cng' => 'CNG', 'electric' => 'Electric', 'hybrid' => 'Hybrid', 'not_applicable' => 'Not applicable (don\'t own vehicle)' ] ], 'ride_sharing_usage' => [ 'question' => 'How often do you use ride-sharing services (Ola, Uber)?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely', 'never' => 'Never' ] ] ] ], 'health_fitness' => [ 'name' => 'Health & Fitness', 'description' => 'Share your health and fitness preferences and habits', 'questions' => [ 'exercise_frequency' => [ 'question' => 'How often do you exercise or engage in physical activities?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Once a week', 'monthly' => 'Few times a month', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'exercise_types' => [ 'question' => 'What types of physical activities do you engage in? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'gym' => 'Gym workouts', 'running' => 'Running/Jogging', 'walking' => 'Walking', 'yoga' => 'Yoga', 'cycling' => 'Cycling', 'swimming' => 'Swimming', 'sports' => 'Sports (cricket, football, etc.)', 'dancing' => 'Dancing', 'home_workouts' => 'Home workouts', 'none' => 'None' ] ], 'diet_preference' => [ 'question' => 'What is your dietary preference?', 'type' => 'single', 'options' => [ 'vegetarian' => 'Vegetarian', 'non_vegetarian' => 'Non-vegetarian', 'vegan' => 'Vegan', 'jain_vegetarian' => 'Jain vegetarian', 'eggetarian' => 'Eggetarian', 'flexitarian' => 'Flexitarian (mostly vegetarian)', 'no_preference' => 'No specific preference' ] ], 'health_concerns' => [ 'question' => 'Do you have any of these health concerns? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'diabetes' => 'Diabetes', 'hypertension' => 'High blood pressure', 'heart_disease' => 'Heart disease', 'obesity' => 'Weight management issues', 'allergies' => 'Allergies', 'digestive_issues' => 'Digestive issues', 'mental_health' => 'Mental health concerns', 'none' => 'None', 'prefer_not_say' => 'Prefer not to say' ] ], 'healthcare_spending' => [ 'question' => 'How much do you spend on healthcare annually?', 'type' => 'single', 'options' => [ 'below_10k' => 'Below ₹10,000', '10k_25k' => '₹10,000 - ₹25,000', '25k_50k' => '₹25,000 - ₹50,000', '50k_1l' => '₹50,000 - ₹1,00,000', 'above_1l' => 'Above ₹1,00,000', 'not_sure' => 'Not sure' ] ], 'health_insurance' => [ 'question' => 'Do you have health insurance?', 'type' => 'single', 'options' => [ 'employer_provided' => 'Yes, provided by employer', 'personal_policy' => 'Yes, personal policy', 'family_floater' => 'Yes, family floater policy', 'government_scheme' => 'Yes, government scheme', 'no_insurance' => 'No health insurance', 'not_sure' => 'Not sure' ] ], 'wellness_interests' => [ 'question' => 'Which wellness activities interest you? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'meditation' => 'Meditation', 'spa_treatments' => 'Spa treatments', 'nutrition_counseling' => 'Nutrition counseling', 'fitness_training' => 'Personal fitness training', 'alternative_medicine' => 'Alternative medicine', 'mental_health_support' => 'Mental health support', 'wellness_retreats' => 'Wellness retreats', 'none' => 'None of these' ] ] ] ], 'entertainment_media' => [ 'name' => 'Entertainment & Media', 'description' => 'Tell us about your entertainment preferences and media consumption', 'questions' => [ 'tv_watching_hours' => [ 'question' => 'How many hours do you watch TV/streaming content daily?', 'type' => 'single', 'options' => [ 'none' => 'I don\'t watch TV', '1_hour' => 'Less than 1 hour', '1_2_hours' => '1-2 hours', '2_3_hours' => '2-3 hours', '3_5_hours' => '3-5 hours', 'more_than_5' => 'More than 5 hours' ] ], 'content_preferences' => [ 'question' => 'What type of content do you prefer? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'bollywood_movies' => 'Bollywood movies', 'hollywood_movies' => 'Hollywood movies', 'regional_movies' => 'Regional movies', 'tv_serials' => 'TV serials/shows', 'reality_shows' => 'Reality shows', 'news' => 'News', 'documentaries' => 'Documentaries', 'comedy_shows' => 'Comedy shows', 'sports' => 'Sports', 'music_videos' => 'Music videos' ] ], 'movie_genres' => [ 'question' => 'Which movie genres do you enjoy? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'action' => 'Action', 'comedy' => 'Comedy', 'drama' => 'Drama', 'romance' => 'Romance', 'thriller' => 'Thriller', 'horror' => 'Horror', 'sci_fi' => 'Science Fiction', 'documentary' => 'Documentary', 'biography' => 'Biography', 'animation' => 'Animation' ] ], 'music_preferences' => [ 'question' => 'What type of music do you listen to? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'bollywood' => 'Bollywood', 'classical_indian' => 'Classical Indian', 'devotional' => 'Devotional/Religious', 'pop' => 'Pop', 'rock' => 'Rock', 'hip_hop' => 'Hip Hop', 'electronic' => 'Electronic/EDM', 'folk' => 'Folk', 'international' => 'International', 'regional' => 'Regional' ] ], 'gaming_habits' => [ 'question' => 'How often do you play games (mobile, PC, console)?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'reading_habits' => [ 'question' => 'How often do you read books, magazines, or blogs?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never' ] ], 'content_consumption_device' => [ 'question' => 'Which device do you primarily use for entertainment? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smartphone' => 'Smartphone', 'smart_tv' => 'Smart TV', 'laptop' => 'Laptop', 'tablet' => 'Tablet', 'desktop' => 'Desktop computer', 'gaming_console' => 'Gaming console', 'traditional_tv' => 'Traditional TV' ] ], 'entertainment_spending' => [ 'question' => 'How much do you spend on entertainment monthly?', 'type' => 'single', 'options' => [ 'below_500' => 'Below ₹500', '500_1000' => '₹500 - ₹1,000', '1000_2000' => '₹1,000 - ₹2,000', '2000_5000' => '₹2,000 - ₹5,000', 'above_5000' => 'Above ₹5,000', 'not_sure' => 'Not sure' ] ] ] ], 'food_dining' => [ 'name' => 'Food & Dining', 'description' => 'Share your food preferences and dining habits', 'questions' => [ 'cooking_frequency' => [ 'question' => 'How often do you cook at home?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'rarely' => 'Rarely', 'never' => 'Never - I don\'t cook' ] ], 'cuisine_preferences' => [ 'question' => 'Which cuisines do you enjoy? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'north_indian' => 'North Indian', 'south_indian' => 'South Indian', 'regional_local' => 'Regional/Local cuisine', 'chinese' => 'Chinese', 'italian' => 'Italian', 'continental' => 'Continental', 'mexican' => 'Mexican', 'thai' => 'Thai', 'japanese' => 'Japanese', 'fast_food' => 'Fast food' ] ], 'dining_out_frequency' => [ 'question' => 'How often do you dine out or order food?', 'type' => 'single', 'options' => [ 'daily' => 'Daily', 'few_times_week' => 'Few times a week', 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'occasionally' => 'Occasionally', 'rarely' => 'Rarely' ] ], 'food_delivery_apps' => [ 'question' => 'Which food delivery apps do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'zomato' => 'Zomato', 'swiggy' => 'Swiggy', 'uber_eats' => 'Uber Eats', 'dominos' => 'Domino\'s', 'pizza_hut' => 'Pizza Hut', 'restaurant_direct' => 'Restaurant direct delivery', 'none' => 'None - I don\'t use food delivery' ] ], 'food_spending_monthly' => [ 'question' => 'How much do you spend on food (including dining out) monthly?', 'type' => 'single', 'options' => [ 'below_3k' => 'Below ₹3,000', '3k_5k' => '₹3,000 - ₹5,000', '5k_8k' => '₹5,000 - ₹8,000', '8k_12k' => '₹8,000 - ₹12,000', '12k_20k' => '₹12,000 - ₹20,000', 'above_20k' => 'Above ₹20,000' ] ], 'special_dietary_requirements' => [ 'question' => 'Do you have any special dietary requirements? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'gluten_free' => 'Gluten-free', 'dairy_free' => 'Dairy-free', 'sugar_free' => 'Sugar-free/Low sugar', 'low_sodium' => 'Low sodium', 'organic_only' => 'Organic food only', 'weight_management' => 'Weight management diet', 'diabetic_friendly' => 'Diabetic-friendly', 'none' => 'No special requirements' ] ], 'grocery_shopping_preference' => [ 'question' => 'Where do you prefer to buy groceries? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'local_stores' => 'Local grocery stores', 'supermarkets' => 'Supermarkets', 'online_delivery' => 'Online grocery delivery', 'wholesale_markets' => 'Wholesale markets', 'organic_stores' => 'Organic/specialty stores', 'convenience_stores' => 'Convenience stores' ] ], 'beverage_preferences' => [ 'question' => 'What beverages do you regularly consume? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'tea' => 'Tea', 'coffee' => 'Coffee', 'soft_drinks' => 'Soft drinks', 'juices' => 'Fruit juices', 'energy_drinks' => 'Energy drinks', 'health_drinks' => 'Health drinks/Protein shakes', 'alcohol' => 'Alcoholic beverages', 'water_only' => 'Mostly just water' ] ] ] ], 'financial_services' => [ 'name' => 'Financial Services', 'description' => 'Tell us about your financial preferences and banking habits', 'questions' => [ 'primary_bank' => [ 'question' => 'Which is your primary bank?', 'type' => 'single', 'options' => [ 'sbi' => 'State Bank of India (SBI)', 'hdfc' => 'HDFC Bank', 'icici' => 'ICICI Bank', 'axis' => 'Axis Bank', 'pnb' => 'Punjab National Bank', 'canara' => 'Canara Bank', 'bob' => 'Bank of Baroda', 'kotak' => 'Kotak Mahindra Bank', 'yes_bank' => 'Yes Bank', 'other' => 'Other' ] ], 'banking_frequency' => [ 'question' => 'How often do you visit bank branches?', 'type' => 'single', 'options' => [ 'weekly' => 'Weekly', 'monthly' => 'Monthly', 'quarterly' => 'Quarterly', 'rarely' => 'Rarely', 'never' => 'Never - I use only digital banking' ] ], 'investment_products' => [ 'question' => 'Which investment products do you currently use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'savings_account' => 'Savings account', 'fixed_deposits' => 'Fixed deposits', 'mutual_funds' => 'Mutual funds', 'stocks' => 'Stocks/Shares', 'ppf' => 'PPF (Public Provident Fund)', 'nps' => 'NPS (National Pension System)', 'life_insurance' => 'Life insurance', 'gold' => 'Gold investments', 'real_estate' => 'Real estate', 'none' => 'None of these' ] ], 'credit_products' => [ 'question' => 'Which credit products do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'credit_card' => 'Credit card', 'personal_loan' => 'Personal loan', 'home_loan' => 'Home loan', 'car_loan' => 'Car loan', 'education_loan' => 'Education loan', 'business_loan' => 'Business loan', 'overdraft' => 'Overdraft facility', 'none' => 'None' ] ], 'financial_planning' => [ 'question' => 'Do you engage in financial planning?', 'type' => 'single', 'options' => [ 'professional_advisor' => 'Yes, with a professional financial advisor', 'self_planned' => 'Yes, I plan myself', 'family_guidance' => 'Yes, with family guidance', 'basic_planning' => 'Basic planning only', 'no_planning' => 'No, I don\'t plan financially', 'want_to_start' => 'No, but I want to start' ] ], 'insurance_products' => [ 'question' => 'What insurance products do you have? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'life_insurance' => 'Life insurance', 'health_insurance' => 'Health insurance', 'vehicle_insurance' => 'Vehicle insurance', 'home_insurance' => 'Home insurance', 'travel_insurance' => 'Travel insurance', 'term_insurance' => 'Term insurance', 'none' => 'No insurance' ] ], 'digital_payment_comfort' => [ 'question' => 'How comfortable are you with digital payments?', 'type' => 'single', 'options' => [ 'very_comfortable' => 'Very comfortable - I use for all transactions', 'mostly_comfortable' => 'Mostly comfortable - I use for most transactions', 'somewhat_comfortable' => 'Somewhat comfortable - I use for small amounts', 'limited_use' => 'Limited use - Only when necessary', 'prefer_cash' => 'I prefer cash transactions' ] ], 'financial_goals' => [ 'question' => 'What are your main financial goals? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'emergency_fund' => 'Building emergency fund', 'retirement_planning' => 'Retirement planning', 'home_purchase' => 'Buying a home', 'child_education' => 'Children\'s education', 'wealth_creation' => 'Wealth creation', 'debt_reduction' => 'Reducing debt', 'travel_fund' => 'Travel fund', 'business_investment' => 'Starting/expanding business', 'no_specific_goals' => 'No specific goals' ] ] ] ], 'communication_payments' => [ 'name' => 'Communication & Payments', 'description' => 'Share your communication preferences and survey availability', 'questions' => [ 'preferred_days_for_surveys' => [ 'question' => 'Which days of the week are you available for surveys? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'monday' => 'Monday', 'tuesday' => 'Tuesday', 'wednesday' => 'Wednesday', 'thursday' => 'Thursday', 'friday' => 'Friday', 'saturday' => 'Saturday', 'sunday' => 'Sunday', 'any_day' => 'Any day of the week' ] ], 'notification_preferences' => [ 'question' => 'How would you like to receive survey notifications? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'sms' => 'SMS', 'email' => 'Email', 'whatsapp' => 'WhatsApp', 'app_notification' => 'App notification', 'phone_call' => 'Phone call' ] ], 'primary_communication_language' => [ 'question' => 'What is your preferred language for communication?', 'type' => 'single', 'options' => [ 'english' => 'English', 'hindi' => 'Hindi', 'tamil' => 'Tamil', 'telugu' => 'Telugu', 'bengali' => 'Bengali', 'marathi' => 'Marathi', 'gujarati' => 'Gujarati', 'kannada' => 'Kannada', 'malayalam' => 'Malayalam', 'punjabi' => 'Punjabi', 'other' => 'Other' ] ], 'survey_participation_time' => [ 'question' => 'What time of day do you prefer to participate in surveys? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'early_morning' => 'Early Morning (6 AM - 9 AM)', 'mid_morning' => 'Mid Morning (9 AM - 12 PM)', 'afternoon' => 'Afternoon (12 PM - 3 PM)', 'late_afternoon' => 'Late Afternoon (3 PM - 6 PM)', 'evening' => 'Evening (6 PM - 9 PM)', 'night' => 'Night (9 PM - 12 AM)', 'late_night' => 'Late Night (12 AM - 6 AM)', 'flexible' => 'Flexible - any time works for me' ] ], 'device_ownership' => [ 'question' => 'Which devices do you use regularly? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'smartphone' => 'Smartphone', 'laptop' => 'Laptop/Desktop', 'tablet' => 'Tablet', 'smart_tv' => 'Smart TV', 'smartwatch' => 'Smartwatch', 'feature_phone' => 'Feature Phone (non-smartphone)' ] ], 'online_payment_methods' => [ 'question' => 'Which online payment methods do you use? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'upi' => 'UPI (PhonePe, GooglePay, Paytm)', 'credit_card' => 'Credit Card', 'debit_card' => 'Debit Card', 'net_banking' => 'Net Banking', 'digital_wallet' => 'Digital Wallets', 'cod' => 'Cash on Delivery', 'bank_transfer' => 'Bank Transfer' ] ], 'survey_types_interest' => [ 'question' => 'What types of surveys interest you most? (Select all that apply)', 'type' => 'multiple', 'options' => [ 'products' => 'Product reviews and feedback', 'brands' => 'Brand awareness surveys', 'lifestyle' => 'Lifestyle and habits', 'technology' => 'Technology and gadgets', 'entertainment' => 'Entertainment and media', 'politics' => 'Political opinions', 'social_issues' => 'Social issues', 'health' => 'Health and wellness', 'finance' => 'Financial products and services', 'all_types' => 'All types of surveys' ] ] ] ], 'household_classification' => [ 'name' => 'Household Classification (ISEC)', 'description' => 'Help us understand your household background for better survey matching. Based on MRSI ISEC 2024 classification.', 'questions' => [ 'cwe_occupation' => [ 'question' => 'What is the occupation of the Chief Wage Earner (the person who earns the most in your household)?', 'type' => 'single', 'options' => [ 'labour' => 'Unskilled / Semi-skilled Labour (daily wage, domestic worker, farm labour)', 'farmer' => 'Farmer / Agricultural Worker (owns or works on farm)', 'worker' => 'Skilled Worker / Artisan / Small Trader (mechanic, carpenter, small shopkeeper)', 'trader' => 'Trader / Business Owner / Contractor (medium/large business, contractor)', 'clerical' => 'Clerical / Supervisory / Junior Officer (office clerk, supervisor, junior govt employee)', 'managerial' => 'Senior Manager / Professional / Executive (doctor, engineer, CA, senior govt officer, executive)', ] ], 'male_education' => [ 'question' => 'What is the highest level of education of the most educated male adult (21 years or above) in your household?', 'type' => 'single', 'options' => [ 'no_adult' => 'No male adult aged 21+ in household', 'no_formal' => 'No formal schooling / Illiterate', 'upto_5' => 'Schooling up to Class 5', 'class_6_9' => 'Schooling Class 6 to 9', 'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma', 'degree_regular' => 'Graduate / Post-Graduate (regular college degree)', 'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)', ] ], 'female_education' => [ 'question' => 'What is the highest level of education of the most educated female adult (21 years or above) in your household?', 'type' => 'single', 'options' => [ 'no_adult' => 'No female adult aged 21+ in household', 'no_formal' => 'No formal schooling / Illiterate', 'upto_5' => 'Schooling up to Class 5', 'class_6_9' => 'Schooling Class 6 to 9', 'class_10_14' => 'Class 10 pass / SSC / HSC / Diploma', 'degree_regular' => 'Graduate / Post-Graduate (regular college degree)', 'degree_professional' => 'Professional Degree (Engineering / Medicine / CA / Law / MBA etc.)', ] ], ] ], ]; // Get the requested section $currentSection = isset($_GET['section']) ? $_GET['section'] : null; if (!$currentSection || !isset($profilerSections[$currentSection])) { header('Location: dashboard.php#profiler'); exit; } $section = $profilerSections[$currentSection]; // Get existing responses for this section $existingResponses = []; try { $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); while ($row = $stmt->fetch()) { $existingResponses[$row['question_id']] = json_decode($row['response'], true); } } catch (Exception $e) { logError('Error fetching existing responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]); } // Determine mode: view (default if has responses) or edit $hasResponses = !empty($existingResponses); $editMode = isset($_GET['edit']) && $_GET['edit'] == '1'; // If no responses yet, always edit mode if (!$hasResponses) $editMode = true; $successMessage = ''; $errorMessages = []; // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { $responses = []; $hasErrors = false; foreach ($section['questions'] as $questionId => $questionData) { if ($questionData['type'] === 'single') { $value = isset($_POST[$questionId]) ? sanitize($_POST[$questionId]) : ''; if (!empty($value)) { $responses[$questionId] = $value; } elseif (isset($existingResponses[$questionId])) { // Cannot empty a previously answered question — keep old response $responses[$questionId] = $existingResponses[$questionId]; } } elseif ($questionData['type'] === 'multiple') { $values = isset($_POST[$questionId]) ? $_POST[$questionId] : []; if (is_array($values) && !empty($values)) { $cleanValues = array_map('sanitize', $values); $responses[$questionId] = $cleanValues; } elseif (isset($existingResponses[$questionId])) { // Cannot empty — keep old response $responses[$questionId] = $existingResponses[$questionId]; } } } if (!$hasErrors) { try { $pdo->beginTransaction(); // Save all responses foreach ($responses as $questionId => $response) { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $responseJson = json_encode($response); $stmt->execute([$user['id'], $currentSection, $questionId, $responseJson, $responseJson]); } // Calculate completion percentage $totalQuestions = count($section['questions']); $answeredQuestions = count($responses); $completionPercentage = ($answeredQuestions / $totalQuestions) * 100; $isCompleted = $completionPercentage >= 100; // Update completion status $stmt = $pdo->prepare("INSERT INTO profiler_completion (user_id, section, total_questions, answered_questions, completion_percentage, is_completed, completed_at) VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE answered_questions = ?, completion_percentage = ?, is_completed = ?, completed_at = CASE WHEN ? = 1 THEN NOW() ELSE completed_at END, updated_at = NOW()"); $completedAt = $isCompleted ? date('Y-m-d H:i:s') : null; $stmt->execute([$user['id'], $currentSection, $totalQuestions, $answeredQuestions, $completionPercentage, $isCompleted, $completedAt, $answeredQuestions, $completionPercentage, $isCompleted, $isCompleted]); // Award points if section is completed and not already awarded if ($isCompleted) { $stmt = $pdo->prepare("SELECT points_awarded FROM profiler_completion WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); $completion = $stmt->fetch(); if ($completion && !$completion['points_awarded']) { // ISEC section earns 20 points, all others earn 5 $pointsToAward = ($currentSection === 'household_classification') ? 20 : 5; $pointsDescription = 'Profiler section completion: ' . $section['name']; $stmt = $pdo->prepare("INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ?"); $stmt->execute([$user['id'], $pointsToAward, $pointsToAward, $pointsToAward, $pointsToAward]); $stmt = $pdo->prepare("INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', ?, ?, ?)"); $stmt->execute([$user['id'], $pointsToAward, 'profiler_' . $currentSection, $pointsDescription]); $stmt = $pdo->prepare("UPDATE profiler_completion SET points_awarded = 1 WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); logError('Profiler points awarded', ['user_id' => $user['id'], 'section' => $currentSection, 'points' => $pointsToAward]); } // For ISEC section: compute and save SEC class to users table if ($currentSection === 'household_classification') { $occ = $responses['cwe_occupation'] ?? null; $mEdu = $responses['male_education'] ?? null; $fEdu = $responses['female_education'] ?? null; if ($occ && $mEdu && $fEdu) { $tier = computeISECTier($occ, $mEdu, $fEdu); $secClass = $tier ? getISECClass($tier) : null; if ($secClass) { $stmt = $pdo->prepare("UPDATE users SET isec_class = ?, isec_tier = ?, updated_at = NOW() WHERE id = ?"); $stmt->execute([$secClass, $tier, $user['id']]); logError('ISEC class computed', ['user_id' => $user['id'], 'tier' => $tier, 'class' => $secClass]); } } } } $pdo->commit(); // Reload responses and switch to view mode $existingResponses = []; $stmt = $pdo->prepare("SELECT question_id, response FROM user_profiler WHERE user_id = ? AND section = ?"); $stmt->execute([$user['id'], $currentSection]); while ($row = $stmt->fetch()) { $existingResponses[$row['question_id']] = json_decode($row['response'], true); } $hasResponses = !empty($existingResponses); $editMode = false; $successMessage = 'Your responses have been saved successfully!'; } catch (Exception $e) { $pdo->rollback(); logError('Error saving profiler responses', ['user_id' => $user['id'], 'section' => $currentSection, 'error' => $e->getMessage()]); $errorMessages[] = 'Error saving your responses. Please try again.'; } } } // Helper: get option label for a value function getOptionLabel($questionData, $value) { return isset($questionData['options'][$value]) ? $questionData['options'][$value] : ucwords(str_replace('_', ' ', $value)); } ?> <?php echo $section['name']; ?> - Profiler | Relevant Reflex

Editing Viewing
of questions completed
$questionData): ?>
Not answered yet
$questionData): ?>
$label): ?>
>
$label): ?>
>
Cancel Back
-------------------- END OF FILE -------------------- ### FILE 32: RR COM/redemption.php - Type: PHP - Size: 56.6 KB - Path: RR COM - Name: redemption.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('DB failed: ' . $e->getMessage()); die('System error.'); } // Award onboarding points // Onboarding points REMOVED - no reward for registering if (!$user['onboarding_points_awarded']) { try { $pdo->prepare("UPDATE users SET onboarding_points_awarded = 1 WHERE id = ?")->execute([$user['id']]); $user = getCurrentUser(); } catch (Exception $e) {} } $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$user['id']]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, completion_percentage, is_completed, points_awarded FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) $profilerCompletion[$row['section']] = $row; } catch (Exception $e) {} $completedSections = 0; foreach ($profilerSections as $k => $n) { if (isset($profilerCompletion[$k]) && $profilerCompletion[$k]['is_completed']) $completedSections++; } $mobileVerified = false; $mobileNumber = ''; try { $stmt = $pdo->prepare("SELECT mobile_number, is_verified FROM mobile_verifications WHERE user_id = ?"); $stmt->execute([$user['id']]); $md = $stmt->fetch(); if ($md) { $mobileVerified = $md['is_verified']; $mobileNumber = $md['mobile_number']; } } catch (Exception $e) {} $upiId = ''; try { $stmt = $pdo->prepare("SELECT response FROM user_profiler WHERE user_id = ? AND section = 'profile' AND question_id = 'upi_id'"); $stmt->execute([$user['id']]); $ud = $stmt->fetch(); if ($ud) $upiId = json_decode($ud['response'], true); } catch (Exception $e) {} if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'update_upi') { $newUpiId = isset($_POST['upi_id']) ? sanitize($_POST['upi_id']) : ''; if (!empty($newUpiId) && preg_match('/^[\w\.\-]+@[\w\.\-]+$/', $newUpiId)) { try { $stmt = $pdo->prepare("INSERT INTO user_profiler (user_id, section, question_id, response) VALUES (?, 'profile', 'upi_id', ?) ON DUPLICATE KEY UPDATE response = ?, updated_at = NOW()"); $j = json_encode($newUpiId); $stmt->execute([$user['id'], $j, $j]); $upiId = $newUpiId; $success_message = "UPI ID updated successfully!"; } catch (Exception $e) { $error_message = "Error updating UPI ID."; } } else { $error_message = "Please enter a valid UPI ID (e.g., yourname@paytm)."; } } $userTickets = []; try { $stmt = $pdo->prepare("SELECT st.*, (SELECT COUNT(*) FROM support_messages sm WHERE sm.ticket_id = st.id) as message_count, (SELECT sm.created_at FROM support_messages sm WHERE sm.ticket_id = st.id ORDER BY sm.created_at DESC LIMIT 1) as last_reply FROM support_tickets st WHERE st.user_id = ? ORDER BY st.created_at DESC LIMIT 10"); $stmt->execute([$user['id']]); $userTickets = $stmt->fetchAll(); } catch (Exception $e) {} $userRedemptions = []; try { $stmt = $pdo->prepare("SELECT * FROM redemption_requests WHERE user_id = ? ORDER BY created_at DESC LIMIT 5"); $stmt->execute([$user['id']]); $userRedemptions = $stmt->fetchAll(); } catch (Exception $e) {} // Survey history from shop DB $surveys = []; $surveyStats = ['total'=>0,'completes'=>0,'pending'=>0,'flagged'=>0]; try { $shopPdo = new PDO("mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4","u752449863_rradmin","S@n@h2016",[PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_DEFAULT_FETCH_MODE=>PDO::FETCH_ASSOC]); $cols = array_column($shopPdo->query("SHOW COLUMNS FROM survey_urls")->fetchAll(), 'Field'); $hasQF = in_array('quality_flag', $cols); $hasLoi = in_array('actual_loi_seconds', $cols); $hasCompAt = in_array('completed_at', $cols); $hasQN = in_array('quality_notes', $cols); $pcols = array_column($shopPdo->query("SHOW COLUMNS FROM projects")->fetchAll(), 'Field'); $hasCS = in_array('closure_status', $pcols); $hasSP = in_array('speedster_threshold_pct', $pcols); $qf = $hasQF ? "su.quality_flag" : "'valid' as quality_flag"; $qn = $hasQN ? "su.quality_notes" : "NULL as quality_notes"; $loi = $hasLoi ? "su.actual_loi_seconds" : "NULL as actual_loi_seconds"; $cat = $hasCompAt ? "su.completed_at" : "NULL as completed_at"; $cs = $hasCS ? "p.closure_status" : "'none' as closure_status"; $sp = $hasSP ? "p.speedster_threshold_pct" : "33.33 as speedster_threshold_pct"; $stmt = $shopPdo->prepare(" SELECT su.status as url_status, su.clicked_at, su.created_at as sent_at, $qf, $qn, $loi, $cat, p.project_id, p.project_name, p.eloi, p.industry, p.status as project_status, $cs, $sp FROM survey_urls su INNER JOIN projects p ON su.project_id = p.project_id WHERE su.sent_to_user_id = ? AND su.status NOT IN ('available') ORDER BY su.created_at DESC LIMIT 30 "); $stmt->execute([$user['id']]); $surveys = $stmt->fetchAll(); foreach ($surveys as $s) { $surveyStats['total']++; if ($s['url_status']==='complete') { $surveyStats['completes']++; $q=$s['quality_flag']??'valid'; if (in_array($q,['speedster','ip_duplicate','client_flagged'])) $surveyStats['flagged']++; elseif ($s['project_status']!=='Closed') $surveyStats['pending']++; } } } catch (Exception $e) { error_log("Survey stats: ".$e->getMessage()); } // Get survey-related point transactions from panel DB $surveyPointsByProject = []; try { $stmt = $pdo->prepare("SELECT reference_id, points, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('survey','survey_reward') AND transaction_type = 'earned' ORDER BY created_at DESC"); $stmt->execute([$user['id']]); while ($row = $stmt->fetch()) { if ($row['reference_id']) $surveyPointsByProject[$row['reference_id']] = $row; } } catch (Exception $e) {} // Get full rewards history for Rewards tab $rewardsHistory = []; try { $stmt = $pdo->prepare("SELECT transaction_type, points, source, description, reference_id, status, created_at FROM point_transactions WHERE user_id = ? ORDER BY created_at DESC LIMIT 50"); $stmt->execute([$user['id']]); $rewardsHistory = $stmt->fetchAll(); } catch (Exception $e) {} $joinDateFormatted = (new DateTime($user['created_at']))->format('M Y'); $profilePct = round(($completedSections / count($profilerSections)) * 100); $firstName = htmlspecialchars($user['first_name'] ?? explode('@',$user['email'])[0]); $initials = strtoupper(substr($user['first_name']??$user['email'],0,1).substr($user['last_name']??'',0,1)); if (strlen($initials)<2) $initials = strtoupper(substr($user['email'],0,2)); function getSurveyLabel($s) { $st=$s['url_status']; $qf=$s['quality_flag']??'valid'; $ps=$s['project_status']; if ($st==='sent') return ['Invited','label-neutral','Invitation sent. Click the survey link in your email to participate.']; if ($st==='clicked') return ['In Progress','label-warn','You started this survey but haven\'t completed it yet.']; if (in_array($st,['earlyscreenout','latescreenout'])) return ['Screened Out','label-neutral','You did not qualify based on screening criteria.']; if ($st==='quotafull') return ['Quota Full','label-neutral','The survey quota was filled before your response was recorded.']; if ($st==='timeout') return ['Timed Out','label-neutral','Session expired before completion.']; if ($st==='partial') return ['Partial','label-info','Your response was partially recorded.']; if ($st==='complete') { if (in_array($qf,['speedster','ip_duplicate','client_flagged'])) return ['Under Review','label-danger','Flagged for quality review. Points held pending admin decision.']; if ($ps==='Closed') return ['Approved','label-ok','Survey approved. Check Rewards tab for credited points.']; return ['Pending Approval','label-warn','Completed successfully. Points will credit when the project closes.']; } return [ucfirst($st),'label-neutral','']; } function fmtLoi($s){if(!$s)return'-';$m=floor($s/60);$ss=$s%60;return($m?$m.'m ':'').$ss.'s';} function fmtDt($d){if(!$d)return'-';return date('M d, Y g:i A',strtotime($d));} ?> Member Area - Relevant Reflex
Overview
English
English Default
Hindi हिन्दी
Bengali বাংলা
Telugu తెలుగు
Marathi मराठी
Tamil தமிழ்
Urdu اردو
Gujarati ગુજરાતી
Kannada ಕನ್ನಡ
Odia ଓଡ଼ିଆ
Malayalam മലയാളം
pts
Refer a Friend

Welcome back, !

Complete your profile, earn points, and participate in paid surveys.

Important! Read 4 essential rules before taking any survey to protect your account and earn maximum rewards.
Available Points
value
Surveys Done
total
Profile
%
sections
Total Earned
Since
Complete Profile
Earn up to 70 points
Redeem Rewards
Convert points to cash
Get Help
Support & FAQs
⚠ Read This Before You Take Any Survey
4 essential rules to protect your account and earn maximum rewards
1
Take your time. Read every question carefully. There are no right or wrong answers — we want your genuine opinion. Think about each question and answer what you truly feel. Surveys that are rushed through too quickly get automatically flagged and your response may be rejected without reward.
2
One attempt per person, per device. Each survey can only be taken once from your IP address or device. Duplicate attempts are automatically detected and flagged. Do not try to retake a survey using a different browser, incognito mode, or VPN — it will be caught and may result in account action.
3
Do not straightline your responses. Straightlining means selecting the same answer option for every question in a row (e.g., choosing "Agree" for all statements). This is a well-known indicator of low-quality responses and is flagged by our system. Only select the same answer repeatedly if that genuinely reflects your opinion.
4
Give thoughtful answers to open-ended questions. When a survey asks you to type your opinion or explain something in your own words, write a genuine, meaningful response. Vague, gibberish, or nonsensical text (e.g., random letters, copy-pasted filler, or irrelevant answers) will be flagged. Responses containing such text will be marked invalid and the completion will not count — no points will be awarded.
Why this matters: Research clients review every response for quality. Flagged responses (speeding, duplicates, straightlining, or gibberish open-ended answers) are rejected and no points are awarded. Repeated violations may lead to fewer survey invitations or account restrictions.
Complete your profile for more surveys. done. Continue →
0):?>
Total
Completed
Pending
0?'Under Review':'Approved';?>
0?$surveyStats['flagged']:$surveyStats['completes']-$surveyStats['pending']-$surveyStats['flagged'];?>
How it works: Click any survey to see full details. Completed surveys are reviewed when the project closes. Points are credited once approved. "Under Review" means quality concerns (e.g., LOI below minimum threshold). = normal LOI, = slow, = below threshold.
Survey History
$s): list($lbl,$cls,$desc)=getSurveyLabel($s); $eloiSec = intval($s['eloi']??0)*60; $thPct = floatval($s['speedster_threshold_pct']??33.33); $thSec = $eloiSec>0 ? $eloiSec*($thPct/100) : 0; $aLoi = $s['actual_loi_seconds'] ? intval($s['actual_loi_seconds']) : null; $loiPct = ($eloiSec>0 && $aLoi) ? min(100,round(($aLoi/$eloiSec)*100)) : 0; $loiCls = 'loi-ok'; if ($aLoi && $thSec>0 && $aLoi<$thSec) $loiCls='loi-fast'; elseif ($loiPct>150) $loiCls='loi-slow'; $pts = $surveyPointsByProject[$s['project_id']] ?? null; $rewardTxt = '-'; if ($s['url_status']==='complete') { if ($pts) $rewardTxt = number_format($pts['points'],0).' pts (₹'.number_format($pts['points']*0.5,2).')'; elseif (($s['quality_flag']??'valid')!=='valid') $rewardTxt = 'Held for review'; elseif ($s['project_status']==='Closed') $rewardTxt = 'Awaiting credit'; else $rewardTxt = 'Pending project closure'; } ?>
· ·
Invited On
Started At
Completed At
Your LOI
Expected LOI
min
Min Required LOI
0 ? fmtLoi(round($thSec)).' ('.$thPct.'%)' : '-';?>
Project Status
Reward

No surveys yet.

📊

No Surveys Yet

Complete your profile to receive survey invitations.

Know Me Better

Complete all sections to earn up to 70 points!

done
Mobile Verification
10 ptsVerify Now
$sn):$c=$profilerCompletion[$sk]??null;$d=$c&&$c['is_completed'];$pct=$c?$c['completion_percentage']:0;$pa=$c&&$c['points_awarded'];$ic=$d?'done':($pct>0?'part':'empty');$isISEC=$sk==='household_classification';$sectionPts=$isISEC?20:5;$rv=$sectionPts*0.5;$sectionRs=($rv==floor($rv))?number_format($rv,0):number_format($rv,2);?>
':round($pct).'%';?>
IMPORTANT
0?'In progress':($isISEC?'Required for survey matching':'Not started'));?>
pts>0?'Continue':'Start · ₹'.$sectionRs);?>
Available
Total Earned
Redeemed
Redeem Points
=500 && !empty($upiId)):?>

Minimum: 500 points (₹250). Cash via UPI to

Redeem Now =500 && empty($upiId)):?>
You have crossed the minimum redemption amount but have not updated your UPI ID in the Profile section. Please add your UPI ID first.
Update UPI in Profile
Need 500 points (₹250) minimum. You have more needed.
Recent Redemptions
# · pts → ₹
to ·
Paid via · Ref: ·
Rewards History
No rewards yet. Complete your profile and participate in surveys to earn points!
pts
Account
Email
Gender
Date of Birth
Postcode
Status
Active Verified
Mobile
+91 verified
Not verified
Verify
UPI Details

For reward payments.

e.g. yourname@paytm, yourname@phonepe
UPI:
-------------------- END OF FILE -------------------- ### FILE 33: RR COM/referral.php - Type: PHP - Size: 27.19 KB - Path: RR COM - Name: referral.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } $userId = $user['id']; $memberRef = 'RR' . str_pad($userId, 7, '0', STR_PAD_LEFT); $refLink = 'https://relevantreflex.com/signup.php?mref=' . $memberRef; try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { die('System error.'); } // Points balance $userPoints = ['points' => 0, 'total_earned' => 0, 'total_redeemed' => 0]; try { $stmt = $pdo->prepare("SELECT points, total_earned, total_redeemed FROM user_points WHERE user_id = ?"); $stmt->execute([$userId]); $p = $stmt->fetch(); if ($p) $userPoints = $p; } catch (Exception $e) {} // Referral stats & history $stats = ['total_clicks' => 0, 'total_signups' => 0, 'total_verified' => 0, 'total_earned' => 0]; $referrals = []; try { $s = $pdo->prepare(" SELECT COUNT(*) AS total_clicks, SUM(signup_completed) AS total_signups, SUM(email_verified) AS total_verified, SUM(CASE WHEN signup_reward_paid = 1 THEN 5 ELSE 0 END) + SUM(survey_commission_earned) AS total_earned FROM member_referral_clicks WHERE referrer_user_id = ? "); $s->execute([$userId]); $row = $s->fetch(); if ($row) { $stats['total_clicks'] = (int)$row['total_clicks']; $stats['total_signups'] = (int)$row['total_signups']; $stats['total_verified'] = (int)$row['total_verified']; $stats['total_earned'] = round((float)$row['total_earned'], 2); } $h = $pdo->prepare(" SELECT id, ip_address, email, signup_completed, email_verified, signup_reward_paid, survey_commission_earned, clicked_at, signed_up_at, verified_at FROM member_referral_clicks WHERE referrer_user_id = ? ORDER BY clicked_at DESC LIMIT 100 "); $h->execute([$userId]); $referrals = $h->fetchAll(); } catch (Exception $e) {} // Referral reward transactions $rewardHistory = []; try { $stmt = $pdo->prepare(" SELECT transaction_type, points, source, description, created_at FROM point_transactions WHERE user_id = ? AND source IN ('member_referral', 'member_referral_survey') ORDER BY created_at DESC LIMIT 50 "); $stmt->execute([$userId]); $rewardHistory = $stmt->fetchAll(); } catch (Exception $e) {} // Sidebar data $profilerSections = ['personal_background'=>'Personal Background','household_family'=>'Household & Family','shopping_lifestyle'=>'Shopping & Lifestyle','technology_digital'=>'Technology & Digital','travel_transportation'=>'Travel & Transportation','health_fitness'=>'Health & Fitness','entertainment_media'=>'Entertainment & Media','food_dining'=>'Food & Dining','financial_services'=>'Financial Services','communication_payments'=>'Communication & Payments','household_classification'=>'Household Classification (ISEC)']; $profilerCompletion = []; try { $stmt = $pdo->prepare("SELECT section, is_completed FROM profiler_completion WHERE user_id = ?"); $stmt->execute([$userId]); while ($r = $stmt->fetch()) $profilerCompletion[$r['section']] = $r; } catch (Exception $e) {} $completedSections = count(array_filter($profilerCompletion, fn($r) => $r['is_completed'])); $firstName = htmlspecialchars($user['first_name'] ?? explode('@', $user['email'])[0]); $initials = strtoupper(substr($user['first_name'] ?? $user['email'], 0, 1) . substr($user['last_name'] ?? '', 0, 1)); if (strlen($initials) < 2) $initials = strtoupper(substr($user['email'], 0, 2)); function maskEmail($email) { if (empty($email)) return '—'; $parts = explode('@', $email); if (count($parts) !== 2) return '—'; $name = $parts[0]; $domain = $parts[1]; $masked = substr($name, 0, 1) . str_repeat('*', max(1, strlen($name) - 1)); $dparts = explode('.', $domain); $maskedDomain = substr($dparts[0], 0, 1) . str_repeat('*', max(1, strlen($dparts[0]) - 1)); return $masked . '@' . $maskedDomain . '.' . ($dparts[1] ?? 'com'); } ?> Referral Programme — Relevant Reflex
Referral Programme
pts
Refer a Friend
Total Clicks
Signups
Verified
Total Earned
Your Referral Link

Share this link with anyone. When they register and verify their email, you earn rewards automatically.

How It Works
🔗
Share your link with friends, groups, or on social media
✍️
They register using your link and verify their email
You earn ₹5 (10 pts)
📋
Every time they complete a survey
You earn ₹5 (10 pts) more
💰
Rewards go directly into your points balance for redemption
 Where to Share Your Link
💬 Messaging Apps: WhatsApp groups, Telegram channels & groups, Instagram DMs
📱 Social Media: Facebook posts & stories, Instagram Reels/Shorts, YouTube video descriptions, Twitter/X threads
📣 Promotions: Digital ad banners, blog articles, email newsletters, LinkedIn posts
⚠️ Fair Use: Referral rewards are for genuine referrals only. Multiple clicks from the same IP are limited. Self-referrals are not counted. Abuse may result in reward reversal.
Click & Signup History
$r): ?>
#Referred EmailClickedSigned UpVerifiedSignup RewardSurvey Earnings
🔗
No referral clicks yet. Share your link to get started!
Not signed up
✓ Yes
Pending
✓ Verified
⏳ Pending
₹5 Paid Processing 0): ?> ₹0.00
-------------------- END OF FILE -------------------- ### FILE 34: RR COM/reset-password.php - Type: PHP - Size: 10.56 KB - Path: RR COM - Name: reset-password.php ------------------------------------------------------------ getConnection(); $stmt = $pdo->prepare(" SELECT email, expires_at FROM password_resets WHERE token = ? AND expires_at > NOW() "); $stmt->execute([$token]); $reset = $stmt->fetch(); if ($reset) { $email = $reset['email']; $isValidToken = true; } } catch (Exception $e) { logError('Error checking reset token', ['error' => $e->getMessage()]); } } // Handle password reset form submission if ($_SERVER['REQUEST_METHOD'] === 'POST' && $isValidToken) { $newPassword = isset($_POST['password']) ? $_POST['password'] : ''; $confirmPassword = isset($_POST['confirm_password']) ? $_POST['confirm_password'] : ''; // Validation $errors = []; if (empty($newPassword)) { $errors[] = 'Password is required.'; } if (empty($confirmPassword)) { $errors[] = 'Please confirm your password.'; } if (!validatePassword($newPassword)) { $errors[] = 'Password must be at least 8 characters long.'; } if ($newPassword !== $confirmPassword) { $errors[] = 'Passwords do not match.'; } if (empty($errors)) { try { // Start transaction $pdo->beginTransaction(); // Hash new password $hashedPassword = hashPassword($newPassword); // Update user password $stmt = $pdo->prepare("UPDATE users SET password = ?, updated_at = NOW() WHERE email = ?"); $stmt->execute([$hashedPassword, $email]); // Delete used reset token $stmt = $pdo->prepare("DELETE FROM password_resets WHERE token = ?"); $stmt->execute([$token]); // Delete all user sessions (force re-login) $stmt = $pdo->prepare("DELETE FROM user_sessions WHERE user_id = (SELECT id FROM users WHERE email = ?)"); $stmt->execute([$email]); // Commit transaction $pdo->commit(); logError('Password reset successful', ['email' => $email]); // Redirect to success page showResetResult(true, 'Password Reset Successful', 'Your password has been reset successfully. You can now log in with your new password.'); } catch (PDOException $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during password reset', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'Failed to reset password due to a system error. Please try again later.'; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('General error during password reset', [ 'error' => $e->getMessage(), 'email' => $email ]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } function showResetResult($success, $title, $message) { $statusClass = $success ? 'success' : 'error'; $statusColor = $success ? '#28a745' : '#dc3545'; $iconClass = $success ? 'fa-check-circle' : 'fa-exclamation-triangle'; ?> <?php echo htmlspecialchars($title); ?> - Relevant Reflex
Reset Password - Relevant Reflex

Set New Password

Enter your new password below.

', array_map('htmlspecialchars', $errors)); ?>
Minimum 8 characters
-------------------- END OF FILE -------------------- ### FILE 35: RR COM/robots.txt - Type: TXT - Size: 1.22 KB - Path: RR COM - Name: robots.txt ------------------------------------------------------------ # robots.txt — relevantreflex.com # Updated: April 2026 User-agent: * # Allow all public pages Allow: / # Block member-only pages — no SEO value, protect user privacy Disallow: /login.php Disallow: /logout.php Disallow: /dashboard.php Disallow: /profiler.php Disallow: /my-surveys.php Disallow: /redemption.php Disallow: /referral.php Disallow: /support.php Disallow: /user-support.php Disallow: /mobile-verification.php Disallow: /forgot-password.php Disallow: /reset-password.php Disallow: /verify.php Disallow: /points-manager.php # Block admin/partner/internal areas Disallow: /partners/ Disallow: /clients/ Disallow: /superlog/ Disallow: /cron/ Disallow: /r/ Disallow: /s/ # Block config and utility files Disallow: /config.php Disallow: /session.php Disallow: /email.php Disallow: /gtag.php Disallow: /isec-helper.php Disallow: /shop-db-config.php Disallow: /sms-config.php Disallow: /errors.log Disallow: /fix-rupee.php Disallow: /default.php Disallow: /profiler-api.php Disallow: /support-upload-helper.php Disallow: /partner-support-creation.php Disallow: /close-project-rewards.php Disallow: /update-ticket-status.php # Block upload folders Disallow: /uploads/ # Sitemap location Sitemap: https://www.relevantreflex.com/sitemap.xml -------------------- END OF FILE -------------------- ### FILE 36: RR COM/session.php - Type: PHP - Size: 6.18 KB - Path: RR COM - Name: session.php ------------------------------------------------------------ pdo = $db->getConnection(); // Start session if not already started if (session_status() === PHP_SESSION_NONE) { session_start(); } // Check for remember me token if user is not logged in if (!$this->isLoggedIn() && isset($_COOKIE['remember_token'])) { $this->checkRememberToken($_COOKIE['remember_token']); } } public function isLoggedIn() { return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true && isset($_SESSION['user_id']) && !empty($_SESSION['user_id']); } public function getCurrentUser() { if (!$this->isLoggedIn()) { return null; } try { $stmt = $this->pdo->prepare(" SELECT id, email, gender, date_of_birth, postcode, email_verified, onboarding_completed, onboarding_points_awarded, status, created_at, last_login FROM users WHERE id = ? AND status = 'active' "); $stmt->execute([$_SESSION['user_id']]); return $stmt->fetch(); } catch (Exception $e) { logError('Error fetching current user', [ 'error' => $e->getMessage(), 'user_id' => $_SESSION['user_id'] ]); return null; } } public function requireLogin() { if (!$this->isLoggedIn()) { $this->redirectToLogin(); } // Check if user still exists and is active $user = $this->getCurrentUser(); if (!$user) { $this->logout(); $this->redirectToLogin('Your session has expired. Please log in again.'); } } public function logout() { // Delete remember me token if exists if (isset($_COOKIE['remember_token'])) { try { $stmt = $this->pdo->prepare("DELETE FROM user_sessions WHERE session_token = ?"); $stmt->execute([$_COOKIE['remember_token']]); } catch (Exception $e) { logError('Error clearing remember token', ['error' => $e->getMessage()]); } setcookie('remember_token', '', time() - 3600, '/', '', true, true); } // Clear session $_SESSION = []; session_destroy(); } public function redirectToLogin($message = null) { $url = 'login.php'; if ($message) { $url .= '?message=' . urlencode($message); } header('Location: ' . $url); exit; } public function redirectToDashboard() { header('Location: dashboard.php'); exit; } public function redirectAfterLogin() { // Check if there's a redirect URL stored if (isset($_SESSION['redirect_after_login'])) { $redirect = $_SESSION['redirect_after_login']; unset($_SESSION['redirect_after_login']); header('Location: ' . $redirect); exit; } $this->redirectToDashboard(); } private function checkRememberToken($token) { try { $stmt = $this->pdo->prepare(" SELECT us.user_id, u.email FROM user_sessions us JOIN users u ON us.user_id = u.id WHERE us.session_token = ? AND us.expires_at > NOW() AND u.status = 'active' "); $stmt->execute([$token]); $session = $stmt->fetch(); if ($session) { // Restore session $_SESSION['user_id'] = $session['user_id']; $_SESSION['user_email'] = $session['email']; $_SESSION['logged_in'] = true; $_SESSION['login_time'] = time(); // Update last login $stmt = $this->pdo->prepare("UPDATE users SET last_login = NOW() WHERE id = ?"); $stmt->execute([$session['user_id']]); logError('User auto-logged in via remember token', [ 'user_id' => $session['user_id'], 'email' => $session['email'] ]); } else { // Invalid or expired token - delete it setcookie('remember_token', '', time() - 3600, '/', '', true, true); } } catch (Exception $e) { logError('Error checking remember token', ['error' => $e->getMessage()]); } } public function getUserAge() { $user = $this->getCurrentUser(); if (!$user || !$user['date_of_birth']) { return null; } $birthDate = new DateTime($user['date_of_birth']); $today = new DateTime(); return $today->diff($birthDate)->y; } public function updateLastActivity() { if ($this->isLoggedIn()) { $_SESSION['last_activity'] = time(); } } public function checkSessionTimeout($timeoutMinutes = 120) { if ($this->isLoggedIn() && isset($_SESSION['last_activity'])) { $timeoutSeconds = $timeoutMinutes * 60; if (time() - $_SESSION['last_activity'] > $timeoutSeconds) { $this->logout(); $this->redirectToLogin('Your session has expired due to inactivity.'); } } $this->updateLastActivity(); } } // Global function to get session manager instance function getSessionManager() { static $instance = null; if ($instance === null) { $instance = new SessionManager(); } return $instance; } // Convenience functions function requireLogin() { getSessionManager()->requireLogin(); } function getCurrentUser() { return getSessionManager()->getCurrentUser(); } function isLoggedIn() { return getSessionManager()->isLoggedIn(); } function logout() { getSessionManager()->logout(); } include_once $_SERVER['DOCUMENT_ROOT'] . '/superlog/banner.php'; ?> -------------------- END OF FILE -------------------- ### FILE 37: RR COM/shop-db-config.php - Type: PHP - Size: 912 B - Path: RR COM - Name: shop-db-config.php ------------------------------------------------------------ PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false ] ); } catch (PDOException $e) { error_log("Shop database connection failed: " . $e->getMessage()); return null; } } return $shopPdo; } -------------------- END OF FILE -------------------- ### FILE 38: RR COM/signup.php - Type: PHP - Size: 57.65 KB - Path: RR COM - Name: signup.php ------------------------------------------------------------ PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ] ); // Check if affiliate exists and is active $stmt = $adminPdo->prepare("SELECT * FROM affiliates WHERE affiliate_code = ? AND status = 'active'"); $stmt->execute([$affiliate_code]); $affiliate = $stmt->fetch(); if ($affiliate) { // Track the click (only if not already tracked in this session) if (!isset($_SESSION['affiliate_tracked_' . $affiliate['id']])) { $trackStmt = $adminPdo->prepare(" INSERT INTO affiliate_signups (affiliate_id, ip_address, user_agent, clicked_at) VALUES (?, ?, ?, NOW()) "); $trackStmt->execute([ $affiliate['id'], $_SERVER['REMOTE_ADDR'] ?? null, $_SERVER['HTTP_USER_AGENT'] ?? null ]); $_SESSION['affiliate_tracked_' . $affiliate['id']] = true; $_SESSION['affiliate_signup_id'] = $adminPdo->lastInsertId(); } $affiliate_signup_id = $_SESSION['affiliate_signup_id'] ?? null; } } catch (Exception $e) { logError('Affiliate tracking error: ' . $e->getMessage()); } } // ===== END AFFILIATE TRACKING CODE ===== // ===== MEMBER REFERRAL TRACKING CODE ===== $mref_code = isset($_GET['mref']) ? strtoupper(sanitize($_GET['mref'])) : ''; $mref_user = null; $mref_click_id = null; if (!empty($mref_code) && preg_match('/^RR\d{7}$/', $mref_code)) { try { $mrefPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrpanel;charset=utf8mb4", 'u752449863_rrpaneladmin', 'S@n@h2016', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Resolve member ID to numeric user id $mrefNumericId = intval(ltrim(substr($mref_code, 2), '0') ?: '0'); $stmt = $mrefPdo->prepare("SELECT id, email, status FROM users WHERE id = ? AND status = 'active' AND email_verified = 1"); $stmt->execute([$mrefNumericId]); $mref_user = $stmt->fetch(); if ($mref_user) { $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; // Block if visitor IP matches the referrer's own signup IP $ipCheck = $mrefPdo->prepare("SELECT signup_ip FROM users WHERE id = ?"); $ipCheck->execute([$mref_user['id']]); $referrerIpRow = $ipCheck->fetch(); $isSameIPAsReferrer = ($referrerIpRow && !empty($referrerIpRow['signup_ip']) && $referrerIpRow['signup_ip'] === $clientIP); // SPAM: max 5 hits per IP per referrer link $spamCheck = $mrefPdo->prepare("SELECT COUNT(*) as cnt FROM member_referral_clicks WHERE referrer_user_id = ? AND ip_address = ?"); $spamCheck->execute([$mref_user['id'], $clientIP]); $spamRow = $spamCheck->fetch(); // Also block Facebook/crawler IPs (2a03:2880:: prefix) $isCrawler = (strpos($clientIP, '2a03:2880:') === 0); if (!$isCrawler && !$isSameIPAsReferrer && $spamRow['cnt'] < 5 && !isset($_SESSION['mref_tracked_' . $mref_user['id']])) { $ins = $mrefPdo->prepare("INSERT INTO member_referral_clicks (referrer_user_id, ip_address, user_agent, clicked_at) VALUES (?, ?, ?, NOW())"); $ins->execute([$mref_user['id'], $clientIP, $_SERVER['HTTP_USER_AGENT'] ?? null]); $_SESSION['mref_click_id'] = $mrefPdo->lastInsertId(); $_SESSION['mref_tracked_' . $mref_user['id']] = true; } $mref_click_id = $_SESSION['mref_click_id'] ?? null; } } catch (Exception $e) { logError('Member referral tracking error: ' . $e->getMessage()); } } // ===== END MEMBER REFERRAL TRACKING CODE ===== $errors = []; $success_message = ''; $form_data = []; $fire_conversion = false; // Google Ads conversion flag // ===== ANTI-BOT: Generate CSRF token ===== if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // Reset form timing on page load (GET), not POST if ($_SERVER['REQUEST_METHOD'] !== 'POST') { $_SESSION['form_loaded_at'] = time(); } // ===== ANTI-BOT: reCAPTCHA v3 config ===== $recaptcha_site_key = defined('RECAPTCHA_SITE_KEY') ? RECAPTCHA_SITE_KEY : ''; $recaptcha_secret_key = defined('RECAPTCHA_SECRET_KEY') ? RECAPTCHA_SECRET_KEY : ''; // Handle form submission if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in signup.php: ' . $e->getMessage()); $errors[] = 'System error. Please try again later.'; } if (empty($errors)) { $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; $userAgent = $_SERVER['HTTP_USER_AGENT'] ?? ''; $honeypotTriggered = false; // ===== ANTI-BOT CHECK 1: Honeypot field ===== if (!empty($_POST['website_url'])) { // Bots fill hidden fields - silently reject $honeypotTriggered = true; logError('Honeypot triggered on signup', ['ip' => $clientIP, 'ua' => $userAgent]); // Log the attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent, honeypot_triggered) VALUES (?, ?, 'registration', 0, ?, 1)") ->execute([$clientIP, $_POST['email'] ?? '', $userAgent]); } catch (Exception $e) {} // Show fake success to not alert the bot $success_message = 'Registration successful! We\'ve sent a verification link to your email address. Please check your inbox and click the link to activate your account.'; $form_data = []; } // ===== ANTI-BOT CHECK 2: CSRF token ===== if (!$honeypotTriggered) { $submittedToken = $_POST['csrf_token'] ?? ''; if (empty($submittedToken) || !hash_equals($_SESSION['csrf_token'], $submittedToken)) { $errors[] = 'Security validation failed. Please refresh the page and try again.'; logError('CSRF token mismatch on signup', ['ip' => $clientIP]); } } // ===== ANTI-BOT CHECK 3: Time-based detection (form filled too fast) ===== if (!$honeypotTriggered && empty($errors)) { $formLoadedAt = $_SESSION['form_loaded_at'] ?? time(); $timeTaken = time() - $formLoadedAt; if ($timeTaken < 3) { $errors[] = 'Please take your time filling out the form.'; logError('Form submitted too quickly', ['ip' => $clientIP, 'seconds' => $timeTaken]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, success, user_agent) VALUES (?, 'registration', 0, ?)") ->execute([$clientIP, $userAgent]); } catch (Exception $e) {} } } // ===== ANTI-BOT CHECK 4: IP blocklist ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT id FROM ip_blocklist WHERE ip_address = ? AND (expires_at IS NULL OR expires_at > NOW())"); $stmt->execute([$clientIP]); if ($stmt->fetch()) { $errors[] = 'Registration is temporarily unavailable from your network. Please contact support.'; logError('Blocked IP attempted signup', ['ip' => $clientIP]); } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 5: Rate limiting ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'registration' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= MAX_ATTEMPTS_PER_IP_HOUR) { $errors[] = 'Too many registration attempts. Please try again later.'; logError('Rate limit exceeded on signup', ['ip' => $clientIP, 'attempts' => $attempts['cnt']]); if ($attempts['cnt'] >= MAX_ATTEMPTS_PER_IP_HOUR * 3) { try { $pdo->prepare("INSERT IGNORE INTO ip_blocklist (ip_address, reason, blocked_by, expires_at) VALUES (?, 'Excessive registration attempts', 'system', DATE_ADD(NOW(), INTERVAL 2 HOUR))") ->execute([$clientIP]); } catch (Exception $e) {} } } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 6: IP duplicate registration (permanent - no time window) ===== if (!$honeypotTriggered && empty($errors)) { try { $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM users WHERE signup_ip = ?"); $stmt->execute([$clientIP]); $ipSignups = $stmt->fetch(); if ($ipSignups && $ipSignups['cnt'] >= 1) { $errors[] = 'An account has already been registered from your network. If you believe this is an error, please contact support@relevantreflex.com.'; logError('Duplicate IP registration blocked (permanent)', ['ip' => $clientIP, 'existing_count' => $ipSignups['cnt']]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'registration', 0, ?)") ->execute([$clientIP, $_POST['email'] ?? '', $userAgent]); } catch (Exception $e) {} } } catch (Exception $e) {} } // ===== ANTI-BOT CHECK 7: reCAPTCHA v3 verification ===== if (!$honeypotTriggered && empty($errors) && !empty($recaptcha_secret_key)) { $recaptchaResponse = $_POST['g-recaptcha-response'] ?? ''; if (empty($recaptchaResponse)) { $errors[] = 'Security verification failed. Please try again.'; } else { $verifyUrl = 'https://www.google.com/recaptcha/api/siteverify'; $response = file_get_contents($verifyUrl . '?' . http_build_query([ 'secret' => $recaptcha_secret_key, 'response' => $recaptchaResponse, 'remoteip' => $clientIP ])); $recaptchaResult = json_decode($response, true); $captchaScore = $recaptchaResult['score'] ?? 0; if (!($recaptchaResult['success'] ?? false) || $captchaScore < 0.3) { $errors[] = 'Security verification failed. If you are not a robot, please try again.'; logError('reCAPTCHA failed', ['ip' => $clientIP, 'score' => $captchaScore]); try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, success, user_agent, captcha_score) VALUES (?, 'registration', 0, ?, ?)") ->execute([$clientIP, $userAgent, $captchaScore]); } catch (Exception $e) {} } } } // Get and sanitize form data $email = isset($_POST['email']) ? sanitize($_POST['email']) : ''; $email_confirm = isset($_POST['email_confirm']) ? sanitize($_POST['email_confirm']) : ''; $password = isset($_POST['password']) ? $_POST['password'] : ''; $gender = isset($_POST['gender']) ? sanitize($_POST['gender']) : ''; $dateOfBirth = isset($_POST['date_of_birth']) ? sanitize($_POST['date_of_birth']) : ''; $postcode = isset($_POST['postcode']) ? sanitize($_POST['postcode']) : ''; $privacyAccepted = isset($_POST['privacy_policy']) ? true : false; // FIX #4: Age confirmation checkbox validation $ageConfirmed = isset($_POST['age_confirm']) ? true : false; // Store form data for repopulating form on error $form_data = [ 'email' => $email, 'gender' => $gender, 'date_of_birth' => $dateOfBirth, 'postcode' => $postcode, 'whatsapp_number' => isset($_POST['whatsapp_number']) ? sanitize($_POST['whatsapp_number']) : '', ]; // Validation if (empty($email)) { $errors[] = 'Email is required.'; } if (!empty($email) && !empty($email_confirm) && $email !== $email_confirm) { $errors[] = 'Email addresses do not match. Please check and try again.'; } if (empty($email_confirm)) { $errors[] = 'Please confirm your email address.'; } if (empty($password)) { $errors[] = 'Password is required.'; } if (empty($gender)) { $errors[] = 'Gender is required.'; } if (empty($dateOfBirth)) { $errors[] = 'Date of birth is required.'; } if (empty($postcode)) { $errors[] = 'Postcode is required.'; } if (!$privacyAccepted) { $errors[] = 'You must agree to the Privacy Policy and Terms & Conditions.'; } // FIX #4: Validate age confirmation if (!$ageConfirmed) { $errors[] = 'You must confirm that you are 18 years of age or older.'; } // Validate email format if (!empty($email) && !validateEmail($email)) { $errors[] = 'Please provide a valid email address.'; } // Validate password strength if (!empty($password) && !validatePassword($password)) { $errors[] = 'Password must be at least 8 characters long.'; } // Validate gender if (!empty($gender) && !in_array($gender, ['Male', 'Female'])) { $errors[] = 'Please select a valid gender.'; } // Validate date of birth if (!empty($dateOfBirth) && !validateDateOfBirth($dateOfBirth)) { $errors[] = 'You must be at least 18 years old to register.'; } // Validate postcode if (!empty($postcode) && !validatePostcode($postcode)) { $errors[] = 'Please provide a valid 6-digit postal code.'; } // ===== WHATSAPP / MOBILE NUMBER ===== $whatsapp_number = isset($_POST['whatsapp_number']) ? preg_replace('/\D/', '', sanitize($_POST['whatsapp_number'])) : ''; $whatsapp_number_confirm = isset($_POST['whatsapp_number_confirm']) ? preg_replace('/\D/', '', sanitize($_POST['whatsapp_number_confirm'])) : ''; $is_whatsapp = isset($_POST['is_whatsapp']) ? 1 : 0; $form_data['whatsapp_number'] = $whatsapp_number; if (empty($whatsapp_number)) { $errors[] = 'Mobile/WhatsApp number is required.'; } elseif (!preg_match('/^[6-9][0-9]{9}$/', $whatsapp_number)) { $errors[] = 'Please enter a valid 10-digit Indian mobile number (starting with 6–9).'; } elseif ($whatsapp_number !== $whatsapp_number_confirm) { $errors[] = 'Mobile numbers do not match. Please check and try again.'; } // ===== END WHATSAPP / MOBILE NUMBER ===== // If no validation errors, proceed with registration if (empty($errors)) { try { // Check if email already exists $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?"); $stmt->execute([$email]); if ($stmt->rowCount() > 0) { $errors[] = 'An account with this email address already exists. Please try logging in or use a different email.'; } else { // Hash the password $hashedPassword = hashPassword($password); // Start transaction $pdo->beginTransaction(); // Insert new user (with signup IP and WhatsApp number) $stmt = $pdo->prepare(" INSERT INTO users (email, password, gender, date_of_birth, postcode, whatsapp_number, whatsapp_is_whatsapp, signup_ip, email_verified, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 0, 'inactive', NOW()) "); $stmt->execute([$email, $hashedPassword, $gender, $dateOfBirth, $postcode, $whatsapp_number, $is_whatsapp, $clientIP]); $userId = $pdo->lastInsertId(); // Auto-map state & city from PIN code try { $pinStmt = $pdo->prepare("SELECT state, city FROM pin_lookup WHERE pincode = ? LIMIT 1"); $pinStmt->execute([$postcode]); $pinRow = $pinStmt->fetch(PDO::FETCH_ASSOC); if ($pinRow) { $pdo->prepare("UPDATE users SET state = ?, city = ? WHERE id = ?")->execute([$pinRow['state'], $pinRow['city'], $userId]); } } catch (Exception $e) {} // Generate verification token $verificationToken = generateSecureToken(); $expiresAt = date('Y-m-d H:i:s', strtotime('+' . TOKEN_EXPIRY_HOURS . ' hours')); // Insert verification token $stmt = $pdo->prepare(" INSERT INTO email_verifications (user_id, token, expires_at, created_at) VALUES (?, ?, ?, NOW()) "); $stmt->execute([$userId, $verificationToken, $expiresAt]); // Save WhatsApp number to mobile_verifications (unverified) so it shows in admin immediately if (!empty($whatsapp_number)) { $pdo->prepare(" INSERT INTO mobile_verifications (user_id, mobile_number, is_verified, verification_attempts, created_at) VALUES (?, ?, 0, 0, NOW()) ON DUPLICATE KEY UPDATE mobile_number = ?, updated_at = NOW() ")->execute([$userId, $whatsapp_number, $whatsapp_number]); } // Commit transaction $pdo->commit(); // Log successful registration attempt try { $pdo->prepare("INSERT INTO registration_attempts (ip_address, email, attempt_type, success, user_agent) VALUES (?, ?, 'registration', 1, ?)") ->execute([$clientIP, $email, $userAgent]); } catch (Exception $e) {} // Regenerate CSRF token $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); // ===== UPDATE MEMBER REFERRAL TRACKING ===== if ($mref_user && $mref_click_id && isset($mrefPdo)) { try { $refIpCheck = $mrefPdo->prepare("SELECT signup_ip FROM users WHERE id = ?"); $refIpCheck->execute([$mref_user['id']]); $refIpRow = $refIpCheck->fetch(); $isSameIP = ($refIpRow && !empty($refIpRow['signup_ip']) && $refIpRow['signup_ip'] === $clientIP); if ($mref_user['id'] != $userId && !$isSameIP) { $mrefPdo->prepare(" UPDATE member_referral_clicks SET referee_user_id = ?, email = ?, signup_completed = 1, signed_up_at = NOW() WHERE id = ? ")->execute([$userId, $email, $mref_click_id]); } } catch (Exception $e) { logError('Member referral signup update error: ' . $e->getMessage()); } } // ===== END UPDATE MEMBER REFERRAL TRACKING ===== // ===== UPDATE AFFILIATE TRACKING ===== if ($affiliate && $affiliate_signup_id && $adminPdo) { try { $updateStmt = $adminPdo->prepare(" UPDATE affiliate_signups SET panel_user_id = ?, email = ?, signup_completed = 1, signed_up_at = NOW(), reward_amount = ? WHERE id = ? "); $updateStmt->execute([ $userId, $email, $affiliate['signup_reward'], $affiliate_signup_id ]); $adminPdo->exec("UPDATE affiliates SET total_signups = total_signups + 1 WHERE id = " . intval($affiliate['id'])); logError('Affiliate signup tracked', [ 'user_id' => $userId, 'affiliate_code' => $affiliate_code, 'email' => $email ]); } catch (Exception $e) { logError('Failed to update affiliate tracking: ' . $e->getMessage()); } } // ===== END UPDATE AFFILIATE TRACKING ===== // Send verification email $emailHandler = new EmailHandler(); $emailSent = $emailHandler->sendVerificationEmail($email, $verificationToken); if ($emailSent) { logError('User registered successfully', [ 'user_id' => $userId, 'email' => $email, 'verification_token_sent' => true, 'affiliate_code' => $affiliate_code ?? null ]); $success_message = 'Registration successful! We\'ve sent a verification link to your email address. Please check your inbox and click the link to activate your account.'; $form_data = []; $fire_conversion = true; // Real signup - fire Google Ads conversion } else { logError('User registered but email verification failed', [ 'user_id' => $userId, 'email' => $email ]); $success_message = 'Registration successful! However, we encountered an issue sending the verification email. Please contact support at support@relevantreflex.com to activate your account.'; $form_data = []; $fire_conversion = true; // Real signup - fire Google Ads conversion } } } catch (PDOException $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during registration', ['error' => $e->getMessage(), 'email' => $email]); $errors[] = 'Registration failed due to a system error. Please try again later.'; } catch (Exception $e) { if ($pdo->inTransaction()) { $pdo->rollback(); } logError('General error during registration', ['error' => $e->getMessage(), 'email' => $email]); $errors[] = 'An unexpected error occurred. Please try again later.'; } } } } ?> Sign Up - Relevant Reflex Paid Online Surveys India

Register as a Survey Taker for FREE!

Furnish some of your basic information below and start participating in paid surveys to earn rewards.

🎉 Partner Signup
Referred by:
0): ?>
🎁 Earn ₹ bonus on email & Mobile phone verification!
Type your email again — no copy/paste
Minimum 8 characters
+91
+91
Type again — no copy/paste
We care about your privacy. By sharing your personal data you will be able to get research opportunities targeted to your interests, help to improve products and services and earn rewards for participation
📧

One Step Left!

We've sent a verification link to:

Click the link in the email to activate your account and start earning.

OPEN YOUR EMAIL NOW:

Can't find it? Check your Spam or Junk folder. The email is from registration@relevantreflex.com

Already verified? Go to Login
-------------------- END OF FILE -------------------- ### FILE 39: RR COM/sitemap.xml - Type: XML - Size: 4.72 KB - Path: RR COM - Name: sitemap.xml ------------------------------------------------------------ https://www.relevantreflex.com/ 2026-04-10 weekly 1.0 https://www.relevantreflex.com/about.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/doubts.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles.php 2026-04-10 weekly 0.9 https://www.relevantreflex.com/contact.php 2026-04-07 monthly 0.6 https://www.relevantreflex.com/privacy.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/terms.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/disclaimer.php 2026-04-07 yearly 0.4 https://www.relevantreflex.com/ticket-guide.php 2026-04-07 monthly 0.4 https://www.relevantreflex.com/articles/earn-money-online-surveys-india-guide.php 2026-04-13 monthly 0.9 https://www.relevantreflex.com/articles/paid-surveys-india-earning-potential.php 2026-04-09 monthly 0.9 https://www.relevantreflex.com/articles/relevant-reflex-review-legit.php 2026-04-09 monthly 0.9 https://www.relevantreflex.com/articles/best-paid-survey-sites-india.php 2026-04-09 monthly 0.8 https://www.relevantreflex.com/articles/online-surveys-india-students.php 2026-04-09 monthly 0.8 https://www.relevantreflex.com/articles/online-surveys-india-housewives.php 2026-04-10 monthly 0.8 https://www.relevantreflex.com/articles/how-to-identify-genuine-survey-websites.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/5-ways-maximize-survey-earnings.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/complete-guide-survey-beginners-india.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/realistic-earning-expectations-surveys-india.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/best-survey-platforms-indian-users.php 2026-04-07 monthly 0.8 https://www.relevantreflex.com/articles/time-management-tips-survey-takers.php 2026-04-07 monthly 0.8 -------------------- END OF FILE -------------------- ### FILE 40: RR COM/sms-config.php - Type: PHP - Size: 11.78 KB - Path: RR COM - Name: sms-config.php ------------------------------------------------------------ gateway = 'twofactor'; // Using 2Factor as primary gateway // SMS Gateway configurations $this->config = [ 'msg91' => [ 'auth_key' => 'YOUR_MSG91_AUTH_KEY', // Replace with actual key 'template_id' => 'YOUR_TEMPLATE_ID', // Replace with actual template ID 'route' => '4', // Transactional route 'country' => '91' ], 'textlocal' => [ 'api_key' => 'YOUR_TEXTLOCAL_API_KEY', 'username' => 'YOUR_TEXTLOCAL_USERNAME', 'hash' => 'YOUR_TEXTLOCAL_HASH', 'sender' => 'TXTLCL' // 6 characters or less ], 'twofactor' => [ 'api_key' => '79d4feb6-d168-11ea-9fa5-0200cd936042', // Your actual 2Factor API key 'sender_id' => 'RELREF', // Matches 2Factor dashboard: Sender Id = RELREF 'template_name' => 'Profile OTP' // Matches 2Factor dashboard: Template Name = Profile OTP ], 'fast2sms' => [ 'api_key' => 'YOUR_FAST2SMS_API_KEY', 'route' => 'dlt', // DLT route for OTP 'sender_id' => 'FSTSMS' ] ]; } /** * Send OTP SMS */ public function sendOTP($mobileNumber, $otpCode, $templateMessage = null) { // Clean mobile number $mobileNumber = preg_replace('/[^0-9]/', '', $mobileNumber); // Remove leading zero if present if (substr($mobileNumber, 0, 1) === '0') { $mobileNumber = substr($mobileNumber, 1); } // Default OTP message if (!$templateMessage) { $templateMessage = "Your Relevant Reflex verification code is: {$otpCode}. Valid for 10 minutes. Do not share this with anyone."; } switch ($this->gateway) { case 'msg91': return $this->sendViaMSG91($mobileNumber, $otpCode, $templateMessage); case 'textlocal': return $this->sendViaTextLocal($mobileNumber, $templateMessage); case 'twofactor': return $this->sendViaTwoFactor($mobileNumber, $otpCode); case 'fast2sms': return $this->sendViaFast2SMS($mobileNumber, $templateMessage); default: return $this->mockSend($mobileNumber, $otpCode); // For testing } } /** * MSG91 SMS Gateway */ private function sendViaMSG91($mobileNumber, $otpCode, $message) { $config = $this->config['msg91']; $url = "https://api.msg91.com/api/v5/otp"; $data = [ 'template_id' => $config['template_id'], 'mobile' => $config['country'] . $mobileNumber, 'authkey' => $config['auth_key'], 'otp' => $otpCode, 'extra_param' => json_encode(['otp' => $otpCode]) ]; return $this->makeAPICall($url, $data, 'POST'); } /** * TextLocal SMS Gateway */ private function sendViaTextLocal($mobileNumber, $message) { $config = $this->config['textlocal']; $url = "https://api.textlocal.in/send/"; $data = [ 'apikey' => $config['api_key'], 'numbers' => '91' . $mobileNumber, 'message' => $message, 'sender' => $config['sender'] ]; return $this->makeAPICall($url, $data, 'POST'); } /** * 2Factor SMS Gateway * * Uses OTP SMS API with explicit template name to force SMS delivery. * Template: "XXXX is the OTP to verify your mobile number at Relevant Reflex" * Sender ID: RELREF | Template Name: Profile OTP * * By specifying the template name in the URL, 2Factor uses the registered * DLT SMS template instead of defaulting to voice calls. */ private function sendViaTwoFactor($mobileNumber, $otpCode) { $config = $this->config['twofactor']; // OTP API with template name — forces SMS delivery via registered DLT template // Format: /SMS/{phone}/{otp}/{template_name} $templateName = urlencode($config['template_name']); $url = "https://2factor.in/API/V1/{$config['api_key']}/SMS/{$mobileNumber}/{$otpCode}/{$templateName}"; $result = $this->makeAPICall($url, [], 'GET'); // Log the attempt logError('2Factor OTP SMS with template', [ 'mobile' => $mobileNumber, 'template' => $config['template_name'], 'status' => $result['response']['Status'] ?? 'unknown', 'details' => $result['response']['Details'] ?? 'none' ]); if ($result['success'] && isset($result['response']['Status']) && $result['response']['Status'] == 'Success') { return [ 'success' => true, 'message' => 'OTP sent via SMS successfully', 'session_id' => $result['response']['Details'] ?? null, 'response' => $result['response'] ]; } return [ 'success' => false, 'message' => 'Failed to send SMS OTP: ' . ($result['response']['Details'] ?? 'Unknown error'), 'response' => $result['response'] ?? [] ]; } /** * Fast2SMS Gateway */ private function sendViaFast2SMS($mobileNumber, $message) { $config = $this->config['fast2sms']; $url = "https://www.fast2sms.com/dev/bulkV2"; $data = [ 'authorization' => $config['api_key'], 'sender_id' => $config['sender_id'], 'message' => $message, 'route' => $config['route'], 'numbers' => $mobileNumber ]; $headers = [ 'authorization: ' . $config['api_key'], 'Content-Type: application/json' ]; return $this->makeAPICall($url, $data, 'POST', $headers); } /** * Mock SMS sending for testing */ private function mockSend($mobileNumber, $otpCode) { logError('Mock SMS sent', [ 'mobile' => $mobileNumber, 'otp' => $otpCode, 'message' => 'OTP for testing: ' . $otpCode ]); return [ 'success' => true, 'message' => 'SMS sent successfully (Mock)', 'reference_id' => 'MOCK_' . time() ]; } /** * Make API call to SMS gateway */ private function makeAPICall($url, $data, $method = 'POST', $headers = []) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, 30); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); if (!empty($data)) { if (empty($headers) || !in_array('Content-Type: application/json', $headers)) { curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); } else { curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); } } } if (!empty($headers)) { curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); } $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($error) { logError('SMS API Error', ['error' => $error, 'url' => $url]); return [ 'success' => false, 'message' => 'Network error: ' . $error ]; } $decodedResponse = json_decode($response, true); logError('SMS API Response', [ 'url' => $url, 'http_code' => $httpCode, 'response' => $decodedResponse ?: $response ]); // Parse response based on gateway return $this->parseResponse($decodedResponse ?: $response, $httpCode); } /** * Parse SMS gateway response */ private function parseResponse($response, $httpCode) { if ($httpCode >= 200 && $httpCode < 300) { return [ 'success' => true, 'message' => 'SMS sent successfully', 'response' => $response ]; } else { return [ 'success' => false, 'message' => 'SMS sending failed', 'response' => $response ]; } } /** * Get available SMS balance (if supported by gateway) */ public function getBalance() { switch ($this->gateway) { case 'msg91': $config = $this->config['msg91']; $url = "https://api.msg91.com/api/balance.php?authkey={$config['auth_key']}&type=4"; return $this->makeAPICall($url, [], 'GET'); case 'twofactor': $config = $this->config['twofactor']; $url = "https://2factor.in/API/V1/{$config['api_key']}/ADDON_SERVICES/BAL/SMS"; return $this->makeAPICall($url, [], 'GET'); default: return ['success' => false, 'message' => 'Balance check not supported for this gateway']; } } } // Global SMS helper function function sendOTPSMS($mobileNumber, $otpCode) { $smsManager = new SMSManager(); return $smsManager->sendOTP($mobileNumber, $otpCode); } /* * SETUP INSTRUCTIONS FOR 2FACTOR SMS GATEWAY * =========================================== * * Your 2Factor API Key: 79d4feb6-d168-11ea-9fa5-0200cd936042 * * FIXING "VOICE CALL INSTEAD OF SMS" ISSUE: * ------------------------------------------ * The 2Factor OTP API has auto-retry that sends voice calls when SMS fails. * To get SMS working properly: * * STEP 1: Login to https://2factor.in with your account * * STEP 2: Disable Voice Auto-Retry * - Go to Dashboard → Settings (or OTP Settings) * - Find "Auto Retry" / "Voice OTP Retry" / "Retry Configuration" * - DISABLE it (turn off voice fallback) * * STEP 3: Check DLT Registration (REQUIRED for SMS in India) * - In India, TRAI requires DLT registration for all SMS * - Go to 2Factor Dashboard → DLT Settings / SMS Templates * - You need: * a) A registered Sender ID (e.g., "RREFX") * b) A DLT-approved Content Template for OTP * Example template: "Your Relevant Reflex OTP is {#var#}. Valid for 10 minutes." * - Update the sender_id and template_name in config above after registering * - If you don't have DLT registration, register at: * Jio: https://trueconnect.jio.com * Airtel: https://www.airtel.in/business/commercial-communication * Vodafone: https://smartping.live/entity/reg-as * * STEP 4: Check SMS Balance * - Go to Dashboard → Balance * - Verify you have SMS credits (not just voice credits) * - Current balance: ~7,038 SMS credits * * STEP 5: Test * - After disabling auto-retry and setting up DLT template * - Try sending OTP from mobile-verification.php * - Check errors.log for detailed API responses * * HOW THIS CODE WORKS: * - First tries Transactional SMS API (no voice fallback at all) * - If that fails, falls back to OTP API (may trigger voice if auto-retry is on) * - Both attempts are logged to errors.log for debugging * */ ?> -------------------- END OF FILE -------------------- ### FILE 41: RR COM/support-upload-helper.php - Type: PHP - Size: 10.69 KB - Path: RR COM - Name: support-upload-helper.php ------------------------------------------------------------ SUPPORT_MAX_FILE_SIZE) { continue; } // Validate extension $ext = strtolower(pathinfo($originalName, PATHINFO_EXTENSION)); if (!in_array($ext, SUPPORT_ALLOWED_EXTENSIONS)) { continue; } // Validate MIME type $finfo = new finfo(FILEINFO_MIME_TYPE); $detectedType = $finfo->file($tmpName); if (!in_array($detectedType, SUPPORT_ALLOWED_TYPES)) { continue; } // Generate unique filename $storedName = 'support_' . $messageId . '_' . uniqid() . '.' . $ext; $fullPath = $uploadPath . $storedName; $relativePath = SUPPORT_UPLOAD_URL . $monthDir . '/' . $storedName; if (move_uploaded_file($tmpName, $fullPath)) { try { $stmt = $pdo->prepare(" INSERT INTO support_attachments (message_id, file_name, original_name, file_path, file_type, file_size) VALUES (?, ?, ?, ?, ?, ?) "); $stmt->execute([$messageId, $storedName, $originalName, $relativePath, $detectedType, $fileSize]); $attachmentIds[] = $pdo->lastInsertId(); } catch (Exception $e) { // Clean up file if DB insert fails @unlink($fullPath); } } } return $attachmentIds; } /** * Get attachments for multiple messages (batch load) * @param PDO $pdo * @param array $messageIds Array of message IDs * @return array Keyed by message_id => [attachments] */ function getAttachmentsForMessages($pdo, $messageIds) { $result = []; if (empty($messageIds)) return $result; $placeholders = implode(',', array_fill(0, count($messageIds), '?')); $stmt = $pdo->prepare(" SELECT * FROM support_attachments WHERE message_id IN ($placeholders) ORDER BY created_at ASC "); $stmt->execute($messageIds); $attachments = $stmt->fetchAll(); foreach ($attachments as $att) { $result[$att['message_id']][] = $att; } return $result; } /** * Render attachment HTML for display * @param array $attachments Array of attachment rows * @return string HTML string */ function renderAttachmentsHTML($attachments) { if (empty($attachments)) return ''; $html = '
'; foreach ($attachments as $att) { $isImage = strpos($att['file_type'], 'image/') === 0; $sizeFormatted = formatFileSize($att['file_size']); $escapedName = htmlspecialchars($att['original_name']); $escapedPath = htmlspecialchars($att['file_path']); if ($isImage) { $html .= '
'; $html .= ''; $html .= '' . $escapedName . ''; $html .= ''; $html .= '
' . $escapedName . ' (' . $sizeFormatted . ')
'; $html .= '
'; } else { $icon = getFileIcon($att['file_type'], $att['original_name']); $html .= ''; } } $html .= '
'; return $html; } /** * Get Font Awesome icon class for file type */ function getFileIcon($mimeType, $fileName) { $ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); $icons = [ 'pdf' => 'fa-file-pdf', 'doc' => 'fa-file-word', 'docx' => 'fa-file-word', 'xls' => 'fa-file-excel', 'xlsx' => 'fa-file-excel', 'csv' => 'fa-file-csv', 'txt' => 'fa-file-alt', ]; return $icons[$ext] ?? 'fa-file'; } /** * Format file size to human readable */ function formatFileSize($bytes) { if ($bytes >= 1048576) return round($bytes / 1048576, 1) . ' MB'; if ($bytes >= 1024) return round($bytes / 1024, 1) . ' KB'; return $bytes . ' B'; } /** * CSS for attachments (include once per page) */ function getAttachmentCSS() { return ' '; } /** * Generate file input HTML for forms * @param string $inputName Name attribute for file input (default: attachments) * @return string HTML for file upload section */ function getFileUploadHTML($inputName = 'attachments') { return '
Max 3 files, 5MB each. Images, PDF, Word, Excel, Text.
'; } /** * JavaScript for showing selected file names (include once per page) */ function getFileUploadJS() { return ' '; } -------------------- END OF FILE -------------------- ### FILE 42: RR COM/support.php - Type: PHP - Size: 1.96 KB - Path: RR COM - Name: support.php ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 43: RR COM/survey-review.php - Type: PHP - Size: 41.69 KB - Path: RR COM - Name: survey-review.php ------------------------------------------------------------ connect_errno) die('PSH DB error: '.$c->connect_error); $c->set_charset('utf8mb4'); } return $c; } function rrDb() { static $p = null; if (!$p) { $db = new Database(); $p = $db->getConnection(); } return $p; } // ── Ensure tables exist ─────────────────────────────────────────────────── try { rrDb()->exec("CREATE TABLE IF NOT EXISTS psh_review_submissions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, campaign_id INT NOT NULL DEFAULT 1, psh_survey_id INT NOT NULL, psh_survey_name VARCHAR(255) DEFAULT '', psh_review_id INT DEFAULT NULL, rating TINYINT NOT NULL, review_text TEXT NOT NULL, proof_filename VARCHAR(512) DEFAULT NULL, reviewer_name VARCHAR(100) DEFAULT NULL, member_ip VARCHAR(45) DEFAULT NULL, points_pending DECIMAL(10,2) DEFAULT 10.00, status ENUM('pending','approved','rejected') DEFAULT 'pending', admin_note TEXT DEFAULT NULL, submitted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, reviewed_at TIMESTAMP NULL DEFAULT NULL, UNIQUE KEY unique_user_site (user_id, psh_survey_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); rrDb()->exec("CREATE TABLE IF NOT EXISTS psh_campaign_status ( user_id INT PRIMARY KEY, campaign_id INT DEFAULT 1, status ENUM('in_progress','completed','screened_out') DEFAULT 'in_progress', reviews_submitted INT DEFAULT 0, banner_closed TINYINT DEFAULT 0, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"); } catch (Exception $e) {} if (!is_dir(UPLOAD_ABS)) mkdir(UPLOAD_ABS, 0755, true); // ── Load campaign status for this member ────────────────────────────────── $stmt = rrDb()->prepare("SELECT status, reviews_submitted, banner_closed FROM psh_campaign_status WHERE user_id = ? AND campaign_id = ?"); $stmt->execute([$userId, CAMPAIGN_ID]); $campaignStatus = $stmt->fetch() ?: ['status'=>null,'reviews_submitted'=>0,'banner_closed'=>0]; // Which PSH sites already reviewed? $stmt = rrDb()->prepare("SELECT psh_survey_id FROM psh_review_submissions WHERE user_id = ? AND campaign_id = ?"); $stmt->execute([$userId, CAMPAIGN_ID]); $alreadyReviewedIds = $stmt->fetchAll(PDO::FETCH_COLUMN); // ── Campaign member cap check ──────────────────────────────────────────────── $totalMembersInCampaign = 0; try { $mc = rrDb()->prepare("SELECT COUNT(DISTINCT user_id) FROM psh_campaign_status WHERE campaign_id = ? AND status != 'screened_out'"); $mc->execute([CAMPAIGN_ID]); $totalMembersInCampaign = (int)$mc->fetchColumn(); } catch (Exception $e) {} $campaignFull = ($totalMembersInCampaign >= MAX_MEMBERS && (!$campaignStatus || $campaignStatus['status'] === null)); // ── Session ─────────────────────────────────────────────────────────────── if (session_status() !== PHP_SESSION_ACTIVE) session_start(); $sessKey = 'psh_camp_'.$userId; // ── Determine screen ────────────────────────────────────────────────────── $screen = isset($_GET['screen']) ? (int)$_GET['screen'] : 1; $rIndex = isset($_GET['ri']) ? (int)$_GET['ri'] : 0; // review index $action = $_POST['action'] ?? ''; $error = ''; // ── Utility: close banner + set status ─────────────────────────────────── function closeCampaign($userId, $status) { rrDb()->prepare("INSERT INTO psh_campaign_status (user_id, campaign_id, status, banner_closed) VALUES (?, ?, ?, 1) ON DUPLICATE KEY UPDATE status=VALUES(status), banner_closed=1, updated_at=NOW()") ->execute([$userId, CAMPAIGN_ID, $status]); } // ── Action: Screen-out ──────────────────────────────────────────────────── if ($action === 'screenout') { closeCampaign($userId, 'screened_out'); header('Location: survey-review.php?screen=4&result=screened_out'); exit; } // ── Action: Save site selection ─────────────────────────────────────────── if ($action === 'select_sites') { $selected = array_map('intval', (array)($_POST['sites'] ?? [])); $selected = array_values(array_unique(array_filter($selected))); $selected = array_values(array_diff($selected, $alreadyReviewedIds)); if (count($selected) === 0) { $error = 'Please select at least 1 platform you are currently a member of.'; $screen = 2; } elseif (count($selected) > MAX_REVIEWS) { $error = 'Please select a maximum of '.MAX_REVIEWS.' platforms.'; $screen = 2; } else { // Validate IDs exist in PSH $ids = implode(',', $selected); $res = pshDb()->query("SELECT id, title FROM survey_sites WHERE id IN ($ids)"); $valid = []; while ($r = $res->fetch_assoc()) $valid[$r['id']] = $r['title']; $selected = array_values(array_filter($selected, fn($id) => isset($valid[$id]))); if (empty($selected)) { $error = 'Invalid selection.'; $screen = 2; } else { $_SESSION[$sessKey] = ['sites' => $selected, 'titles' => $valid]; rrDb()->prepare("INSERT INTO psh_campaign_status (user_id, campaign_id, status) VALUES (?,?,'in_progress') ON DUPLICATE KEY UPDATE status='in_progress', updated_at=NOW()") ->execute([$userId, CAMPAIGN_ID]); header('Location: survey-review.php?screen=3&ri=0'); exit; } } } // ── Action: Submit review ────────────────────────────────────────────────── if ($action === 'submit_review') { $sess = $_SESSION[$sessKey] ?? null; if (!$sess) { header('Location: survey-review.php?screen=2'); exit; } $ri = (int)($_POST['ri'] ?? 0); $pshSurveyId = (int)($sess['sites'][$ri] ?? 0); $siteName = $sess['titles'][$pshSurveyId] ?? ''; $rating = (int)($_POST['rating'] ?? 0); $reviewText = trim($_POST['review_text'] ?? ''); $reviewerName = trim($_POST['reviewer_name'] ?? '') ?: explode('@', $user['email'])[0]; $memberEmail = $user['email']; $memberIp = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; $wordCount = str_word_count($reviewText); // Validations if ($rating < 1 || $rating > 5) $error = 'Please select a star rating.'; elseif ($wordCount < MIN_WORDS) $error = 'Review too short — minimum '.MIN_WORDS.' words. You wrote '.$wordCount.'.'; elseif ($wordCount > MAX_WORDS) $error = 'Review too long — maximum '.MAX_WORDS.' words. You wrote '.$wordCount.'.'; elseif (empty($_FILES['proof']['name']) || $_FILES['proof']['error'] !== UPLOAD_ERR_OK) $error = 'Proof screenshot is mandatory. Please upload an image or PDF.'; if (empty($error)) { // Handle file upload $allowedTypes = ['image/jpeg','image/jpg','image/png','image/gif','application/pdf']; $fileType = mime_content_type($_FILES['proof']['tmp_name']); $fileSize = $_FILES['proof']['size']; if (!in_array($fileType, $allowedTypes)) $error = 'Only JPG, PNG, GIF, or PDF files are allowed.'; elseif ($fileSize > 5 * 1024 * 1024) $error = 'File must be under 5MB.'; else { $ext = strtolower(pathinfo($_FILES['proof']['name'], PATHINFO_EXTENSION)); $fname = 'rr_'.$userId.'_'.$pshSurveyId.'_'.time().'.'.$ext; $dest = UPLOAD_ABS.$fname; $proofUrl = UPLOAD_PUBLIC_BASE.$fname; $proofType = (strpos($fileType,'pdf') !== false) ? 'pdf' : 'image'; // Ensure destination directory exists (cross-domain target on PSH) if (!is_dir(UPLOAD_ABS)) { @mkdir(UPLOAD_ABS, 0755, true); } if (!move_uploaded_file($_FILES['proof']['tmp_name'], $dest)) { $error = 'File upload failed. Please try again.'; error_log('[survey-review] move_uploaded_file failed. dest='.$dest); } } } if (empty($error)) { // Check PSH duplicate $psh = pshDb(); $dup = $psh->prepare("SELECT COUNT(*) FROM survey_reviews WHERE survey_id=? AND reviewer_email=?"); $dup->bind_param('is', $pshSurveyId, $memberEmail); $dup->execute(); $dup->bind_result($dupCnt); $dup->fetch(); $dup->close(); if ($dupCnt > 0) { $error = 'You have already submitted a review for '.htmlspecialchars($siteName).' on PaidSurveyHub.'; } else { // Insert into PSH — using member's real IP $colCheck = $psh->query("SHOW COLUMNS FROM survey_reviews LIKE 'proof_file'"); $hasProof = ($colCheck->num_rows > 0); $colCheck2 = $psh->query("SHOW COLUMNS FROM survey_reviews LIKE 'rr_campaign'"); $hasRrCol = ($colCheck2->num_rows > 0); if ($hasProof && $hasRrCol) { $ins = $psh->prepare("INSERT INTO survey_reviews (survey_id, member_id, reviewer_name, reviewer_email, rating, feedback, proof_file, proof_type, newsletter_consent, ip_address, is_approved, rr_campaign, rr_member_id, created_at) VALUES (?, NULL, ?, ?, ?, ?, ?, ?, 0, ?, 0, 1, ?, NOW())"); $ins->bind_param('isssssssi', $pshSurveyId, $reviewerName, $memberEmail, $rating, $reviewText, $proofUrl, $proofType, $memberIp, $userId); } elseif ($hasProof) { $ins = $psh->prepare("INSERT INTO survey_reviews (survey_id, member_id, reviewer_name, reviewer_email, rating, feedback, proof_file, proof_type, newsletter_consent, ip_address, is_approved, created_at) VALUES (?, NULL, ?, ?, ?, ?, ?, ?, 0, ?, 0, NOW())"); $ins->bind_param('isssssss', $pshSurveyId, $reviewerName, $memberEmail, $rating, $reviewText, $proofUrl, $proofType, $memberIp); } else { $ins = $psh->prepare("INSERT INTO survey_reviews (survey_id, member_id, rating, feedback, ip_address, is_approved, created_at) VALUES (?, NULL, ?, ?, ?, 0, NOW())"); $ins->bind_param('iiss', $pshSurveyId, $rating, $reviewText, $memberIp); } if ($ins->execute()) { $pshReviewId = $psh->insert_id; // Save to RR tracking (status=pending — no points yet) rrDb()->prepare("INSERT IGNORE INTO psh_review_submissions (user_id, campaign_id, psh_survey_id, psh_survey_name, psh_review_id, rating, review_text, proof_filename, reviewer_name, member_ip, points_pending, status) VALUES (?,?,?,?,?,?,?,?,?,?,?,'pending')") ->execute([$userId, CAMPAIGN_ID, $pshSurveyId, $siteName, $pshReviewId, $rating, $reviewText, $proofUrl, $reviewerName, $memberIp, POINTS_PER_REVIEW]); // Increment count in campaign status rrDb()->prepare("INSERT INTO psh_campaign_status (user_id, campaign_id, status, reviews_submitted) VALUES (?,?,'in_progress',1) ON DUPLICATE KEY UPDATE reviews_submitted=reviews_submitted+1, updated_at=NOW()") ->execute([$userId, CAMPAIGN_ID]); $nextRi = $ri + 1; $total = count($sess['sites']); if ($nextRi < $total) { header('Location: survey-review.php?screen=3&ri='.$nextRi); } else { // All done — close campaign, keep pending closeCampaign($userId, 'completed'); unset($_SESSION[$sessKey]); header('Location: survey-review.php?screen=4&result=completed'); } exit; } else { $error = 'Could not save review. Please try again.'; } } } $screen = 3; // Fall through to review form with error } // ── Load PSH sites ───────────────────────────────────────────────────────── $pshSites = []; $res = pshDb()->query("SELECT id, title FROM survey_sites ORDER BY CASE WHEN rank IS NULL THEN 1 ELSE 0 END, rank ASC, title ASC"); while ($r = $res->fetch_assoc()) $pshSites[] = $r; // ── Session data for screen 3 ────────────────────────────────────────────── $sess = $_SESSION[$sessKey] ?? null; $currentSite = null; $totalSites = 0; if ($screen === 3 && $sess) { $totalSites = count($sess['sites']); $pshSurveyId = $sess['sites'][$rIndex] ?? 0; $currentSite = ['id'=>$pshSurveyId, 'title'=>$sess['titles'][$pshSurveyId]??'']; } elseif ($screen === 3 && !$sess) { header('Location: survey-review.php?screen=2'); exit; } // Reload reviews done count $stmt = rrDb()->prepare("SELECT COUNT(*) FROM psh_review_submissions WHERE user_id=? AND campaign_id=?"); $stmt->execute([$userId, CAMPAIGN_ID]); $reviewsDone = (int)$stmt->fetchColumn(); // Reload campaign status row $stmt = rrDb()->prepare("SELECT status, reviews_submitted, banner_closed FROM psh_campaign_status WHERE user_id=?"); $stmt->execute([$userId]); $cs = $stmt->fetch() ?: ['status'=>null,'reviews_submitted'=>0,'banner_closed'=>0]; ?> Survey Review Campaign — Relevant Reflex
RelevantReflex
Dashboard

📋 Survey Platform Review

This is a research activity initiated by Paid Survey Hub India (paidsurveyhub.in) — India's independent survey platform directory. They would like your genuine, first-hand reviews about online survey platforms you are currently a member of.

Earn ₹5 per review · Up to ₹15 total · Pending admin approval

Before You Begin — Please Read

This review helps thousands of Indians choose the right survey platforms. Your honesty is what makes it valuable.
Only platforms you actively use
Select only platforms where you currently have a member account. Reviews must reflect your real experience.
📎
Proof is mandatory for every site
Upload a screenshot of your account dashboard, rewards section, payment proof, or support interaction for each platform selected.
💰
₹5 per review — pending approval
Points are credited to your Relevant Reflex account after our team verifies your submission. You may review 1 to 3 platforms.
💬
You may review any aspect
App experience, survey frequency, points system, redemption process, payment speed, customer support — any honest observation is welcome.
⚠ Not a member of any platform below? Please click "I haven't used any" and exit. Do not submit a review for a platform you haven't personally used.
⏰ Campaign Full
We have reached our target of members for this review campaign. Thank you for your interest — watch out for the next campaign!
I Understand — Continue →

Select Platforms You've Used

Choose 1 to survey platforms you are currently a member of. You will need to provide proof for each one you select.

Maximum selections
Tick the platforms where you have an active member account. If a platform is greyed out, you have already submitted a review for it.
Remember: You must upload a screenshot proof (account page, rewards, payment, or support) for each platform you select. Reviews without proof will not be approved.

Review of :

Share your honest experience. You can review any aspect — app, surveys, payments, support etc. Minimum words, maximum words.

+10 points (₹5) after approval
/
=1;$i--): ?>
This name will be visible publicly on Paid Survey Hub India
0 words
Upload one of the following: your account/member page, rewards balance section, payment confirmation, or support chat. This confirms you are an active member.
Drop file here or click to browse
JPG, PNG, GIF or PDF · Max 5MB
📌 Note: Your review will be submitted to Paid Survey Hub India under your display name with your current IP address. It will be pending admin approval before appearing publicly. Your email address will never be displayed publicly.
prepare("SELECT COUNT(*) FROM psh_review_submissions WHERE user_id=? AND campaign_id=?"); $stmt->execute([$userId, CAMPAIGN_ID]); $rd = (int)$stmt->fetchColumn(); ?>
🎉

Thank You!

You have submitted review successfully.

⏳ ₹ ( points) — Pending Admin Approval

Your reviews are being reviewed by our team. Points will be credited to your Relevant Reflex account once approved — usually within 24–48 hours. Your reviews will also appear on paidsurveyhub.in after approval.

👋

No Worries!

This campaign is for members of other survey platforms. Since you're not currently a member of any of the listed sites, you're not eligible at this time.

If you join any of the platforms listed on PaidSurveyHub India in the future and accumulate some experience, you can participate in future review campaigns.

-------------------- END OF FILE -------------------- ### FILE 44: RR COM/terms.php - Type: PHP - Size: 36.01 KB - Path: RR COM - Name: terms.php ------------------------------------------------------------ Terms and Conditions - Relevant Reflex | Platform Usage Agreement
Last Updated: March 2026 | Effective Date: January 1, 2025
Welcome to Relevant Reflex!
These Terms and Conditions ("Terms") govern your use of our online survey platform and related services. Please read them carefully.

1 Acceptance of Terms

By using Relevant Reflex's services, you acknowledge that you have read, understood, and agree to be bound by these Terms, as well as our Privacy Policy.

If you do not agree with any part of these terms, you must not use our services. Your continued use of the platform constitutes acceptance of any modifications to these Terms.

2 Eligibility

2.1 Age Requirement

You must be at least 18 years old to use our services. By registering, you represent and warrant that you meet this age requirement.

2.2 Geographic Requirement

You must be a resident of India to participate in our surveys and receive rewards. This helps us provide relevant survey opportunities and comply with local regulations.

2.3 Account Limitations

You may only maintain one account with Relevant Reflex. Multiple accounts from the same individual are prohibited and may result in account suspension.

3 Account Registration and Security

3.1 Account Responsibility

You are responsible for:

  • Maintaining the confidentiality of your account information
  • All activities that occur under your account
  • Notifying us immediately of any unauthorized use
  • Ensuring your login credentials are secure

3.2 Accurate Information

You agree to provide accurate and up-to-date information during registration and throughout your use of our services. False or misleading information may result in account termination.

3.3 Account Verification

You must verify your email address and may be required to provide additional verification for account security or compliance purposes.

4 Survey Participation

4.1 Honest Responses

You agree to provide honest and thoughtful responses to surveys. Quality responses are essential for meaningful research.

4.2 Survey Qualification

We reserve the right to disqualify you from a survey if we detect:

  • Fraudulent or inconsistent responses
  • Use of automated tools or bots
  • Excessively fast completion times
  • Random or nonsensical answers

4.3 Survey Availability

Survey opportunities are based on your demographic profile and survey requirements. We cannot guarantee specific numbers or types of surveys.

Important: Completion of a survey does not guarantee reward if disqualified for quality reasons. We maintain strict quality standards to ensure valuable research data.

5 Rewards and Payments

5.1 Reward Distribution

Rewards will be issued as per the terms specified for each survey. Typical processing times are:

  • Survey validation: 1-5 business days
  • Payment processing: 3-7 business days
  • Bank transfer: 2-3 additional business days

5.2 Reward Modifications

We reserve the right to modify, suspend, or terminate the reward system at any time with reasonable notice to members.

5.3 Reward Restrictions and Payout Terms

Unless specified otherwise:

  • Rewards are non-transferable between accounts
  • Accumulated rewards can be withdrawn as cash via UPI once the minimum payout threshold has been reached. Rewards from specific bonus promotions may be subject to additional conditions stated at the time of the promotion.
  • Minimum payout threshold: ₹500. You must accumulate at least ₹500 in your account balance before requesting a withdrawal.
  • Payments are processed via UPI transfer to your registered UPI ID. UPI is currently the sole payment method for member withdrawals.
  • Payment processing may take 3–7 business days after a withdrawal request is submitted and approved.

5.4 Tax Responsibilities

You are responsible for reporting and paying any applicable taxes on rewards received. We may provide necessary documentation for tax purposes.

6 Intellectual Property

6.1 Platform Content

All content on our website, including text, graphics, logos, images, and software, is the property of Relevant Reflex or its licensors and is protected by copyright laws.

6.2 Usage Restrictions

You may not:

  • Use, reproduce, or distribute our content without express written permission
  • Modify or create derivative works from our platform
  • Reverse engineer any part of our services
  • Use our trademarks or branding without authorization

6.3 User-Generated Content

By providing survey responses and feedback, you grant us a non-exclusive, royalty-free license to use this information for research and platform improvement purposes.

7 Prohibited Conduct

You agree NOT to engage in any of the following activities:

7.1 Technical Violations

  • Use automated means (bots, scripts) to access our services or complete surveys
  • Attempt to interfere with the proper functioning of our website
  • Circumvent any security measures or access controls
  • Use VPNs or proxy services to mask your location

7.2 Identity and Fraud

  • Impersonate any person or entity
  • Create multiple accounts
  • Provide false personal information
  • Share account credentials with others

7.3 Legal Violations

  • Engage in any activity that violates applicable law or regulation
  • Violate the rights of other users or third parties
  • Transmit harmful, threatening, or offensive content
  • Engage in harassment or discrimination
Enforcement: Violation of these terms may result in immediate account suspension or termination, forfeiture of rewards, and potential legal action.

8 Termination

8.1 Termination by Us

We reserve the right to suspend or terminate your account at our discretion, without notice, for:

  • Violation of these Terms
  • Fraudulent activity
  • Extended inactivity (24+ months)
  • Legal or regulatory requirements

8.2 Termination by You

You may terminate your account at any time by:

  • Using the account deletion option in your settings
  • Contacting our support team
  • Sending a written request to support@relevantreflex.com

8.3 Effects of Termination

Upon termination:

  • Your access to the platform will be immediately revoked
  • Pending rewards may be forfeited (depending on circumstances)
  • Your personal data will be handled according to our Privacy Policy
  • Certain provisions of these Terms will survive termination

9 Limitation of Liability

9.1 Service Disclaimer

Our services are provided "as is" without warranties of any kind. We do not guarantee:

  • Uninterrupted or error-free service
  • Specific survey availability or earnings
  • Compatibility with all devices or browsers
  • Accuracy of third-party content

9.2 Liability Limitations

Relevant Reflex is not liable for any indirect, incidental, special, or consequential damages, including:

  • Loss of profits or earnings
  • Business interruption
  • Data loss or corruption
  • Emotional distress

9.3 Maximum Liability

Our total liability for any claim arising from these Terms shall not exceed the amount paid to you in the past 12 months, or ₹1,000, whichever is greater.

10 Indemnification

You agree to indemnify and hold Relevant Reflex harmless from any claims, losses, or damages arising from:

  • Your use of our services
  • Violation of these Terms
  • Violation of any law or regulation
  • Infringement of third-party rights
  • Your survey responses or other content

11 Privacy Policy

Your privacy is important to us. Our Privacy Policy explains how we collect, use, and protect your information. By using our services, you also agree to our Privacy Policy.

Key privacy principles:

  • We never sell your personal data to third parties
  • Your survey responses are anonymized for research
  • You control your data and can request deletion
  • We use industry-standard security measures

12 Changes to Terms

12.1 Modification Process

We may modify these Terms at any time. When we make changes, we will:

  • Update the "Last Modified" date
  • Notify active users via email
  • Provide a summary of significant changes
  • Allow reasonable time for review (minimum 30 days for material changes)

12.2 Acceptance of Changes

Continued use of our services after changes constitutes acceptance of the modified Terms. If you disagree with changes, you should terminate your account before they take effect.

13 Governing Law and Jurisdiction

13.1 Applicable Law

These Terms are governed by the laws of India, without regard to conflict of law principles.

13.2 Jurisdiction

Any disputes shall be subject to the exclusive jurisdiction of the courts in Tamil Nadu, India.

13.3 Dispute Resolution

Before pursuing legal action, we encourage users to:

  • Contact our support team to resolve issues
  • Allow 30 days for resolution attempts
  • Consider mediation for complex disputes

14 Contact Information

If you have questions about these Terms, please contact us:

General Support

support@relevantreflex.com
Response within 24 hours

Legal Inquiries

legal@relevantreflex.com
Response within 5 business days

Mailing Address

Relevant Reflex
Ethirmedu, NH 544
Tamilnadu - 638183
India

Thank you for using Relevant Reflex!
We appreciate your participation in our survey community and your commitment to providing quality responses.
-------------------- END OF FILE -------------------- ### FILE 45: RR COM/test-postmark.php - Type: PHP - Size: 1.73 KB - Path: RR COM - Name: test-postmark.php ------------------------------------------------------------ 'Relevant Reflex ', 'To' => $toEmail, 'Subject' => 'Postmark Test - Relevant Reflex', 'HtmlBody' => '

Postmark is working!

This is a test email from Relevant Reflex via Postmark.

', 'TextBody' => 'Postmark is working! This is a test email from Relevant Reflex via Postmark.', 'ReplyTo' => 'support@relevantreflex.com', 'MessageStream' => 'outbound', 'Tag' => 'test', 'TrackOpens' => true, 'TrackLinks' => 'None' ]; $ch = curl_init('https://api.postmarkapp.com/email'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Accept: application/json', 'Content-Type: application/json', 'X-Postmark-Server-Token: ' . $postmarkApiKey ], CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $data = json_decode($response, true); echo "
";
echo "HTTP Status: $statusCode\n";
echo "Response: " . print_r($data, true);
echo "
"; if ($statusCode === 200 && isset($data['ErrorCode']) && $data['ErrorCode'] === 0) { echo "

SUCCESS — Email sent via Postmark! Check your Gmail.

"; } else { echo "

FAILED — Check the response above.

"; } ?> -------------------- END OF FILE -------------------- ### FILE 46: RR COM/ticket-guide.php - Type: PHP - Size: 34.52 KB - Path: RR COM - Name: ticket-guide.php ------------------------------------------------------------ Support Ticket Guide - How It Works | Relevant Reflex

Getting Started

Our support ticket system is designed to provide you with efficient, trackable help for any issues or questions you may have. Each ticket gets a unique number and goes through a structured process to ensure nothing gets missed.

How to Create a Support Ticket
  1. Login to your account - Visit your dashboard
  2. Go to Support section - Click "Support" in the navigation
  3. Fill out the form - Provide subject and detailed description
  4. Choose priority - Select appropriate urgency level
  5. Submit ticket - You'll get a unique ticket number

Understanding Ticket Statuses

Every support ticket goes through different statuses as our team works to resolve your issue. Here's what each status means:

OPEN

What it means: Your ticket has been received and is waiting for our support team to review it.

What happens next: A support agent will review your issue and respond with initial guidance or questions.

Can you reply? Yes, you can add more information anytime.

PENDING

What it means: Our support team has responded and is waiting for your reply or action.

What happens next: Please check your email and dashboard for our response. We may need more information or be waiting for you to try a suggested solution.

Can you reply? Yes, please respond to keep the conversation going.

RESOLVED

What it means: Our team believes your issue has been solved, but we want to make sure!

What happens next: Please test the solution and let us know if it worked. If the issue persists, just reply and we'll reopen the ticket.

Can you reply? Yes, you can confirm the fix worked or report if issues continue.

CLOSED

What it means: Your issue has been completely resolved and the ticket is archived.

What happens next: Nothing! Your issue is solved. If you have a new problem, please create a new ticket.

Can you reply? No, closed tickets cannot be reopened. Please create a new ticket for new issues.

Priority Levels

When creating a ticket, choose the priority level that best matches your situation:

LOW General Questions
24-48 hours

Use for: How-to questions, feature requests, general inquiries

MEDIUM Standard Issues
12-24 hours

Use for: Account issues, survey problems, payment questions

HIGH Urgent Problems
4-8 hours

Use for: Cannot access account, missing payments, data issues

URGENT Critical Issues
1-2 hours

Use for: Security concerns, service outages, data loss

Typical Workflow

Example: "I can't access my account"
Day 1 - You create ticket

OPEN "I can't log in to my account"

Day 1 - We respond (4 hours later)

PENDING "Can you try resetting your password? Click here..."

Day 2 - You reply

PENDING "I tried but didn't receive the reset email"

Day 2 - We investigate and fix

RESOLVED "Found the issue - email was blocked. Fixed it and reset your password to: [new password]"

Day 2 - You confirm

RESOLVED "Perfect! I can log in now. Thank you!"

Day 3 - We close ticket

CLOSED Issue resolved successfully.

Response Times

We strive to respond to all tickets promptly. Our target response times are:

Business Hours

Monday-Friday: 9:00 AM - 6:00 PM IST
Saturday: 10:00 AM - 4:00 PM IST
Sunday: Closed (emergency only)

Response Goals

Urgent: Within 2 hours
High: Within 8 hours
Medium: Within 24 hours
Low: Within 48 hours

Pro Tip

Response times are for first response. Complex issues may require multiple exchanges, but we'll keep you updated on progress throughout the resolution process.

Best Practices

DO
  • Be specific - Include error messages, screenshots
  • One issue per ticket - Don't combine multiple problems
  • Choose correct priority - Be honest about urgency
  • Respond promptly - Reply to our questions quickly
  • Provide context - When did it start? What changed?
  • Be patient - Allow time for investigation
DON'T
  • Create duplicate tickets - One ticket per issue
  • Mark everything urgent - Saves urgent for real emergencies
  • Leave out details - More info = faster resolution
  • Use inappropriate channels - Keep support in tickets
  • Get impatient - Quality takes time
  • Close tickets too early - Make sure it's really fixed

Good Ticket Examples

GOOD Example

Subject: Cannot complete survey ID #12345 - browser crashes

Priority: Medium

Description: "Hi, I'm trying to complete survey #12345 'Shopping Preferences' but on question 8 (the one about brands), my browser (Chrome v91 on Windows 10) crashes and closes. This has happened 3 times now. I've tried clearing my cache and using incognito mode, but same issue. I need to complete this survey by Friday to get the reward. Screenshots attached."

Why this is good: Specific survey ID, exact problem description, browser details, steps already tried, deadline mentioned, screenshots included.
POOR Example

Subject: Survey not working

Priority: Urgent

Description: "Your surveys don't work. Fix it."

Why this is poor: No specific details, wrong priority level, no context, rude tone, impossible to diagnose.

Frequently Asked Questions

Q: Can I reply to a resolved ticket?

A: Yes! If the solution didn't work or you have follow-up questions, just reply to the resolved ticket. We'll reopen it and continue helping.

Q: What happens if I don't respond to a pending ticket?

A: We'll wait 7 days for your response. After that, we'll send a reminder. If there's no response after 14 days, we'll mark it as resolved.

Q: Can I change the priority of my ticket?

A: You can mention in a reply if urgency has changed, but our support team manages priority levels based on actual impact and urgency.

Q: How do I know when you reply to my ticket?

A: You'll receive an email notification and can also check your dashboard support section for updates.

Q: Can I call for support instead?

A: We primarily use tickets to ensure nothing gets lost and maintain quality records. For complex issues, our team may schedule a call as part of the resolution process.

-------------------- END OF FILE -------------------- ### FILE 47: RR COM/update-ticket-status.php - Type: PHP - Size: 2.93 KB - Path: RR COM - Name: update-ticket-status.php ------------------------------------------------------------ isLoggedIn()) { throw new Exception('Admin authentication required'); } // Only handle POST requests if ($_SERVER['REQUEST_METHOD'] !== 'POST') { throw new Exception('Only POST requests allowed'); } $admin = $auth->getCurrentAdmin(); $ticketId = isset($_POST['ticket_id']) ? intval($_POST['ticket_id']) : 0; $status = isset($_POST['status']) ? trim($_POST['status']) : ''; // Validate input if ($ticketId <= 0) { throw new Exception('Invalid ticket ID'); } if (empty($status)) { throw new Exception('Status is required'); } $validStatuses = ['open', 'pending', 'resolved', 'closed']; if (!in_array($status, $validStatuses)) { throw new Exception('Invalid status. Must be: ' . implode(', ', $validStatuses)); } // Database update $db = new Database(); $pdo = $db->getConnection(); // Get current ticket info $stmt = $pdo->prepare("SELECT id, ticket_number, status FROM support_tickets WHERE id = ?"); $stmt->execute([$ticketId]); $ticket = $stmt->fetch(); if (!$ticket) { throw new Exception('Ticket not found'); } // Update status $stmt = $pdo->prepare(" UPDATE support_tickets SET status = ?, resolved_at = CASE WHEN ? = 'resolved' THEN NOW() ELSE resolved_at END, updated_at = NOW() WHERE id = ? "); $result = $stmt->execute([$status, $status, $ticketId]); if (!$result || $stmt->rowCount() === 0) { throw new Exception('Failed to update ticket status'); } // Log the success logError('Ticket status updated successfully', [ 'ticket_id' => $ticketId, 'ticket_number' => $ticket['ticket_number'], 'old_status' => $ticket['status'], 'new_status' => $status, 'admin_id' => $admin['id'], 'admin_username' => $admin['username'] ]); // Return success echo json_encode([ 'success' => true, 'message' => 'Status updated successfully', 'ticket_id' => $ticketId, 'ticket_number' => $ticket['ticket_number'], 'old_status' => $ticket['status'], 'new_status' => $status, 'updated_by' => $admin['full_name'] ]); } catch (Exception $e) { // Return error echo json_encode([ 'success' => false, 'message' => $e->getMessage(), 'debug_info' => [ 'ticket_id' => $ticketId ?? 'not_provided', 'status' => $status ?? 'not_provided', 'admin_logged_in' => $auth->isLoggedIn(), 'request_method' => $_SERVER['REQUEST_METHOD'] ] ]); } ?> -------------------- END OF FILE -------------------- ### FILE 48: RR COM/user-support.php - Type: PHP - Size: 24.76 KB - Path: RR COM - Name: user-support.php ------------------------------------------------------------ redirectToLogin('Session expired. Please log in again.'); } // Initialize database try { $db = new Database(); $pdo = $db->getConnection(); } catch (Exception $e) { logError('Database connection failed in user-support.php: ' . $e->getMessage()); if ($_SERVER['REQUEST_METHOD'] === 'POST') { jsonResponse(false, 'System error. Please try again later.'); } else { die('System error. Please try again later.'); } } // Handle POST request - Create new ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && !isset($_GET['ticket'])) { $subject = isset($_POST['subject']) ? sanitize($_POST['subject']) : ''; $message = isset($_POST['message']) ? trim($_POST['message']) : ''; $priority = isset($_POST['priority']) ? sanitize($_POST['priority']) : 'medium'; // Validation if (empty($subject) || empty($message)) { jsonResponse(false, 'Subject and message are required.'); } if (strlen($subject) > 255) { jsonResponse(false, 'Subject must be 255 characters or less.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Message must be 5000 characters or less.'); } if (!in_array($priority, ['low', 'medium', 'high', 'urgent'])) { $priority = 'medium'; } try { $pdo->beginTransaction(); // Generate unique ticket number $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -4)); // Check if ticket number already exists (very unlikely but let's be safe) $stmt = $pdo->prepare("SELECT id FROM support_tickets WHERE ticket_number = ?"); $stmt->execute([$ticketNumber]); if ($stmt->fetch()) { // Generate a new one if it exists $ticketNumber = 'TKT-' . date('Ymd') . '-' . strtoupper(substr(uniqid(), -6)); } // Insert support ticket $stmt = $pdo->prepare(" INSERT INTO support_tickets (ticket_number, user_id, subject, status, priority) VALUES (?, ?, ?, 'open', ?) "); $stmt->execute([$ticketNumber, $user['id'], $subject, $priority]); $ticketId = $pdo->lastInsertId(); // Insert initial message $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticketId, $user['id'], $message]); $messageId = $pdo->lastInsertId(); $pdo->commit(); // Handle file attachments (after commit so message exists) if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } logError('Support ticket created', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'], 'subject' => $subject, 'priority' => $priority ]); jsonResponse(true, 'Support ticket created successfully.', ['ticket_number' => $ticketNumber]); } catch (Exception $e) { $pdo->rollBack(); logError('Error creating support ticket', ['user_id' => $user['id'], 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to create support ticket. Please try again.'); } } // Handle GET request - View specific ticket if (isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); try { // Get ticket details $stmt = $pdo->prepare(" SELECT st.*, au.full_name as assigned_to_name FROM support_tickets st LEFT JOIN admin_users au ON st.assigned_to = au.id WHERE st.ticket_number = ? AND st.user_id = ? "); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { header('Location: dashboard.php#support'); exit; } // Get all messages for this ticket $stmt = $pdo->prepare(" SELECT sm.*, CASE WHEN sm.sender_type = 'user' THEN u.email WHEN sm.sender_type = 'admin' THEN au.full_name END as sender_name FROM support_messages sm LEFT JOIN users u ON sm.sender_type = 'user' AND sm.sender_id = u.id LEFT JOIN admin_users au ON sm.sender_type = 'admin' AND sm.sender_id = au.id WHERE sm.ticket_id = ? AND sm.is_internal = 0 ORDER BY sm.created_at ASC "); $stmt->execute([$ticket['id']]); $messages = $stmt->fetchAll(); // Load attachments for all messages $messageIds = array_column($messages, 'id'); $messageAttachments = $supportHelperLoaded ? getAttachmentsForMessages($pdo, $messageIds) : []; } catch (Exception $e) { logError('Error fetching ticket details', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); header('Location: dashboard.php#support'); exit; } } // Handle POST request for adding reply to existing ticket if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_GET['ticket'])) { $ticketNumber = sanitize($_GET['ticket']); $message = isset($_POST['reply']) ? trim($_POST['reply']) : ''; if (empty($message)) { jsonResponse(false, 'Reply message is required.'); } if (strlen($message) > 5000) { jsonResponse(false, 'Reply must be 5000 characters or less.'); } try { // Verify ticket belongs to user and is not closed $stmt = $pdo->prepare("SELECT id, status FROM support_tickets WHERE ticket_number = ? AND user_id = ?"); $stmt->execute([$ticketNumber, $user['id']]); $ticket = $stmt->fetch(); if (!$ticket) { jsonResponse(false, 'Ticket not found.'); } if ($ticket['status'] === 'closed') { jsonResponse(false, 'Cannot reply to a closed ticket.'); } // Insert reply $stmt = $pdo->prepare(" INSERT INTO support_messages (ticket_id, sender_type, sender_id, message) VALUES (?, 'user', ?, ?) "); $stmt->execute([$ticket['id'], $user['id'], $message]); $messageId = $pdo->lastInsertId(); // Handle file attachments if ($supportHelperLoaded && !empty($_FILES['attachments']['name'][0])) { handleSupportAttachments($pdo, $messageId, $_FILES['attachments']); } // Update ticket status to 'open' if it was 'resolved' if ($ticket['status'] === 'resolved') { $stmt = $pdo->prepare("UPDATE support_tickets SET status = 'open', updated_at = NOW() WHERE id = ?"); $stmt->execute([$ticket['id']]); } logError('Support ticket reply added', [ 'ticket_number' => $ticketNumber, 'user_id' => $user['id'] ]); jsonResponse(true, 'Reply added successfully.'); } catch (Exception $e) { logError('Error adding ticket reply', ['ticket_number' => $ticketNumber, 'error' => $e->getMessage()]); jsonResponse(false, 'Failed to add reply. Please try again.'); } } // If we're here, it means we're displaying a specific ticket or the form ?> Support - Relevant Reflex
Status:
Priority:
Created:
Agent:
You (Support)
Add Reply
Max 5000 characters
This ticket has been closed. If you need further help, please create a new ticket.
Response Times
  • Low: 2-3 business days
  • Medium: 1-2 business days
  • High: 4-8 hours
  • Urgent: 1-2 hours
Before Submitting
  • Check our FAQ section
  • Provide as much detail as possible
  • Include any error messages you see
  • Attach screenshots if relevant
-------------------- END OF FILE -------------------- ### FILE 49: RR COM/verify.php - Type: PHP - Size: 23.6 KB - Path: RR COM - Name: verify.php ------------------------------------------------------------ Relevant Reflex

Please open this link in your browser to verify your account.

'; exit; } // ===== END BOT PROTECTION ===== // Get token from URL $token = isset($_GET['token']) ? sanitize($_GET['token']) : ''; if (empty($token)) { showVerificationPage(false, 'Invalid verification link.', 'The verification link appears to be incomplete. Please check your email and click the complete link.'); } try { // Initialize database $db = new Database(); $pdo = $db->getConnection(); // ===== ANTI-BOT: Rate limit verification attempts per IP ===== $clientIP = $_SERVER['REMOTE_ADDR'] ?? '0.0.0.0'; try { // Check if IP is blocked $stmt = $pdo->prepare("SELECT id FROM ip_blocklist WHERE ip_address = ? AND (expires_at IS NULL OR expires_at > NOW())"); $stmt->execute([$clientIP]); if ($stmt->fetch()) { showVerificationPage(false, 'Access Restricted', 'Verification is temporarily unavailable from your network. Please contact support.'); } // Rate limit: max 10 verification attempts per IP per hour (prevents token brute-forcing) $stmt = $pdo->prepare("SELECT COUNT(*) as cnt FROM registration_attempts WHERE ip_address = ? AND attempt_type = 'verification' AND created_at > DATE_SUB(NOW(), INTERVAL 1 HOUR)"); $stmt->execute([$clientIP]); $attempts = $stmt->fetch(); if ($attempts && $attempts['cnt'] >= 10) { showVerificationPage(false, 'Too Many Attempts', 'Too many verification attempts. Please try again later.'); } // Log this attempt $pdo->prepare("INSERT INTO registration_attempts (ip_address, attempt_type, user_agent) VALUES (?, 'verification', ?)") ->execute([$clientIP, $_SERVER['HTTP_USER_AGENT'] ?? '']); } catch (Exception $e) { // Don't block verification if logging fails } // Start transaction $pdo->beginTransaction(); // Find the verification token $stmt = $pdo->prepare(" SELECT ev.user_id, ev.expires_at, u.email, u.email_verified FROM email_verifications ev JOIN users u ON ev.user_id = u.id WHERE ev.token = ? AND ev.expires_at > NOW() "); $stmt->execute([$token]); $verification = $stmt->fetch(); if (!$verification) { // Check if token exists but is expired $stmt = $pdo->prepare(" SELECT ev.expires_at, u.email FROM email_verifications ev JOIN users u ON ev.user_id = u.id WHERE ev.token = ? "); $stmt->execute([$token]); $expiredToken = $stmt->fetch(); if ($expiredToken) { showVerificationPage(false, 'Verification Link Expired', 'This verification link has expired. Please register again to receive a new verification email.'); } else { // Token not found and not expired = it was already consumed (user already verified) showVerificationPage(true, 'Email Already Verified', 'Your email has already been verified successfully. You can now log in to your account.'); } } // Check if email is already verified if ($verification['email_verified']) { showVerificationPage(true, 'Email Already Verified', 'Your email has already been verified. You can now log in to your account.'); } $userId = $verification['user_id']; // Detect channel before commit so we can store it $verifiedVia = (isset($_GET['via']) && $_GET['via'] === 'whatsapp') ? 'whatsapp' : 'email'; // Update user status $stmt = $pdo->prepare(" UPDATE users SET email_verified = 1, status = 'active', email_verified_via = ?, updated_at = NOW() WHERE id = ? "); $stmt->execute([$verifiedVia, $userId]); // Delete used verification token $stmt = $pdo->prepare("DELETE FROM email_verifications WHERE token = ?"); $stmt->execute([$token]); // Commit transaction $pdo->commit(); // Log successful verification logError('Email verification successful', [ 'user_id' => $userId, 'email' => $verification['email'] ]); // ===== WHATSAPP VERIFICATION: If link clicked via WhatsApp, also mark mobile as verified ===== $viaWhatsApp = ($verifiedVia === 'whatsapp'); if ($viaWhatsApp) { try { // Check if this user has an unverified mobile number (saved at signup) $waStmt = $pdo->prepare("SELECT mobile_number FROM mobile_verifications WHERE user_id = ? AND is_verified = 0"); $waStmt->execute([$userId]); $waRow = $waStmt->fetch(); if ($waRow) { $pdo->beginTransaction(); // Mark mobile as verified — they proved access to the number by clicking on WhatsApp $pdo->prepare(" UPDATE mobile_verifications SET is_verified = 1, verified_at = NOW(), otp_code = NULL, otp_expires_at = NULL, updated_at = NOW() WHERE user_id = ? ")->execute([$userId]); // Award 10 points for mobile verification (same as OTP flow) $pdo->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, 10.00, 10.00) ON DUPLICATE KEY UPDATE points = points + 10.00, total_earned = total_earned + 10.00 ")->execute([$userId]); $pdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description) VALUES (?, 'earned', 10.00, 'whatsapp_verification', 'Mobile number verified via WhatsApp link') ")->execute([$userId]); $pdo->commit(); logError('Mobile number verified via WhatsApp link', [ 'user_id' => $userId, 'mobile' => $waRow['mobile_number'] ]); } } catch (Exception $e) { if ($pdo->inTransaction()) $pdo->rollback(); logError('Failed to verify mobile via WhatsApp', ['user_id' => $userId, 'error' => $e->getMessage()]); // Don't fail the email verification — this is a bonus action } } // ===== END WHATSAPP VERIFICATION ===== // ===== AFFILIATE TRACKING: Update affiliate signup tracking ===== try { // Connect to admin database $adminPdo = new PDO( "mysql:host=localhost;dbname=u752449863_rrshop;charset=utf8mb4", 'u752449863_rradmin', 'S@n@h2016', [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ] ); // Update affiliate signup tracking - mark as verified $updateStmt = $adminPdo->prepare(" UPDATE affiliate_signups SET email_verified = 1, verified_at = NOW() WHERE panel_user_id = ? AND email_verified = 0 "); $updateStmt->execute([$userId]); $rowsAffected = $updateStmt->rowCount(); // If a row was updated, update the affiliate's total verified count if ($rowsAffected > 0) { // Get the affiliate_id $affiliateStmt = $adminPdo->prepare(" SELECT affiliate_id, reward_amount FROM affiliate_signups WHERE panel_user_id = ? "); $affiliateStmt->execute([$userId]); $affiliateInfo = $affiliateStmt->fetch(); if ($affiliateInfo) { // Update affiliate total_verified_signups count $countStmt = $adminPdo->prepare(" UPDATE affiliates SET total_verified_signups = ( SELECT COUNT(*) FROM affiliate_signups WHERE affiliate_id = ? AND email_verified = 1 ) WHERE id = ? "); $countStmt->execute([$affiliateInfo['affiliate_id'], $affiliateInfo['affiliate_id']]); // Award points to the user (onboarding bonus from affiliate) if ($affiliateInfo['reward_amount'] > 0) { // Check if user_points record exists $pointsCheckStmt = $pdo->prepare("SELECT id FROM user_points WHERE user_id = ?"); $pointsCheckStmt->execute([$userId]); if ($pointsCheckStmt->fetch()) { // Update existing points $pointsStmt = $pdo->prepare(" UPDATE user_points SET points = points + ?, total_earned = total_earned + ?, updated_at = NOW() WHERE user_id = ? "); $pointsStmt->execute([ $affiliateInfo['reward_amount'], $affiliateInfo['reward_amount'], $userId ]); } else { // Create new points record $pointsStmt = $pdo->prepare(" INSERT INTO user_points (user_id, points, total_earned, created_at) VALUES (?, ?, ?, NOW()) "); $pointsStmt->execute([ $userId, $affiliateInfo['reward_amount'], $affiliateInfo['reward_amount'] ]); } // Log the transaction $transactionStmt = $pdo->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, status, created_at) VALUES (?, 'earned', ?, 'affiliate_bonus', ?, 'completed', NOW()) "); $transactionStmt->execute([ $userId, $affiliateInfo['reward_amount'], 'Affiliate signup bonus - Welcome reward for joining through our partner' ]); } logError('Affiliate verification tracked successfully', [ 'user_id' => $userId, 'affiliate_id' => $affiliateInfo['affiliate_id'], 'reward_amount' => $affiliateInfo['reward_amount'] ]); } } } catch (Exception $e) { // Log error but don't fail the verification logError('Failed to update affiliate verification tracking', [ 'error' => $e->getMessage(), 'user_id' => $userId ]); } // ===== END AFFILIATE TRACKING ===== // ===== MEMBER REFERRAL: Award referrer Rs.5 (10 pts) on email verification ===== try { $mrefPdo2 = new PDO( "mysql:host=localhost;dbname=u752449863_rrpanel;charset=utf8mb4", 'u752449863_rrpaneladmin', 'S@n@h2016', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC] ); // Find if this user was referred by a member $stmt = $mrefPdo2->prepare(" SELECT id, referrer_user_id FROM member_referral_clicks WHERE referee_user_id = ? AND email_verified = 0 AND signup_completed = 1 LIMIT 1 "); $stmt->execute([$userId]); $mrefRow = $stmt->fetch(); if ($mrefRow && $mrefRow['referrer_user_id'] != $userId) { $referrerId = $mrefRow['referrer_user_id']; $mrefClickId = $mrefRow['id']; $rewardPts = 10; // Rs.5 = 10 points (1 pt = Rs.0.50) // Mark click as verified + reward paid $mrefPdo2->prepare(" UPDATE member_referral_clicks SET email_verified = 1, verified_at = NOW(), signup_reward_paid = 1 WHERE id = ? ")->execute([$mrefClickId]); // Award points to referrer $mrefPdo2->prepare(" INSERT INTO user_points (user_id, points, total_earned) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE points = points + ?, total_earned = total_earned + ? ")->execute([$referrerId, $rewardPts, $rewardPts, $rewardPts, $rewardPts]); $mrefPdo2->prepare(" INSERT INTO point_transactions (user_id, transaction_type, points, source, description, reference_id, created_at) VALUES (?, 'earned', ?, 'member_referral', ?, ?, NOW()) ")->execute([ $referrerId, $rewardPts, 'Referral reward: your friend verified their email (₹5 = 10 pts)', $userId ]); } } catch (Exception $e) { logError('Member referral verify reward error: ' . $e->getMessage()); } // ===== END MEMBER REFERRAL ===== showVerificationPage( true, 'Email Verified Successfully!', 'Your email has been verified successfully. Your account is now active and you can start taking surveys and earning rewards!' ); } catch (PDOException $e) { // Rollback transaction on error if ($pdo->inTransaction()) { $pdo->rollback(); } logError('Database error during email verification', [ 'error' => $e->getMessage(), 'token' => substr($token, 0, 10) . '...' // Log partial token for debugging ]); showVerificationPage( false, 'Verification Failed', 'We encountered a system error while verifying your email. Please try again later or contact support.' ); } catch (Exception $e) { // Rollback transaction on error if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollback(); } logError('General error during email verification', [ 'error' => $e->getMessage(), 'token' => substr($token, 0, 10) . '...' ]); showVerificationPage( false, 'Verification Failed', 'An unexpected error occurred. Please try again later or contact support.' ); } function showVerificationPage($success, $title, $message) { $statusClass = $success ? 'success' : 'error'; $statusColor = $success ? '#28a745' : '#dc3545'; $iconClass = $success ? 'fa-check-circle' : 'fa-times-circle'; $iconColor = $success ? '#28a745' : '#dc3545'; ?> <?php echo htmlspecialchars($title); ?> - Relevant Reflex

What's Next?
  • Log in with your registered email and password
  • Complete your profile to get targeted surveys
  • Start participating in surveys and earn rewards
  • Redeem your points for real money via UPI
Need Help?
  • Check your spam/junk folder for the verification email
  • Make sure you clicked the complete link from the email
  • Contact our support team at support@relevantreflex.com
  • Our team responds within 24 hours
-------------------- END OF FILE -------------------- ### FILE 50: RR COM/whatsapp-cron.log - Type: LOG - Size: 0 B - Path: RR COM - Name: whatsapp-cron.log ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 51: RR COM/whatsapp-cron.php - Type: PHP - Size: 6.34 KB - Path: RR COM - Name: whatsapp-cron.php ------------------------------------------------------------ AISENSY_API_KEY, 'campaignName' => AISENSY_TEMPLATE, 'destination' => $phone, 'userName' => 'Relevant Reflex Consulting', 'templateParams' => [$verifyUrl], 'source' => 'new-landing-page form', 'media' => (object)[], 'buttons' => [], 'carouselCards' => [], 'location' => (object)[] ]; $ch = curl_init(AISENSY_API_URL); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json' ], CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => true, ]); $response = curl_exec($ch); $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlError = curl_error($ch); curl_close($ch); if ($curlError) { logMsg("CURL error for $phone: $curlError"); return false; } $data = json_decode($response, true); // AiSensy returns 200 with success or error message if ($statusCode === 200) { logMsg("Sent to $phone — Response: $response"); return true; } logMsg("Failed for $phone — HTTP $statusCode — $response"); return false; } // ── MAIN ───────────────────────────────────────────────────────── logMsg("Cron started"); try { $pdo = new PDO( "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8mb4", DB_USER, DB_PASS, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ] ); // Find eligible members: // - signed up 5 to 10 minutes ago // - email not verified // - has a whatsapp number // - whatsapp_msg_sent = 0 $stmt = $pdo->query(" SELECT u.id, u.whatsapp_number, ev.token as verify_token FROM users u LEFT JOIN email_verifications ev ON ev.id = ( SELECT id FROM email_verifications WHERE user_id = u.id ORDER BY created_at DESC LIMIT 1 ) WHERE u.email_verified = 0 AND u.whatsapp_msg_sent = 0 AND u.whatsapp_number IS NOT NULL AND u.whatsapp_number != '' AND u.created_at BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND DATE_SUB(NOW(), INTERVAL 5 MINUTE) "); $members = $stmt->fetchAll(); if (empty($members)) { logMsg("No eligible members found — exiting"); exit; } logMsg("Found " . count($members) . " eligible member(s)"); foreach ($members as $member) { $userId = $member['id']; $mobile = $member['whatsapp_number']; $token = $member['verify_token']; if (empty($token)) { logMsg("User $userId — no verify token found, skipping"); // Mark as sent anyway so we don't retry endlessly $pdo->prepare("UPDATE users SET whatsapp_msg_sent = 1 WHERE id = ?") ->execute([$userId]); continue; } $verifyUrl = 'https://relevantreflex.com/verify.php?token=' . $token . '&via=whatsapp'; $sent = sendWhatsApp($mobile, $verifyUrl); // Always mark as sent (success or not) to prevent duplicate sends $pdo->prepare("UPDATE users SET whatsapp_msg_sent = 1 WHERE id = ?") ->execute([$userId]); if ($sent) { logMsg("User $userId ($mobile) — WhatsApp sent successfully"); } else { logMsg("User $userId ($mobile) — WhatsApp send FAILED (marked as sent to avoid retry loop)"); } } } catch (Exception $e) { logMsg("ERROR: " . $e->getMessage()); } logMsg("Cron finished"); -------------------- END OF FILE -------------------- ### FILE 52: RR COM/articles/5-ways-maximize-survey-earnings.php - Type: PHP - Size: 12.35 KB - Path: RR COM/articles - Name: 5-ways-maximize-survey-earnings.php ------------------------------------------------------------ 5 Ways to Maximize Survey Earnings in India | Relevant Reflex
December 10, 2024  |  Tips & Tricks  |  Last updated: April 2026

5 Ways to Maximize Your Survey Earnings in India

Most survey takers in India earn far less than they could — not because of low survey availability, but because of avoidable mistakes. These five strategies can meaningfully increase how much you earn each month.

1. Complete Your Profile 100%

Your profile is the single most important factor in how many surveys you receive. Survey platforms match members to surveys based on demographics — age, occupation, income range, household details, and interests. A half-complete profile means you get matched to only a fraction of available surveys.

On Relevant Reflex, members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Set aside 20–30 minutes to fill everything in thoroughly and honestly — it pays off consistently every month.

2. Check for Surveys Every Single Day

Many surveys have a fixed quota — once enough respondents have completed them, they close. If you check your dashboard only a few times a week, you will miss surveys that filled up in the meantime. Members who log in daily and check their email for invitations consistently earn more than those who participate sporadically.

The best habit is to check your survey dashboard first thing in the morning, as many new surveys are added overnight by research teams in different time zones.

3. Participate in Profiler Surveys Whenever Available

Profiler surveys are short surveys that gather additional information about your lifestyle, preferences, and purchase habits. They are often overlooked because they pay less individually — but completing them unlocks a significantly larger pool of paid surveys targeted to your updated profile.

Think of profiler surveys as an investment. Spending 5 minutes on a profiler survey today can unlock ₹300–₹500 worth of targeted surveys over the next few weeks.

4. Answer Honestly and Consistently

Survey platforms use quality checks — including consistency questions and speeding detection — to identify unreliable responses. Members who rush through surveys or give random answers get flagged and receive fewer invitations over time. Honest, thoughtful responses protect your account quality and ensure continued access to surveys.

This is not just about ethics — it is about protecting your earning potential. A flagged account sees a dramatic drop in survey invitations that is very difficult to recover from.

5. Choose the Right Languages

Only select languages you are genuinely fluent in when setting up your profile. Attempting surveys in languages you do not understand leads to longer completion times, which triggers quality flags in the system. Surveys that take unusually long to complete are automatically reviewed and may not be credited.

If you are fluent in both English and Tamil, select both — this expands your eligible survey pool. But do not select Hindi or other regional languages simply to receive more surveys if you cannot complete them accurately.

Start Earning with Relevant Reflex

Relevant Reflex is an India-based survey platform with 50,000+ members and ₹25 lakh+ paid out since 2021. UPI payments, ₹500 minimum payout. Join free today.

-------------------- END OF FILE -------------------- ### FILE 53: RR COM/articles/best-paid-survey-sites-india.php - Type: PHP - Size: 34.57 KB - Path: RR COM/articles - Name: best-paid-survey-sites-india.php ------------------------------------------------------------ Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

Best Paid Survey Sites in India That Actually Pay in 2026 (Honest Comparison)

A factual, balanced comparison — including platforms we compete with — to help you choose the right survey sites for your situation.

Disclosure: This article is written by Relevant Reflex, one of the platforms reviewed below. We have made every effort to provide factual, balanced information about competitors. Per Google's Product Review Guidelines, we do not make unsupported negative claims about other platforms. All comparison data is based on publicly available information as of April 2026.

If you are looking for paid survey sites in India, you have two broad categories to choose from: India-based platforms built specifically for Indian users with UPI payment, and international platforms that accept Indian members but pay via PayPal or gift cards. Both have their place — the right choice depends on your priorities.

This article compares the main options honestly so you can make an informed decision. The recommendation at the end is based on what actually matters to Indian users — UPI payment support, India-specific survey volume, minimum payout threshold, and reliability.

Side-by-Side Comparison Table

Platform Based In UPI Payment Min. Payout India Surveys Free to Join
Relevant Reflex India (Tamil Nadu) ✓ Yes ₹250 India-specific ✓ Yes
Swagbucks USA ✗ No $5 (gift cards) Mixed ✓ Yes
Toluna France/Global ✗ No Points (≈₹800+) Some India ✓ Yes
ySense USA ✗ No $10 (PayPal) Mixed ✓ Yes
OpinionWorld India India (SSI) Partial Points (≈₹600+) India-focused ✓ Yes

India-Based Platforms

2. OpinionWorld India India-Focused

Best for: Users who want another India-focused option alongside Relevant Reflex

OpinionWorld operates in India as part of the global SSI/Dynata network, one of the world's largest market research data collectors. This gives it access to a large volume of surveys from multinational brands researching the Indian market. Payment options include bank transfer and some gift card options, though UPI support is limited compared to India-native platforms.

What it does well: Good survey volume from international brands, established global company backing, India-specific survey content.

Limitation: Less seamless UPI integration compared to India-native platforms. Payment can take longer. Interface is less user-friendly for mobile users.

Verdict: Good complement to Relevant Reflex for increasing overall survey volume, especially for users researched by multinational brands.

International Platforms Available in India

3. Swagbucks International

Best for: Users comfortable with gift card payments who want multiple earning methods

Swagbucks is one of the most well-known GPT (Get-Paid-To) platforms globally. Indian members can earn SB points through surveys, watching videos, shopping online, and completing offers. Points are redeemable for gift cards from brands like Amazon India, Flipkart, and others. PayPal cash is available but less convenient for Indian users.

What it does well: Multiple earning methods beyond just surveys — videos, games, shopping cashback. Established global platform with strong reputation. Amazon India and Flipkart gift card redemption options are genuinely useful.

Limitation: No direct UPI payment. Survey volume for Indian demographics is lower than India-focused platforms. Some surveys are routed through third-party providers with inconsistent quality. Minimum redemption for PayPal is $25 which takes time to accumulate.

Verdict: Worth joining for the gift card options and diversified earning methods, but not a substitute for India-native UPI platforms.

4. Toluna International

Best for: Users who want to influence product decisions for global brands

Toluna is a large global survey panel with an India presence. It offers surveys from major international brands including FMCG, technology, and automotive companies. The point system is more complex than direct cash platforms, and redemption options for Indian users typically involve gift cards rather than direct bank transfer.

What it does well: High-quality surveys from reputable global brands. Active community features with polls and discussions. Regular contests. Good survey variety.

Limitation: Complex points system can be confusing. No UPI payment. Minimum redemption requires a significant number of accumulated points. Customer service response times can be slow for Indian users.

Verdict: Good supplementary platform, especially for users interested in global brand research, but not ideal as a primary platform for Indian users wanting cash payments.

5. ySense International

Best for: Users who have a PayPal account and want a reliable international option

ySense (formerly ClixSense) is a well-established GPT platform with a strong reputation for actually paying members. It aggregates surveys from multiple survey networks, which means more variety but also more inconsistency in survey quality. PayPal is the primary payment method, which requires Indian users to have a verified PayPal account.

What it does well: Very reliable payment track record. Good survey volume from aggregated networks. Daily tasks available beyond surveys. Transparent point system.

Limitation: $10 PayPal minimum payout is higher than India-native platforms. Requires a PayPal account. Survey availability for Indian demographics can be inconsistent. Some surveys screen out Indian respondents at higher rates.

Verdict: Trustworthy platform with a good payment record, but the PayPal requirement and higher minimum payout make it less convenient for most Indian users than UPI-native alternatives.

How to Choose the Right Platform for You

Choose based on your primary priority:
  • Want UPI cash payment? → Relevant Reflex first, OpinionWorld second
  • Want Amazon/Flipkart gift cards? → Swagbucks or Toluna
  • Have a PayPal account and want global platforms? → ySense + Toluna
  • Want maximum survey volume? → Join all 3–5 platforms above
  • First-time survey user? → Start with Relevant Reflex to understand the process, then expand

Why You Should Join Multiple Platforms

The single most effective strategy for maximising your monthly earnings from paid surveys in India is joining 3–5 platforms rather than committing to just one. Here is why:

Every platform has different client relationships. A survey on Swagbucks from an FMCG brand will never appear on Relevant Reflex, and vice versa. By joining multiple platforms, you access a larger total pool of surveys — meaning more daily opportunities and fewer days with nothing available.

The time investment is front-loaded. You spend 20–30 minutes setting up and completing your profile on each new platform — but after that, the marginal daily time required to check an additional platform is minimal. Most members who join 3 platforms check all three in the same 30-minute session each morning.

Our recommendation for Indian users starting from scratch: begin with Relevant Reflex for UPI cash, add OpinionWorld for additional India-specific surveys, and add Swagbucks for the diversified earning methods and gift card redemption. Evaluate after 2 months and add more platforms based on which types suit your profile best.

Looking for an earlier overview?

Our original platform overview — Best Survey Platforms for Indian Users — covers the broader landscape of survey platforms available in India and is a useful companion read alongside this detailed 2026 comparison.

Frequently Asked Questions

Which paid survey site is best for Indian users who want UPI payment?

Relevant Reflex is currently the best option for UPI payment in India, as it is built natively for Indian users with direct UPI payouts to PhonePe, Google Pay, and Paytm at a ₹250 minimum threshold.

Can I join multiple paid survey sites in India?

Yes, and it is recommended. Joining 3–5 platforms significantly increases your monthly earnings. Each platform has different clients and survey pools, so they complement rather than overlap each other.

Are international survey sites worth joining for Indian users?

Yes, as supplementary platforms — especially Swagbucks for gift cards and ySense for PayPal payments. However, India-native platforms offer more India-specific surveys and UPI payment, making them more convenient as primary platforms for most Indian users.

Which survey site has the lowest minimum payout for Indian users?

Among India-focused platforms, Relevant Reflex has a ₹250 minimum payout threshold via UPI — one of the lowest among legitimate platforms available to Indian users.

Start with India's UPI-Native Survey Platform

Join Relevant Reflex free — ₹250 minimum payout directly to your PhonePe, GPay, or Paytm.

Join Relevant Reflex Free Read Our Full Review
-------------------- END OF FILE -------------------- ### FILE 54: RR COM/articles/best-survey-platforms-indian-users.php - Type: PHP - Size: 14.21 KB - Path: RR COM/articles - Name: best-survey-platforms-indian-users.php ------------------------------------------------------------ Best Survey Platforms for Indian Users in 2026 | Relevant Reflex
November 20, 2024  |  India Specific  |  Last updated: April 2026

Best Survey Platforms for Indian Users in 2026

Not all survey platforms work equally well for Indian users. Payment methods, survey availability for Indian demographics, minimum thresholds, and language support all vary significantly. This guide helps you choose the right platforms for your situation.

What Makes a Survey Platform Good for Indian Users?

Before listing any platforms, it helps to understand what criteria matter most for someone based in India. The most important factors are: UPI or Indian payment method support, a low minimum payout threshold that is achievable within weeks rather than months, surveys actually targeted at Indian demographics rather than repurposed global surveys, and a responsive support team that understands Indian users.

Relevant Reflex

Relevant Reflex is built specifically for India, operating out of Tamil Nadu since 2021. Unlike most platforms on this list which are global platforms with an India section, Relevant Reflex sources surveys specifically for Indian consumer profiles. Payment is via UPI direct transfer — PhonePe, Google Pay, and Paytm are all supported — with a ₹500 minimum threshold. With 50,000+ members and ₹25 lakh+ paid out, it is a verified and active platform for Indian survey takers.

Best for: Indian users who want UPI payments and India-focused surveys.
Minimum payout: ₹250 via UPI
Free to join: Yes

Third-party verified: Relevant Reflex is independently listed as the #1 ranked platform on Paid Survey Hub India — a free directory that researches and verifies survey sites specifically for Indian users.

Swagbucks India

Swagbucks is one of the most well-known global reward platforms and is available in India. In addition to surveys, members can earn by watching videos, searching the web, and shopping online. The platform pays in "SB" points redeemable for gift cards or PayPal cash. Survey availability for Indian users is moderate — there are surveys available but fewer than on India-specific platforms.

Best for: Members who want multiple earning methods beyond surveys.
Minimum payout: Approx. ₹400 equivalent
Payment: PayPal or gift cards (no direct UPI)

Toluna India

Toluna is a large global panel with a dedicated India presence. The platform has a community element — members can create polls and participate in discussions in addition to surveys. Survey frequency for Indian members is decent, and the platform has been operating in India for many years. Payment is via PayPal or Paytm once the minimum threshold is reached.

Best for: Members who enjoy community features alongside surveys.
Minimum payout: ₹500 equivalent
Payment: PayPal or Paytm

ySense (formerly ClixSense)

ySense is a well-established platform available in India offering surveys, tasks, and offers. It has a strong track record of payments and a large user base. The platform pays via PayPal, Skrill, or Payoneer — not directly via UPI, which is a limitation for some Indian users. Survey availability is reasonable for Indian demographics.

Best for: Members comfortable with PayPal or Skrill for receiving payments.
Minimum payout: Approx. ₹800 equivalent
Payment: PayPal, Skrill, Payoneer

Key Things to Watch Out For

When evaluating any survey platform, watch for these warning signs: requests for payment to join or access surveys, promises of unrealistically high earnings, no physical address or contact information, and payment methods that are not easily accessible in India. Legitimate platforms are always free to join and transparent about how much members typically earn.

How Many Platforms Should You Join?

Most experienced survey takers in India join 3–5 platforms simultaneously. This increases the total number of surveys available to you and reduces the impact of any one platform having a quiet month. However, spreading yourself too thin across 10+ platforms makes it difficult to keep profiles updated and surveys completed on time. Start with 2–3 platforms, get comfortable, then expand.

Start with Relevant Reflex

India-built, UPI payments, ₹500 minimum payout, 50,000+ members, free to join. Sign up in under 2 minutes.

-------------------- END OF FILE -------------------- ### FILE 55: RR COM/articles/complete-guide-survey-beginners-india.php - Type: PHP - Size: 13.22 KB - Path: RR COM/articles - Name: complete-guide-survey-beginners-india.php ------------------------------------------------------------ Online Survey Beginners Guide India | Relevant Reflex
December 5, 2024  |  Getting Started  |  Last updated: April 2026

Complete Guide to Online Surveys for Beginners in India

If you have never taken a paid survey online before, this guide explains everything from choosing the right platform to receiving your first UPI payment — in plain, simple language.

What Are Paid Online Surveys?

Companies and brands need to understand what Indian consumers think about their products, services, and advertisements. Instead of running expensive focus groups, they commission online surveys through market research platforms. These platforms pay ordinary people — students, homemakers, working professionals, retirees — to share their honest opinions. You answer questions, and you earn rewards that can be redeemed as cash via UPI.

Step 1 — Choose the Right Survey Platform

Not all survey sites are equal. Look for platforms that are genuinely India-focused, offer UPI payments, have a low minimum payout threshold, and have verifiable member reviews. Avoid sites that ask for any registration fee or promise unrealistically high earnings. Relevant Reflex, for example, is free to join, pays via UPI, and has a ₹500 minimum threshold — achievable within your first few weeks.

Step 2 — Register with Accurate Information

When signing up, always provide your real details — age, gender, occupation, city, and income range. This is not just a policy requirement. Survey platforms match you to surveys based on your demographic profile. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.

Step 3 — Verify Your Email and Mobile

After registering, check your inbox for a verification email and click the confirmation link. Some platforms also require mobile verification. Completing both steps unlocks your full survey access and, on Relevant Reflex, earns you bonus points for verifying each.

Step 4 — Complete Your Profile Thoroughly

Before looking for surveys, spend time completing your profile sections — including profiler surveys about your lifestyle, income, vehicle ownership, electronics, and interests. This is the most important step most beginners skip. A thorough profile means you qualify for more surveys from day one.

Step 5 — Start Taking Surveys

Log in to your dashboard and look for available surveys. Each survey shows an estimated completion time and reward amount. Start with shorter surveys to build familiarity with the format. Answer all questions honestly — quality checks are built into most surveys, and inconsistent answers will disqualify your response without payment.

Step 6 — Understand Survey Types

There are several types of surveys you may encounter. Standard opinion surveys cover products, brands, and current topics and take 5–20 minutes. Profiler surveys gather demographic details and take 2–5 minutes. Product testing surveys are longer, sometimes requiring you to use a product at home before reviewing it. Focus groups are invitation-only group discussions that offer the highest rewards.

Step 7 — Redeem Your Rewards via UPI

Once you reach the minimum payout threshold (₹500 on Relevant Reflex), you can request a withdrawal to your UPI ID — PhonePe, Google Pay, or Paytm all work. Payments are processed within 3–7 business days. Always ensure your UPI ID is entered correctly in your profile settings before requesting a withdrawal.

What to Expect in Your First Month

In your first month, expect to earn between ₹300 and ₹1,000 depending on how actively you participate and how thoroughly you completed your profile. This is normal — survey availability increases as your profile data becomes richer. Most members see their earnings grow steadily from the second month onwards as they qualify for more targeted surveys.

Ready to Start?

Relevant Reflex is free to join, pays via UPI, and has 50,000+ active members across India. Registration takes under 2 minutes. Sign up now and start earning.

-------------------- END OF FILE -------------------- ### FILE 56: RR COM/articles/earn-money-online-surveys-india-guide.php - Type: PHP - Size: 28.18 KB - Path: RR COM/articles - Name: earn-money-online-surveys-india-guide.php ------------------------------------------------------------ How to Earn Money with Online Surveys in India 2026 | Relevant Reflex
April 13, 2026  |  Complete Guide  |  12 min read

How to Earn Money with Online Surveys in India: The Complete Guide (2026)

Online surveys in India have become one of the most accessible ways to earn supplementary income from home — no investment, no special skills, and no fixed schedule required. This guide covers everything you need to know in 2026: what online surveys actually are, how much you can realistically earn, how to get started, and the strategies that separate consistent earners from those who give up after a week.

At Relevant Reflex, we have been operating India's survey platform since 2021. We have paid over ₹25 lakh to 50,000+ verified Indian members via UPI. Everything in this guide is based on real data from our platform — not theoretical estimates.

What Are Online Surveys in India?

Online surveys are questionnaires commissioned by brands, companies, and market research firms to understand what Indian consumers think about their products, services, and advertising. Instead of running expensive in-person focus groups, companies pay survey platforms to collect this feedback digitally from a large pool of respondents.

When you join a survey platform in India, you become part of that respondent pool. When a company wants opinions from people matching your profile — say, a 28-year-old working professional in Tamil Nadu who owns a car — the platform sends you that survey. You complete it honestly, and you earn a reward.

This is a genuine, well-established industry. Market research is a multi-billion dollar global business, and brands genuinely need consumer feedback to make product, pricing, and marketing decisions. The money paid to survey respondents is a tiny fraction of what companies would otherwise spend on traditional research methods.

Who Commissions These Surveys?

The surveys available on Indian platforms typically come from three sources. Large consumer brands like FMCG companies, automobile manufacturers, and electronics brands regularly commission surveys to understand purchase intent and brand perception. Market research agencies collect data on behalf of multiple clients simultaneously. And media companies including streaming platforms, news organisations, and app developers run surveys to understand audience preferences.

How Much Can You Realistically Earn from Online Surveys in India?

This is the question most people ask first — and the one where many survey platforms are dishonest. Here is the truth based on actual member data from Relevant Reflex:

Member Type Daily Time Monthly Earnings Profile Status
Beginner (Month 1–2) 30–45 mins ₹500 – ₹1,500 Partially complete
Active member 1–2 hours ₹2,000 – ₹4,000 Fully complete
Experienced member 2+ hours ₹4,000 – ₹6,000 100% + profilers done

*Indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.

What determines where you fall in this range? Three factors matter most. First, profile completeness — members who complete all profiler sections receive significantly more survey invitations than those with basic profiles. Second, consistency — members who log in daily and check their email for invitations earn considerably more than those who participate sporadically. Third, demographic profile — certain demographics such as professionals in technology or healthcare, car owners, and parents of young children receive more high-value survey invitations because brands specifically target these groups.

Further Reading — Demographic-Specific Guides

We have written dedicated earning guides for two of the most active survey demographics in India: Online Surveys for Students — Earn Pocket Money in College and Online Surveys for Housewives — Work From Home and Earn. Both guides include realistic earning expectations, profile tips, and UPI payout guidance specific to each group.

What Surveys Pay in India

Standard opinion surveys of 5–15 minutes typically pay ₹20–₹80 on Indian platforms. Longer surveys of 20–30 minutes pay ₹100–₹250. Product testing surveys, which require you to use a product at home for a week before reviewing it, can pay ₹500–₹2,000. Focus group discussions, which are invitation-only group sessions of 60–90 minutes, pay the highest rewards — often ₹1,000–₹3,000 per session.

Step-by-Step: How to Start Earning with Online Surveys in India

Step 1 — Choose a Legitimate Platform

The most important decision you will make is which platform to join. Look for platforms that are free to join with no registration fee, offer UPI payments (not just PayPal or international transfers), have a minimum payout threshold below ₹1,000, and have verifiable payment records — either from public reviews or direct member testimonials.

Relevant Reflex is free to join, pays via UPI with a ₹500 minimum threshold, and has paid ₹25 lakh+ to Indian members since 2021. You can also join 2–3 other platforms simultaneously to increase survey volume.

Step 2 — Register with Accurate Information

When signing up, provide your real age, gender, occupation, income range, and location. This is not just a policy requirement — it directly determines which surveys you receive. Fake details lead to fewer survey matches, more screen-outs, and lower earnings. There is no benefit to providing inaccurate information.

Step 3 — Complete Email and Mobile Verification

After registering, verify your email address immediately by clicking the link in your inbox. Some platforms also require mobile number verification. Completing both unlocks your full survey access. On Relevant Reflex, verified members receive bonus points for completing both verification steps.

Step 4 — Complete Your Profile Thoroughly

Before looking for surveys, spend 20–30 minutes completing every section of your profile. This includes the main profile (occupation, education, household) and any available profiler surveys covering areas like vehicle ownership, electronics, gaming habits, financial products, and lifestyle. This single step has the largest impact on how many surveys you receive.

Learn more about how our matching system works and why a complete profile matters.

Step 5 — Establish a Daily Routine

Log in every day — even if only for 5 minutes to check for new surveys. Many surveys close once their quota is filled. Members who check daily catch surveys before they close; those who check every few days regularly miss them. Set a phone reminder if needed.

Step 6 — Complete Surveys Honestly

Answer every question thoughtfully and accurately. Survey platforms use built-in quality checks — including consistency questions and timing analysis — to detect rushed or random responses. Flagged responses are not credited, and repeated flags can reduce your survey eligibility. Honest participation protects both your earnings and your account quality.

Step 7 — Withdraw Your Earnings

Once you reach the minimum payout threshold, go to the redemption section and enter your UPI ID. Ensure your UPI ID is correct before submitting — incorrect UPI IDs cause payment failures. Withdrawals are typically processed within 3–7 business days on Relevant Reflex.

Pro Tips for Higher Earnings from Online Surveys in India

Prioritise Profiler Surveys Every Time

Whenever a new profiler survey appears in your dashboard, complete it the same day. Profiler surveys are short (2–5 minutes) and often unpaid or low-paid individually — but completing them unlocks a significantly larger pool of targeted, higher-paying surveys. Think of them as an investment that pays off over weeks and months.

Choose Your Languages Carefully

Only select languages you can read and write fluently. Taking surveys in unfamiliar languages results in slow completion times, which is flagged as suspicious by the quality system. If you are fluent in both English and Tamil, selecting both expands your eligible survey pool. But do not select additional languages simply to receive more invitations.

Join 3–5 Platforms Simultaneously

No single platform has surveys available every day for every demographic. Joining 3–5 legitimate platforms ensures you always have something available. Update your profile on each platform, check all of them daily, and prioritise the highest-paying surveys available across all platforms at any given time.

Use Idle Time Productively

Most surveys take 5–20 minutes — a natural fit for commutes, lunch breaks, or time between tasks. Rather than blocking out dedicated survey time, treat surveys as productive use of moments that would otherwise be idle. Many of our most consistent earners complete surveys during their morning commute or while waiting for appointments.

Never Rush

Completing a survey in half the expected time is a quality red flag. If a 15-minute survey is completed in 4 minutes, the response is flagged and not credited. Take each survey at a natural pace, read questions carefully, and give thoughtful answers. A single quality response that earns ₹80 is worth more than three rushed responses that earn nothing.

How Survey Payments Work in India

The shift to UPI payments has made online surveys significantly more accessible for Indian members. Unlike older platforms that paid only via PayPal or gift cards — both of which have limitations for Indian users — UPI-native platforms like Relevant Reflex transfer earnings directly to your PhonePe, Google Pay, or Paytm account.

The process is straightforward. You earn points or direct rupee credits for each completed survey. Once your account balance reaches the minimum threshold (₹500 on Relevant Reflex), you can submit a withdrawal request. Enter your UPI ID in the redemption section, confirm it is correct, and submit. Payments are typically processed within 3–7 business days.

One important note on taxes: survey earnings in India are technically taxable income. Most members earning supplementary income from surveys do not need to file separately unless their total annual income from all sources exceeds the taxable threshold. If you earn consistently above ₹4,000–₹5,000 per month from surveys, consult a tax advisor about whether this needs to be reported.

Frequently Asked Questions — Online Surveys India

How much can you realistically earn from online surveys in India?

Most active members earn between ₹500 and ₹4,000 per month depending on profile completeness, participation consistency, and demographic profile. Beginners typically earn ₹500–₹1,500 in their first month. Experienced, active members earn ₹2,000–₹4,000 per month.

Are online surveys in India legitimate and safe?

Yes — legitimate paid survey platforms are genuine businesses. Relevant Reflex has paid over ₹25 lakh to 50,000+ verified Indian members since 2021. The key is choosing platforms that are free to join, offer UPI payments, and have verifiable payment records. Avoid any platform that charges a registration fee.

How do I get paid from online surveys in India?

Most India-focused platforms pay via UPI — directly to your PhonePe, Google Pay, or Paytm account. The minimum payout threshold on Relevant Reflex is ₹500. Once you reach this threshold, you can request a withdrawal which is typically processed within 3–7 business days.

Why do I keep getting screened out of surveys?

Getting screened out means that particular survey was targeting a specific demographic that does not match your profile. This is completely normal and happens to all members. The fix is to complete your profiler surveys thoroughly — the more detail you provide about your lifestyle, income, and interests, the better your profile matches available surveys.

How long does it take to receive the first survey payment in India?

Most new members reach the ₹500 minimum payout threshold within 2–4 weeks of joining, assuming they log in daily and complete available surveys. After requesting a withdrawal, payment is typically processed within 3–7 business days via UPI.

Ready to Start Earning with Online Surveys?

Join 50,000+ Indians already earning with Relevant Reflex. Free to join, UPI payments, ₹500 minimum payout.

Join Free Today
-------------------- END OF FILE -------------------- ### FILE 57: RR COM/articles/errors.log - Type: LOG - Size: 123 B - Path: RR COM/articles - Name: errors.log ------------------------------------------------------------ 2026-05-01 11:27:01 - User auto-logged in via remember token - Context: {"user_id":1280,"email":"baislasameer5@gmail.com"} -------------------- END OF FILE -------------------- ### FILE 58: RR COM/articles/how-to-identify-genuine-survey-websites.php - Type: PHP - Size: 11.3 KB - Path: RR COM/articles - Name: how-to-identify-genuine-survey-websites.php ------------------------------------------------------------ How to Identify Genuine Survey Websites India | Relevant Reflex
December 15, 2024  |  Avoiding Scams  |  Last updated: April 2026

How to Identify Genuine Survey Websites in India

In India's growing online survey landscape, legitimate earning opportunities exist alongside fraudulent sites. Knowing how to tell them apart protects your time and personal data.

1. Look for Transparent Contact Information

Every legitimate survey platform displays a physical address, working email address, and a privacy policy. If a survey site has no "About Us" or "Contact" page, treat it as a red flag. Genuine platforms like Relevant Reflex display their full address (Ethirmedu, Tamil Nadu) and respond to support queries within 24 hours.

2. They Never Charge to Join

Reputable paid survey sites in India are always free to join. Any site asking for a registration fee, "activation charge", or upfront payment is a scam. No legitimate market research company requires payment from respondents.

3. Check Payment Methods Suited to India

A genuine India-focused survey platform will offer UPI transfers, Paytm, or PhonePe — not just PayPal or international wire transfers. If a site only offers international payment methods with high minimum thresholds, it may not actually serve Indian members well.

4. Read Reviews on Independent Sites

Search for the platform's name on SurveyPolice, Google Reviews, or Trustpilot. Genuine platforms accumulate real reviews over time. Be wary of platforms with zero reviews or only 5-star reviews posted on the same day.

5. Realistic Earnings Claims

Legitimate survey sites set realistic expectations. If a platform promises ₹50,000 per month from surveys alone, that is not realistic. Genuine platforms are honest — most members earn ₹500–₹4,000 per month depending on their profile and participation level.

6. They Have a Clear Privacy Policy

Genuine platforms explain exactly what data they collect, how it is used, and whether it is shared with third parties. A missing or vague privacy policy is a serious warning sign, especially given India's data protection laws.

About Relevant Reflex

Relevant Reflex is an India-based paid survey platform operating since 2021. We have 50,000+ verified members across India and have paid out ₹25 lakh+ via UPI. Join free today.

-------------------- END OF FILE -------------------- ### FILE 59: RR COM/articles/online-surveys-india-housewives.php - Type: PHP - Size: 33.16 KB - Path: RR COM/articles - Name: online-surveys-india-housewives.php ------------------------------------------------------------ Online Surveys India for Housewives: Work From Home and Earn in 2026

Online Surveys India for Housewives: Work From Home and Earn in 2026

A practical guide for Indian homemakers — earn ₹1,000–₹3,500 per month from your phone, in your own time, with no investment required.

For Indian homemakers who manage household expenses, grocery purchases, childcare decisions, and daily family needs, paid online surveys offer something genuinely valuable: a way to earn money independently, on your own schedule, from your phone — with no investment, no employer, and no fixed hours.

This is not a get-rich-quick scheme. It is a legitimate market research activity where companies pay for the opinions of Indian homemakers because those opinions directly influence product and pricing decisions. Your experience managing a household makes your feedback genuinely valuable to brands — and they pay for it.

Why Homemakers Receive High-Value Surveys

Indian homemakers control the majority of household purchase decisions — groceries, cleaning products, cooking oil, personal care, children's products, household appliances, and more. Market research companies know this, and they actively seek homemaker opinions for their clients.

This means homemakers with complete profiles often receive more survey invitations than many other demographic groups. The surveys sent to homemakers are typically about products you already buy and use — making them faster to complete and easier to answer honestly than surveys about unfamiliar topics.

Survey categories homemakers commonly qualify for:
  • Grocery and FMCG product preferences — oils, detergents, packaged foods
  • Children's products — health supplements, school supplies, toys, apps
  • Household appliances — mixers, washing machines, refrigerators
  • Personal care — skincare, haircare, health and wellness
  • Home cleaning and hygiene products
  • Online shopping habits — Big Basket, Blinkit, Zepto, Amazon
  • Health and nutrition — cooking oils, dairy, packaged snacks
  • Financial products — insurance, savings accounts, UPI usage

These are surveys about products and brands you likely already have opinions about — which is exactly why your participation is valuable and why your answers are taken seriously by the brands commissioning the research.

Realistic Earnings for Homemakers

Homemakers who match common research demographics — married women aged 25–45 with children, managing household purchasing decisions — typically fall into the more active earning bracket. Here is a realistic picture:

Daily Time Monthly Earnings Suitable When
20–30 mins ₹700 – ₹1,500 Busy periods, young children at home
45–60 mins ₹1,500 – ₹2,800 Most homemakers — sustainable daily commitment
60–90 mins ₹2,500 – ₹3,500+ When children are at school, more free time available

"I started after my second child was born and I had stepped away from my teaching job. In month 1 I earned ₹820. Now in month 7 I'm earning ₹2,600–₹3,000 every month. It goes directly into my personal savings — money I earned myself."

— Kavitha R., Homemaker, Madurai

"I do surveys during the hour after the children leave for school and before I start cooking. Usually 3–4 surveys a day. Last month I withdrew ₹2,100 via GPay. My husband was surprised it was real."

— Meena S., Homemaker, Bengaluru

Fitting Surveys Into Your Daily Routine

The design of survey participation fits naturally into a homemaker's schedule because it requires no fixed time slot, no advance preparation, and can be paused and resumed. Most surveys take 10–20 minutes and require only your phone.

Sample Daily Survey Schedule for a Homemaker
8:30 – 9:00 AM After children leave for school — check for new surveys, complete 1–2 short surveys (10–15 mins each). Best time for focused survey completion.
11:00 – 11:30 AM Mid-morning quiet period — complete 1 longer survey (15–20 mins). Check email for new survey invitations.
2:00 – 2:30 PM After lunch, before children return — complete remaining available surveys. Good time for longer detailed surveys.
Evening (optional) Check for newly opened surveys — some new surveys open in the afternoon. Quick 5-minute check only.

This schedule gives you approximately 60–75 minutes of survey time per day without affecting your household responsibilities. On days when you are particularly busy, simply skip — there is no penalty and no minimum participation requirement.

How to Get Started — Step by Step

Step 1 — Register with your real personal information

Sign up at Relevant Reflex using your real age, marital status, number of children, household income range, and location. This demographic data is exactly what determines which surveys you receive. Inaccurate information leads to fewer and lower-value survey matches — there is no benefit to providing false details.

Step 2 — Verify your email immediately

After registering, check your email inbox and click the verification link right away. Unverified accounts do not receive survey invitations. If you do not see the email, check your spam folder and look for an email from Relevant Reflex.

Step 3 — Complete your profile in full on day 1

Spend your first session — approximately 30–40 minutes — completing every section of your profile. For homemakers, the most important sections are household size and composition, number and ages of children, monthly household spending on groceries and personal care, appliances owned, shopping habits (online vs in-store), and vehicle ownership. These specific data points unlock the FMCG, children's products, and household research surveys that are most relevant to homemakers.

Step 4 — Complete profiler surveys as they appear

Profiler surveys are short (3–6 minutes) and appear periodically in your dashboard. They expand your profile data and unlock new survey categories. Completing every profiler survey within 24 hours of it appearing is the single most effective way to increase the number and quality of survey invitations you receive.

Step 5 — Log in daily and check email

Set up email notifications if possible, so you receive alerts when new surveys arrive. Many surveys close within hours once their quota fills. Members who check daily catch these opportunities; those who check every few days regularly miss them. Even a 5-minute daily check is enough to stay ahead of closing surveys.

Step 6 — Withdraw via UPI when you reach ₹250

Once your account balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID, and submit a withdrawal request. The money arrives in your PhonePe, Google Pay, or Paytm account within 3–7 business days — independently, in your name.

Profile Tips Specific to Homemakers

Be specific about your household spending

Brands commission surveys targeting homemakers who spend specific amounts on groceries, personal care, or household products. Provide your honest monthly spending figures in each category — do not understate or approximate. More specific data leads to better survey matches and more relevant invitations.

Include your children's ages precisely

Companies making products for specific age groups — baby products for 0–2 years, school supplies for 6–12 years, teenage consumer products — look specifically for mothers in those age ranges. Providing your children's exact ages (not just "school age") unlocks a significant category of product research surveys.

Mention all brands you use regularly

When profile surveys ask about brand usage — which cooking oil, which detergent, which personal care brands — answer honestly and specifically. Brand research surveys are some of the highest-paying, and they specifically target users of particular brands. If you use Aashirvaad atta, Fortune oil, or Surf Excel, say so — it matters.

Update your profile when your household situation changes

If you have a new child, move to a different city, or your household income changes significantly, update your profile. Outdated profile data leads to poor survey matching and missed opportunities. Check your profile completeness every 3 months.

Financial Independence Through UPI Payments

For many Indian homemakers, having a personal income — however small — that arrives directly in their own UPI account represents a meaningful form of financial independence. Survey earnings go directly to your account, in your name, accessible to you immediately upon processing.

Many members use their survey earnings for personal expenses they would otherwise need to ask their spouses about — mobile recharges, personal care products, books, subscriptions, or small gifts for themselves or their children. Others save steadily — ₹2,000/month adds up to ₹24,000 per year, which is meaningful supplemental savings.

The UPI-native payment system on Relevant Reflex means you do not need a credit card, PayPal account, or any special financial setup. If you already use PhonePe, Google Pay, or Paytm — which most Indian smartphone users do — you are already set up to receive payments.

Safety note: Legitimate survey platforms will never ask for your bank account number, debit card details, OTP, or UPI PIN. Relevant Reflex only needs your UPI ID (the handle like yourname@ybl) to send you money — never your PIN. If any platform asks for your PIN or OTP, it is a scam.

Frequently Asked Questions

Can housewives in India earn money from online surveys?

Yes. Indian homemakers are one of the most valued demographics for market research. Homemakers can realistically earn ₹1,000–₹3,500 per month through consistent survey participation with no investment and a flexible schedule.

How much can an Indian housewife earn from online surveys per month?

Most active homemaker members earn ₹1,000–₹3,500 per month. Homemakers with children, car ownership, or household incomes above ₹5 lakh typically receive more high-value survey invitations and earn toward the higher end of this range.

What is the best time for housewives to do online surveys in India?

Most homemakers find mid-morning (after children leave for school, between 8:30–11 AM) the most productive time. This quiet period allows focused survey completion without interruption.

Do I need a laptop or can I use my phone?

Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. All surveys can be completed on a phone without a laptop or desktop computer.

Is it safe to join a paid survey site as a homemaker in India?

Yes, as long as you join legitimate platforms that are free to join and never ask for your bank PIN, OTP, or upfront payment. Relevant Reflex is free, asks only for your UPI ID to send you money, and never requires any financial information that could compromise your accounts.

Can I do surveys even if I have very limited free time?

Yes. Even 20 minutes per day is enough to earn ₹700–₹1,000 per month. There is no minimum daily requirement — on very busy days, simply check for new surveys in 5 minutes and skip the rest. No penalty, no pressure.

Start Earning Your First ₹500 This Month

Join free, complete your profile in 30 minutes, and start receiving survey invitations matched to your household profile.

Join Relevant Reflex Free See Earning Potential
Homemakers — Join Free

Earn ₹1,000–₹3,500/month. Your time, your schedule, your income.

Sign Up Free Today
-------------------- END OF FILE -------------------- ### FILE 60: RR COM/articles/online-surveys-india-students.php - Type: PHP - Size: 32.34 KB - Path: RR COM/articles - Name: online-surveys-india-students.php ------------------------------------------------------------ Online Surveys India for Students: Earn Pocket Money in College (2026)

Online Surveys India for Students: Earn Pocket Money in College (2026)

No investment, no fixed schedule, UPI payout — a practical guide for Indian college students looking for genuine supplemental income.

India has over 40 million college students — and for many, managing monthly expenses on a limited budget is a real challenge. Paid online surveys offer a genuine, zero-investment way to earn ₹500–₹2,000 per month without disrupting your studies. You do not need any skills, prior experience, or a laptop — your Android phone is enough.

This guide is written specifically for Indian college students. We cover why students are a valued survey demographic, how to fit survey participation around your schedule, what you can realistically earn, and how to avoid the common mistakes that cause new members to give up too early.

Why Brands Actively Want Student Opinions

Students aged 18–24 are one of the most researched demographic groups in India's market research industry. Here is why — and why this works in your favour:

Indian college students represent the country's next generation of consumers. Brands want to understand what influences your purchasing decisions before you form strong brand loyalties. Companies in smartphones, fashion, food delivery, streaming services, edtech, gaming, and FMCG products regularly commission surveys specifically targeting 18–24 year olds in India.

This means students with accurate, complete profiles often receive more survey invitations than older demographics in the same region. Brands are willing to pay for access to student opinions because this demographic is notoriously difficult to reach through traditional research methods.

Survey categories students commonly qualify for:
  • Smartphone usage and brand preferences
  • Food delivery apps (Swiggy, Zomato) and ordering habits
  • Streaming platforms (Netflix, Disney+, YouTube)
  • Online shopping behaviour — Flipkart, Amazon, Meesho
  • Social media usage patterns — Instagram, YouTube, Moj
  • Career and education services — coaching, online courses
  • Fashion and personal care products
  • Gaming apps and habits

What Students Actually Earn — Honest Numbers

Here is a realistic earnings picture for Indian college students based on actual member data:

Daily Time Monthly Earnings Best For
15–20 mins (casual) ₹300 – ₹700 Exam periods, busy semesters
30–45 mins (regular) ₹700 – ₹1,500 Most students — sustainable pace
60–90 mins (active) ₹1,500 – ₹2,500 Semester breaks, multiple platforms

To put these numbers in context: ₹1,500/month covers most students' monthly mobile recharge and data costs. ₹2,500/month covers transport, canteen expenses, or a monthly OTT subscription with money left over. It is genuine supplemental income — not a salary, but meaningfully useful for students managing tight budgets.

"I started during my second year of engineering. The first month I earned ₹650, which I used to buy data. By month 4, I was making ₹1,800 per month consistently — enough to stop asking my parents for pocket money every week."

— Arun K., Engineering Student, Chennai

How to Fit Surveys Around Your College Schedule

The best thing about survey participation for students is the complete flexibility. There is no fixed schedule, no minimum hours, and no penalty for taking a day off. Here is how to structure it around a typical college week:

Time Slot Survey Activity Why It Works
Morning commute (bus/metro) Check for new surveys, complete 1–2 short polls Dead time converted to earnings — 15–20 mins
Between lectures (free periods) Complete 1 standard survey (10–15 mins) Uninterrupted time, no equipment needed
After college (before dinner) Complete 1–2 surveys, check new invitations Most productive time for longer surveys
Weekend mornings Complete any pending profiler surveys, 2–3 standard surveys More time available, better focus

During exam periods, simply reduce to 10–15 minutes per day — just enough to check for new surveys and complete one or two quick polls. Survey earnings do not require a fixed minimum time commitment. Even 15 minutes per day yields ₹300–₹500 per month.

Step-by-Step: How to Get Started

Step 1 — Sign up with accurate information

Register at Relevant Reflex using your real name, age, gender, and email address. Use a personal email you check daily — survey invitations arrive by email and surveys close quickly once quotas fill. Do not use a college email that you may lose access to after graduation.

Step 2 — Verify your email immediately

Check your inbox right after registering and click the verification link. This activates your full account. Without email verification, you will not receive survey invitations.

Step 3 — Complete your profile thoroughly on day 1

Spend 25–35 minutes completing every section of your profile — especially your education status, year of study, course, smartphone usage, apps you use regularly, and spending habits. This profile data determines which surveys you qualify for. Students with complete profiles consistently receive 3–4x more invitations than those with incomplete profiles.

Step 4 — Complete profiler surveys as they appear

Profiler surveys are short questionnaires (2–5 minutes) that build a more detailed picture of your interests and habits. Every profiler you complete unlocks new survey categories. Make it a habit to complete any new profiler survey within 24 hours of it appearing in your dashboard.

Step 5 — Check in daily and be consistent

Log in at least once per day — even if only for 5 minutes. Many surveys close once their quota fills, sometimes within hours. Members who check daily earn significantly more than those who check every few days because they catch surveys before they close.

Step 6 — Withdraw via UPI when you reach ₹250

Once your balance reaches ₹250 (500 points), go to the redemption section, enter your UPI ID (PhonePe, GPay, or Paytm), and submit your withdrawal request. Processing takes 3–7 business days. Your first withdrawal is the proof that the platform actually pays — and it is a good feeling.

Tips Specific to Student Members

Register with your permanent personal email, not your college email

Many students register using their college-provided email address. This is a mistake — college email access is usually revoked after graduation or when you change institutions. Use a Gmail or personal email address you will have access to permanently.

Be specific about your course and institution type in your profile

Brands often commission surveys specifically targeting engineering students, medical students, MBA students, or students at certain types of institutions (IITs, NITs, state universities, private colleges). The more specific your profile, the more precisely you can be matched to surveys designed for your demographic.

Surveys about apps and services you actually use are more valuable

When completing surveys about apps or services you use genuinely — Swiggy, Spotify, Instagram, WhatsApp — your answers are more authentic and complete. Survey platforms use quality checks to detect rushed or inconsistent answers. Genuine users of the products being researched also complete surveys faster, which improves your earnings per hour.

Do not do surveys during lectures

This sounds obvious but is worth stating. Survey quality checks detect when users are distracted — rushing through questions, giving inconsistent answers, or completing surveys in implausibly short times. These responses are flagged and not credited. Surveys done in 10 minutes that should take 15 minutes earn nothing.

Semester breaks are high-earning periods

During semester breaks when you have 3–4 hours of free time per day, consider increasing your survey time to 60–90 minutes across 2–3 platforms. Members who make full use of semester break time can accumulate 3–4 months of typical earnings in 4–6 weeks of focused participation.

How UPI Payout Works for Students

Most Indian college students already have UPI set up on their phones through PhonePe, Google Pay, or Paytm. This makes withdrawing survey earnings straightforward — there is no need to set up a bank account separately or deal with international payment processors.

To withdraw your earnings on Relevant Reflex:

  1. Go to your dashboard and click on the redemption section
  2. Enter your UPI ID exactly as registered on your UPI app — a small typo will cause the payment to fail
  3. Submit the withdrawal request — minimum amount is ₹250
  4. Payment arrives in your UPI account within 3–7 business days
  5. You will receive a notification on your UPI app when the payment lands
Important: Double-check your UPI ID before submitting a withdrawal request. An incorrect UPI ID will result in a failed payment. If you are unsure of your exact UPI ID, open your PhonePe or GPay app and check the profile section for your UPI handle (usually in the format: yourname@ybl or yourphone@okaxis).

Frequently Asked Questions

Can college students in India earn money from online surveys?

Yes. Students aged 18–24 are a highly valued research demographic. Indian students can realistically earn ₹500–₹2,000 per month through consistent survey participation with no investment required.

Do I need a laptop or will my phone work?

Your Android or iPhone is sufficient. Relevant Reflex is fully mobile-optimised. Most surveys are designed to be completed on a phone and typically take 10–20 minutes.

Do I need to be 18 to join paid survey sites in India?

Yes. Most legitimate survey platforms including Relevant Reflex require members to be at least 18 years old to participate and earn rewards. This is a legal requirement related to contract eligibility.

Will paid surveys affect my studies?

Not if you manage your time well. Most students spend 20–30 minutes per day during idle time — commutes, free periods, or before bed. Survey participation does not require fixed time blocks and can be paused during exams without penalty.

Do I need to invest money to join paid survey sites as a student?

No. Legitimate paid survey platforms are always free to join. Never pay a registration fee or membership fee. Platforms that charge fees are scams.

Start Earning Your First ₹500 This Month

Join free, complete your profile, and start receiving survey invitations matched to your student profile.

Join Relevant Reflex Free See Earning Potential
Students — Join Free Today

Earn ₹500–₹2,000/month. No investment. UPI payout.

Sign Up Free
-------------------- END OF FILE -------------------- ### FILE 61: RR COM/articles/online-surveys-india-upi-payment.php - Type: PHP - Size: 30.35 KB - Path: RR COM/articles - Name: online-surveys-india-upi-payment.php ------------------------------------------------------------ How to Get Paid via UPI for Online Surveys in India (2026) | Relevant Reflex
April 22, 2026  |  Payment Guide  |  7 min read

How to Get Paid via UPI for Online Surveys in India (2026)

UPI has transformed how Indian survey takers receive their earnings. This guide explains exactly how UPI payments work on survey platforms, which apps are supported, how long transfers take, and why UPI is significantly better than PayPal or gift cards for Indian members.

Why UPI is the Best Payment Method for Indian Survey Takers

Before UPI became widespread, Indian survey members faced a frustrating problem: most survey platforms were built for Western markets and paid exclusively via PayPal, cheque, or Amazon gift cards. None of these work smoothly for the average Indian user.

PayPal in India has withdrawal restrictions — you cannot hold a PayPal balance in Indian Rupees indefinitely, and transferring to a bank account requires meeting specific conditions and involves exchange rate losses. Gift cards are only useful for specific retailers. Cheques require a branch visit and take weeks to clear.

UPI changes all of this completely. When a survey platform pays you via UPI, the money goes directly to your linked Indian bank account — no intermediary, no conversion, no waiting at a branch. The transaction completes in seconds once processed.

UPI Payment
  • Direct to bank account
  • No conversion fees
  • 2–3 business days
  • ₹250 minimum (Relevant Reflex)
  • Works on any smartphone
  • No account balance limit
PayPal Payment
  • Must transfer to bank separately
  • Exchange rate loss on conversion
  • 5–7 business days total
  • $10+ minimum (₹830+)
  • Requires PayPal account verification
  • RBI balance restrictions apply

For Indian survey takers, UPI-native platforms are objectively better. The lower minimum threshold, faster processing, and zero friction make them significantly more practical for earning supplementary income.

How UPI Survey Payments Work — Step by Step

The payment process on a UPI-native survey platform like Relevant Reflex works as follows:

  1. Earn points through surveys. Each completed survey credits points to your account. On Relevant Reflex, 1 point = ₹0.50.
  2. Reach the minimum threshold. Once your balance reaches ₹250 (500 points), you become eligible to withdraw.
  3. Submit a withdrawal request. Go to the Redemption section of your dashboard and enter your UPI ID. This is the ID linked to your PhonePe, Google Pay, or Paytm account — typically in the format yourname@paytm, yourphone@ybl, or yourphone@okaxis.
  4. Verification. The platform verifies your UPI ID against your registered name and mobile number. This is why providing accurate profile details during signup matters — name mismatches can delay or reject payments.
  5. Processing. The withdrawal is processed within 3–7 business days. You receive a payment notification on your UPI app when the transfer completes.
  6. Funds in account. The money appears directly in your linked bank account — no additional steps required.

Important: Use Your Correct UPI ID

Always double-check your UPI ID before submitting a withdrawal request. A single character error means the payment goes to the wrong account or fails. Most UPI apps show your UPI ID under Settings or Profile — copy it rather than typing it manually.

Which UPI Apps Work for Survey Payments

All major UPI applications work for survey payment withdrawals. Here is how each handles incoming payments:

UPI App UPI ID Format Notification Bank Credit
PhonePe mobilenumber@ybl or @axl Push notification + SMS Instant on receipt
Google Pay (GPay) mobilenumber@okaxis or @okicici Push notification Instant on receipt
Paytm mobilenumber@paytm Push notification + SMS Instant on receipt
BHIM mobilenumber@upi SMS Instant on receipt
Amazon Pay UPI mobilenumber@apl Push notification Instant on receipt

There is no advantage of one UPI app over another for receiving survey payments. Use whichever app you are most comfortable with and that is linked to your primary bank account.

Minimum Payout Thresholds — Indian Platforms vs International

One of the biggest practical advantages of India-native survey platforms is the significantly lower minimum payout threshold. Here is how the common platforms compare for Indian members:

Platform Minimum Payout Payment Method India-Friendly?
Relevant Reflex ₹250 UPI (PhonePe, GPay, Paytm) ✅ India-native
OpinionWorld India ₹400 Gift vouchers ✅ India panel
Toluna ~₹830 ($10) Gift cards, PayPal ⚠️ International
Swagbucks ~₹250 ($3 via PayPal) PayPal, gift cards ⚠️ No direct UPI
ySense ~₹830 ($10) PayPal, Skrill ⚠️ International

A lower minimum threshold means you receive your money sooner and can verify the platform is genuinely paying before investing more time. The ₹250 minimum on Relevant Reflex means most active members receive their first payment within 2–4 weeks of joining.

Payment Timelines — What to Expect and What Affects Them

On Relevant Reflex, the standard UPI payment timeline is 3–7 business days from the moment you submit a withdrawal request. Most payments are processed within 2–3 business days in practice.

Several factors can affect how long your payment takes:

  • Submission day: Requests submitted on Friday after 3 PM may not be processed until the following Monday. Business days exclude weekends and public holidays.
  • UPI ID accuracy: If your UPI ID has a typo, the payment fails and needs to be resubmitted — adding 3–5 additional days.
  • Profile verification status: Members with unverified mobile numbers or incomplete profiles may face additional verification steps before first payment.
  • Bank maintenance windows: Some banks have scheduled maintenance windows (typically late Sunday nights) when UPI transfers may be delayed by a few hours.
  • Payment batch processing: Survey platforms typically process withdrawals in batches rather than individually. If you submit just after a batch has been processed, you wait for the next cycle.

Tips to Get Paid Faster

These steps help ensure your UPI payments process without delays:

  1. Verify your mobile number early. Completing mobile verification during onboarding removes one potential hurdle at payment time. On Relevant Reflex, verified members typically receive payments faster.
  2. Add your UPI ID to your profile before withdrawing. Don't wait until you're ready to withdraw to add your UPI ID. Add it in the Profile section as soon as you join so it's already verified when you need it.
  3. Submit withdrawal requests early in the week. Monday or Tuesday submissions are most likely to be processed before the weekend.
  4. Use the exact UPI ID from your app. Open your UPI app, go to Settings or Profile, and copy the UPI ID from there. Do not type it from memory.
  5. Complete your profiler sections. Beyond affecting survey matching, a complete profile helps confirm your identity — which makes payment verification smoother.
  6. Keep your registered phone number active. Some payment verifications send OTPs to your registered mobile. If you've changed your number, update it in your profile first.

Tax Considerations for UPI Survey Income in India

Survey earnings received via UPI are technically income under Indian tax law and fall under "Income from Other Sources." However, practical implications depend on your total annual income:

  • Earning ₹500–₹2,000 per month: Annual total of ₹6,000–₹24,000. Unless this pushes your combined income above the basic exemption limit (₹2.5 lakh for most individuals), no separate tax filing action is required for survey income alone.
  • Earning ₹3,000–₹4,000 per month: Annual total of ₹36,000–₹48,000. Still likely below the taxable threshold for most individuals, but you should factor this into your overall income calculation.
  • Earning above ₹4,000 per month consistently: Annual total approaching ₹50,000+. Consult a tax advisor about whether this needs to be declared under your ITR filing.

UPI transactions are traceable — unlike cash. If you receive consistent UPI payments from survey platforms, it is good practice to maintain a simple record of monthly earnings for your own reference, even if the amounts are below taxable thresholds.

Frequently Asked Questions

Which UPI apps work for survey payments in India?

PhonePe, Google Pay, and Paytm all work. Any UPI-enabled app linked to a valid Indian bank account is accepted. There is no preference between these apps — use whichever you are most comfortable with.

How long does UPI survey payment take in India?

On Relevant Reflex, UPI payments are processed within 3–7 business days after a withdrawal request. Most payments arrive within 2–3 business days in practice.

What is the minimum payout for surveys via UPI in India?

On Relevant Reflex, the minimum is ₹250 (500 points at ₹0.50 per point). This is one of the lowest thresholds available, meaning you can withdraw your first payment within 2–4 weeks of joining as an active member.

Why is UPI better than PayPal for Indian survey takers?

UPI transfers money directly to your Indian bank account with no conversion fees, no intermediate wallet, and no RBI balance restrictions. Payments arrive faster and there is no exchange rate loss. For Indian users, UPI is objectively superior to PayPal for receiving survey income.

Is UPI survey income taxable in India?

Technically yes — survey earnings are income under Indian law. However, most survey takers earning ₹500–₹4,000 per month remain well below taxable thresholds. Those earning consistently above ₹4,000 per month should consult a tax advisor.

Start Earning via UPI Today

Join Relevant Reflex — India's UPI-native survey platform. ₹250 minimum payout, direct to PhonePe, Google Pay or Paytm. Free to join.

Join Free Today
-------------------- END OF FILE -------------------- ### FILE 62: RR COM/articles/paid-surveys-india-earning-potential.php - Type: PHP - Size: 33.89 KB - Path: RR COM/articles - Name: paid-surveys-india-earning-potential.php ------------------------------------------------------------ Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

Paid Surveys India: How Much Can You Realistically Earn Per Month in 2026?

An honest breakdown based on real data from 50,000+ Indian members — no inflated numbers, no false promises.

If you've searched for paid surveys in India, you've probably seen websites claiming you can earn ₹10,000–₹50,000 per month just by answering a few questions. Those numbers are not real. They are designed to get you to click, not to give you accurate information.

This article gives you the honest picture — based on actual member data from Relevant Reflex, which has operated India's paid survey platform since 2021 and paid over ₹25 lakh to 50,000+ verified Indian members via UPI. We want you to join us knowing exactly what to expect, not disappointed by unrealistic claims.

The Honest Earnings Table

Here is what members at different stages of experience and engagement actually earn on Indian survey platforms. These ranges are based on real payout data — not projections or estimates from international markets.

Member Type Daily Time Monthly Earnings Profile Status
Beginner
Month 1–2
30–45 mins ₹500 – ₹1,500 Partially complete profile
Active Member
Month 3–6
1–2 hours ₹2,000 – ₹4,000 Fully complete profile
Experienced Member
6+ months
2+ hours ₹4,000 – ₹6,000 100% profile + all profilers done
Multi-Platform
3–5 platforms combined
2–3 hours ₹6,000 – ₹10,000 Full profiles on all platforms
Important: These ranges reflect what active, consistent members earn. Individual results vary based on your demographic profile, time investment, and survey availability in your region. Earnings are supplemental income — not a replacement for a primary salary. See our Earnings Disclaimer for full details.

What Individual Surveys Actually Pay in India

Understanding the per-survey payout structure helps you set realistic daily expectations. Here is a breakdown by survey type and duration:

Survey Type Duration Typical Payout Availability
Quick opinion polls 2–5 min ₹10 – ₹30 Daily
Standard surveys 10–15 min ₹40 – ₹120 Several per week
Detailed surveys 20–30 min ₹100 – ₹300 1–3 per week
Product testing surveys 30–45 min + usage period ₹400 – ₹2,000 Occasional (invite only)
Focus group discussions 60–90 min ₹1,000 – ₹3,000 Rare (invite only)
Profiler surveys 3–8 min ₹5 – ₹20 (or 0, but unlock more surveys) Periodic

The key insight from this table: your monthly income is not determined by one big survey — it is built from consistent daily participation across multiple survey types. A member who completes 2–3 standard surveys per day plus one detailed survey every two days can realistically accumulate ₹2,000–₹3,000 per month before even factoring in the occasional product test or focus group.

5 Factors That Determine Your Earnings

1. Profile Completeness

This is the single most impactful factor and the one most beginners underestimate. Survey platforms match respondents to surveys based on demographic data — your age, gender, occupation, household income, education, family situation, vehicle ownership, and dozens of other criteria. A member with a fully completed profile including all optional profiler sections receives significantly more invitations than someone with basic information only.

On Relevant Reflex, members who complete 100% of their profile and all available profiler surveys receive on average 3–4x more survey invitations than members with incomplete profiles. This single action can double or triple your monthly earnings without any additional time investment.

2. Daily Login Consistency

Many surveys close once their response quota is filled — often within hours of opening. Members who check their dashboard and email daily catch these surveys before they close. Those who log in every few days regularly miss opportunities that are already gone. This is not something that can be compensated for by spending longer on the platform when you do log in — the surveys simply are not available anymore.

3. Your Demographic Profile

Some demographics receive more high-value surveys than others. This is determined by what Indian brands and market research agencies are currently studying — not something you can change. Demographics that typically receive more surveys in India include working professionals aged 25–45, car owners, parents of children under 12, people with household incomes above ₹5 lakh per year, residents of metros and Tier 1 cities, and people who regularly purchase consumer electronics, FMCG products, or financial products.

If your profile matches these demographics, your earnings potential is naturally higher. If it does not, your earnings will be lower — and that is honest. Survey platforms match based on research demand, not on what members want to earn.

4. Number of Platforms

No single survey platform has unlimited surveys available every day. Even the most active members on a single platform will have days with few or no surveys available. Joining 3–5 legitimate platforms ensures you always have something to complete. Members who combine Relevant Reflex with 2–3 other India-focused platforms typically earn 60–80% more per month than single-platform members with similar demographics.

5. Response Speed to Invitations

When you receive a survey invitation by email, responding within 1–2 hours dramatically increases your chances of completing it before the quota fills. Setting up email notifications for survey invitations and checking them promptly is a simple habit that meaningfully increases monthly earnings for most members.

How to Move from Beginner to Active Earner

The gap between earning ₹500/month and ₹3,000/month is almost entirely explained by these five actions — not by luck or by having the right demographic profile:

The 5 actions that move you from beginner to active earner:
  1. Complete 100% of your profile on day 1 — spend the first 30–45 minutes after joining doing nothing else. This is the most valuable time you will invest on the platform.
  2. Complete every profiler survey within 24 hours of it appearing. Set a habit of checking for new profilers every Monday morning.
  3. Log in every day, even if only for 5 minutes to check for new surveys. Missing a day means missing surveys that closed overnight.
  4. Join 2–3 other legitimate Indian survey platforms within your first month. Use your Relevant Reflex earnings as proof that the model works, then expand.
  5. Be patient for the first 6–8 weeks. The algorithm needs time to learn your profile and match you with appropriate surveys. Members who give up in week 3 never see the earnings that months 3–6 deliver.

What a Realistic 3-Month Goal Looks Like

Here is what a typical new member journey looks like on Relevant Reflex, assuming consistent daily participation:

Month What Happens Expected Earnings
Month 1 Profile setup, learning the platform, completing profilers, first surveys — algorithm is still calibrating your profile ₹500 – ₹1,200
Month 2 More targeted survey invitations arriving, profiler data built up, first UPI withdrawal possible ₹1,000 – ₹2,500
Month 3 Consistent survey flow, good understanding of which survey types suit your profile, regular withdrawals ₹2,000 – ₹4,000

This progression is real — it happens because the matching algorithm gets more accurate data about your profile and preferences over time, and because profiler surveys you completed in month 1 begin unlocking higher-value survey categories in months 2–3.

The members who earn ₹500/month in month 1 and ₹4,000/month in month 6 are not the same people who give up in week 2 because they only earned ₹150 in their first survey session. Patience and consistency are what actually separate high earners from low earners on Indian survey platforms.

Frequently Asked Questions

How much can a beginner earn from paid surveys in India per month?

A beginner in their first 1–2 months can typically earn ₹500–₹1,500 per month, assuming daily logins and a partially completed profile. This increases significantly in months 3–6 as the platform calibrates to your profile.

Can you earn ₹5,000 per month from paid surveys in India?

Yes, but it requires consistent daily participation of 2+ hours, a fully completed profile, and a demographic that receives high-value survey invitations. Experienced members on multiple platforms can reach ₹6,000–₹10,000 combined.

What factors affect how much you earn from paid surveys in India?

The main factors are profile completeness, daily login consistency, your demographic profile, the number of platforms you use, and how quickly you respond to survey invitations.

How much does a single paid survey pay in India?

Short surveys of 5–10 minutes typically pay ₹20–₹60. Standard surveys of 15–20 minutes pay ₹60–₹200. Longer surveys pay ₹150–₹400. Focus group discussions of 60–90 minutes can pay ₹1,000–₹3,000.

Is ₹10,000/month from paid surveys in India possible?

It is possible but requires combining 3–5 platforms, 3+ hours of daily participation, a strong demographic profile, and several months of consistent participation. It is not achievable for most members in their first few months on a single platform.

Start Building Your Survey Income Today

Join 50,000+ Indians earning with Relevant Reflex. Free to join — UPI payments — ₹250 minimum payout.

Join Free Today Read the Complete Guide
-------------------- END OF FILE -------------------- ### FILE 63: RR COM/articles/paid-surveys-india-faq.php - Type: PHP - Size: 35.99 KB - Path: RR COM/articles - Name: paid-surveys-india-faq.php ------------------------------------------------------------ Paid Surveys India FAQ: 30 Most Asked Questions Answered (2026) | Relevant Reflex
April 22, 2026  |  FAQ  |  15 min read

Paid Surveys India: 30 Most Asked Questions Answered (2026)

This comprehensive FAQ answers the 30 most common questions about paid surveys in India — from whether they are real, to how much you can earn, to what gets your account banned. Compiled from real member queries at Relevant Reflex and updated for 2026.

🔍 Basics — Is This Real?

1Are paid surveys in India real or fake?

Paid surveys in India are real. They are a legitimate market research tool — brands commission surveys to understand what Indian consumers think before launching products. Legitimate platforms pay members for their time and opinions. Relevant Reflex has paid over ₹25 lakh to 50,000+ Indian members since 2021. The key distinction is between legitimate platforms (free to join, UPI payment, verifiable track record) and scams (charge fees, promise unrealistic earnings, never pay).

2Do online surveys actually pay real money in India?

Yes — but only if you choose legitimate platforms. The money is real, the UPI transfers are real, and the brands commissioning the surveys are real companies. The confusion arises because the internet is full of fake "survey sites" that collect your data or string you along with fake points that can never be redeemed. Stick to platforms with verifiable payment proof and a track record of paying Indian members.

3Is it free to join paid survey sites in India?

Yes — always. All legitimate paid survey platforms are completely free to join. There is never a registration fee, subscription fee, or "activation charge." If a site asks you to pay to access surveys or to receive your earnings, it is a scam. Walk away immediately.

4Why do brands pay for survey opinions?

Brands spend crores of rupees on product development and marketing. Before investing in a new product launch, they need to know whether consumers actually want it, how much they are willing to pay, and which features matter most. Survey data from real consumers — like you — directly influences these multi-crore decisions. The cost of a few survey rewards is negligible compared to the value of the research insights.

💰 Earnings & Payments

5How much can I earn from paid surveys in India per month?

Most active members earn between ₹500 and ₹4,000 per month. Beginners typically earn ₹500–₹1,500 in their first month while establishing their profile and learning the system. Experienced, active members with complete profiles earn ₹2,000–₹4,000 per month. Earnings above ₹4,000 are possible but uncommon without joining multiple platforms simultaneously. Surveys are supplementary income — realistic for 30–60 minutes of daily participation.

6How do I get paid from surveys in India?

India-native platforms like Relevant Reflex pay directly via UPI — to your PhonePe, Google Pay, or Paytm account. You earn points for each survey (on Relevant Reflex, 1 point = ₹0.50). Once your balance reaches the minimum threshold (₹250), you can request a withdrawal. The money arrives in your bank account within 3–7 business days. International platforms typically pay via PayPal or gift cards, which are less convenient for Indian users.

7What is the minimum payout for surveys in India?

Minimum payouts vary by platform. Relevant Reflex has a minimum of ₹250 (500 points). OpinionWorld India requires approximately ₹400. International platforms like Toluna and ySense typically require the equivalent of $10 or more, which at current rates is ₹830+. Lower minimums are better for new members as they can verify the platform is paying before spending significant time on it.

8How long does it take to receive my first survey payment?

Most active members reach the ₹250 threshold within 2–4 weeks of joining Relevant Reflex. After submitting a withdrawal request, UPI payment is typically processed within 3–7 business days. So from joining to first payment in your account, expect 3–6 weeks for most members.

9Are survey earnings taxable in India?

Technically yes — survey income falls under "Income from Other Sources" under Indian tax law. However, most members earning ₹500–₹4,000 per month from surveys have annual survey income well below the basic exemption limit. Those earning consistently above ₹4,000 per month should factor this into their ITR calculation. UPI transactions are traceable, so maintain a simple monthly record.

10Can I earn more by joining multiple survey platforms?

Yes — this is one of the most effective ways to increase monthly earnings. Each platform has different client relationships and survey pools. Joining 3–5 platforms ensures you always have surveys available and significantly increases total monthly earning potential. The marginal daily time to check 3 platforms versus 1 is minimal — most members do it in a single 30-minute morning session.

🚀 Getting Started

11What do I need to start taking paid surveys in India?

You need a smartphone or computer with internet access, a valid Indian mobile number, an email address, and a UPI ID (PhonePe, Google Pay, or Paytm) for receiving payments. No special skills, qualifications, or prior experience are required. Registration takes about 5 minutes.

12How do I choose which survey platform to join?

Look for four things: free to join (no registration fee), UPI payment option, minimum payout under ₹1,000, and verifiable payment records. Relevant Reflex meets all four criteria and is specifically built for Indian users. For additional survey volume, add OpinionWorld India and Swagbucks. Avoid any platform asking for payment or promising guaranteed earnings above ₹10,000 per month.

13How important is completing my profile?

Extremely important. Your profile determines which surveys you are invited to. Members with complete profiles receive significantly more survey invitations than those with basic profiles. On Relevant Reflex, completing all profiler sections can earn you up to 70 bonus points and ensures you are matched to surveys relevant to your actual lifestyle, interests, and demographic. Spend time completing it thoroughly when you first join — it pays dividends every week.

14How long does registration take?

Registration on most survey platforms takes 5–10 minutes. You fill in basic details, verify your email address, and complete initial profiler questions. The full profiler (which determines survey matching quality) takes 20–40 minutes to complete thoroughly — but you can do this over multiple sessions. Many members complete one or two profile sections per day in their first week.

📋 The Survey Process

15How many surveys will I receive per week?

Most members receive 2–5 survey invitations per week on a single platform. Members with desirable demographics (household decision-makers, technology professionals, parents of young children, car owners) typically receive more. Joining 3 platforms at once typically results in 6–15 survey opportunities per week in total.

16How long do surveys take?

Survey lengths vary. Short surveys take 5–10 minutes and pay ₹20–₹50. Standard surveys take 15–20 minutes and pay ₹50–₹150. Long surveys take 25–40 minutes and pay ₹150–₹300. Focus groups and in-depth interviews can run 60–90 minutes and pay ₹1,000–₹3,000. The survey invitation always shows the estimated length before you start.

17Why do I get screened out of surveys?

Screening questions at the start of a survey check whether your profile matches the specific demographic the client is looking for. For example, a survey targeting urban women aged 25–35 who own cars will screen out men, people outside that age range, and non-car owners. Getting screened out is completely normal and happens to all members — it is not a reflection of your account quality. A complete profiler profile reduces screen-outs by ensuring you are only invited to surveys you are likely to qualify for.

18Do I get paid if I get screened out?

On most platforms, screen-outs during initial qualification do not earn rewards. However, some platforms including Relevant Reflex credit a small number of points for screen-outs that occur after you have partially completed a survey (late screen-outs). This depends on the specific survey and client requirements.

19What happens if I miss a survey?

Most surveys have a limited number of responses they need to collect (quota). Once the quota is filled, the survey closes — even to people who were invited. Checking your email and the platform dashboard daily ensures you catch surveys before they close. Members who check every few days regularly miss surveys that were available and then quota-filled.

20Can I take surveys in Tamil, Hindi, or other Indian languages?

Some surveys are available in regional Indian languages — particularly for FMCG and consumer goods brands targeting non-English-speaking demographics. On Relevant Reflex, you can specify your language preferences in your profile. Surveys in Indian languages are less frequent than English surveys but do exist, particularly for demographics in tier-2 and tier-3 cities.

👤 Account & Profile

21Can I have multiple accounts on the same platform?

No. Each person is permitted exactly one account per platform. Creating duplicate accounts — even with different email addresses — is a terms violation detected through IP matching and device fingerprinting. Both accounts will be suspended and all earnings forfeited when detected. If a family member wants to participate, they should create their own account on a different device.

22What should I do if I forget my password?

Use the "Forgot Password" link on the login page — this sends a reset link to your registered email. If you no longer have access to that email, contact the platform's support team with your registered mobile number for identity verification. Never create a second account if you lose access to your first one — contact support instead.

23Can I update my profile information?

Most demographic information (location, occupation, income) can be updated if your circumstances genuinely change. However, platforms flag accounts where core demographics like age, gender, and birth year are frequently changed, as this suggests profile manipulation. Update your profile when your actual situation changes — not to qualify for different surveys.

👥 Who Can Join

24What is the minimum age to join paid survey sites in India?

Most platforms require members to be at least 18 years old. This is a legal requirement related to data collection regulations and contractual capacity. Relevant Reflex requires all members to be 18 or above and verifies this during registration.

25Can students join paid survey sites in India?

Yes — students aged 18 and above can join. Student demographics are actively sought for surveys on education, technology, food delivery, entertainment, and lifestyle topics. See our dedicated guide: Online Surveys for Students — Earn Pocket Money in College.

26Can housewives join paid survey sites in India?

Yes — homemakers are one of the most valued demographics for paid surveys. Household purchasing decisions, FMCG preferences, healthcare, and nutrition surveys specifically target homemakers. See our guide: Online Surveys for Housewives — Work From Home and Earn.

27Do I need any qualifications or skills?

No qualifications or skills are required to take paid surveys. You only need the ability to read questions and provide honest answers. Basic English literacy is helpful as most surveys are in English, though some are available in regional languages. No prior experience, technical skills, or education level requirements exist.

⚠️ Common Problems

28My payment has not arrived — what should I do?

First, confirm you submitted the withdrawal request and it shows as "Pending" or "Processing" in your account. Check that your UPI ID is correct — a single character error means the transfer fails silently. Allow the stated processing time (3–7 business days on Relevant Reflex). If payment has not arrived after 10 business days, contact the platform's support team with your withdrawal request ID and the UPI ID you entered.

29Why has my account been suspended?

Account suspensions typically result from one or more of these: rushing through surveys (speedster violation), inconsistent answers, using a VPN, creating multiple accounts, or providing false demographic information. Most suspensions are permanent. If you believe the suspension was an error, contact support with a detailed explanation. See our full guide: 10 Mistakes That Get You Banned from Survey Sites.

🎯 Advanced Tips

30What is the single most effective way to earn more from surveys in India?

Complete your profiler sections thoroughly and keep them updated. This single action has more impact on earnings than anything else — including joining additional platforms. A complete profile with accurate, detailed information about your lifestyle, spending habits, and interests means you are matched to more surveys, qualify for more of the ones you are invited to, and are invited to higher-value surveys targeting your specific demographic. Members who complete all profile sections typically earn 2–3x more per month than those with basic profiles.

Ready to Start Earning?

Join 50,000+ Indians already earning with Relevant Reflex. Free to join, UPI payments, ₹250 minimum payout.

Join Free Today
-------------------- END OF FILE -------------------- ### FILE 64: RR COM/articles/paid-surveys-india-mistakes.php - Type: PHP - Size: 27.3 KB - Path: RR COM/articles - Name: paid-surveys-india-mistakes.php ------------------------------------------------------------ 10 Mistakes That Get You Banned from Paid Survey Sites India (2026) | Relevant Reflex
April 22, 2026  |  Tips & Warnings  |  9 min read

10 Common Mistakes That Get You Banned from Paid Survey Sites in India (2026)

Getting banned from a paid survey platform means losing all your accumulated points and future earning potential — permanently in most cases. These are the 10 most common mistakes Indian members make, why each one triggers a ban, and exactly how to avoid them.

Before You Read: This guide is written specifically for members of legitimate survey platforms. If you are still choosing a platform, read our guide to identifying genuine survey websites first.

Mistake 1: Rushing Through Surveys (Speedster Violations)

Every survey has an expected length of interview (LOI) — the time a thoughtful respondent should take to complete it honestly. Survey platforms track your actual completion time and compare it to this expected duration.

If you complete a 15-minute survey in under 5 minutes, your response is flagged as a "speedster" response. The platform knows this is impossible if you actually read each question carefully and considered your answer. One or two speedster flags might result in a warning. Multiple flags trigger automatic account review and frequently lead to suspension.

How to avoid it: Read each question fully before answering. If a question has multiple sub-items, check each one. Take the survey at a natural pace — the points per hour earned by rushing are lower than you think, because rushed responses often get flagged and not credited.

Mistake 2: Giving Inconsistent Answers

Survey platforms include consistency checks — the same question asked in slightly different ways at different points in the survey. For example, you might be asked your age at the start and your birth year near the end. Or asked how often you use a product at the beginning and again at the end.

If your answers contradict each other, the response is automatically flagged as low quality. This is especially important for demographic questions — your age, occupation, income bracket, and household composition should be consistent throughout every survey you take on that platform.

How to avoid it: Answer based on your real details and be consistent. If you forget what you answered earlier in a long survey, take a moment to reconsider rather than guessing.

Mistake 3: Using a VPN While Taking Surveys

This is one of the most common reasons Indian members get banned — and one of the most avoidable. Survey platforms capture your IP address when you participate. Your IP address shows your approximate location and ISP.

If you use a VPN, your IP appears to come from a different city or country than your stated profile location. For example, if your profile says you are in Chennai but your IP shows you connecting from Singapore, this is flagged as location fraud — which is a serious violation and typically results in immediate permanent suspension.

Some members use VPNs for general privacy browsing and forget to turn them off before taking surveys. Always disable your VPN completely before logging into any survey platform.

How to avoid it: Turn off your VPN before opening the survey platform. Check your IP at a site like whatismyip.com to confirm it shows your actual city before starting.

Zero Tolerance: VPN use during surveys is treated as fraud on most platforms including Relevant Reflex. This results in immediate account suspension and forfeiture of all pending earnings.

Mistake 4: Creating Multiple Accounts

Each person is permitted exactly one account on each survey platform. Creating a second account — whether to earn more points, recover from a suspension, or take surveys that have already been completed — is a serious terms violation.

Survey platforms detect multiple accounts using IP address matching, device fingerprinting, email pattern analysis, and matching profile details. Even if you use different email addresses and devices, the platform can typically identify that two accounts belong to the same person.

When duplicate accounts are detected, both accounts are suspended and all earnings are forfeited. This applies even if the second account was created by a family member using the same internet connection.

How to avoid it: Create one account per platform and use it consistently. If a family member wants to participate, they should create their own account on a different device and, ideally, a different internet connection.

Mistake 5: Providing False Demographic Information

Some members believe that providing more "desirable" demographic details — such as claiming a higher income or a more sought-after profession — will earn them more surveys. This is a significant mistake for two reasons.

First, surveys include qualification screening. If you claim to be a software engineer and then cannot answer basic technical questions correctly, you will be screened out of those surveys anyway. Second, and more importantly, providing false demographics is profile fraud. Brands pay survey platforms for responses from specific real demographic segments. Falsifying your profile undermines the research quality and is treated as a serious violation.

How to avoid it: Fill in your profile accurately and completely. You will receive surveys that genuinely match your real demographic — and you will qualify for more of them because you are answering honestly.

Mistake 6: Straight-Lining on Grid Questions

Grid questions present a matrix — multiple items rated on a scale (e.g., rate 10 products from 1 to 5). "Straight-lining" means selecting the same rating for every single item without actually considering each one individually. For example, selecting "4" for all 10 products in a row.

Survey quality algorithms specifically detect straight-lining because it is a clear signal that the respondent is not reading the questions. A few instances of straight-lining on genuinely uniform preferences are acceptable, but consistent straight-lining across multiple grid questions triggers quality flags.

How to avoid it: Actually read each item in a grid question and give your genuine opinion. If you truly feel the same about every item, that is acceptable — but if you find yourself selecting the same option for every row without reading them, stop and engage with the content.

Mistake 7: Ignoring Open-Ended Questions

Many surveys include open-ended questions asking for your genuine opinion in your own words — for example, "What do you like most about this product?" Minimum-effort responses like "nothing", "good", "N/A", or a single word are flagged as low-quality responses.

Survey platforms and their clients specifically include these questions to gather genuine qualitative insights. Gibberish responses, repeated characters (like "aaaaaaa"), or copy-pasted answers from earlier in the survey all trigger quality flags.

How to avoid it: Write at least 1–2 genuine sentences for open-ended questions. It does not need to be long — just honest and relevant to the question asked.

Mistake 8: Failing Attention Check Questions

Attention check questions are deliberately placed within surveys to verify you are reading carefully. A common example is: "We want to make sure you are paying attention — please select 'Strongly Disagree' for this question." If you actually read it, you select "Strongly Disagree." If you are rushing, you might select whatever the previous question's answer was.

Failing multiple attention checks across surveys signals to the platform that you are not genuinely engaging with the content. This leads to quality flags and eventually account review.

How to avoid it: Read every question carefully, including those that seem unusual or oddly specific. Attention checks are intentionally worded differently from regular survey questions — if a question seems to be telling you what to answer, it is likely a check.

Mistake 9: Sharing Your Account With Others

Survey accounts are strictly individual. Sharing your login credentials with a spouse, sibling, or friend — so they can take surveys on your account — is a terms violation that leads to permanent suspension.

Platforms detect account sharing through inconsistent IP locations (your account accessed from Chennai and then from Mumbai within hours), device changes, and answer pattern inconsistencies that suggest different people are responding.

How to avoid it: Never share your login details. If a family member wants to earn from surveys, they should register their own account on the platform.

Mistake 10: Attempting to Manipulate Referral Systems

Many survey platforms have referral programmes that reward you for bringing in new members. Some members attempt to abuse these by creating fake referral accounts using different emails, phone numbers, or names. This is referral fraud — one of the most serious violations on any platform.

Fraud detection systems identify fake referral accounts through shared IP addresses, matching device fingerprints, similar email naming patterns, and registration timing. When referral fraud is detected, both the referring account and all referred accounts are suspended, and all pending earnings are forfeited.

How to avoid it: Only refer real people you know. Legitimate referrals who genuinely join and participate are the only referrals that count — and they earn you real, sustained income through the referral programme.

How Survey Quality Systems Work

Understanding how quality detection works helps you appreciate why these rules exist. Survey platforms sell research data to brands. The value of that data depends entirely on its accuracy and reliability. A brand paying ₹5 lakh to understand what Tamil Nadu consumers think about their product needs genuine responses — not rushed, inconsistent, or fabricated ones.

Quality systems work on a scoring model. Each member accumulates a quality score based on their survey behaviour. Actions like rushing, inconsistency, and failing attention checks reduce the score. A high-quality score earns you more survey invitations and higher-value surveys. A low score reduces your invitation frequency and, below a threshold, triggers account suspension.

On Relevant Reflex, your quality score directly affects which surveys you are matched to. Members who maintain high quality scores earn significantly more over time because they are matched to more premium surveys.

Frequently Asked Questions

Why do survey sites ban members in India?

Survey sites ban members for quality violations that compromise research data integrity. The most common reasons are rushing through surveys, inconsistent answers, VPN use, multiple accounts, and providing false demographics.

Can a banned survey account be recovered?

Most bans are permanent. Some platforms allow appeals for genuine mistakes, but bans for clear quality violations are rarely reversed. Prevention is far more effective than attempting recovery.

Does rushing through surveys lead to a ban?

Yes. Platforms track completion time against the expected survey length. Consistently completing surveys too quickly triggers speedster flags and eventually account suspension.

Is it allowed to use a VPN while taking surveys?

No. VPN use creates a location mismatch between your stated profile and your actual IP address. This is treated as location fraud and results in immediate account suspension on most platforms.

Earn Honestly — Earn Consistently

Join 50,000+ Indians earning with Relevant Reflex. Follow the rules, complete your profile, and earn up to ₹4,000 per month via UPI.

Join Free Today
-------------------- END OF FILE -------------------- ### FILE 65: RR COM/articles/realistic-earning-expectations-surveys-india.php - Type: PHP - Size: 14.33 KB - Path: RR COM/articles - Name: realistic-earning-expectations-surveys-india.php ------------------------------------------------------------ Realistic Paid Survey Earnings Expectations India | Relevant Reflex
November 28, 2024  |  Maximize Earnings  |  Last updated: April 2026

Realistic Earning Expectations from Paid Surveys in India

Before joining any paid survey platform, it is important to understand what you can realistically earn — and what factors determine how much you make each month.

The Honest Truth About Survey Earnings in India

Online surveys are a genuine way to earn supplementary income in India — but they are not a replacement for a job or a primary income source. Anyone promising thousands of rupees per day from surveys alone is not being honest. The good news is that with consistent participation and a complete profile, most active members build a reliable monthly side income.

Indicative Earnings by Experience Level

Based on member data from Relevant Reflex, here is what members at different stages of participation typically earn. These are indicative ranges — individual results vary based on the factors described below.

Member Level Daily Time Monthly Earnings Range Profile Status
Beginner (first 1–2 months) 30–45 mins ₹500 – ₹1,500 Partially complete
Active member 1–2 hours ₹2,000 – ₹4,000 Fully complete
Experienced member 2+ hours ₹5,000+ 100% complete + profilers done

* These are indicative ranges based on member data. Individual earnings are not guaranteed and vary. See our Earnings Disclaimer.

What Determines How Much You Earn

Several factors directly influence your monthly survey earnings:

Your Demographic Profile

Certain demographics receive more survey invitations because brands specifically want their feedback. For example, professionals in technology, healthcare, or finance are frequently targeted for industry surveys that pay higher rates. Parents of young children, car owners, and frequent online shoppers also tend to receive more surveys. This is not something you can control — but being honest about your profile ensures you receive surveys you actually qualify for.

Profile Completeness

Members with complete profiles — including all profiler sections covering lifestyle, assets, income, and interests — receive significantly more survey invitations than those with basic profiles. This is the single most controllable factor in your earnings.

Daily Participation Consistency

Members who check their dashboard and email daily earn consistently more than those who participate sporadically. Many surveys close once their quota is filled — checking in daily means you catch surveys before they close.

Survey Availability in Your Region

Survey availability fluctuates based on what research clients are studying at any given time. Some months may have high survey volume; others may be quieter. This is normal and affects all members equally.

Why You Get Screened Out of Some Surveys

Getting screened out — where you start a survey but get disqualified partway through — is a normal part of survey taking and happens to every member. It means the survey was targeting a specific demographic that does not match your profile. You are not penalised for being screened out, and it does not affect your account quality. Over time, as your profiler data becomes richer, your screen-out rate decreases.

Surveys as Supplementary Income

The most satisfied survey takers treat earnings as a supplement — covering phone bills, streaming subscriptions, occasional dining out, or small savings contributions. Members who approach surveys with this mindset participate more consistently and sustainably than those expecting a primary income replacement.

Join 50,000+ Members Earning with Surveys

Relevant Reflex has paid ₹25 lakh+ to members across India since 2021. UPI payments, ₹500 minimum payout, free to join. Create your free account today.

-------------------- END OF FILE -------------------- ### FILE 66: RR COM/articles/relevant-reflex-review-legit.php - Type: PHP - Size: 31.19 KB - Path: RR COM/articles - Name: relevant-reflex-review-legit.php ------------------------------------------------------------ Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

Is Relevant Reflex Legit? Honest Review with Real UPI Payment Proofs (2026)

We are reviewing our own platform — so we have committed to being honest about both what works well and what our limitations are.

Disclosure: This review is written by the Relevant Reflex team about our own platform. We have made every effort to be honest and balanced, including acknowledging our limitations. We encourage you to read third-party reviews alongside this one before deciding to join.

When someone searches "is Relevant Reflex legit", they want a straight answer — not marketing language. This article gives you that. We cover what we are, what we have paid out, what our members say, and importantly, what our limitations are. A survey platform that only tells you the positives is not being honest with you.

What is Relevant Reflex?

Relevant Reflex is an India-based paid online survey platform founded in 2021 and operating from Ethirmedu, Tamil Nadu. We connect Indian consumers with companies and market research agencies that need opinions on their products, services, and advertising.

Members register for free, complete their demographic profile, and receive survey invitations matched to their profile. Completed surveys earn points redeemable as cash via UPI — directly to PhonePe, Google Pay, or Paytm. The minimum payout threshold is ₹250 (500 points at ₹0.50 per point).

We are a market research data collection company — not a get-rich-quick scheme, not an app that pays you for downloading other apps, and not a platform that charges a registration fee. We operate in a well-established, legitimate global industry.

Payment Proof and Payout Data

The most common question people ask when evaluating any survey platform is simple: do they actually pay? Here is our verified payout data as of April 2026:

Verified Payout Facts — Relevant Reflex (as of April 2026):
  • Total paid to members: ₹25 lakh+ via UPI
  • Total verified members: 50,000+ across India
  • Payment method: UPI only (PhonePe, GPay, Paytm)
  • Minimum payout threshold: ₹250 (500 pts × ₹0.50)
  • Average payout processing time: 3–7 business days
  • Platform founded: 2021
  • Registration fee: None — free to join

UPI payment screenshots from members are available on our social media profiles and can be requested by emailing support@relevantreflex.com. We blur account numbers and personal details before sharing. The transaction references in these screenshots are verifiable on the UPI network.

Our Honest Ratings

Payment reliability
4.5/5
Survey availability
3.5/5
Payout speed
4.0/5
Ease of use
4.3/5
Earning potential
3.7/5
Overall
4.2/5

Pros and Cons — Balanced View

What Works Well
  • Completely free to join — no fees ever
  • UPI payments — works with PhonePe, GPay, Paytm
  • Low ₹250 minimum payout threshold
  • India-specific surveys — not repurposed international content
  • Reliable payment processing — members are paid
  • Responsive email support team
  • Mobile-friendly platform — works well on Android and iOS
  • No investment of any kind required
Honest Limitations
  • Survey volume varies — not every day has available surveys
  • Some demographics receive fewer invitations than others
  • Screen-outs are common — this is normal on all platforms
  • Earnings are supplemental — not a primary income replacement
  • No app yet — mobile web only
  • Payout takes 3–7 days — not instant
  • Focus groups are invite-only and not guaranteed

What Members Say

Rather than curating only positive reviews, here is a representative range of member feedback we have received — positive and critical:

"I was sceptical at first but after receiving my first UPI payment of ₹650 in week 3, I was convinced. Now in my fourth month and earning around ₹2,800 per month consistently."
— Priya S., Software Professional, Bengaluru

"The first month was slow — maybe ₹400 total. But I kept at it, completed all the profiler surveys, and by month 3 I was getting 8–10 survey invitations per week. My last withdrawal was ₹1,800 in one go."
— Rajesh M., Teacher, Chennai

"I wish there were more surveys available every day. Some days I log in and there are only 1–2 available which is a bit disappointing. But when they are available they are genuine and the payment always comes through."
— Anitha K., Homemaker, Coimbatore

"I got screened out of several surveys in my first week and almost quit. Then I read that this is normal and completed my full profile. The screening rate dropped a lot after that. Good platform overall."
— Mohammed R., Student, Hyderabad

Our Honest Limitations

We believe you should know these before joining:

Survey availability is not guaranteed

The number of surveys available to you on any given day depends on what our research clients need that day, and whether your profile matches those requirements. There will be days — sometimes several in a row — where there are no new surveys available for your demographic. This is true of every survey platform in the world, not just ours. We cannot guarantee a minimum number of daily surveys.

Not everyone earns the same amount

Members with demographics that are frequently targeted by market research — working professionals in metros, car owners, parents — receive more survey invitations than members with less commonly researched profiles. We are transparent that earnings vary significantly by demographic profile.

Screen-outs happen

Being screened out of a survey — where you start and get rejected after a few questions — is a standard part of survey participation everywhere. Companies want specific demographic subgroups, and once a quota fills, everyone else is screened out. This is not a reflection of your answers being wrong. It is unavoidable in the survey industry.

This is supplemental income, not a salary

We do not want members to join expecting to replace a full-time income. Most active members earn ₹1,500–₹4,000 per month — genuinely useful supplemental income, but not a living wage. Members who join with realistic expectations are consistently satisfied. Members who join expecting ₹20,000 per month are always disappointed — on every platform.

Verdict — Is Relevant Reflex Worth Joining?

Yes — with realistic expectations

Relevant Reflex is a legitimate, free-to-join, UPI-paying Indian survey platform. It is not a scam, does not charge fees, and does pay its members. We have verifiable payment records across 50,000+ members.

It is worth joining if you want supplemental income from home with no investment, have 30–120 minutes per day available, and are patient enough to build up earnings over the first 2–3 months.

It is not the right fit if you expect to earn more than ₹6,000–₹8,000 per month from surveys alone, want instant payments, or are looking for a primary income source.

Our recommendation: Join free, complete your full profile on day 1, spend 30–45 minutes per day for the first 2 weeks, and evaluate after your first withdrawal. The experience will tell you everything you need to know.

Frequently Asked Questions

Is Relevant Reflex a legitimate survey platform?

Yes. Relevant Reflex is a legitimate India-based paid survey platform founded in 2021, operating from Tamil Nadu. It has paid over ₹25 lakh to 50,000+ verified Indian members via UPI and is free to join.

Does Relevant Reflex actually pay via UPI?

Yes. Payments go directly to your UPI account — PhonePe, Google Pay, or Paytm — once the ₹250 minimum threshold is reached. Withdrawals are processed within 3–7 business days.

Is there a registration fee?

No. Joining Relevant Reflex is completely free. We do not charge a registration fee, membership fee, or any other fee at any point. If any website claims you need to pay to join Relevant Reflex, that is a fraudulent site — not us.

What are the limitations of Relevant Reflex?

Survey availability varies by day and demographic. Members in smaller cities or with less commonly researched profiles may receive fewer invitations. Like all platforms, screen-outs happen. Earnings are supplemental — not a primary income replacement.

How long has Relevant Reflex been operating?

Relevant Reflex was founded in 2021 and has been operating continuously since then, growing to 50,000+ verified members across India.

Try It Yourself — Free to Join

The best way to evaluate any survey platform is to try it. Join free, complete your profile, and see your first earnings within 2–4 weeks.

Join Relevant Reflex Free See Earning Potential
-------------------- END OF FILE -------------------- ### FILE 67: RR COM/articles/survey-scams-india.php - Type: PHP - Size: 30.93 KB - Path: RR COM/articles - Name: survey-scams-india.php ------------------------------------------------------------ Survey Scams India 2026: How to Identify and Avoid Fake Survey Sites | Relevant Reflex
April 22, 2026  |  Safety & Scam Warning  |  10 min read

Survey Scams India 2026: How to Identify and Avoid Fake Survey Sites

India's growing interest in online earning has made survey scams increasingly common. Knowing what fake survey sites look like — and how they operate — is the single most important step before joining any survey platform. This guide covers 8 red flags, real scam tactics used in India, and how to verify a platform is legitimate.

Quick Safety Check: Any survey site that asks you to PAY to join or to receive your earnings is a scam. Stop immediately and do not proceed.

How Survey Scams Work in India

Fake survey sites exploit a simple truth: people in India are actively searching for legitimate ways to earn money from home. Scammers build websites that look like real survey platforms, make claims about easy earnings, and use one of several tactics to profit from users — either by collecting money directly or harvesting valuable personal data.

The scam lifecycle typically follows this pattern:

  1. Discovery: The fake site appears in Google search results, gets shared on WhatsApp, or advertises on social media with income claims like "Earn ₹5,000 per day just by answering questions."
  2. Registration: Users sign up and see a convincing interface with points accumulating. The platform may even give large sign-up bonuses — points that cannot actually be redeemed.
  3. The trap: When users try to withdraw their earnings, they are told they need to pay a "processing fee", "tax payment", "account verification charge", or "membership upgrade." This is where the scam monetises.
  4. Disappearance: After collecting fees from enough users, the site goes offline. The accumulated points disappear and the "earnings" were never real.

Some scams are more sophisticated — they never ask for money directly but harvest your Aadhaar number, bank account details, or mobile number for use in other fraud schemes.

8 Red Flags of Fake Survey Sites in India

🚩 Red Flag 1: They Charge a Registration Fee

Every legitimate paid survey platform is completely free to join. There is never a registration fee, activation charge, or membership payment required. If a site asks you to pay ₹99, ₹299, or any amount to "activate your account" or "start receiving surveys," stop immediately. This is the most common and clearest sign of a scam.

🚩 Red Flag 2: Promises of ₹5,000–₹10,000 per Day

Legitimate surveys pay ₹20–₹300 per completed survey. Active members on real platforms earn ₹500–₹4,000 per month. Any site claiming you can earn ₹5,000 per day, ₹1,000 per survey, or "₹50,000 per month working 2 hours a day" is lying. These numbers are mathematically impossible given how survey research actually works. The higher the promised earnings, the more certain it is a scam.

🚩 Red Flag 3: No Contact Details or Physical Address

Legitimate survey companies are registered businesses with real addresses, working contact email addresses, and often phone support. If a survey site has no "About Us" page, no physical address, no working email, or only a WhatsApp number — treat it as suspect. Scam sites deliberately make themselves impossible to contact once the fraud is complete.

🚩 Red Flag 4: You Need to Pay to Withdraw Your Earnings

When you try to withdraw points you have earned on a scam site, they invent a reason why you must pay first — "GST charge," "TDS deduction," "bank processing fee," or "account verification payment." Legitimate platforms never charge you to receive money you have earned. Payment always flows from platform to member, never the other way around.

🚩 Red Flag 5: Shared via WhatsApp or Telegram Without an Official Website

Legitimate survey platforms are accessible via a proper website with a real domain, SSL certificate, and established web presence. Scams frequently spread through WhatsApp forwards, Telegram groups, or Facebook posts — often with messages like "My friend earned ₹15,000 in one week — join here." Real survey platforms do not rely on WhatsApp chains for user acquisition.

🚩 Red Flag 6: Claims to be a Government or TRAI Survey

A persistent scam in India involves fake surveys claiming to be from TRAI (Telecom Regulatory Authority), government ministries, or "RBI authorised" platforms. The Indian government does not pay citizens to take surveys via WhatsApp links or unofficial websites. Any survey claiming government affiliation and offering payment should be treated as a scam.

🚩 Red Flag 7: No Verifiable Payment Proof

Real survey platforms have a track record of payments — visible in member forums, review sites, and social media. If you search for "[platform name] payment proof india" and find nothing from real users — only testimonials on the site itself — this is a serious warning sign. Payment proof screenshots from real members are the gold standard for verifying legitimacy.

🚩 Red Flag 8: They Ask for Aadhaar or Bank Details Before You Have Earned Anything

Legitimate survey platforms collect basic profile information at registration — name, email, age, and location. Requests for Aadhaar, bank account numbers, or OTPs at the point of signup — before you have participated in any surveys — are a serious warning sign of fraud.

Important distinction on PAN: PAN collection is legitimate and legally required in specific circumstances. Under Indian income tax law (Section 194H and related provisions), platforms that pay members above a defined threshold must collect PAN for TDS (Tax Deducted at Source) compliance. Relevant Reflex collects PAN for this purpose — not at signup, but only when a member's cumulative earnings reach the TDS threshold. This is a legal obligation, not a scam indicator.

The red flag is platforms that demand Aadhaar or bank account details immediately at registration with no payment history established — or that ask for OTPs, passwords, or CVV numbers at any stage. No legitimate survey platform ever needs your Aadhaar, bank PIN, or OTP to sign you up.

Most Common Survey Scam Types in India

1. The Registration Fee Scam

The most widespread type. Users pay ₹99–₹999 to "join" and then find either no surveys exist, or they need to pay more to withdraw their "earnings." The registration fee is the entire scam revenue model.

2. The Withdrawal Fee Scam

Users are allowed to accumulate large point balances (which cost the scammer nothing). When withdrawal is requested, suddenly a "mandatory tax payment" of ₹200–₹500 is required. This hooks users who feel they have already invested time and are close to receiving real money.

3. The Data Harvesting Scam

Some fake survey sites are not interested in money — they want your data. They collect your mobile number, email, age, income, and location to sell to spammers and telemarketers. The surveys themselves are real, but the "rewards" never materialise because payment was never the intent.

4. The Referral Pyramid Scam

The platform encourages you to refer friends, promising large rewards for each referral. In reality, the platform makes money by charging referral fees to new members. The reward structure is unsustainable — early joiners who successfully recruit others may receive small payments, while the majority of participants earn nothing. These are essentially pyramid schemes disguised as survey platforms.

5. The WhatsApp Survey Scam

Short surveys are shared via WhatsApp with a link asking you to complete a 5-question survey and share it with 10 friends to "unlock" your reward. These collect no real research data — they are chain messages designed to harvest phone numbers and spread further. No payment ever arrives.

How to Verify a Survey Site is Legitimate

Before joining any survey platform in India, run these five checks:

  1. Search for payment proof: Search "[platform name] payment proof india" on Google. Look for real screenshots from members on Reddit, Quora, and YouTube — not just testimonials on the platform's own website.
  2. Check how long it has been operating: Use the Wayback Machine (web.archive.org) to see how long the website has existed. A site registered 3 months ago with no history is high risk. Legitimate platforms have years of operation.
  3. Verify the registration model: Attempt to join without paying anything. If payment is required to join, leave immediately.
  4. Check for an independent listing: See if the platform is listed on independent survey directories like Paid Survey Hub India (paidsurveyhub.in) — which only lists platforms with verified India accessibility.
  5. Look for real contact details: Find the About page. Verify there is a real email address, physical address, and ideally a registered company name you can look up.
✅ Legitimate Platform — What to Look For
  • Free to join — no registration fee
  • UPI or established payment method
  • Realistic earnings claims (₹500–₹4,000/month)
  • Verifiable payment proof from real members
  • Years of operation with web history
  • Real contact details and address
  • Listed on independent survey directories
  • Never charges to withdraw earnings
🚩 Scam Platform — Warning Signs
  • Charges registration or activation fee
  • Promises ₹5,000+ per day
  • No verifiable payment history
  • No physical address or contact details
  • Spread via WhatsApp or Telegram
  • Claims government or TRAI affiliation
  • Requests Aadhaar or bank details at signup
  • Charges fees to release your earnings

What to Do if You Have Already Joined a Scam Survey Site

If you realise you have joined a fraudulent survey platform, take these steps immediately:

  1. Stop participating immediately. Do not complete more surveys, do not refer friends or family, and do not pay any fees they request to "unlock" your earnings.
  2. Do not pay any withdrawal fees. The "processing fee" or "tax payment" they request is the scam revenue mechanism. Once you pay, they will invent another reason to charge you again.
  3. Change your password on the scam site if you used the same password elsewhere. Change it on any other accounts using that password.
  4. Report the site to the Indian Cyber Crime portal at cybercrime.gov.in — especially if you paid money or shared sensitive personal information.
  5. Warn others. Post your experience on social media or Quora to prevent others from falling victim to the same scam.

Frequently Asked Questions

How do I know if a survey site in India is genuine or fake?

Genuine sites are free to join, pay via UPI or verified methods, have verifiable payment history, have years of operation, and have real contact details. Fake sites charge fees, promise unrealistic earnings, have no payment history, and disappear quickly.

What are the most common survey scams in India?

Registration fee scams, withdrawal fee scams, data harvesting scams, referral pyramid schemes, and WhatsApp forwarded survey links are the most common in India in 2026.

Is Relevant Reflex a legitimate survey site?

Yes. Relevant Reflex is a legitimate paid survey platform founded in 2021, based in Tamil Nadu. It has paid over ₹25 lakh to 50,000+ Indian members via UPI. It is free to join with no hidden fees, and is independently listed on Paid Survey Hub India. Read the full review: Is Relevant Reflex Legit?

What should I do if I joined a scam survey site?

Stop immediately, do not pay any withdrawal fees, change your passwords, report to cybercrime.gov.in if you lost money or shared sensitive data, and warn others on social media.

Join a Verified Legitimate Platform

Relevant Reflex is India's UPI-native survey platform — free to join, ₹25 lakh paid to 50,000+ members. No fees, no scams, no promises that aren't kept.

Join Free Today
-------------------- END OF FILE -------------------- ### FILE 68: RR COM/articles/time-management-tips-survey-takers.php - Type: PHP - Size: 13.35 KB - Path: RR COM/articles - Name: time-management-tips-survey-takers.php ------------------------------------------------------------ Time Management Tips for Survey Takers in India | Relevant Reflex
November 15, 2024  |  Tips & Tricks  |  Last updated: April 2026

Time Management Tips for Survey Takers in India

One of the biggest advantages of paid surveys is flexibility — you can participate whenever time allows. But without a simple routine, it is easy to miss surveys or participate inconsistently. These tips help you get the most from the time you invest.

Set a Fixed Daily Check-In Time

The most consistent earners on survey platforms share one habit — they check their dashboard at the same time every day. It does not need to be a long session. A 5–10 minute check each morning to see what surveys are available, and a quick email scan for invitation emails, is enough to ensure you never miss a survey that opened overnight.

Many surveys close within 24–48 hours of opening because research clients need responses quickly. Members who check daily catch these before they fill up. Members who check every few days regularly find surveys they qualified for have already closed.

Use Idle Time Productively

Most surveys on Relevant Reflex take between 5 and 20 minutes to complete. This fits naturally into time that would otherwise be idle — waiting for a bus or auto, a tea break at work, time between college classes, or the first 15 minutes after waking up. Rather than blocking out dedicated "survey time," many members find it easier to treat surveys as a productive use of idle moments throughout the day.

Prioritise Higher-Paying Surveys First

When multiple surveys are available at the same time, start with the ones that offer the highest reward relative to their estimated completion time. A 10-minute survey paying ₹80 is a better use of your time than a 15-minute survey paying ₹50. Over a month, making these small prioritisation decisions consistently adds up to meaningfully higher earnings.

Do Not Force Every Survey

If you are short on time, it is better to skip a survey entirely than to rush through it. Surveys completed too quickly are flagged by quality detection systems — the response gets rejected, you earn nothing, and your account quality score takes a hit. A rejected response wastes more time than skipping the survey would have. Participate when you can give each survey the attention it requires.

Mobile vs Desktop — Know When to Use Each

Relevant Reflex works on both mobile and desktop. Short opinion surveys of 5–10 minutes are well-suited to mobile — you can complete them during commutes or short breaks. Longer surveys of 15–25 minutes, particularly those with detailed questions or grids, are more comfortable on a desktop or laptop where reading and responding is easier. Using the right device for the right survey type reduces fatigue and improves response quality.

Complete Profile Updates Promptly

When the platform prompts you to update a section of your profile or complete a new profiler survey, do it the same day. Profile updates directly affect which surveys you are matched with. Delaying them means missing out on surveys that were targeted at your updated demographic in the meantime. Profiler surveys are typically short — 2 to 5 minutes — and the downstream benefit in survey availability is significant.

Track Your Monthly Earnings

Keeping a simple note of your monthly survey earnings — even just a number in your phone's notes app — helps you stay motivated and spot patterns. If you notice a particular month where earnings dropped, you can usually trace it back to a period of inconsistent participation. Tracking reinforces the habit and gives you a visible measure of progress over time.

Avoid Survey Burnout

Survey fatigue is real. Trying to complete every available survey every day can become exhausting and leads to lower-quality responses. A sustainable approach is better than an intensive one — 30 to 60 minutes of quality participation daily will produce better long-term results than 3-hour sessions a few times a week followed by days of inactivity.

Join Relevant Reflex and Start Earning

50,000+ members across India earn survey rewards via UPI on their own schedule. Free to join, ₹500 minimum payout. Sign up now — takes under 2 minutes.

-------------------- END OF FILE -------------------- ### FILE 69: RR COM/assets/css/bootstrap.min.css - Type: CSS - Size: 149.52 KB - Path: RR COM/assets/css - Name: bootstrap.min.css ------------------------------------------------------------ @charset "UTF-8";/*! * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) * Copyright 2011-2020 The Bootstrap Authors * Copyright 2011-2020 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0))}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus{outline:dotted 1px;outline:-webkit-focus-ring-color auto 5px}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(var(--bs-gutter-y) * -1);margin-right:calc(var(--bs-gutter-x)/ -2);margin-left:calc(var(--bs-gutter-x)/ -2)}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x)/ 2);padding-left:calc(var(--bs-gutter-x)/ 2);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.3333333333%}.col-2{flex:0 0 auto;width:16.6666666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.3333333333%}.col-5{flex:0 0 auto;width:41.6666666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.3333333333%}.col-8{flex:0 0 auto;width:66.6666666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.3333333333%}.col-11{flex:0 0 auto;width:91.6666666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.3333333333%}.offset-2{margin-left:16.6666666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.3333333333%}.offset-5{margin-left:41.6666666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.3333333333%}.offset-8{margin-left:66.6666666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.3333333333%}.offset-11{margin-left:91.6666666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.3333333333%}.col-sm-2{flex:0 0 auto;width:16.6666666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.3333333333%}.col-sm-5{flex:0 0 auto;width:41.6666666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.3333333333%}.col-sm-8{flex:0 0 auto;width:66.6666666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.3333333333%}.col-sm-11{flex:0 0 auto;width:91.6666666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.3333333333%}.offset-sm-2{margin-left:16.6666666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.3333333333%}.offset-sm-5{margin-left:41.6666666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.3333333333%}.offset-sm-8{margin-left:66.6666666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.3333333333%}.offset-sm-11{margin-left:91.6666666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.3333333333%}.col-md-2{flex:0 0 auto;width:16.6666666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.3333333333%}.col-md-5{flex:0 0 auto;width:41.6666666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.3333333333%}.col-md-8{flex:0 0 auto;width:66.6666666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.3333333333%}.col-md-11{flex:0 0 auto;width:91.6666666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.3333333333%}.offset-md-2{margin-left:16.6666666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.3333333333%}.offset-md-5{margin-left:41.6666666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.3333333333%}.offset-md-8{margin-left:66.6666666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.3333333333%}.offset-md-11{margin-left:91.6666666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.3333333333%}.col-lg-2{flex:0 0 auto;width:16.6666666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.3333333333%}.col-lg-5{flex:0 0 auto;width:41.6666666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.3333333333%}.col-lg-8{flex:0 0 auto;width:66.6666666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.3333333333%}.col-lg-11{flex:0 0 auto;width:91.6666666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.3333333333%}.offset-lg-2{margin-left:16.6666666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.3333333333%}.offset-lg-5{margin-left:41.6666666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.3333333333%}.offset-lg-8{margin-left:66.6666666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.3333333333%}.offset-lg-11{margin-left:91.6666666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.3333333333%}.col-xl-2{flex:0 0 auto;width:16.6666666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.3333333333%}.col-xl-5{flex:0 0 auto;width:41.6666666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.3333333333%}.col-xl-8{flex:0 0 auto;width:66.6666666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.3333333333%}.col-xl-11{flex:0 0 auto;width:91.6666666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.3333333333%}.offset-xl-2{margin-left:16.6666666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.3333333333%}.offset-xl-5{margin-left:41.6666666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.3333333333%}.offset-xl-8{margin-left:66.6666666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.3333333333%}.offset-xl-11{margin-left:91.6666666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.3333333333%}.col-xxl-2{flex:0 0 auto;width:16.6666666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.3333333333%}.col-xxl-5{flex:0 0 auto;width:41.6666666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.3333333333%}.col-xxl-8{flex:0 0 auto;width:66.6666666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.3333333333%}.col-xxl-11{flex:0 0 auto;width:91.6666666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.3333333333%}.offset-xxl-2{margin-left:16.6666666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.3333333333%}.offset-xxl-5{margin-left:41.6666666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.3333333333%}.offset-xxl-8{margin-left:66.6666666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.3333333333%}.offset-xxl-11{margin-left:91.6666666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);background-image:linear-gradient(var(--bs-table-accent-bg),var(--bs-table-accent-bg));border-bottom-width:1px}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;vertical-align:middle;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#6c757d;background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;transition:background-color .15s ease-in-out,background-position .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-check-input{transition:none}}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control::-webkit-input-placeholder{color:transparent}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:1.75rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545;padding-right:calc(.75em + 2.3125rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 1.75rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[style]{right:auto!important}.dropdown-menu-start{--bs-position:start;right:auto;left:0}.dropdown-menu-end{--bs-position:end;right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start;right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end;right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start;right:auto;left:0}.dropdown-menu-md-end{--bs-position:end;right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start;right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end;right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start;right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end;right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start;right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end;right:0;left:auto}}.dropup .dropdown-menu{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{align-items:center;width:100%}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-collapse{display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-collapse{display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-collapse{display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-collapse{display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-collapse{display:flex!important}.navbar-expand-xxl .navbar-toggler{display:none}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-collapse{display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;background-color:transparent;border:1px solid rgba(0,0,0,.125);border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button.collapsed{border-bottom-width:0}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item:first-of-type .accordion-button{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-width:1px;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-collapse{border-bottom-width:1px;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-collapse{border:solid rgba(0,0,0,.125);border-width:0 1px}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-button{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item:first-of-type .accordion-button{border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.accordion-flush .accordion-item:last-of-type .accordion-button.collapsed{border-bottom-width:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{position:fixed;top:0;left:0;z-index:1050;display:none;width:100%;height:100%;overflow:hidden;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top],.bs-popover-top{margin-bottom:.5rem!important}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right],.bs-popover-end{margin-left:.5rem!important}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom],.bs-popover-bottom{margin-top:.5rem!important}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left],.bs-popover-start{margin-right:.5rem!important}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators li{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--aspect-ratio:100%}.ratio-4x3{--aspect-ratio:calc(3 / 4 * 100%)}.ratio-16x9{--aspect-ratio:calc(9 / 16 * 100%)}.ratio-21x9{--aspect-ratio:calc(9 / 21 * 100%)}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-0{border-width:0!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-primary{color:#0d6efd!important}.text-secondary{color:#6c757d!important}.text-success{color:#198754!important}.text-info{color:#0dcaf0!important}.text-warning{color:#ffc107!important}.text-danger{color:#dc3545!important}.text-light{color:#f8f9fa!important}.text-dark{color:#212529!important}.text-white{color:#fff!important}.text-body{color:#212529!important}.text-muted{color:#6c757d!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-reset{color:inherit!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.bg-primary{background-color:#0d6efd!important}.bg-secondary{background-color:#6c757d!important}.bg-success{background-color:#198754!important}.bg-info{background-color:#0dcaf0!important}.bg-warning{background-color:#ffc107!important}.bg-danger{background-color:#dc3545!important}.bg-light{background-color:#f8f9fa!important}.bg-dark{background-color:#212529!important}.bg-body{background-color:#fff!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.bg-gradient{background-image:var(--bs-gradient)!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}.fs-sm-1{font-size:2.5rem!important}.fs-sm-2{font-size:2rem!important}.fs-sm-3{font-size:1.75rem!important}.fs-sm-4{font-size:1.5rem!important}.fs-md-1{font-size:2.5rem!important}.fs-md-2{font-size:2rem!important}.fs-md-3{font-size:1.75rem!important}.fs-md-4{font-size:1.5rem!important}.fs-lg-1{font-size:2.5rem!important}.fs-lg-2{font-size:2rem!important}.fs-lg-3{font-size:1.75rem!important}.fs-lg-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} /*# sourceMappingURL=bootstrap.min.css.map */ -------------------- END OF FILE -------------------- ### FILE 70: RR COM/assets/css/custom.css - Type: CSS - Size: 17 B - Path: RR COM/assets/css - Name: custom.css ------------------------------------------------------------ /* Custom Css */ -------------------- END OF FILE -------------------- ### FILE 71: RR COM/assets/css/fontawesome.css - Type: CSS - Size: 71.9 KB - Path: RR COM/assets/css - Name: fontawesome.css ------------------------------------------------------------ /*! * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */ .fa, .fas, .far, .fal, .fad, .fab { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; display: inline-block; font-style: normal; font-variant: normal; text-rendering: auto; line-height: 1; } .fa-lg { font-size: 1.33333em; line-height: 0.75em; vertical-align: -.0667em; } .fa-xs { font-size: .75em; } .fa-sm { font-size: .875em; } .fa-1x { font-size: 1em; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-6x { font-size: 6em; } .fa-7x { font-size: 7em; } .fa-8x { font-size: 8em; } .fa-9x { font-size: 9em; } .fa-10x { font-size: 10em; } .fa-fw { text-align: center; width: 1.25em; } .fa-ul { list-style-type: none; margin-left: 2.5em; padding-left: 0; } .fa-ul > li { position: relative; } .fa-li { left: -2em; position: absolute; text-align: center; width: 2em; line-height: inherit; } .fa-border { border: solid 0.08em #eee; border-radius: .1em; padding: .2em .25em .15em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left, .fas.fa-pull-left, .far.fa-pull-left, .fal.fa-pull-left, .fab.fa-pull-left { margin-right: .3em; } .fa.fa-pull-right, .fas.fa-pull-right, .far.fa-pull-right, .fal.fa-pull-right, .fab.fa-pull-right { margin-left: .3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); transform: scale(1, -1); } .fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(-1, -1); transform: scale(-1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical, :root .fa-flip-both { -webkit-filter: none; filter: none; } .fa-stack { display: inline-block; height: 2em; line-height: 2em; position: relative; vertical-align: middle; width: 2.5em; } .fa-stack-1x, .fa-stack-2x { left: 0; position: absolute; text-align: center; width: 100%; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-500px:before { content: "\f26e"; } .fa-accessible-icon:before { content: "\f368"; } .fa-accusoft:before { content: "\f369"; } .fa-acquisitions-incorporated:before { content: "\f6af"; } .fa-ad:before { content: "\f641"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-card:before { content: "\f2bb"; } .fa-adjust:before { content: "\f042"; } .fa-adn:before { content: "\f170"; } .fa-adversal:before { content: "\f36a"; } .fa-affiliatetheme:before { content: "\f36b"; } .fa-air-freshener:before { content: "\f5d0"; } .fa-airbnb:before { content: "\f834"; } .fa-algolia:before { content: "\f36c"; } .fa-align-center:before { content: "\f037"; } .fa-align-justify:before { content: "\f039"; } .fa-align-left:before { content: "\f036"; } .fa-align-right:before { content: "\f038"; } .fa-alipay:before { content: "\f642"; } .fa-allergies:before { content: "\f461"; } .fa-amazon:before { content: "\f270"; } .fa-amazon-pay:before { content: "\f42c"; } .fa-ambulance:before { content: "\f0f9"; } .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-amilia:before { content: "\f36d"; } .fa-anchor:before { content: "\f13d"; } .fa-android:before { content: "\f17b"; } .fa-angellist:before { content: "\f209"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-down:before { content: "\f107"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angry:before { content: "\f556"; } .fa-angrycreative:before { content: "\f36e"; } .fa-angular:before { content: "\f420"; } .fa-ankh:before { content: "\f644"; } .fa-app-store:before { content: "\f36f"; } .fa-app-store-ios:before { content: "\f370"; } .fa-apper:before { content: "\f371"; } .fa-apple:before { content: "\f179"; } .fa-apple-alt:before { content: "\f5d1"; } .fa-apple-pay:before { content: "\f415"; } .fa-archive:before { content: "\f187"; } .fa-archway:before { content: "\f557"; } .fa-arrow-alt-circle-down:before { content: "\f358"; } .fa-arrow-alt-circle-left:before { content: "\f359"; } .fa-arrow-alt-circle-right:before { content: "\f35a"; } .fa-arrow-alt-circle-up:before { content: "\f35b"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-down:before { content: "\f063"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-arrows-alt-h:before { content: "\f337"; } .fa-arrows-alt-v:before { content: "\f338"; } .fa-artstation:before { content: "\f77a"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asterisk:before { content: "\f069"; } .fa-asymmetrik:before { content: "\f372"; } .fa-at:before { content: "\f1fa"; } .fa-atlas:before { content: "\f558"; } .fa-atlassian:before { content: "\f77b"; } .fa-atom:before { content: "\f5d2"; } .fa-audible:before { content: "\f373"; } .fa-audio-description:before { content: "\f29e"; } .fa-autoprefixer:before { content: "\f41c"; } .fa-avianex:before { content: "\f374"; } .fa-aviato:before { content: "\f421"; } .fa-award:before { content: "\f559"; } .fa-aws:before { content: "\f375"; } .fa-baby:before { content: "\f77c"; } .fa-baby-carriage:before { content: "\f77d"; } .fa-backspace:before { content: "\f55a"; } .fa-backward:before { content: "\f04a"; } .fa-bacon:before { content: "\f7e5"; } .fa-bacteria:before { content: "\e059"; } .fa-bacterium:before { content: "\e05a"; } .fa-bahai:before { content: "\f666"; } .fa-balance-scale:before { content: "\f24e"; } .fa-balance-scale-left:before { content: "\f515"; } .fa-balance-scale-right:before { content: "\f516"; } .fa-ban:before { content: "\f05e"; } .fa-band-aid:before { content: "\f462"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-barcode:before { content: "\f02a"; } .fa-bars:before { content: "\f0c9"; } .fa-baseball-ball:before { content: "\f433"; } .fa-basketball-ball:before { content: "\f434"; } .fa-bath:before { content: "\f2cd"; } .fa-battery-empty:before { content: "\f244"; } .fa-battery-full:before { content: "\f240"; } .fa-battery-half:before { content: "\f242"; } .fa-battery-quarter:before { content: "\f243"; } .fa-battery-three-quarters:before { content: "\f241"; } .fa-battle-net:before { content: "\f835"; } .fa-bed:before { content: "\f236"; } .fa-beer:before { content: "\f0fc"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-bell:before { content: "\f0f3"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bezier-curve:before { content: "\f55b"; } .fa-bible:before { content: "\f647"; } .fa-bicycle:before { content: "\f206"; } .fa-biking:before { content: "\f84a"; } .fa-bimobject:before { content: "\f378"; } .fa-binoculars:before { content: "\f1e5"; } .fa-biohazard:before { content: "\f780"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitcoin:before { content: "\f379"; } .fa-bity:before { content: "\f37a"; } .fa-black-tie:before { content: "\f27e"; } .fa-blackberry:before { content: "\f37b"; } .fa-blender:before { content: "\f517"; } .fa-blender-phone:before { content: "\f6b6"; } .fa-blind:before { content: "\f29d"; } .fa-blog:before { content: "\f781"; } .fa-blogger:before { content: "\f37c"; } .fa-blogger-b:before { content: "\f37d"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-bold:before { content: "\f032"; } .fa-bolt:before { content: "\f0e7"; } .fa-bomb:before { content: "\f1e2"; } .fa-bone:before { content: "\f5d7"; } .fa-bong:before { content: "\f55c"; } .fa-book:before { content: "\f02d"; } .fa-book-dead:before { content: "\f6b7"; } .fa-book-medical:before { content: "\f7e6"; } .fa-book-open:before { content: "\f518"; } .fa-book-reader:before { content: "\f5da"; } .fa-bookmark:before { content: "\f02e"; } .fa-bootstrap:before { content: "\f836"; } .fa-border-all:before { content: "\f84c"; } .fa-border-none:before { content: "\f850"; } .fa-border-style:before { content: "\f853"; } .fa-bowling-ball:before { content: "\f436"; } .fa-box:before { content: "\f466"; } .fa-box-open:before { content: "\f49e"; } .fa-box-tissue:before { content: "\e05b"; } .fa-boxes:before { content: "\f468"; } .fa-braille:before { content: "\f2a1"; } .fa-brain:before { content: "\f5dc"; } .fa-bread-slice:before { content: "\f7ec"; } .fa-briefcase:before { content: "\f0b1"; } .fa-briefcase-medical:before { content: "\f469"; } .fa-broadcast-tower:before { content: "\f519"; } .fa-broom:before { content: "\f51a"; } .fa-brush:before { content: "\f55d"; } .fa-btc:before { content: "\f15a"; } .fa-buffer:before { content: "\f837"; } .fa-bug:before { content: "\f188"; } .fa-building:before { content: "\f1ad"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bullseye:before { content: "\f140"; } .fa-burn:before { content: "\f46a"; } .fa-buromobelexperte:before { content: "\f37f"; } .fa-bus:before { content: "\f207"; } .fa-bus-alt:before { content: "\f55e"; } .fa-business-time:before { content: "\f64a"; } .fa-buy-n-large:before { content: "\f8a6"; } .fa-buysellads:before { content: "\f20d"; } .fa-calculator:before { content: "\f1ec"; } .fa-calendar:before { content: "\f133"; } .fa-calendar-alt:before { content: "\f073"; } .fa-calendar-check:before { content: "\f274"; } .fa-calendar-day:before { content: "\f783"; } .fa-calendar-minus:before { content: "\f272"; } .fa-calendar-plus:before { content: "\f271"; } .fa-calendar-times:before { content: "\f273"; } .fa-calendar-week:before { content: "\f784"; } .fa-camera:before { content: "\f030"; } .fa-camera-retro:before { content: "\f083"; } .fa-campground:before { content: "\f6bb"; } .fa-canadian-maple-leaf:before { content: "\f785"; } .fa-candy-cane:before { content: "\f786"; } .fa-cannabis:before { content: "\f55f"; } .fa-capsules:before { content: "\f46b"; } .fa-car:before { content: "\f1b9"; } .fa-car-alt:before { content: "\f5de"; } .fa-car-battery:before { content: "\f5df"; } .fa-car-crash:before { content: "\f5e1"; } .fa-car-side:before { content: "\f5e4"; } .fa-caravan:before { content: "\f8ff"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-caret-square-down:before { content: "\f150"; } .fa-caret-square-left:before { content: "\f191"; } .fa-caret-square-right:before { content: "\f152"; } .fa-caret-square-up:before { content: "\f151"; } .fa-caret-up:before { content: "\f0d8"; } .fa-carrot:before { content: "\f787"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-cart-plus:before { content: "\f217"; } .fa-cash-register:before { content: "\f788"; } .fa-cat:before { content: "\f6be"; } .fa-cc-amazon-pay:before { content: "\f42d"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-apple-pay:before { content: "\f416"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-centercode:before { content: "\f380"; } .fa-centos:before { content: "\f789"; } .fa-certificate:before { content: "\f0a3"; } .fa-chair:before { content: "\f6c0"; } .fa-chalkboard:before { content: "\f51b"; } .fa-chalkboard-teacher:before { content: "\f51c"; } .fa-charging-station:before { content: "\f5e7"; } .fa-chart-area:before { content: "\f1fe"; } .fa-chart-bar:before { content: "\f080"; } .fa-chart-line:before { content: "\f201"; } .fa-chart-pie:before { content: "\f200"; } .fa-check:before { content: "\f00c"; } .fa-check-circle:before { content: "\f058"; } .fa-check-double:before { content: "\f560"; } .fa-check-square:before { content: "\f14a"; } .fa-cheese:before { content: "\f7ef"; } .fa-chess:before { content: "\f439"; } .fa-chess-bishop:before { content: "\f43a"; } .fa-chess-board:before { content: "\f43c"; } .fa-chess-king:before { content: "\f43f"; } .fa-chess-knight:before { content: "\f441"; } .fa-chess-pawn:before { content: "\f443"; } .fa-chess-queen:before { content: "\f445"; } .fa-chess-rook:before { content: "\f447"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-down:before { content: "\f078"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-chevron-up:before { content: "\f077"; } .fa-child:before { content: "\f1ae"; } .fa-chrome:before { content: "\f268"; } .fa-chromecast:before { content: "\f838"; } .fa-church:before { content: "\f51d"; } .fa-circle:before { content: "\f111"; } .fa-circle-notch:before { content: "\f1ce"; } .fa-city:before { content: "\f64f"; } .fa-clinic-medical:before { content: "\f7f2"; } .fa-clipboard:before { content: "\f328"; } .fa-clipboard-check:before { content: "\f46c"; } .fa-clipboard-list:before { content: "\f46d"; } .fa-clock:before { content: "\f017"; } .fa-clone:before { content: "\f24d"; } .fa-closed-captioning:before { content: "\f20a"; } .fa-cloud:before { content: "\f0c2"; } .fa-cloud-download-alt:before { content: "\f381"; } .fa-cloud-meatball:before { content: "\f73b"; } .fa-cloud-moon:before { content: "\f6c3"; } .fa-cloud-moon-rain:before { content: "\f73c"; } .fa-cloud-rain:before { content: "\f73d"; } .fa-cloud-showers-heavy:before { content: "\f740"; } .fa-cloud-sun:before { content: "\f6c4"; } .fa-cloud-sun-rain:before { content: "\f743"; } .fa-cloud-upload-alt:before { content: "\f382"; } .fa-cloudflare:before { content: "\e07d"; } .fa-cloudscale:before { content: "\f383"; } .fa-cloudsmith:before { content: "\f384"; } .fa-cloudversify:before { content: "\f385"; } .fa-cocktail:before { content: "\f561"; } .fa-code:before { content: "\f121"; } .fa-code-branch:before { content: "\f126"; } .fa-codepen:before { content: "\f1cb"; } .fa-codiepie:before { content: "\f284"; } .fa-coffee:before { content: "\f0f4"; } .fa-cog:before { content: "\f013"; } .fa-cogs:before { content: "\f085"; } .fa-coins:before { content: "\f51e"; } .fa-columns:before { content: "\f0db"; } .fa-comment:before { content: "\f075"; } .fa-comment-alt:before { content: "\f27a"; } .fa-comment-dollar:before { content: "\f651"; } .fa-comment-dots:before { content: "\f4ad"; } .fa-comment-medical:before { content: "\f7f5"; } .fa-comment-slash:before { content: "\f4b3"; } .fa-comments:before { content: "\f086"; } .fa-comments-dollar:before { content: "\f653"; } .fa-compact-disc:before { content: "\f51f"; } .fa-compass:before { content: "\f14e"; } .fa-compress:before { content: "\f066"; } .fa-compress-alt:before { content: "\f422"; } .fa-compress-arrows-alt:before { content: "\f78c"; } .fa-concierge-bell:before { content: "\f562"; } .fa-confluence:before { content: "\f78d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-contao:before { content: "\f26d"; } .fa-cookie:before { content: "\f563"; } .fa-cookie-bite:before { content: "\f564"; } .fa-copy:before { content: "\f0c5"; } .fa-copyright:before { content: "\f1f9"; } .fa-cotton-bureau:before { content: "\f89e"; } .fa-couch:before { content: "\f4b8"; } .fa-cpanel:before { content: "\f388"; } .fa-creative-commons:before { content: "\f25e"; } .fa-creative-commons-by:before { content: "\f4e7"; } .fa-creative-commons-nc:before { content: "\f4e8"; } .fa-creative-commons-nc-eu:before { content: "\f4e9"; } .fa-creative-commons-nc-jp:before { content: "\f4ea"; } .fa-creative-commons-nd:before { content: "\f4eb"; } .fa-creative-commons-pd:before { content: "\f4ec"; } .fa-creative-commons-pd-alt:before { content: "\f4ed"; } .fa-creative-commons-remix:before { content: "\f4ee"; } .fa-creative-commons-sa:before { content: "\f4ef"; } .fa-creative-commons-sampling:before { content: "\f4f0"; } .fa-creative-commons-sampling-plus:before { content: "\f4f1"; } .fa-creative-commons-share:before { content: "\f4f2"; } .fa-creative-commons-zero:before { content: "\f4f3"; } .fa-credit-card:before { content: "\f09d"; } .fa-critical-role:before { content: "\f6c9"; } .fa-crop:before { content: "\f125"; } .fa-crop-alt:before { content: "\f565"; } .fa-cross:before { content: "\f654"; } .fa-crosshairs:before { content: "\f05b"; } .fa-crow:before { content: "\f520"; } .fa-crown:before { content: "\f521"; } .fa-crutch:before { content: "\f7f7"; } .fa-css3:before { content: "\f13c"; } .fa-css3-alt:before { content: "\f38b"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-cut:before { content: "\f0c4"; } .fa-cuttlefish:before { content: "\f38c"; } .fa-d-and-d:before { content: "\f38d"; } .fa-d-and-d-beyond:before { content: "\f6ca"; } .fa-dailymotion:before { content: "\e052"; } .fa-dashcube:before { content: "\f210"; } .fa-database:before { content: "\f1c0"; } .fa-deaf:before { content: "\f2a4"; } .fa-deezer:before { content: "\e077"; } .fa-delicious:before { content: "\f1a5"; } .fa-democrat:before { content: "\f747"; } .fa-deploydog:before { content: "\f38e"; } .fa-deskpro:before { content: "\f38f"; } .fa-desktop:before { content: "\f108"; } .fa-dev:before { content: "\f6cc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-dharmachakra:before { content: "\f655"; } .fa-dhl:before { content: "\f790"; } .fa-diagnoses:before { content: "\f470"; } .fa-diaspora:before { content: "\f791"; } .fa-dice:before { content: "\f522"; } .fa-dice-d20:before { content: "\f6cf"; } .fa-dice-d6:before { content: "\f6d1"; } .fa-dice-five:before { content: "\f523"; } .fa-dice-four:before { content: "\f524"; } .fa-dice-one:before { content: "\f525"; } .fa-dice-six:before { content: "\f526"; } .fa-dice-three:before { content: "\f527"; } .fa-dice-two:before { content: "\f528"; } .fa-digg:before { content: "\f1a6"; } .fa-digital-ocean:before { content: "\f391"; } .fa-digital-tachograph:before { content: "\f566"; } .fa-directions:before { content: "\f5eb"; } .fa-discord:before { content: "\f392"; } .fa-discourse:before { content: "\f393"; } .fa-disease:before { content: "\f7fa"; } .fa-divide:before { content: "\f529"; } .fa-dizzy:before { content: "\f567"; } .fa-dna:before { content: "\f471"; } .fa-dochub:before { content: "\f394"; } .fa-docker:before { content: "\f395"; } .fa-dog:before { content: "\f6d3"; } .fa-dollar-sign:before { content: "\f155"; } .fa-dolly:before { content: "\f472"; } .fa-dolly-flatbed:before { content: "\f474"; } .fa-donate:before { content: "\f4b9"; } .fa-door-closed:before { content: "\f52a"; } .fa-door-open:before { content: "\f52b"; } .fa-dot-circle:before { content: "\f192"; } .fa-dove:before { content: "\f4ba"; } .fa-download:before { content: "\f019"; } .fa-draft2digital:before { content: "\f396"; } .fa-drafting-compass:before { content: "\f568"; } .fa-dragon:before { content: "\f6d5"; } .fa-draw-polygon:before { content: "\f5ee"; } .fa-dribbble:before { content: "\f17d"; } .fa-dribbble-square:before { content: "\f397"; } .fa-dropbox:before { content: "\f16b"; } .fa-drum:before { content: "\f569"; } .fa-drum-steelpan:before { content: "\f56a"; } .fa-drumstick-bite:before { content: "\f6d7"; } .fa-drupal:before { content: "\f1a9"; } .fa-dumbbell:before { content: "\f44b"; } .fa-dumpster:before { content: "\f793"; } .fa-dumpster-fire:before { content: "\f794"; } .fa-dungeon:before { content: "\f6d9"; } .fa-dyalog:before { content: "\f399"; } .fa-earlybirds:before { content: "\f39a"; } .fa-ebay:before { content: "\f4f4"; } .fa-edge:before { content: "\f282"; } .fa-edge-legacy:before { content: "\e078"; } .fa-edit:before { content: "\f044"; } .fa-egg:before { content: "\f7fb"; } .fa-eject:before { content: "\f052"; } .fa-elementor:before { content: "\f430"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-ello:before { content: "\f5f1"; } .fa-ember:before { content: "\f423"; } .fa-empire:before { content: "\f1d1"; } .fa-envelope:before { content: "\f0e0"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-open-text:before { content: "\f658"; } .fa-envelope-square:before { content: "\f199"; } .fa-envira:before { content: "\f299"; } .fa-equals:before { content: "\f52c"; } .fa-eraser:before { content: "\f12d"; } .fa-erlang:before { content: "\f39d"; } .fa-ethereum:before { content: "\f42e"; } .fa-ethernet:before { content: "\f796"; } .fa-etsy:before { content: "\f2d7"; } .fa-euro-sign:before { content: "\f153"; } .fa-evernote:before { content: "\f839"; } .fa-exchange-alt:before { content: "\f362"; } .fa-exclamation:before { content: "\f12a"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-exclamation-triangle:before { content: "\f071"; } .fa-expand:before { content: "\f065"; } .fa-expand-alt:before { content: "\f424"; } .fa-expand-arrows-alt:before { content: "\f31e"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-external-link-alt:before { content: "\f35d"; } .fa-external-link-square-alt:before { content: "\f360"; } .fa-eye:before { content: "\f06e"; } .fa-eye-dropper:before { content: "\f1fb"; } .fa-eye-slash:before { content: "\f070"; } .fa-facebook:before { content: "\f09a"; } .fa-facebook-f:before { content: "\f39e"; } .fa-facebook-messenger:before { content: "\f39f"; } .fa-facebook-square:before { content: "\f082"; } .fa-fan:before { content: "\f863"; } .fa-fantasy-flight-games:before { content: "\f6dc"; } .fa-fast-backward:before { content: "\f049"; } .fa-fast-forward:before { content: "\f050"; } .fa-faucet:before { content: "\e005"; } .fa-fax:before { content: "\f1ac"; } .fa-feather:before { content: "\f52d"; } .fa-feather-alt:before { content: "\f56b"; } .fa-fedex:before { content: "\f797"; } .fa-fedora:before { content: "\f798"; } .fa-female:before { content: "\f182"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-figma:before { content: "\f799"; } .fa-file:before { content: "\f15b"; } .fa-file-alt:before { content: "\f15c"; } .fa-file-archive:before { content: "\f1c6"; } .fa-file-audio:before { content: "\f1c7"; } .fa-file-code:before { content: "\f1c9"; } .fa-file-contract:before { content: "\f56c"; } .fa-file-csv:before { content: "\f6dd"; } .fa-file-download:before { content: "\f56d"; } .fa-file-excel:before { content: "\f1c3"; } .fa-file-export:before { content: "\f56e"; } .fa-file-image:before { content: "\f1c5"; } .fa-file-import:before { content: "\f56f"; } .fa-file-invoice:before { content: "\f570"; } .fa-file-invoice-dollar:before { content: "\f571"; } .fa-file-medical:before { content: "\f477"; } .fa-file-medical-alt:before { content: "\f478"; } .fa-file-pdf:before { content: "\f1c1"; } .fa-file-powerpoint:before { content: "\f1c4"; } .fa-file-prescription:before { content: "\f572"; } .fa-file-signature:before { content: "\f573"; } .fa-file-upload:before { content: "\f574"; } .fa-file-video:before { content: "\f1c8"; } .fa-file-word:before { content: "\f1c2"; } .fa-fill:before { content: "\f575"; } .fa-fill-drip:before { content: "\f576"; } .fa-film:before { content: "\f008"; } .fa-filter:before { content: "\f0b0"; } .fa-fingerprint:before { content: "\f577"; } .fa-fire:before { content: "\f06d"; } .fa-fire-alt:before { content: "\f7e4"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-firefox:before { content: "\f269"; } .fa-firefox-browser:before { content: "\e007"; } .fa-first-aid:before { content: "\f479"; } .fa-first-order:before { content: "\f2b0"; } .fa-first-order-alt:before { content: "\f50a"; } .fa-firstdraft:before { content: "\f3a1"; } .fa-fish:before { content: "\f578"; } .fa-fist-raised:before { content: "\f6de"; } .fa-flag:before { content: "\f024"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-flag-usa:before { content: "\f74d"; } .fa-flask:before { content: "\f0c3"; } .fa-flickr:before { content: "\f16e"; } .fa-flipboard:before { content: "\f44d"; } .fa-flushed:before { content: "\f579"; } .fa-fly:before { content: "\f417"; } .fa-folder:before { content: "\f07b"; } .fa-folder-minus:before { content: "\f65d"; } .fa-folder-open:before { content: "\f07c"; } .fa-folder-plus:before { content: "\f65e"; } .fa-font:before { content: "\f031"; } .fa-font-awesome:before { content: "\f2b4"; } .fa-font-awesome-alt:before { content: "\f35c"; } .fa-font-awesome-flag:before { content: "\f425"; } .fa-font-awesome-logo-full:before { content: "\f4e6"; } .fa-fonticons:before { content: "\f280"; } .fa-fonticons-fi:before { content: "\f3a2"; } .fa-football-ball:before { content: "\f44e"; } .fa-fort-awesome:before { content: "\f286"; } .fa-fort-awesome-alt:before { content: "\f3a3"; } .fa-forumbee:before { content: "\f211"; } .fa-forward:before { content: "\f04e"; } .fa-foursquare:before { content: "\f180"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-freebsd:before { content: "\f3a4"; } .fa-frog:before { content: "\f52e"; } .fa-frown:before { content: "\f119"; } .fa-frown-open:before { content: "\f57a"; } .fa-fulcrum:before { content: "\f50b"; } .fa-funnel-dollar:before { content: "\f662"; } .fa-futbol:before { content: "\f1e3"; } .fa-galactic-republic:before { content: "\f50c"; } .fa-galactic-senate:before { content: "\f50d"; } .fa-gamepad:before { content: "\f11b"; } .fa-gas-pump:before { content: "\f52f"; } .fa-gavel:before { content: "\f0e3"; } .fa-gem:before { content: "\f3a5"; } .fa-genderless:before { content: "\f22d"; } .fa-get-pocket:before { content: "\f265"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-ghost:before { content: "\f6e2"; } .fa-gift:before { content: "\f06b"; } .fa-gifts:before { content: "\f79c"; } .fa-git:before { content: "\f1d3"; } .fa-git-alt:before { content: "\f841"; } .fa-git-square:before { content: "\f1d2"; } .fa-github:before { content: "\f09b"; } .fa-github-alt:before { content: "\f113"; } .fa-github-square:before { content: "\f092"; } .fa-gitkraken:before { content: "\f3a6"; } .fa-gitlab:before { content: "\f296"; } .fa-gitter:before { content: "\f426"; } .fa-glass-cheers:before { content: "\f79f"; } .fa-glass-martini:before { content: "\f000"; } .fa-glass-martini-alt:before { content: "\f57b"; } .fa-glass-whiskey:before { content: "\f7a0"; } .fa-glasses:before { content: "\f530"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-globe:before { content: "\f0ac"; } .fa-globe-africa:before { content: "\f57c"; } .fa-globe-americas:before { content: "\f57d"; } .fa-globe-asia:before { content: "\f57e"; } .fa-globe-europe:before { content: "\f7a2"; } .fa-gofore:before { content: "\f3a7"; } .fa-golf-ball:before { content: "\f450"; } .fa-goodreads:before { content: "\f3a8"; } .fa-goodreads-g:before { content: "\f3a9"; } .fa-google:before { content: "\f1a0"; } .fa-google-drive:before { content: "\f3aa"; } .fa-google-pay:before { content: "\e079"; } .fa-google-play:before { content: "\f3ab"; } .fa-google-plus:before { content: "\f2b3"; } .fa-google-plus-g:before { content: "\f0d5"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-gopuram:before { content: "\f664"; } .fa-graduation-cap:before { content: "\f19d"; } .fa-gratipay:before { content: "\f184"; } .fa-grav:before { content: "\f2d6"; } .fa-greater-than:before { content: "\f531"; } .fa-greater-than-equal:before { content: "\f532"; } .fa-grimace:before { content: "\f57f"; } .fa-grin:before { content: "\f580"; } .fa-grin-alt:before { content: "\f581"; } .fa-grin-beam:before { content: "\f582"; } .fa-grin-beam-sweat:before { content: "\f583"; } .fa-grin-hearts:before { content: "\f584"; } .fa-grin-squint:before { content: "\f585"; } .fa-grin-squint-tears:before { content: "\f586"; } .fa-grin-stars:before { content: "\f587"; } .fa-grin-tears:before { content: "\f588"; } .fa-grin-tongue:before { content: "\f589"; } .fa-grin-tongue-squint:before { content: "\f58a"; } .fa-grin-tongue-wink:before { content: "\f58b"; } .fa-grin-wink:before { content: "\f58c"; } .fa-grip-horizontal:before { content: "\f58d"; } .fa-grip-lines:before { content: "\f7a4"; } .fa-grip-lines-vertical:before { content: "\f7a5"; } .fa-grip-vertical:before { content: "\f58e"; } .fa-gripfire:before { content: "\f3ac"; } .fa-grunt:before { content: "\f3ad"; } .fa-guilded:before { content: "\e07e"; } .fa-guitar:before { content: "\f7a6"; } .fa-gulp:before { content: "\f3ae"; } .fa-h-square:before { content: "\f0fd"; } .fa-hacker-news:before { content: "\f1d4"; } .fa-hacker-news-square:before { content: "\f3af"; } .fa-hackerrank:before { content: "\f5f7"; } .fa-hamburger:before { content: "\f805"; } .fa-hammer:before { content: "\f6e3"; } .fa-hamsa:before { content: "\f665"; } .fa-hand-holding:before { content: "\f4bd"; } .fa-hand-holding-heart:before { content: "\f4be"; } .fa-hand-holding-medical:before { content: "\e05c"; } .fa-hand-holding-usd:before { content: "\f4c0"; } .fa-hand-holding-water:before { content: "\f4c1"; } .fa-hand-lizard:before { content: "\f258"; } .fa-hand-middle-finger:before { content: "\f806"; } .fa-hand-paper:before { content: "\f256"; } .fa-hand-peace:before { content: "\f25b"; } .fa-hand-point-down:before { content: "\f0a7"; } .fa-hand-point-left:before { content: "\f0a5"; } .fa-hand-point-right:before { content: "\f0a4"; } .fa-hand-point-up:before { content: "\f0a6"; } .fa-hand-pointer:before { content: "\f25a"; } .fa-hand-rock:before { content: "\f255"; } .fa-hand-scissors:before { content: "\f257"; } .fa-hand-sparkles:before { content: "\e05d"; } .fa-hand-spock:before { content: "\f259"; } .fa-hands:before { content: "\f4c2"; } .fa-hands-helping:before { content: "\f4c4"; } .fa-hands-wash:before { content: "\e05e"; } .fa-handshake:before { content: "\f2b5"; } .fa-handshake-alt-slash:before { content: "\e05f"; } .fa-handshake-slash:before { content: "\e060"; } .fa-hanukiah:before { content: "\f6e6"; } .fa-hard-hat:before { content: "\f807"; } .fa-hashtag:before { content: "\f292"; } .fa-hat-cowboy:before { content: "\f8c0"; } .fa-hat-cowboy-side:before { content: "\f8c1"; } .fa-hat-wizard:before { content: "\f6e8"; } .fa-hdd:before { content: "\f0a0"; } .fa-head-side-cough:before { content: "\e061"; } .fa-head-side-cough-slash:before { content: "\e062"; } .fa-head-side-mask:before { content: "\e063"; } .fa-head-side-virus:before { content: "\e064"; } .fa-heading:before { content: "\f1dc"; } .fa-headphones:before { content: "\f025"; } .fa-headphones-alt:before { content: "\f58f"; } .fa-headset:before { content: "\f590"; } .fa-heart:before { content: "\f004"; } .fa-heart-broken:before { content: "\f7a9"; } .fa-heartbeat:before { content: "\f21e"; } .fa-helicopter:before { content: "\f533"; } .fa-highlighter:before { content: "\f591"; } .fa-hiking:before { content: "\f6ec"; } .fa-hippo:before { content: "\f6ed"; } .fa-hips:before { content: "\f452"; } .fa-hire-a-helper:before { content: "\f3b0"; } .fa-history:before { content: "\f1da"; } .fa-hive:before { content: "\e07f"; } .fa-hockey-puck:before { content: "\f453"; } .fa-holly-berry:before { content: "\f7aa"; } .fa-home:before { content: "\f015"; } .fa-hooli:before { content: "\f427"; } .fa-hornbill:before { content: "\f592"; } .fa-horse:before { content: "\f6f0"; } .fa-horse-head:before { content: "\f7ab"; } .fa-hospital:before { content: "\f0f8"; } .fa-hospital-alt:before { content: "\f47d"; } .fa-hospital-symbol:before { content: "\f47e"; } .fa-hospital-user:before { content: "\f80d"; } .fa-hot-tub:before { content: "\f593"; } .fa-hotdog:before { content: "\f80f"; } .fa-hotel:before { content: "\f594"; } .fa-hotjar:before { content: "\f3b1"; } .fa-hourglass:before { content: "\f254"; } .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-start:before { content: "\f251"; } .fa-house-damage:before { content: "\f6f1"; } .fa-house-user:before { content: "\e065"; } .fa-houzz:before { content: "\f27c"; } .fa-hryvnia:before { content: "\f6f2"; } .fa-html5:before { content: "\f13b"; } .fa-hubspot:before { content: "\f3b2"; } .fa-i-cursor:before { content: "\f246"; } .fa-ice-cream:before { content: "\f810"; } .fa-icicles:before { content: "\f7ad"; } .fa-icons:before { content: "\f86d"; } .fa-id-badge:before { content: "\f2c1"; } .fa-id-card:before { content: "\f2c2"; } .fa-id-card-alt:before { content: "\f47f"; } .fa-ideal:before { content: "\e013"; } .fa-igloo:before { content: "\f7ae"; } .fa-image:before { content: "\f03e"; } .fa-images:before { content: "\f302"; } .fa-imdb:before { content: "\f2d8"; } .fa-inbox:before { content: "\f01c"; } .fa-indent:before { content: "\f03c"; } .fa-industry:before { content: "\f275"; } .fa-infinity:before { content: "\f534"; } .fa-info:before { content: "\f129"; } .fa-info-circle:before { content: "\f05a"; } .fa-innosoft:before { content: "\e080"; } .fa-instagram:before { content: "\f16d"; } .fa-instagram-square:before { content: "\e055"; } .fa-instalod:before { content: "\e081"; } .fa-intercom:before { content: "\f7af"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-invision:before { content: "\f7b0"; } .fa-ioxhost:before { content: "\f208"; } .fa-italic:before { content: "\f033"; } .fa-itch-io:before { content: "\f83a"; } .fa-itunes:before { content: "\f3b4"; } .fa-itunes-note:before { content: "\f3b5"; } .fa-java:before { content: "\f4e4"; } .fa-jedi:before { content: "\f669"; } .fa-jedi-order:before { content: "\f50e"; } .fa-jenkins:before { content: "\f3b6"; } .fa-jira:before { content: "\f7b1"; } .fa-joget:before { content: "\f3b7"; } .fa-joint:before { content: "\f595"; } .fa-joomla:before { content: "\f1aa"; } .fa-journal-whills:before { content: "\f66a"; } .fa-js:before { content: "\f3b8"; } .fa-js-square:before { content: "\f3b9"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-kaaba:before { content: "\f66b"; } .fa-kaggle:before { content: "\f5fa"; } .fa-key:before { content: "\f084"; } .fa-keybase:before { content: "\f4f5"; } .fa-keyboard:before { content: "\f11c"; } .fa-keycdn:before { content: "\f3ba"; } .fa-khanda:before { content: "\f66d"; } .fa-kickstarter:before { content: "\f3bb"; } .fa-kickstarter-k:before { content: "\f3bc"; } .fa-kiss:before { content: "\f596"; } .fa-kiss-beam:before { content: "\f597"; } .fa-kiss-wink-heart:before { content: "\f598"; } .fa-kiwi-bird:before { content: "\f535"; } .fa-korvue:before { content: "\f42f"; } .fa-landmark:before { content: "\f66f"; } .fa-language:before { content: "\f1ab"; } .fa-laptop:before { content: "\f109"; } .fa-laptop-code:before { content: "\f5fc"; } .fa-laptop-house:before { content: "\e066"; } .fa-laptop-medical:before { content: "\f812"; } .fa-laravel:before { content: "\f3bd"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-laugh:before { content: "\f599"; } .fa-laugh-beam:before { content: "\f59a"; } .fa-laugh-squint:before { content: "\f59b"; } .fa-laugh-wink:before { content: "\f59c"; } .fa-layer-group:before { content: "\f5fd"; } .fa-leaf:before { content: "\f06c"; } .fa-leanpub:before { content: "\f212"; } .fa-lemon:before { content: "\f094"; } .fa-less:before { content: "\f41d"; } .fa-less-than:before { content: "\f536"; } .fa-less-than-equal:before { content: "\f537"; } .fa-level-down-alt:before { content: "\f3be"; } .fa-level-up-alt:before { content: "\f3bf"; } .fa-life-ring:before { content: "\f1cd"; } .fa-lightbulb:before { content: "\f0eb"; } .fa-line:before { content: "\f3c0"; } .fa-link:before { content: "\f0c1"; } .fa-linkedin:before { content: "\f08c"; } .fa-linkedin-in:before { content: "\f0e1"; } .fa-linode:before { content: "\f2b8"; } .fa-linux:before { content: "\f17c"; } .fa-lira-sign:before { content: "\f195"; } .fa-list:before { content: "\f03a"; } .fa-list-alt:before { content: "\f022"; } .fa-list-ol:before { content: "\f0cb"; } .fa-list-ul:before { content: "\f0ca"; } .fa-location-arrow:before { content: "\f124"; } .fa-lock:before { content: "\f023"; } .fa-lock-open:before { content: "\f3c1"; } .fa-long-arrow-alt-down:before { content: "\f309"; } .fa-long-arrow-alt-left:before { content: "\f30a"; } .fa-long-arrow-alt-right:before { content: "\f30b"; } .fa-long-arrow-alt-up:before { content: "\f30c"; } .fa-low-vision:before { content: "\f2a8"; } .fa-luggage-cart:before { content: "\f59d"; } .fa-lungs:before { content: "\f604"; } .fa-lungs-virus:before { content: "\e067"; } .fa-lyft:before { content: "\f3c3"; } .fa-magento:before { content: "\f3c4"; } .fa-magic:before { content: "\f0d0"; } .fa-magnet:before { content: "\f076"; } .fa-mail-bulk:before { content: "\f674"; } .fa-mailchimp:before { content: "\f59e"; } .fa-male:before { content: "\f183"; } .fa-mandalorian:before { content: "\f50f"; } .fa-map:before { content: "\f279"; } .fa-map-marked:before { content: "\f59f"; } .fa-map-marked-alt:before { content: "\f5a0"; } .fa-map-marker:before { content: "\f041"; } .fa-map-marker-alt:before { content: "\f3c5"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-markdown:before { content: "\f60f"; } .fa-marker:before { content: "\f5a1"; } .fa-mars:before { content: "\f222"; } .fa-mars-double:before { content: "\f227"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mask:before { content: "\f6fa"; } .fa-mastodon:before { content: "\f4f6"; } .fa-maxcdn:before { content: "\f136"; } .fa-mdb:before { content: "\f8ca"; } .fa-medal:before { content: "\f5a2"; } .fa-medapps:before { content: "\f3c6"; } .fa-medium:before { content: "\f23a"; } .fa-medium-m:before { content: "\f3c7"; } .fa-medkit:before { content: "\f0fa"; } .fa-medrt:before { content: "\f3c8"; } .fa-meetup:before { content: "\f2e0"; } .fa-megaport:before { content: "\f5a3"; } .fa-meh:before { content: "\f11a"; } .fa-meh-blank:before { content: "\f5a4"; } .fa-meh-rolling-eyes:before { content: "\f5a5"; } .fa-memory:before { content: "\f538"; } .fa-mendeley:before { content: "\f7b3"; } .fa-menorah:before { content: "\f676"; } .fa-mercury:before { content: "\f223"; } .fa-meteor:before { content: "\f753"; } .fa-microblog:before { content: "\e01a"; } .fa-microchip:before { content: "\f2db"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-alt:before { content: "\f3c9"; } .fa-microphone-alt-slash:before { content: "\f539"; } .fa-microphone-slash:before { content: "\f131"; } .fa-microscope:before { content: "\f610"; } .fa-microsoft:before { content: "\f3ca"; } .fa-minus:before { content: "\f068"; } .fa-minus-circle:before { content: "\f056"; } .fa-minus-square:before { content: "\f146"; } .fa-mitten:before { content: "\f7b5"; } .fa-mix:before { content: "\f3cb"; } .fa-mixcloud:before { content: "\f289"; } .fa-mixer:before { content: "\e056"; } .fa-mizuni:before { content: "\f3cc"; } .fa-mobile:before { content: "\f10b"; } .fa-mobile-alt:before { content: "\f3cd"; } .fa-modx:before { content: "\f285"; } .fa-monero:before { content: "\f3d0"; } .fa-money-bill:before { content: "\f0d6"; } .fa-money-bill-alt:before { content: "\f3d1"; } .fa-money-bill-wave:before { content: "\f53a"; } .fa-money-bill-wave-alt:before { content: "\f53b"; } .fa-money-check:before { content: "\f53c"; } .fa-money-check-alt:before { content: "\f53d"; } .fa-monument:before { content: "\f5a6"; } .fa-moon:before { content: "\f186"; } .fa-mortar-pestle:before { content: "\f5a7"; } .fa-mosque:before { content: "\f678"; } .fa-motorcycle:before { content: "\f21c"; } .fa-mountain:before { content: "\f6fc"; } .fa-mouse:before { content: "\f8cc"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-mug-hot:before { content: "\f7b6"; } .fa-music:before { content: "\f001"; } .fa-napster:before { content: "\f3d2"; } .fa-neos:before { content: "\f612"; } .fa-network-wired:before { content: "\f6ff"; } .fa-neuter:before { content: "\f22c"; } .fa-newspaper:before { content: "\f1ea"; } .fa-nimblr:before { content: "\f5a8"; } .fa-node:before { content: "\f419"; } .fa-node-js:before { content: "\f3d3"; } .fa-not-equal:before { content: "\f53e"; } .fa-notes-medical:before { content: "\f481"; } .fa-npm:before { content: "\f3d4"; } .fa-ns8:before { content: "\f3d5"; } .fa-nutritionix:before { content: "\f3d6"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-octopus-deploy:before { content: "\e082"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-oil-can:before { content: "\f613"; } .fa-old-republic:before { content: "\f510"; } .fa-om:before { content: "\f679"; } .fa-opencart:before { content: "\f23d"; } .fa-openid:before { content: "\f19b"; } .fa-opera:before { content: "\f26a"; } .fa-optin-monster:before { content: "\f23c"; } .fa-orcid:before { content: "\f8d2"; } .fa-osi:before { content: "\f41a"; } .fa-otter:before { content: "\f700"; } .fa-outdent:before { content: "\f03b"; } .fa-page4:before { content: "\f3d7"; } .fa-pagelines:before { content: "\f18c"; } .fa-pager:before { content: "\f815"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-paint-roller:before { content: "\f5aa"; } .fa-palette:before { content: "\f53f"; } .fa-palfed:before { content: "\f3d8"; } .fa-pallet:before { content: "\f482"; } .fa-paper-plane:before { content: "\f1d8"; } .fa-paperclip:before { content: "\f0c6"; } .fa-parachute-box:before { content: "\f4cd"; } .fa-paragraph:before { content: "\f1dd"; } .fa-parking:before { content: "\f540"; } .fa-passport:before { content: "\f5ab"; } .fa-pastafarianism:before { content: "\f67b"; } .fa-paste:before { content: "\f0ea"; } .fa-patreon:before { content: "\f3d9"; } .fa-pause:before { content: "\f04c"; } .fa-pause-circle:before { content: "\f28b"; } .fa-paw:before { content: "\f1b0"; } .fa-paypal:before { content: "\f1ed"; } .fa-peace:before { content: "\f67c"; } .fa-pen:before { content: "\f304"; } .fa-pen-alt:before { content: "\f305"; } .fa-pen-fancy:before { content: "\f5ac"; } .fa-pen-nib:before { content: "\f5ad"; } .fa-pen-square:before { content: "\f14b"; } .fa-pencil-alt:before { content: "\f303"; } .fa-pencil-ruler:before { content: "\f5ae"; } .fa-penny-arcade:before { content: "\f704"; } .fa-people-arrows:before { content: "\e068"; } .fa-people-carry:before { content: "\f4ce"; } .fa-pepper-hot:before { content: "\f816"; } .fa-perbyte:before { content: "\e083"; } .fa-percent:before { content: "\f295"; } .fa-percentage:before { content: "\f541"; } .fa-periscope:before { content: "\f3da"; } .fa-person-booth:before { content: "\f756"; } .fa-phabricator:before { content: "\f3db"; } .fa-phoenix-framework:before { content: "\f3dc"; } .fa-phoenix-squadron:before { content: "\f511"; } .fa-phone:before { content: "\f095"; } .fa-phone-alt:before { content: "\f879"; } .fa-phone-slash:before { content: "\f3dd"; } .fa-phone-square:before { content: "\f098"; } .fa-phone-square-alt:before { content: "\f87b"; } .fa-phone-volume:before { content: "\f2a0"; } .fa-photo-video:before { content: "\f87c"; } .fa-php:before { content: "\f457"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-pied-piper-hat:before { content: "\f4e5"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-square:before { content: "\e01e"; } .fa-piggy-bank:before { content: "\f4d3"; } .fa-pills:before { content: "\f484"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-p:before { content: "\f231"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-pizza-slice:before { content: "\f818"; } .fa-place-of-worship:before { content: "\f67f"; } .fa-plane:before { content: "\f072"; } .fa-plane-arrival:before { content: "\f5af"; } .fa-plane-departure:before { content: "\f5b0"; } .fa-plane-slash:before { content: "\e069"; } .fa-play:before { content: "\f04b"; } .fa-play-circle:before { content: "\f144"; } .fa-playstation:before { content: "\f3df"; } .fa-plug:before { content: "\f1e6"; } .fa-plus:before { content: "\f067"; } .fa-plus-circle:before { content: "\f055"; } .fa-plus-square:before { content: "\f0fe"; } .fa-podcast:before { content: "\f2ce"; } .fa-poll:before { content: "\f681"; } .fa-poll-h:before { content: "\f682"; } .fa-poo:before { content: "\f2fe"; } .fa-poo-storm:before { content: "\f75a"; } .fa-poop:before { content: "\f619"; } .fa-portrait:before { content: "\f3e0"; } .fa-pound-sign:before { content: "\f154"; } .fa-power-off:before { content: "\f011"; } .fa-pray:before { content: "\f683"; } .fa-praying-hands:before { content: "\f684"; } .fa-prescription:before { content: "\f5b1"; } .fa-prescription-bottle:before { content: "\f485"; } .fa-prescription-bottle-alt:before { content: "\f486"; } .fa-print:before { content: "\f02f"; } .fa-procedures:before { content: "\f487"; } .fa-product-hunt:before { content: "\f288"; } .fa-project-diagram:before { content: "\f542"; } .fa-pump-medical:before { content: "\e06a"; } .fa-pump-soap:before { content: "\e06b"; } .fa-pushed:before { content: "\f3e1"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-python:before { content: "\f3e2"; } .fa-qq:before { content: "\f1d6"; } .fa-qrcode:before { content: "\f029"; } .fa-question:before { content: "\f128"; } .fa-question-circle:before { content: "\f059"; } .fa-quidditch:before { content: "\f458"; } .fa-quinscape:before { content: "\f459"; } .fa-quora:before { content: "\f2c4"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-quran:before { content: "\f687"; } .fa-r-project:before { content: "\f4f7"; } .fa-radiation:before { content: "\f7b9"; } .fa-radiation-alt:before { content: "\f7ba"; } .fa-rainbow:before { content: "\f75b"; } .fa-random:before { content: "\f074"; } .fa-raspberry-pi:before { content: "\f7bb"; } .fa-ravelry:before { content: "\f2d9"; } .fa-react:before { content: "\f41b"; } .fa-reacteurope:before { content: "\f75d"; } .fa-readme:before { content: "\f4d5"; } .fa-rebel:before { content: "\f1d0"; } .fa-receipt:before { content: "\f543"; } .fa-record-vinyl:before { content: "\f8d9"; } .fa-recycle:before { content: "\f1b8"; } .fa-red-river:before { content: "\f3e3"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-alien:before { content: "\f281"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-redhat:before { content: "\f7bc"; } .fa-redo:before { content: "\f01e"; } .fa-redo-alt:before { content: "\f2f9"; } .fa-registered:before { content: "\f25d"; } .fa-remove-format:before { content: "\f87d"; } .fa-renren:before { content: "\f18b"; } .fa-reply:before { content: "\f3e5"; } .fa-reply-all:before { content: "\f122"; } .fa-replyd:before { content: "\f3e6"; } .fa-republican:before { content: "\f75e"; } .fa-researchgate:before { content: "\f4f8"; } .fa-resolving:before { content: "\f3e7"; } .fa-restroom:before { content: "\f7bd"; } .fa-retweet:before { content: "\f079"; } .fa-rev:before { content: "\f5b2"; } .fa-ribbon:before { content: "\f4d6"; } .fa-ring:before { content: "\f70b"; } .fa-road:before { content: "\f018"; } .fa-robot:before { content: "\f544"; } .fa-rocket:before { content: "\f135"; } .fa-rocketchat:before { content: "\f3e8"; } .fa-rockrms:before { content: "\f3e9"; } .fa-route:before { content: "\f4d7"; } .fa-rss:before { content: "\f09e"; } .fa-rss-square:before { content: "\f143"; } .fa-ruble-sign:before { content: "\f158"; } .fa-ruler:before { content: "\f545"; } .fa-ruler-combined:before { content: "\f546"; } .fa-ruler-horizontal:before { content: "\f547"; } .fa-ruler-vertical:before { content: "\f548"; } .fa-running:before { content: "\f70c"; } .fa-rupee-sign:before { content: "\f156"; } .fa-rust:before { content: "\e07a"; } .fa-sad-cry:before { content: "\f5b3"; } .fa-sad-tear:before { content: "\f5b4"; } .fa-safari:before { content: "\f267"; } .fa-salesforce:before { content: "\f83b"; } .fa-sass:before { content: "\f41e"; } .fa-satellite:before { content: "\f7bf"; } .fa-satellite-dish:before { content: "\f7c0"; } .fa-save:before { content: "\f0c7"; } .fa-schlix:before { content: "\f3ea"; } .fa-school:before { content: "\f549"; } .fa-screwdriver:before { content: "\f54a"; } .fa-scribd:before { content: "\f28a"; } .fa-scroll:before { content: "\f70e"; } .fa-sd-card:before { content: "\f7c2"; } .fa-search:before { content: "\f002"; } .fa-search-dollar:before { content: "\f688"; } .fa-search-location:before { content: "\f689"; } .fa-search-minus:before { content: "\f010"; } .fa-search-plus:before { content: "\f00e"; } .fa-searchengin:before { content: "\f3eb"; } .fa-seedling:before { content: "\f4d8"; } .fa-sellcast:before { content: "\f2da"; } .fa-sellsy:before { content: "\f213"; } .fa-server:before { content: "\f233"; } .fa-servicestack:before { content: "\f3ec"; } .fa-shapes:before { content: "\f61f"; } .fa-share:before { content: "\f064"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-share-square:before { content: "\f14d"; } .fa-shekel-sign:before { content: "\f20b"; } .fa-shield-alt:before { content: "\f3ed"; } .fa-shield-virus:before { content: "\e06c"; } .fa-ship:before { content: "\f21a"; } .fa-shipping-fast:before { content: "\f48b"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-shoe-prints:before { content: "\f54b"; } .fa-shopify:before { content: "\e057"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-shopware:before { content: "\f5b5"; } .fa-shower:before { content: "\f2cc"; } .fa-shuttle-van:before { content: "\f5b6"; } .fa-sign:before { content: "\f4d9"; } .fa-sign-in-alt:before { content: "\f2f6"; } .fa-sign-language:before { content: "\f2a7"; } .fa-sign-out-alt:before { content: "\f2f5"; } .fa-signal:before { content: "\f012"; } .fa-signature:before { content: "\f5b7"; } .fa-sim-card:before { content: "\f7c4"; } .fa-simplybuilt:before { content: "\f215"; } .fa-sink:before { content: "\e06d"; } .fa-sistrix:before { content: "\f3ee"; } .fa-sitemap:before { content: "\f0e8"; } .fa-sith:before { content: "\f512"; } .fa-skating:before { content: "\f7c5"; } .fa-sketch:before { content: "\f7c6"; } .fa-skiing:before { content: "\f7c9"; } .fa-skiing-nordic:before { content: "\f7ca"; } .fa-skull:before { content: "\f54c"; } .fa-skull-crossbones:before { content: "\f714"; } .fa-skyatlas:before { content: "\f216"; } .fa-skype:before { content: "\f17e"; } .fa-slack:before { content: "\f198"; } .fa-slack-hash:before { content: "\f3ef"; } .fa-slash:before { content: "\f715"; } .fa-sleigh:before { content: "\f7cc"; } .fa-sliders-h:before { content: "\f1de"; } .fa-slideshare:before { content: "\f1e7"; } .fa-smile:before { content: "\f118"; } .fa-smile-beam:before { content: "\f5b8"; } .fa-smile-wink:before { content: "\f4da"; } .fa-smog:before { content: "\f75f"; } .fa-smoking:before { content: "\f48d"; } .fa-smoking-ban:before { content: "\f54d"; } .fa-sms:before { content: "\f7cd"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-snowboarding:before { content: "\f7ce"; } .fa-snowflake:before { content: "\f2dc"; } .fa-snowman:before { content: "\f7d0"; } .fa-snowplow:before { content: "\f7d2"; } .fa-soap:before { content: "\e06e"; } .fa-socks:before { content: "\f696"; } .fa-solar-panel:before { content: "\f5ba"; } .fa-sort:before { content: "\f0dc"; } .fa-sort-alpha-down:before { content: "\f15d"; } .fa-sort-alpha-down-alt:before { content: "\f881"; } .fa-sort-alpha-up:before { content: "\f15e"; } .fa-sort-alpha-up-alt:before { content: "\f882"; } .fa-sort-amount-down:before { content: "\f160"; } .fa-sort-amount-down-alt:before { content: "\f884"; } .fa-sort-amount-up:before { content: "\f161"; } .fa-sort-amount-up-alt:before { content: "\f885"; } .fa-sort-down:before { content: "\f0dd"; } .fa-sort-numeric-down:before { content: "\f162"; } .fa-sort-numeric-down-alt:before { content: "\f886"; } .fa-sort-numeric-up:before { content: "\f163"; } .fa-sort-numeric-up-alt:before { content: "\f887"; } .fa-sort-up:before { content: "\f0de"; } .fa-soundcloud:before { content: "\f1be"; } .fa-sourcetree:before { content: "\f7d3"; } .fa-spa:before { content: "\f5bb"; } .fa-space-shuttle:before { content: "\f197"; } .fa-speakap:before { content: "\f3f3"; } .fa-speaker-deck:before { content: "\f83c"; } .fa-spell-check:before { content: "\f891"; } .fa-spider:before { content: "\f717"; } .fa-spinner:before { content: "\f110"; } .fa-splotch:before { content: "\f5bc"; } .fa-spotify:before { content: "\f1bc"; } .fa-spray-can:before { content: "\f5bd"; } .fa-square:before { content: "\f0c8"; } .fa-square-full:before { content: "\f45c"; } .fa-square-root-alt:before { content: "\f698"; } .fa-squarespace:before { content: "\f5be"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-stackpath:before { content: "\f842"; } .fa-stamp:before { content: "\f5bf"; } .fa-star:before { content: "\f005"; } .fa-star-and-crescent:before { content: "\f699"; } .fa-star-half:before { content: "\f089"; } .fa-star-half-alt:before { content: "\f5c0"; } .fa-star-of-david:before { content: "\f69a"; } .fa-star-of-life:before { content: "\f621"; } .fa-staylinked:before { content: "\f3f5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-steam-symbol:before { content: "\f3f6"; } .fa-step-backward:before { content: "\f048"; } .fa-step-forward:before { content: "\f051"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-sticker-mule:before { content: "\f3f7"; } .fa-sticky-note:before { content: "\f249"; } .fa-stop:before { content: "\f04d"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stopwatch:before { content: "\f2f2"; } .fa-stopwatch-20:before { content: "\e06f"; } .fa-store:before { content: "\f54e"; } .fa-store-alt:before { content: "\f54f"; } .fa-store-alt-slash:before { content: "\e070"; } .fa-store-slash:before { content: "\e071"; } .fa-strava:before { content: "\f428"; } .fa-stream:before { content: "\f550"; } .fa-street-view:before { content: "\f21d"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-stripe:before { content: "\f429"; } .fa-stripe-s:before { content: "\f42a"; } .fa-stroopwafel:before { content: "\f551"; } .fa-studiovinari:before { content: "\f3f8"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-subscript:before { content: "\f12c"; } .fa-subway:before { content: "\f239"; } .fa-suitcase:before { content: "\f0f2"; } .fa-suitcase-rolling:before { content: "\f5c1"; } .fa-sun:before { content: "\f185"; } .fa-superpowers:before { content: "\f2dd"; } .fa-superscript:before { content: "\f12b"; } .fa-supple:before { content: "\f3f9"; } .fa-surprise:before { content: "\f5c2"; } .fa-suse:before { content: "\f7d6"; } .fa-swatchbook:before { content: "\f5c3"; } .fa-swift:before { content: "\f8e1"; } .fa-swimmer:before { content: "\f5c4"; } .fa-swimming-pool:before { content: "\f5c5"; } .fa-symfony:before { content: "\f83d"; } .fa-synagogue:before { content: "\f69b"; } .fa-sync:before { content: "\f021"; } .fa-sync-alt:before { content: "\f2f1"; } .fa-syringe:before { content: "\f48e"; } .fa-table:before { content: "\f0ce"; } .fa-table-tennis:before { content: "\f45d"; } .fa-tablet:before { content: "\f10a"; } .fa-tablet-alt:before { content: "\f3fa"; } .fa-tablets:before { content: "\f490"; } .fa-tachometer-alt:before { content: "\f3fd"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-tape:before { content: "\f4db"; } .fa-tasks:before { content: "\f0ae"; } .fa-taxi:before { content: "\f1ba"; } .fa-teamspeak:before { content: "\f4f9"; } .fa-teeth:before { content: "\f62e"; } .fa-teeth-open:before { content: "\f62f"; } .fa-telegram:before { content: "\f2c6"; } .fa-telegram-plane:before { content: "\f3fe"; } .fa-temperature-high:before { content: "\f769"; } .fa-temperature-low:before { content: "\f76b"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-tenge:before { content: "\f7d7"; } .fa-terminal:before { content: "\f120"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-th:before { content: "\f00a"; } .fa-th-large:before { content: "\f009"; } .fa-th-list:before { content: "\f00b"; } .fa-the-red-yeti:before { content: "\f69d"; } .fa-theater-masks:before { content: "\f630"; } .fa-themeco:before { content: "\f5c6"; } .fa-themeisle:before { content: "\f2b2"; } .fa-thermometer:before { content: "\f491"; } .fa-thermometer-empty:before { content: "\f2cb"; } .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-think-peaks:before { content: "\f731"; } .fa-thumbs-down:before { content: "\f165"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbtack:before { content: "\f08d"; } .fa-ticket-alt:before { content: "\f3ff"; } .fa-tiktok:before { content: "\e07b"; } .fa-times:before { content: "\f00d"; } .fa-times-circle:before { content: "\f057"; } .fa-tint:before { content: "\f043"; } .fa-tint-slash:before { content: "\f5c7"; } .fa-tired:before { content: "\f5c8"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-toilet:before { content: "\f7d8"; } .fa-toilet-paper:before { content: "\f71e"; } .fa-toilet-paper-slash:before { content: "\e072"; } .fa-toolbox:before { content: "\f552"; } .fa-tools:before { content: "\f7d9"; } .fa-tooth:before { content: "\f5c9"; } .fa-torah:before { content: "\f6a0"; } .fa-torii-gate:before { content: "\f6a1"; } .fa-tractor:before { content: "\f722"; } .fa-trade-federation:before { content: "\f513"; } .fa-trademark:before { content: "\f25c"; } .fa-traffic-light:before { content: "\f637"; } .fa-trailer:before { content: "\e041"; } .fa-train:before { content: "\f238"; } .fa-tram:before { content: "\f7da"; } .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-trash:before { content: "\f1f8"; } .fa-trash-alt:before { content: "\f2ed"; } .fa-trash-restore:before { content: "\f829"; } .fa-trash-restore-alt:before { content: "\f82a"; } .fa-tree:before { content: "\f1bb"; } .fa-trello:before { content: "\f181"; } .fa-tripadvisor:before { content: "\f262"; } .fa-trophy:before { content: "\f091"; } .fa-truck:before { content: "\f0d1"; } .fa-truck-loading:before { content: "\f4de"; } .fa-truck-monster:before { content: "\f63b"; } .fa-truck-moving:before { content: "\f4df"; } .fa-truck-pickup:before { content: "\f63c"; } .fa-tshirt:before { content: "\f553"; } .fa-tty:before { content: "\f1e4"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-tv:before { content: "\f26c"; } .fa-twitch:before { content: "\f1e8"; } .fa-twitter:before { content: "\f099"; } .fa-twitter-square:before { content: "\f081"; } .fa-typo3:before { content: "\f42b"; } .fa-uber:before { content: "\f402"; } .fa-ubuntu:before { content: "\f7df"; } .fa-uikit:before { content: "\f403"; } .fa-umbraco:before { content: "\f8e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-umbrella-beach:before { content: "\f5ca"; } .fa-uncharted:before { content: "\e084"; } .fa-underline:before { content: "\f0cd"; } .fa-undo:before { content: "\f0e2"; } .fa-undo-alt:before { content: "\f2ea"; } .fa-uniregistry:before { content: "\f404"; } .fa-unity:before { content: "\e049"; } .fa-universal-access:before { content: "\f29a"; } .fa-university:before { content: "\f19c"; } .fa-unlink:before { content: "\f127"; } .fa-unlock:before { content: "\f09c"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-unsplash:before { content: "\e07c"; } .fa-untappd:before { content: "\f405"; } .fa-upload:before { content: "\f093"; } .fa-ups:before { content: "\f7e0"; } .fa-usb:before { content: "\f287"; } .fa-user:before { content: "\f007"; } .fa-user-alt:before { content: "\f406"; } .fa-user-alt-slash:before { content: "\f4fa"; } .fa-user-astronaut:before { content: "\f4fb"; } .fa-user-check:before { content: "\f4fc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-clock:before { content: "\f4fd"; } .fa-user-cog:before { content: "\f4fe"; } .fa-user-edit:before { content: "\f4ff"; } .fa-user-friends:before { content: "\f500"; } .fa-user-graduate:before { content: "\f501"; } .fa-user-injured:before { content: "\f728"; } .fa-user-lock:before { content: "\f502"; } .fa-user-md:before { content: "\f0f0"; } .fa-user-minus:before { content: "\f503"; } .fa-user-ninja:before { content: "\f504"; } .fa-user-nurse:before { content: "\f82f"; } .fa-user-plus:before { content: "\f234"; } .fa-user-secret:before { content: "\f21b"; } .fa-user-shield:before { content: "\f505"; } .fa-user-slash:before { content: "\f506"; } .fa-user-tag:before { content: "\f507"; } .fa-user-tie:before { content: "\f508"; } .fa-user-times:before { content: "\f235"; } .fa-users:before { content: "\f0c0"; } .fa-users-cog:before { content: "\f509"; } .fa-users-slash:before { content: "\e073"; } .fa-usps:before { content: "\f7e1"; } .fa-ussunnah:before { content: "\f407"; } .fa-utensil-spoon:before { content: "\f2e5"; } .fa-utensils:before { content: "\f2e7"; } .fa-vaadin:before { content: "\f408"; } .fa-vector-square:before { content: "\f5cb"; } .fa-venus:before { content: "\f221"; } .fa-venus-double:before { content: "\f226"; } .fa-venus-mars:before { content: "\f228"; } .fa-vest:before { content: "\e085"; } .fa-vest-patches:before { content: "\e086"; } .fa-viacoin:before { content: "\f237"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-vial:before { content: "\f492"; } .fa-vials:before { content: "\f493"; } .fa-viber:before { content: "\f409"; } .fa-video:before { content: "\f03d"; } .fa-video-slash:before { content: "\f4e2"; } .fa-vihara:before { content: "\f6a7"; } .fa-vimeo:before { content: "\f40a"; } .fa-vimeo-square:before { content: "\f194"; } .fa-vimeo-v:before { content: "\f27d"; } .fa-vine:before { content: "\f1ca"; } .fa-virus:before { content: "\e074"; } .fa-virus-slash:before { content: "\e075"; } .fa-viruses:before { content: "\e076"; } .fa-vk:before { content: "\f189"; } .fa-vnv:before { content: "\f40b"; } .fa-voicemail:before { content: "\f897"; } .fa-volleyball-ball:before { content: "\f45f"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-mute:before { content: "\f6a9"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-up:before { content: "\f028"; } .fa-vote-yea:before { content: "\f772"; } .fa-vr-cardboard:before { content: "\f729"; } .fa-vuejs:before { content: "\f41f"; } .fa-walking:before { content: "\f554"; } .fa-wallet:before { content: "\f555"; } .fa-warehouse:before { content: "\f494"; } .fa-watchman-monitoring:before { content: "\e087"; } .fa-water:before { content: "\f773"; } .fa-wave-square:before { content: "\f83e"; } .fa-waze:before { content: "\f83f"; } .fa-weebly:before { content: "\f5cc"; } .fa-weibo:before { content: "\f18a"; } .fa-weight:before { content: "\f496"; } .fa-weight-hanging:before { content: "\f5cd"; } .fa-weixin:before { content: "\f1d7"; } .fa-whatsapp:before { content: "\f232"; } .fa-whatsapp-square:before { content: "\f40c"; } .fa-wheelchair:before { content: "\f193"; } .fa-whmcs:before { content: "\f40d"; } .fa-wifi:before { content: "\f1eb"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-wind:before { content: "\f72e"; } .fa-window-close:before { content: "\f410"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-windows:before { content: "\f17a"; } .fa-wine-bottle:before { content: "\f72f"; } .fa-wine-glass:before { content: "\f4e3"; } .fa-wine-glass-alt:before { content: "\f5ce"; } .fa-wix:before { content: "\f5cf"; } .fa-wizards-of-the-coast:before { content: "\f730"; } .fa-wodu:before { content: "\e088"; } .fa-wolf-pack-battalion:before { content: "\f514"; } .fa-won-sign:before { content: "\f159"; } .fa-wordpress:before { content: "\f19a"; } .fa-wordpress-simple:before { content: "\f411"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-wpforms:before { content: "\f298"; } .fa-wpressr:before { content: "\f3e4"; } .fa-wrench:before { content: "\f0ad"; } .fa-x-ray:before { content: "\f497"; } .fa-xbox:before { content: "\f412"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-y-combinator:before { content: "\f23b"; } .fa-yahoo:before { content: "\f19e"; } .fa-yammer:before { content: "\f840"; } .fa-yandex:before { content: "\f413"; } .fa-yandex-international:before { content: "\f414"; } .fa-yarn:before { content: "\f7e3"; } .fa-yelp:before { content: "\f1e9"; } .fa-yen-sign:before { content: "\f157"; } .fa-yin-yang:before { content: "\f6ad"; } .fa-yoast:before { content: "\f2b1"; } .fa-youtube:before { content: "\f167"; } .fa-youtube-square:before { content: "\f431"; } .fa-zhihu:before { content: "\f63f"; } .sr-only { border: 0; clip: rect(0, 0, 0, 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } .sr-only-focusable:active, .sr-only-focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; } @font-face { font-family: 'Font Awesome 5 Brands'; font-style: normal; font-weight: 400; font-display: block; src: url("../webfonts/fa-brands-400.eot"); src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } .fab { font-family: 'Font Awesome 5 Brands'; font-weight: 400; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 400; font-display: block; src: url("../webfonts/fa-regular-400.eot"); src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } .far { font-family: 'Font Awesome 5 Free'; font-weight: 400; } @font-face { font-family: 'Font Awesome 5 Free'; font-style: normal; font-weight: 900; font-display: block; src: url("../webfonts/fa-solid-900.eot"); src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } .fa, .fas { font-family: 'Font Awesome 5 Free'; font-weight: 900; } -------------------- END OF FILE -------------------- ### FILE 72: RR COM/assets/css/fontawesome.min.css - Type: CSS - Size: 57.96 KB - Path: RR COM/assets/css - Name: fontawesome.min.css ------------------------------------------------------------ /*! * Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) */.fa-fw,.fa-li{text-align:center}.fab,.far{font-weight:400}.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1,-1);transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(-1,-1);transform:scale(-1,-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudflare:before{content:"\e07d"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guilded:before{content:"\e07e"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hive:before{content:"\e07f"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-innosoft:before{content:"\e080"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-instalod:before{content:"\e081"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-octopus-deploy:before{content:"\e082"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-perbyte:before{content:"\e083"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-uncharted:before{content:"\e084"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-vest:before{content:"\e085"}.fa-vest-patches:before{content:"\e086"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-watchman-monitoring:before{content:"\e087"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wodu:before{content:"\e088"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:'Font Awesome 5 Brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:'Font Awesome 5 Brands'}.fa,.far,.fas{font-family:'Font Awesome 5 Free'}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}@font-face{font-family:'Font Awesome 5 Free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-weight:900} -------------------- END OF FILE -------------------- ### FILE 73: RR COM/assets/css/redirect-pages.css - Type: CSS - Size: 6.11 KB - Path: RR COM/assets/css - Name: redirect-pages.css ------------------------------------------------------------ /* Redirect Landing Pages Stylesheet */ /* For Relevant Reflex Survey Completion Pages */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; line-height: 1.6; color: #333; min-height: 100vh; } .page-container { min-height: 100vh; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 20px; position: relative; overflow: hidden; } /* Animated background elements */ .page-container::before, .page-container::after { content: ''; position: absolute; border-radius: 50%; opacity: 0.1; animation: float 20s infinite ease-in-out; } .page-container::before { width: 400px; height: 400px; background: white; top: -100px; left: -100px; } .page-container::after { width: 300px; height: 300px; background: white; bottom: -50px; right: -50px; animation-delay: 10s; } @keyframes float { 0%, 100% { transform: translate(0, 0) scale(1); } 50% { transform: translate(50px, 50px) scale(1.1); } } .content-card { background: white; border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); max-width: 600px; width: 100%; padding: 50px 40px; text-align: center; position: relative; z-index: 1; animation: slideUp 0.6s ease-out; } @keyframes slideUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } .icon-circle { width: 120px; height: 120px; border-radius: 50%; margin: 0 auto 30px; display: flex; align-items: center; justify-content: center; animation: scaleIn 0.8s ease-out; } @keyframes scaleIn { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.1); } 100% { transform: scale(1); opacity: 1; } } .icon-circle.success { background: linear-gradient(135deg, #28a745, #20c997); } .icon-circle.partial { background: linear-gradient(135deg, #0066cc, #0052a3); } .icon-circle.screenout { background: linear-gradient(135deg, #dc2626, #991b1b); } .icon-circle.warning { background: linear-gradient(135deg, #f59e0b, #d97706); } .icon-circle.timeout { background: linear-gradient(135deg, #6b7280, #4b5563); } .icon-circle.quota { background: linear-gradient(135deg, #ec4899, #be185d); } .icon { font-size: 60px; color: white; line-height: 1; } .page-heading { font-size: 32px; font-weight: 700; color: #111827; margin-bottom: 20px; } .main-message { font-size: 18px; color: #6b7280; line-height: 1.8; margin-bottom: 30px; max-width: 500px; margin-left: auto; margin-right: auto; } .points-box { background: linear-gradient(135deg, #fbbf24 0%, #f59e0b 100%); border-radius: 16px; padding: 30px; margin: 30px 0; color: white; animation: pulse 2s ease-in-out infinite; } @keyframes pulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.02); } } .points-label { font-size: 14px; font-weight: 600; text-transform: uppercase; letter-spacing: 1px; opacity: 0.9; margin-bottom: 10px; } .points-amount { font-size: 48px; font-weight: 800; margin: 10px 0; } .points-sublabel { font-size: 14px; opacity: 0.9; } .info-box { background: #f3f4f6; border-radius: 12px; padding: 25px; margin: 30px 0; text-align: left; } .info-box h3 { font-size: 18px; font-weight: 600; color: #111827; margin-bottom: 12px; } .info-box p { font-size: 15px; color: #6b7280; line-height: 1.6; } .info-grid { background: #f9fafb; border-radius: 12px; padding: 20px; margin: 30px 0; } .info-item { display: flex; justify-content: space-between; padding: 12px 0; border-bottom: 1px solid #e5e7eb; } .info-item:last-child { border-bottom: none; } .info-label { font-size: 14px; color: #6b7280; } .info-value { font-size: 14px; font-weight: 600; color: #111827; } .action-buttons { display: flex; gap: 12px; margin: 30px 0; flex-wrap: wrap; justify-content: center; } .btn { display: inline-block; padding: 14px 28px; border-radius: 10px; font-size: 16px; font-weight: 600; text-decoration: none; transition: all 0.3s ease; border: none; cursor: pointer; } .btn-primary { background: #0066cc; color: white; } .btn-primary:hover { background: #0052a3; transform: translateY(-2px); box-shadow: 0 10px 20px rgba(0, 102, 204, 0.3); } .btn-secondary { background: #f3f4f6; color: #374151; } .btn-secondary:hover { background: #e5e7eb; transform: translateY(-2px); box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1); } .footer-note { margin-top: 30px; padding-top: 25px; border-top: 2px solid #e5e7eb; } .footer-note p { font-size: 14px; color: #6b7280; line-height: 1.6; } .branding { position: relative; z-index: 1; margin-top: 30px; color: white; text-align: center; } .branding .logo { height: 40px; margin-bottom: 10px; opacity: 0.9; } .branding p { font-size: 14px; opacity: 0.8; font-weight: 500; } /* Mobile Responsive */ @media (max-width: 768px) { .content-card { padding: 40px 30px; } .page-heading { font-size: 26px; } .main-message { font-size: 16px; } .icon-circle { width: 100px; height: 100px; } .icon { font-size: 50px; } .points-amount { font-size: 40px; } .action-buttons { flex-direction: column; } .btn { width: 100%; } } @media (max-width: 480px) { .content-card { padding: 30px 20px; } .page-heading { font-size: 22px; } .points-box { padding: 20px; } .points-amount { font-size: 36px; } } -------------------- END OF FILE -------------------- ### FILE 74: RR COM/assets/css/slick-theme.css - Type: CSS - Size: 3.12 KB - Path: RR COM/assets/css - Name: slick-theme.css ------------------------------------------------------------ @charset 'UTF-8'; /* Slider */ .slick-loading .slick-list { background: #fff url('../img/ajax-loader.gif') center center no-repeat; } /* Icons */ @font-face { font-family: 'slick'; font-weight: normal; font-style: normal; src: url('../webfonts/slick.eot'); src: url('../webfonts/slick.eot?#iefix') format('embedded-opentype'), url('../webfonts/slick.woff') format('woff'), url('../webfonts/slick.ttf') format('truetype'), url('../webfonts/slick.svg#slick') format('svg'); } /* Arrows */ .slick-prev, .slick-next { font-size: 0; line-height: 0; position: absolute; top: 50%; display: block; width: 20px; height: 20px; padding: 0; -webkit-transform: translate(0, -50%); -ms-transform: translate(0, -50%); transform: translate(0, -50%); cursor: pointer; color: transparent; border: none; outline: none; background: transparent; } .slick-prev:hover, .slick-prev:focus, .slick-next:hover, .slick-next:focus { color: transparent; outline: none; background: transparent; } .slick-prev:hover:before, .slick-prev:focus:before, .slick-next:hover:before, .slick-next:focus:before { opacity: 1; } .slick-prev.slick-disabled:before, .slick-next.slick-disabled:before { opacity: .25; } .slick-prev:before, .slick-next:before { font-family: 'slick'; font-size: 20px; line-height: 1; opacity: .75; color: white; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .slick-prev { left: -25px; } [dir='rtl'] .slick-prev { right: -25px; left: auto; } .slick-prev:before { content: '←'; } [dir='rtl'] .slick-prev:before { content: '→'; } .slick-next { right: -25px; } [dir='rtl'] .slick-next { right: auto; left: -25px; } .slick-next:before { content: '→'; } [dir='rtl'] .slick-next:before { content: '←'; } /* Dots */ .slick-dotted.slick-slider { margin-bottom: 30px; } .slick-dots { position: absolute; bottom: -25px; display: block; width: 100%; padding: 0; margin: 0; list-style: none; text-align: center; } .slick-dots li { position: relative; display: inline-block; width: 20px; height: 20px; margin: 0 5px; padding: 0; cursor: pointer; } .slick-dots li button { font-size: 0; line-height: 0; display: block; width: 20px; height: 20px; padding: 5px; cursor: pointer; color: transparent; border: 0; outline: none; background: transparent; } .slick-dots li button:hover, .slick-dots li button:focus { outline: none; } .slick-dots li button:hover:before, .slick-dots li button:focus:before { opacity: 1; } .slick-dots li button:before { font-family: 'slick'; font-size: 6px; line-height: 20px; position: absolute; top: 0; left: 0; width: 20px; height: 20px; content: '•'; text-align: center; opacity: .25; color: black; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .slick-dots li.slick-active button:before { opacity: .75; color: black; } -------------------- END OF FILE -------------------- ### FILE 75: RR COM/assets/css/slick-theme.min.css - Type: CSS - Size: 2.28 KB - Path: RR COM/assets/css - Name: slick-theme.min.css ------------------------------------------------------------ @charset 'UTF-8';.slick-dots,.slick-next,.slick-prev{position:absolute;display:block;padding:0}.slick-dots li button:before,.slick-next:before,.slick-prev:before{font-family:slick;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-loading .slick-list{background:url(../img/ajax-loader.gif) center center no-repeat #fff}@font-face{font-family:slick;font-weight:400;font-style:normal;src:url(../webfonts/slick.eot);src:url(../webfonts/slick.eot?#iefix) format('embedded-opentype'),url(../webfonts/slick.woff) format('woff'),url(../webfonts/slick.ttf) format('truetype'),url(../webfonts/slick.svg#slick) format('svg')}.slick-next,.slick-prev{font-size:0;line-height:0;top:50%;width:20px;height:20px;-webkit-transform:translate(0,-50%);-ms-transform:translate(0,-50%);transform:translate(0,-50%);cursor:pointer;color:transparent;border:none;outline:0;background:0 0}.slick-next:focus,.slick-next:hover,.slick-prev:focus,.slick-prev:hover{color:transparent;outline:0;background:0 0}.slick-next:focus:before,.slick-next:hover:before,.slick-prev:focus:before,.slick-prev:hover:before{opacity:1}.slick-next.slick-disabled:before,.slick-prev.slick-disabled:before{opacity:.25}.slick-next:before,.slick-prev:before{font-size:20px;line-height:1;opacity:.75;color:#fff}.slick-prev{left:-25px}[dir=rtl] .slick-prev{right:-25px;left:auto}.slick-prev:before{content:'←'}.slick-next:before,[dir=rtl] .slick-prev:before{content:'→'}.slick-next{right:-25px}[dir=rtl] .slick-next{right:auto;left:-25px}[dir=rtl] .slick-next:before{content:'←'}.slick-dotted.slick-slider{margin-bottom:30px}.slick-dots{bottom:-25px;width:100%;margin:0;list-style:none;text-align:center}.slick-dots li{position:relative;display:inline-block;width:20px;height:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{font-size:0;line-height:0;display:block;width:20px;height:20px;padding:5px;cursor:pointer;color:transparent;border:0;outline:0;background:0 0}.slick-dots li button:focus,.slick-dots li button:hover{outline:0}.slick-dots li button:focus:before,.slick-dots li button:hover:before{opacity:1}.slick-dots li button:before{font-size:6px;line-height:20px;position:absolute;top:0;left:0;width:20px;height:20px;content:'•';text-align:center;opacity:.25;color:#000}.slick-dots li.slick-active button:before{opacity:.75;color:#000} -------------------- END OF FILE -------------------- ### FILE 76: RR COM/assets/css/slick.min.css - Type: CSS - Size: 1.34 KB - Path: RR COM/assets/css - Name: slick.min.css ------------------------------------------------------------ .slick-slider{position:relative;display:block;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-khtml-user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;display:block;overflow:hidden;margin:0;padding:0}.slick-list:focus{outline:0}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-list,.slick-slider .slick-track{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.slick-track{position:relative;top:0;left:0;display:block;margin-left:auto;margin-right:auto}.slick-track:after,.slick-track:before{display:table;content:''}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{display:none;float:left;height:100%;min-height:1px}[dir=rtl] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-arrow.slick-hidden{display:none} /*# sourceMappingURL=slick.min.css.map */ -------------------- END OF FILE -------------------- ### FILE 77: RR COM/assets/css/templatemo.css - Type: CSS - Size: 5.34 KB - Path: RR COM/assets/css - Name: templatemo.css ------------------------------------------------------------ /* TemplateMo 559 Zay Shop https://templatemo.com/tm-559-zay-shop --------------------------------------------- Table of contents ------------------------------------------------ 1. Typography 2. General 3. Nav 4. Hero Carousel 5. Accordion 6. Shop 7. Product 8. Carousel Hero 9. Carousel Brand 10. Services 11. Contact map 12. Footer 13. Small devices (landscape phones, 576px and up) 14. Medium devices (tablets, 768px and up) 15. Large devices (desktops, 992px and up) 16. Extra large devices (large desktops, 1200px and up) --------------------------------------------- */ /* Typography */ body, ul, li, p, a, label, input, div { font-family: 'Roboto', sans-serif; font-size: 18px !important; font-weight: 300 !important; } .h1 { font-family: 'Roboto', sans-serif; font-size: 48px !important; font-weight: 200 !important; } .h2 { font-family: 'Roboto', sans-serif; font-size: 30px !important; font-weight: 300; } .h3 { font-family: 'Roboto', sans-serif; font-size: 22px !important; } /* General */ .logo { font-weight: 500 !important;} .text-warning { color: #ede861 !important;} .text-muted { color: #bcbcbc !important;} .text-success { color: #59ab6e !important;} .text-light { color: #cfd6e1 !important;} .bg-dark { background-color: #212934 !important;} .bg-light { background-color: #e9eef5 !important;} .bg-black { background-color: #1d242d !important;} .bg-success { background-color: #59ab6e !important;} .btn-success { background-color: #59ab6e !important; border-color: #56ae6c !important; } .pagination .page-link:hover {color: #000;} .pagination .page-link:hover, .pagination .page-link.active { background-color: #69bb7e; color: #fff; } /* Nav */ #templatemo_nav_top { min-height: 40px;} #templatemo_nav_top * { font-size: .9em !important;} #templatemo_main_nav a { color: #212934;} #templatemo_main_nav a:hover { color: #69bb7e;} #templatemo_main_nav .navbar .nav-icon { margin-right: 20px;} /* Hero Carousel */ #template-mo-zay-hero-carousel { background: #f2cc8e !important;} /* Accordion */ .templatemo-accordion a { color: #000;} .templatemo-accordion a:hover { color: #333d4a;} /* Shop */ .shop-top-menu a:hover { color: #69bb7e !important;} /* Product */ .product-wap { box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.10);} .product-wap .product-color-dot.color-dot-red { background:#f71515;} .product-wap .product-color-dot.color-dot-blue { background:#6db4fe;} .product-wap .product-color-dot.color-dot-black { background:#000000;} .product-wap .product-color-dot.color-dot-light { background:#e0e0e0;} .product-wap .product-color-dot.color-dot-green { background:#0bff7e;} .card.product-wap .card .product-overlay { background: rgba(0,0,0,.2); visibility: hidden; opacity: 0; transition: .3s; } .card.product-wap:hover .card .product-overlay { visibility: visible; opacity: 1; } .card.product-wap a { color: #000;} #carousel-related-product .slick-slide:focus { outline: none !important;} #carousel-related-product .slick-dots li button:before { font-size: 15px; margin-top: 20px; } /* Brand */ .brand-img { filter: grayscale(100%); opacity: 0.5; transition: .5s; } .brand-img:hover { filter: grayscale(0%); opacity: 1; } /* Carousel Hero */ #template-mo-zay-hero-carousel .carousel-indicators li { margin-top: -50px; background-color: #59ab6e; } #template-mo-zay-hero-carousel .carousel-control-next i, #template-mo-zay-hero-carousel .carousel-control-prev i { color: #59ab6e !important; font-size: 2.8em !important; } /* Carousel Brand */ .tempaltemo-carousel .h1 { font-size: .5em !important; color: #000 !important; } /* Services */ .services-icon-wap {transition: .3s;} .services-icon-wap:hover, .services-icon-wap:hover i {color: #fff;} .services-icon-wap:hover {background: #69bb7e;} /* Contact map */ .leaflet-control a, .leaflet-control { font-size: 10px !important;} .form-control { border: 1px solid #e8e8e8;} /* Footer */ #tempaltemo_footer a { color: #dcdde1;} #tempaltemo_footer a:hover { color: #68bb7d;} #tempaltemo_footer ul.footer-link-list li { padding-top: 10px;} #tempaltemo_footer ul.footer-icons li { width: 2.6em; height: 2.6em; line-height: 2.6em; } #tempaltemo_footer ul.footer-icons li:hover { background-color: #cfd6e1; transition: .5s; } #tempaltemo_footer ul.footer-icons li:hover i { color: #212934; transition: .5s; } #tempaltemo_footer .border-light { border-color: #2d343f !important;} /* // Extra small devices (portrait phones, less than 576px) // No media query since this is the default in Bootstrap */ /* Small devices (landscape phones, 576px and up)*/ .product-wap .h3, .product-wap li, .product-wap i, .product-wap p { font-size: 12px !important; } .product-wap .product-color-dot { width: 6px; height: 6px; } @media (min-width: 576px) { .tempaltemo-carousel .h1 { font-size: 1em !important;} } /*// Medium devices (tablets, 768px and up)*/ @media (min-width: 768px) { #templatemo_main_nav .navbar-nav {max-width: 450px;} } /* Large devices (desktops, 992px and up)*/ @media (min-width: 992px) { #templatemo_main_nav .navbar-nav {max-width: 550px;} #template-mo-zay-hero-carousel .carousel-item {min-height: 30rem !important;} .product-wap .h3, .product-wap li, .product-wap i, .product-wap p {font-size: 18px !important;} .product-wap .product-color-dot { width: 12px; height: 12px; } } /* Extra large devices (large desktops, 1200px and up)*/ @media (min-width: 1200px) {} -------------------- END OF FILE -------------------- ### FILE 78: RR COM/assets/css/templatemo.min.css - Type: CSS - Size: 3.57 KB - Path: RR COM/assets/css - Name: templatemo.min.css ------------------------------------------------------------ .h1,.h2,.h3,a,body,div,input,label,li,p,ul{font-family:Roboto,sans-serif}a,body,div,input,label,li,p,ul{font-size:18px!important;font-weight:300!important}.h1{font-size:48px!important;font-weight:200!important}.h2{font-size:30px!important;font-weight:300}.h3{font-size:22px!important}.logo{font-weight:500!important}.text-warning{color:#ede861!important}.text-muted{color:#bcbcbc!important}.text-success{color:#59ab6e!important}.text-light{color:#cfd6e1!important}.bg-dark{background-color:#212934!important}.bg-light{background-color:#e9eef5!important}.bg-black{background-color:#1d242d!important}.bg-success,.btn-success{background-color:#59ab6e!important}.btn-success{border-color:#56ae6c!important}.pagination .page-link.active,.pagination .page-link:hover{background-color:#69bb7e;color:#fff}#templatemo_nav_top{min-height:40px}#templatemo_nav_top *{font-size:.9em!important}#templatemo_main_nav a{color:#212934}#templatemo_main_nav a:hover{color:#69bb7e}#templatemo_main_nav .navbar .nav-icon{margin-right:20px}#template-mo-zay-hero-carousel{background:#efefef!important}.templatemo-accordion a{color:#000}.templatemo-accordion a:hover{color:#333d4a}.shop-top-menu a:hover{color:#69bb7e!important}.product-wap{box-shadow:0 5px 10px 0 rgba(0,0,0,.1)}.product-wap .product-color-dot.color-dot-red{background:#f71515}.product-wap .product-color-dot.color-dot-blue{background:#6db4fe}.product-wap .product-color-dot.color-dot-black{background:#000}.product-wap .product-color-dot.color-dot-light{background:#e0e0e0}.product-wap .product-color-dot.color-dot-green{background:#0bff7e}.card.product-wap .card .product-overlay{background:rgba(0,0,0,.2);visibility:hidden;opacity:0;transition:.3s}.card.product-wap:hover .card .product-overlay{visibility:visible;opacity:1}.card.product-wap a{color:#000}#carousel-related-product .slick-slide:focus{outline:0!important}#carousel-related-product .slick-dots li button:before{font-size:15px;margin-top:20px}.brand-img{filter:grayscale(100%);opacity:.5;transition:.5s}.brand-img:hover{filter:grayscale(0);opacity:1}#template-mo-zay-hero-carousel .carousel-indicators li{margin-top:-50px;background-color:#59ab6e}#template-mo-zay-hero-carousel .carousel-control-next i,#template-mo-zay-hero-carousel .carousel-control-prev i{color:#59ab6e!important;font-size:2.8em!important}.tempaltemo-carousel .h1{font-size:.5em!important;color:#000!important}.services-icon-wap{transition:.3s}.services-icon-wap:hover,.services-icon-wap:hover i{color:#fff}.services-icon-wap:hover{background:#69bb7e}.leaflet-control,.leaflet-control a{font-size:10px!important}.form-control{border:1px solid #e8e8e8}#tempaltemo_footer a{color:#dcdde1}#tempaltemo_footer a:hover{color:#68bb7d}#tempaltemo_footer ul.footer-link-list li{padding-top:10px}#tempaltemo_footer ul.footer-icons li{width:2.6em;height:2.6em;line-height:2.6em}#tempaltemo_footer ul.footer-icons li:hover{background-color:#cfd6e1;transition:.5s}#tempaltemo_footer ul.footer-icons li:hover i{color:#212934;transition:.5s}#tempaltemo_footer .border-light{border-color:#2d343f!important}.product-wap .h3,.product-wap i,.product-wap li,.product-wap p{font-size:12px!important}.product-wap .product-color-dot{width:6px;height:6px}@media (min-width:576px){.tempaltemo-carousel .h1{font-size:1em!important}}@media (min-width:768px){#templatemo_main_nav .navbar-nav{max-width:450px}}@media (min-width:992px){#templatemo_main_nav .navbar-nav{max-width:550px}#template-mo-zay-hero-carousel .carousel-item{min-height:30rem!important}.product-wap .h3,.product-wap i,.product-wap li,.product-wap p{font-size:18px!important}.product-wap .product-color-dot{width:12px;height:12px}} -------------------- END OF FILE -------------------- ### FILE 79: RR COM/assets/img/about-hero.svg - Type: SVG - Size: 44.89 KB - Path: RR COM/assets/img - Name: about-hero.svg ------------------------------------------------------------ [IMAGE FILE: SVG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 80: RR COM/assets/img/ajax-loader.gif - Type: GIF - Size: 4.04 KB - Path: RR COM/assets/img - Name: ajax-loader.gif ------------------------------------------------------------ [IMAGE FILE: GIF - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 81: RR COM/assets/img/apple-icon.png - Type: PNG - Size: 924 B - Path: RR COM/assets/img - Name: apple-icon.png ------------------------------------------------------------ [IMAGE FILE: PNG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 82: RR COM/assets/img/banner_img_01.jpg - Type: JPG - Size: 37.62 KB - Path: RR COM/assets/img - Name: banner_img_01.jpg ------------------------------------------------------------ [IMAGE FILE: JPG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 83: RR COM/assets/img/favicon-16x16.png - Type: PNG - Size: 182 B - Path: RR COM/assets/img - Name: favicon-16x16.png ------------------------------------------------------------ [IMAGE FILE: PNG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 84: RR COM/assets/img/favicon-192x192.png - Type: PNG - Size: 886 B - Path: RR COM/assets/img - Name: favicon-192x192.png ------------------------------------------------------------ [IMAGE FILE: PNG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 85: RR COM/assets/img/favicon.ico - Type: ICO - Size: 260 B - Path: RR COM/assets/img - Name: favicon.ico ------------------------------------------------------------ [BINARY/UNKNOWN FILE: ICO - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 86: RR COM/assets/img/favicon.png - Type: PNG - Size: 251 B - Path: RR COM/assets/img - Name: favicon.png ------------------------------------------------------------ [IMAGE FILE: PNG - Content not displayed] -------------------- END OF FILE -------------------- ### FILE 87: RR COM/assets/js/bootstrap.bundle.min.js - Type: JS - Size: 78.93 KB - Path: RR COM/assets/js - Name: bootstrap.bundle.min.js ------------------------------------------------------------ /*! * Bootstrap v5.0.0-beta1 (https://getbootstrap.com/) * Copyright 2011-2020 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";function t(t,e){for(var n=0;n0,i._pointerEvent=Boolean(window.PointerEvent),i._addEventListeners(),i}i(o,t);var r=o.prototype;return r.next=function(){this._isSliding||this._slide("next")},r.nextWhenVisible=function(){!document.hidden&&g(this._element)&&this.next()},r.prev=function(){this._isSliding||this._slide("prev")},r.pause=function(t){t||(this._isPaused=!0),q.findOne(".carousel-item-next, .carousel-item-prev",this._element)&&(f(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},r.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config&&this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},r.to=function(t){var e=this;this._activeElement=q.findOne(".active.carousel-item",this._element);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)H.one(this._element,"slid.bs.carousel",(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var i=t>n?"next":"prev";this._slide(i,this._items[t])}},r.dispose=function(){t.prototype.dispose.call(this),H.off(this._element,V),this._items=null,this._config=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},r._getConfig=function(t){return t=n({},X,t),p(z,t,$),t},r._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=40)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},r._addEventListeners=function(){var t=this;this._config.keyboard&&H.on(this._element,"keydown.bs.carousel",(function(e){return t._keydown(e)})),"hover"===this._config.pause&&(H.on(this._element,"mouseenter.bs.carousel",(function(e){return t.pause(e)})),H.on(this._element,"mouseleave.bs.carousel",(function(e){return t.cycle(e)}))),this._config.touch&&this._touchSupported&&this._addTouchEventListeners()},r._addTouchEventListeners=function(){var t=this,e=function(e){t._pointerEvent&&G[e.pointerType.toUpperCase()]?t.touchStartX=e.clientX:t._pointerEvent||(t.touchStartX=e.touches[0].clientX)},n=function(e){t._pointerEvent&&G[e.pointerType.toUpperCase()]&&(t.touchDeltaX=e.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),500+t._config.interval))};q.find(".carousel-item img",this._element).forEach((function(t){H.on(t,"dragstart.bs.carousel",(function(t){return t.preventDefault()}))})),this._pointerEvent?(H.on(this._element,"pointerdown.bs.carousel",(function(t){return e(t)})),H.on(this._element,"pointerup.bs.carousel",(function(t){return n(t)})),this._element.classList.add("pointer-event")):(H.on(this._element,"touchstart.bs.carousel",(function(t){return e(t)})),H.on(this._element,"touchmove.bs.carousel",(function(e){return function(e){e.touches&&e.touches.length>1?t.touchDeltaX=0:t.touchDeltaX=e.touches[0].clientX-t.touchStartX}(e)})),H.on(this._element,"touchend.bs.carousel",(function(t){return n(t)})))},r._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.key){case"ArrowLeft":t.preventDefault(),this.prev();break;case"ArrowRight":t.preventDefault(),this.next()}},r._getItemIndex=function(t){return this._items=t&&t.parentNode?q.find(".carousel-item",t.parentNode):[],this._items.indexOf(t)},r._getItemByDirection=function(t,e){var n="next"===t,i="prev"===t,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+("prev"===t?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},r._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),i=this._getItemIndex(q.findOne(".active.carousel-item",this._element));return H.trigger(this._element,"slide.bs.carousel",{relatedTarget:t,direction:e,from:i,to:n})},r._setActiveIndicatorElement=function(t){if(this._indicatorsElement){for(var e=q.find(".active",this._indicatorsElement),n=0;n0)for(var i=0;i=0}function wt(t){return((ht(t)?t.ownerDocument:t.document)||window.document).documentElement}function Et(t){return"html"===ft(t)?t:t.assignedSlot||t.parentNode||t.host||wt(t)}function Tt(t){if(!pt(t)||"fixed"===bt(t).position)return null;var e=t.offsetParent;if(e){var n=wt(e);if("body"===ft(e)&&"static"===bt(e).position&&"static"!==bt(n).position)return n}return e}function kt(t){for(var e=dt(t),n=Tt(t);n&&yt(n)&&"static"===bt(n).position;)n=Tt(n);return n&&"body"===ft(n)&&"static"===bt(n).position?e:n||function(t){for(var e=Et(t);pt(e)&&["html","body"].indexOf(ft(e))<0;){var n=bt(e);if("none"!==n.transform||"none"!==n.perspective||n.willChange&&"auto"!==n.willChange)return e;e=e.parentNode}return null}(t)||e}function Ot(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Lt(t,e,n){return Math.max(t,Math.min(e,n))}function At(t){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),t)}function Ct(t,e){return e.reduce((function(e,n){return e[n]=t,e}),{})}var Dt={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,n=t.state,i=t.name,o=n.elements.arrow,r=n.modifiersData.popperOffsets,s=mt(n.placement),a=Ot(s),l=[st,rt].indexOf(s)>=0?"height":"width";if(o&&r){var c=n.modifiersData[i+"#persistent"].padding,u=vt(o),f="y"===a?it:st,d="y"===a?ot:rt,h=n.rects.reference[l]+n.rects.reference[a]-r[a]-n.rects.popper[l],p=r[a]-n.rects.reference[a],g=kt(o),m=g?"y"===a?g.clientHeight||0:g.clientWidth||0:0,v=h/2-p/2,_=c[f],b=m-u[l]-c[d],y=m/2-u[l]/2+v,w=Lt(_,y,b),E=a;n.modifiersData[i]=((e={})[E]=w,e.centerOffset=w-y,e)}},effect:function(t){var e=t.state,n=t.options,i=t.name,o=n.element,r=void 0===o?"[data-popper-arrow]":o,s=n.padding,a=void 0===s?0:s;null!=r&&("string"!=typeof r||(r=e.elements.popper.querySelector(r)))&&_t(e.elements.popper,r)&&(e.elements.arrow=r,e.modifiersData[i+"#persistent"]={padding:At("number"!=typeof a?a:Ct(a,at))})},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]},xt={top:"auto",right:"auto",bottom:"auto",left:"auto"};function St(t){var e,n=t.popper,i=t.popperRect,o=t.placement,r=t.offsets,s=t.position,a=t.gpuAcceleration,l=t.adaptive,c=function(t){var e=t.x,n=t.y,i=window.devicePixelRatio||1;return{x:Math.round(e*i)/i||0,y:Math.round(n*i)/i||0}}(r),u=c.x,f=c.y,d=r.hasOwnProperty("x"),h=r.hasOwnProperty("y"),p=st,g=it,m=window;if(l){var v=kt(n);v===dt(n)&&(v=wt(n)),o===it&&(g=ot,f-=v.clientHeight-i.height,f*=a?1:-1),o===st&&(p=rt,u-=v.clientWidth-i.width,u*=a?1:-1)}var _,b=Object.assign({position:s},l&&xt);return a?Object.assign(Object.assign({},b),{},((_={})[g]=h?"0":"",_[p]=d?"0":"",_.transform=(m.devicePixelRatio||1)<2?"translate("+u+"px, "+f+"px)":"translate3d("+u+"px, "+f+"px, 0)",_)):Object.assign(Object.assign({},b),{},((e={})[g]=h?f+"px":"",e[p]=d?u+"px":"",e.transform="",e))}var jt={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,n=t.options,i=n.gpuAcceleration,o=void 0===i||i,r=n.adaptive,s=void 0===r||r,a={placement:mt(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:o};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign(Object.assign({},e.styles.popper),St(Object.assign(Object.assign({},a),{},{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:s})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign(Object.assign({},e.styles.arrow),St(Object.assign(Object.assign({},a),{},{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1})))),e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-placement":e.placement})},data:{}},Nt={passive:!0};var It={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,n=t.instance,i=t.options,o=i.scroll,r=void 0===o||o,s=i.resize,a=void 0===s||s,l=dt(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return r&&c.forEach((function(t){t.addEventListener("scroll",n.update,Nt)})),a&&l.addEventListener("resize",n.update,Nt),function(){r&&c.forEach((function(t){t.removeEventListener("scroll",n.update,Nt)})),a&&l.removeEventListener("resize",n.update,Nt)}},data:{}},Pt={left:"right",right:"left",bottom:"top",top:"bottom"};function Mt(t){return t.replace(/left|right|bottom|top/g,(function(t){return Pt[t]}))}var Bt={start:"end",end:"start"};function Ht(t){return t.replace(/start|end/g,(function(t){return Bt[t]}))}function Rt(t){var e=t.getBoundingClientRect();return{width:e.width,height:e.height,top:e.top,right:e.right,bottom:e.bottom,left:e.left,x:e.left,y:e.top}}function Wt(t){var e=dt(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Kt(t){return Rt(wt(t)).left+Wt(t).scrollLeft}function Qt(t){var e=bt(t),n=e.overflow,i=e.overflowX,o=e.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+i)}function Ut(t,e){void 0===e&&(e=[]);var n=function t(e){return["html","body","#document"].indexOf(ft(e))>=0?e.ownerDocument.body:pt(e)&&Qt(e)?e:t(Et(e))}(t),i="body"===ft(n),o=dt(n),r=i?[o].concat(o.visualViewport||[],Qt(n)?n:[]):n,s=e.concat(r);return i?s:s.concat(Ut(Et(r)))}function Ft(t){return Object.assign(Object.assign({},t),{},{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function Yt(t,e){return"viewport"===e?Ft(function(t){var e=dt(t),n=wt(t),i=e.visualViewport,o=n.clientWidth,r=n.clientHeight,s=0,a=0;return i&&(o=i.width,r=i.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(s=i.offsetLeft,a=i.offsetTop)),{width:o,height:r,x:s+Kt(t),y:a}}(t)):pt(e)?function(t){var e=Rt(t);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}(e):Ft(function(t){var e=wt(t),n=Wt(t),i=t.ownerDocument.body,o=Math.max(e.scrollWidth,e.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),r=Math.max(e.scrollHeight,e.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),s=-n.scrollLeft+Kt(t),a=-n.scrollTop;return"rtl"===bt(i||e).direction&&(s+=Math.max(e.clientWidth,i?i.clientWidth:0)-o),{width:o,height:r,x:s,y:a}}(wt(t)))}function qt(t,e,n){var i="clippingParents"===e?function(t){var e=Ut(Et(t)),n=["absolute","fixed"].indexOf(bt(t).position)>=0&&pt(t)?kt(t):t;return ht(n)?e.filter((function(t){return ht(t)&&_t(t,n)&&"body"!==ft(t)})):[]}(t):[].concat(e),o=[].concat(i,[n]),r=o[0],s=o.reduce((function(e,n){var i=Yt(t,n);return e.top=Math.max(i.top,e.top),e.right=Math.min(i.right,e.right),e.bottom=Math.min(i.bottom,e.bottom),e.left=Math.max(i.left,e.left),e}),Yt(t,r));return s.width=s.right-s.left,s.height=s.bottom-s.top,s.x=s.left,s.y=s.top,s}function zt(t){return t.split("-")[1]}function Vt(t){var e,n=t.reference,i=t.element,o=t.placement,r=o?mt(o):null,s=o?zt(o):null,a=n.x+n.width/2-i.width/2,l=n.y+n.height/2-i.height/2;switch(r){case it:e={x:a,y:n.y-i.height};break;case ot:e={x:a,y:n.y+n.height};break;case rt:e={x:n.x+n.width,y:l};break;case st:e={x:n.x-i.width,y:l};break;default:e={x:n.x,y:n.y}}var c=r?Ot(r):null;if(null!=c){var u="y"===c?"height":"width";switch(s){case"start":e[c]=Math.floor(e[c])-Math.floor(n[u]/2-i[u]/2);break;case"end":e[c]=Math.floor(e[c])+Math.ceil(n[u]/2-i[u]/2)}}return e}function Xt(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=void 0===i?t.placement:i,r=n.boundary,s=void 0===r?"clippingParents":r,a=n.rootBoundary,l=void 0===a?"viewport":a,c=n.elementContext,u=void 0===c?"popper":c,f=n.altBoundary,d=void 0!==f&&f,h=n.padding,p=void 0===h?0:h,g=At("number"!=typeof p?p:Ct(p,at)),m="popper"===u?"reference":"popper",v=t.elements.reference,_=t.rects.popper,b=t.elements[d?m:u],y=qt(ht(b)?b:b.contextElement||wt(t.elements.popper),s,l),w=Rt(v),E=Vt({reference:w,element:_,strategy:"absolute",placement:o}),T=Ft(Object.assign(Object.assign({},_),E)),k="popper"===u?T:w,O={top:y.top-k.top+g.top,bottom:k.bottom-y.bottom+g.bottom,left:y.left-k.left+g.left,right:k.right-y.right+g.right},L=t.modifiersData.offset;if("popper"===u&&L){var A=L[o];Object.keys(O).forEach((function(t){var e=[rt,ot].indexOf(t)>=0?1:-1,n=[it,ot].indexOf(t)>=0?"y":"x";O[t]+=A[n]*e}))}return O}function $t(t,e){void 0===e&&(e={});var n=e,i=n.placement,o=n.boundary,r=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,c=void 0===l?ct:l,u=zt(i),f=u?a?lt:lt.filter((function(t){return zt(t)===u})):at,d=f.filter((function(t){return c.indexOf(t)>=0}));0===d.length&&(d=f);var h=d.reduce((function(e,n){return e[n]=Xt(t,{placement:n,boundary:o,rootBoundary:r,padding:s})[mt(n)],e}),{});return Object.keys(h).sort((function(t,e){return h[t]-h[e]}))}var Gt={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name;if(!e.modifiersData[i]._skip){for(var o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0===s||s,l=n.fallbackPlacements,c=n.padding,u=n.boundary,f=n.rootBoundary,d=n.altBoundary,h=n.flipVariations,p=void 0===h||h,g=n.allowedAutoPlacements,m=e.options.placement,v=mt(m),_=l||(v===m||!p?[Mt(m)]:function(t){if("auto"===mt(t))return[];var e=Mt(t);return[Ht(t),e,Ht(e)]}(m)),b=[m].concat(_).reduce((function(t,n){return t.concat("auto"===mt(n)?$t(e,{placement:n,boundary:u,rootBoundary:f,padding:c,flipVariations:p,allowedAutoPlacements:g}):n)}),[]),y=e.rects.reference,w=e.rects.popper,E=new Map,T=!0,k=b[0],O=0;O=0,x=D?"width":"height",S=Xt(e,{placement:L,boundary:u,rootBoundary:f,altBoundary:d,padding:c}),j=D?C?rt:st:C?ot:it;y[x]>w[x]&&(j=Mt(j));var N=Mt(j),I=[];if(r&&I.push(S[A]<=0),a&&I.push(S[j]<=0,S[N]<=0),I.every((function(t){return t}))){k=L,T=!1;break}E.set(L,I)}if(T)for(var P=function(t){var e=b.find((function(e){var n=E.get(e);if(n)return n.slice(0,t).every((function(t){return t}))}));if(e)return k=e,"break"},M=p?3:1;M>0;M--){if("break"===P(M))break}e.placement!==k&&(e.modifiersData[i]._skip=!0,e.placement=k,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function Zt(t,e,n){return void 0===n&&(n={x:0,y:0}),{top:t.top-e.height-n.y,right:t.right-e.width+n.x,bottom:t.bottom-e.height+n.y,left:t.left-e.width-n.x}}function Jt(t){return[it,rt,ot,st].some((function(e){return t[e]>=0}))}var te={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,n=t.name,i=e.rects.reference,o=e.rects.popper,r=e.modifiersData.preventOverflow,s=Xt(e,{elementContext:"reference"}),a=Xt(e,{altBoundary:!0}),l=Zt(s,i),c=Zt(a,o,r),u=Jt(l),f=Jt(c);e.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:u,hasPopperEscaped:f},e.attributes.popper=Object.assign(Object.assign({},e.attributes.popper),{},{"data-popper-reference-hidden":u,"data-popper-escaped":f})}};var ee={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.offset,r=void 0===o?[0,0]:o,s=ct.reduce((function(t,n){return t[n]=function(t,e,n){var i=mt(t),o=[st,it].indexOf(i)>=0?-1:1,r="function"==typeof n?n(Object.assign(Object.assign({},e),{},{placement:t})):n,s=r[0],a=r[1];return s=s||0,a=(a||0)*o,[st,rt].indexOf(i)>=0?{x:a,y:s}:{x:s,y:a}}(n,e.rects,r),t}),{}),a=s[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[i]=s}};var ne={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,n=t.name;e.modifiersData[n]=Vt({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}};var ie={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,n=t.options,i=t.name,o=n.mainAxis,r=void 0===o||o,s=n.altAxis,a=void 0!==s&&s,l=n.boundary,c=n.rootBoundary,u=n.altBoundary,f=n.padding,d=n.tether,h=void 0===d||d,p=n.tetherOffset,g=void 0===p?0:p,m=Xt(e,{boundary:l,rootBoundary:c,padding:f,altBoundary:u}),v=mt(e.placement),_=zt(e.placement),b=!_,y=Ot(v),w="x"===y?"y":"x",E=e.modifiersData.popperOffsets,T=e.rects.reference,k=e.rects.popper,O="function"==typeof g?g(Object.assign(Object.assign({},e.rects),{},{placement:e.placement})):g,L={x:0,y:0};if(E){if(r){var A="y"===y?it:st,C="y"===y?ot:rt,D="y"===y?"height":"width",x=E[y],S=E[y]+m[A],j=E[y]-m[C],N=h?-k[D]/2:0,I="start"===_?T[D]:k[D],P="start"===_?-k[D]:-T[D],M=e.elements.arrow,B=h&&M?vt(M):{width:0,height:0},H=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},R=H[A],W=H[C],K=Lt(0,T[D],B[D]),Q=b?T[D]/2-N-K-R-O:I-K-R-O,U=b?-T[D]/2+N+K+W+O:P+K+W+O,F=e.elements.arrow&&kt(e.elements.arrow),Y=F?"y"===y?F.clientTop||0:F.clientLeft||0:0,q=e.modifiersData.offset?e.modifiersData.offset[e.placement][y]:0,z=E[y]+Q-q-Y,V=E[y]+U-q,X=Lt(h?Math.min(S,z):S,x,h?Math.max(j,V):j);E[y]=X,L[y]=X-x}if(a){var $="x"===y?it:st,G="x"===y?ot:rt,Z=E[w],J=Lt(Z+m[$],Z,Z-m[G]);E[w]=J,L[w]=J-Z}e.modifiersData[i]=L}},requiresIfExists:["offset"]};function oe(t,e,n){void 0===n&&(n=!1);var i,o,r=wt(e),s=Rt(t),a=pt(e),l={scrollLeft:0,scrollTop:0},c={x:0,y:0};return(a||!a&&!n)&&(("body"!==ft(e)||Qt(r))&&(l=(i=e)!==dt(i)&&pt(i)?{scrollLeft:(o=i).scrollLeft,scrollTop:o.scrollTop}:Wt(i)),pt(e)?((c=Rt(e)).x+=e.clientLeft,c.y+=e.clientTop):r&&(c.x=Kt(r))),{x:s.left+l.scrollLeft-c.x,y:s.top+l.scrollTop-c.y,width:s.width,height:s.height}}function re(t){var e=new Map,n=new Set,i=[];return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){n.has(t.name)||function t(o){n.add(o.name),[].concat(o.requires||[],o.requiresIfExists||[]).forEach((function(i){if(!n.has(i)){var o=e.get(i);o&&t(o)}})),i.push(o)}(t)})),i}var se={placement:"bottom",modifiers:[],strategy:"absolute"};function ae(){for(var t=arguments.length,e=new Array(t),n=0;n0&&r--,"ArrowDown"===t.key&&rdocument.documentElement.clientHeight;e||(this._element.style.overflowY="hidden"),this._element.classList.add("modal-static");var n=u(this._dialog);H.off(this._element,"transitionend"),H.one(this._element,"transitionend",(function(){t._element.classList.remove("modal-static"),e||(H.one(t._element,"transitionend",(function(){t._element.style.overflowY=""})),h(t._element,n))})),h(this._element,n),this._element.focus()}},r._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;(!this._isBodyOverflowing&&t&&!y||this._isBodyOverflowing&&!t&&y)&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),(this._isBodyOverflowing&&!t&&!y||!this._isBodyOverflowing&&t&&y)&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},r._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},r._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",container:!1,fallbackPlacements:null,boundary:"clippingParents",customClass:"",sanitize:!0,sanitizeFn:null,allowList:xe,popperConfig:null},He={HIDE:"hide.bs.tooltip",HIDDEN:"hidden.bs.tooltip",SHOW:"show.bs.tooltip",SHOWN:"shown.bs.tooltip",INSERTED:"inserted.bs.tooltip",CLICK:"click.bs.tooltip",FOCUSIN:"focusin.bs.tooltip",FOCUSOUT:"focusout.bs.tooltip",MOUSEENTER:"mouseenter.bs.tooltip",MOUSELEAVE:"mouseleave.bs.tooltip"},Re=function(t){function o(e,n){var i;if(void 0===de)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");return(i=t.call(this,e)||this)._isEnabled=!0,i._timeout=0,i._hoverState="",i._activeTrigger={},i._popper=null,i.config=i._getConfig(n),i.tip=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.enable=function(){this._isEnabled=!0},r.disable=function(){this._isEnabled=!1},r.toggleEnabled=function(){this._isEnabled=!this._isEnabled},r.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=T(t.delegateTarget,e);n||(n=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(this.getTipElement().classList.contains("show"))return void this._leave(null,this);this._enter(null,this)}},r.dispose=function(){clearTimeout(this._timeout),H.off(this._element,this.constructor.EVENT_KEY),H.off(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.tip&&this.tip.parentNode.removeChild(this.tip),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.config=null,this.tip=null,t.prototype.dispose.call(this)},r.show=function(){var t=this;if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(this.isWithContent()&&this._isEnabled){var e=H.trigger(this._element,this.constructor.Event.SHOW),n=function t(e){if(!document.documentElement.attachShadow)return null;if("function"==typeof e.getRootNode){var n=e.getRootNode();return n instanceof ShadowRoot?n:null}return e instanceof ShadowRoot?e:e.parentNode?t(e.parentNode):null}(this._element),i=null===n?this._element.ownerDocument.documentElement.contains(this._element):n.contains(this._element);if(e.defaultPrevented||!i)return;var o=this.getTipElement(),r=s(this.constructor.NAME);o.setAttribute("id",r),this._element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&o.classList.add("fade");var a="function"==typeof this.config.placement?this.config.placement.call(this,o,this._element):this.config.placement,l=this._getAttachment(a);this._addAttachmentClass(l);var c=this._getContainer();E(o,this.constructor.DATA_KEY,this),this._element.ownerDocument.documentElement.contains(this.tip)||c.appendChild(o),H.trigger(this._element,this.constructor.Event.INSERTED),this._popper=fe(this._element,o,this._getPopperConfig(l)),o.classList.add("show");var f,d,p="function"==typeof this.config.customClass?this.config.customClass():this.config.customClass;if(p)(f=o.classList).add.apply(f,p.split(" "));if("ontouchstart"in document.documentElement)(d=[]).concat.apply(d,document.body.children).forEach((function(t){H.on(t,"mouseover",(function(){}))}));var g=function(){var e=t._hoverState;t._hoverState=null,H.trigger(t._element,t.constructor.Event.SHOWN),"out"===e&&t._leave(null,t)};if(this.tip.classList.contains("fade")){var m=u(this.tip);H.one(this.tip,"transitionend",g),h(this.tip,m)}else g()}},r.hide=function(){var t=this;if(this._popper){var e=this.getTipElement(),n=function(){"show"!==t._hoverState&&e.parentNode&&e.parentNode.removeChild(e),t._cleanTipClass(),t._element.removeAttribute("aria-describedby"),H.trigger(t._element,t.constructor.Event.HIDDEN),t._popper&&(t._popper.destroy(),t._popper=null)};if(!H.trigger(this._element,this.constructor.Event.HIDE).defaultPrevented){var i;if(e.classList.remove("show"),"ontouchstart"in document.documentElement)(i=[]).concat.apply(i,document.body.children).forEach((function(t){return H.off(t,"mouseover",m)}));if(this._activeTrigger.click=!1,this._activeTrigger.focus=!1,this._activeTrigger.hover=!1,this.tip.classList.contains("fade")){var o=u(e);H.one(e,"transitionend",n),h(e,o)}else n();this._hoverState=""}}},r.update=function(){null!==this._popper&&this._popper.update()},r.isWithContent=function(){return Boolean(this.getTitle())},r.getTipElement=function(){if(this.tip)return this.tip;var t=document.createElement("div");return t.innerHTML=this.config.template,this.tip=t.children[0],this.tip},r.setContent=function(){var t=this.getTipElement();this.setElementContent(q.findOne(".tooltip-inner",t),this.getTitle()),t.classList.remove("fade","show")},r.setElementContent=function(t,e){if(null!==t)return"object"==typeof e&&d(e)?(e.jquery&&(e=e[0]),void(this.config.html?e.parentNode!==t&&(t.innerHTML="",t.appendChild(e)):t.textContent=e.textContent)):void(this.config.html?(this.config.sanitize&&(e=Se(e,this.config.allowList,this.config.sanitizeFn)),t.innerHTML=e):t.textContent=e)},r.getTitle=function(){var t=this._element.getAttribute("data-bs-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this._element):this.config.title),t},r.updateAttachment=function(t){return"right"===t?"end":"left"===t?"start":t},r._getPopperConfig=function(t){var e=this,i={name:"flip",options:{altBoundary:!0}};return this.config.fallbackPlacements&&(i.options.fallbackPlacements=this.config.fallbackPlacements),n({},{placement:t,modifiers:[i,{name:"preventOverflow",options:{rootBoundary:this.config.boundary}},{name:"arrow",options:{element:"."+this.constructor.NAME+"-arrow"}},{name:"onChange",enabled:!0,phase:"afterWrite",fn:function(t){return e._handlePopperPlacementChange(t)}}],onFirstUpdate:function(t){t.options.placement!==t.placement&&e._handlePopperPlacementChange(t)}},this.config.popperConfig)},r._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-tooltip-"+this.updateAttachment(t))},r._getContainer=function(){return!1===this.config.container?document.body:d(this.config.container)?this.config.container:q.findOne(this.config.container)},r._getAttachment=function(t){return Me[t.toUpperCase()]},r._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)H.on(t._element,t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if("manual"!==e){var n="hover"===e?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,i="hover"===e?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;H.on(t._element,n,t.config.selector,(function(e){return t._enter(e)})),H.on(t._element,i,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t._element&&t.hide()},H.on(this._element.closest(".modal"),"hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=n({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},r._fixTitle=function(){var t=this._element.getAttribute("title"),e=typeof this._element.getAttribute("data-bs-original-title");(t||"string"!==e)&&(this._element.setAttribute("data-bs-original-title",t||""),!t||this._element.getAttribute("aria-label")||this._element.textContent||this._element.setAttribute("aria-label",t),this._element.setAttribute("title",""))},r._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),t&&(e._activeTrigger["focusin"===t.type?"focus":"hover"]=!0),e.getTipElement().classList.contains("show")||"show"===e._hoverState?e._hoverState="show":(clearTimeout(e._timeout),e._hoverState="show",e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){"show"===e._hoverState&&e.show()}),e.config.delay.show):e.show())},r._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||T(t.delegateTarget,n))||(e=new this.constructor(t.delegateTarget,this._getDelegateConfig()),E(t.delegateTarget,n,e)),t&&(e._activeTrigger["focusout"===t.type?"focus":"hover"]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState="out",e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){"out"===e._hoverState&&e.hide()}),e.config.delay.hide):e.hide())},r._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},r._getConfig=function(t){var e=Y.getDataAttributes(this._element);return Object.keys(e).forEach((function(t){Ie.has(t)&&delete e[t]})),t&&"object"==typeof t.container&&t.container.jquery&&(t.container=t.container[0]),"number"==typeof(t=n({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),p(je,t,this.constructor.DefaultType),t.sanitize&&(t.template=Se(t.template,t.allowList,t.sanitizeFn)),t},r._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},r._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ne);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},r._handlePopperPlacementChange=function(t){var e=t.state;e&&(this.tip=e.elements.popper,this._cleanTipClass(),this._addAttachmentClass(this._getAttachment(e.placement)))},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tooltip"),n="object"==typeof t&&t;if((e||!/dispose|hide/.test(t))&&(e||(e=new o(this,n)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(o,null,[{key:"Default",get:function(){return Be}},{key:"NAME",get:function(){return je}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return He}},{key:"EVENT_KEY",get:function(){return".bs.tooltip"}},{key:"DefaultType",get:function(){return Pe}}]),o}(R);b((function(){var t=_();if(t){var e=t.fn[je];t.fn[je]=Re.jQueryInterface,t.fn[je].Constructor=Re,t.fn[je].noConflict=function(){return t.fn[je]=e,Re.jQueryInterface}}}));var We="popover",Ke=new RegExp("(^|\\s)bs-popover\\S+","g"),Qe=n({},Re.Default,{placement:"right",trigger:"click",content:"",template:''}),Ue=n({},Re.DefaultType,{content:"(string|element|function)"}),Fe={HIDE:"hide.bs.popover",HIDDEN:"hidden.bs.popover",SHOW:"show.bs.popover",SHOWN:"shown.bs.popover",INSERTED:"inserted.bs.popover",CLICK:"click.bs.popover",FOCUSIN:"focusin.bs.popover",FOCUSOUT:"focusout.bs.popover",MOUSEENTER:"mouseenter.bs.popover",MOUSELEAVE:"mouseleave.bs.popover"},Ye=function(t){function n(){return t.apply(this,arguments)||this}i(n,t);var o=n.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.setContent=function(){var t=this.getTipElement();this.setElementContent(q.findOne(".popover-header",t),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this._element)),this.setElementContent(q.findOne(".popover-body",t),e),t.classList.remove("fade","show")},o._addAttachmentClass=function(t){this.getTipElement().classList.add("bs-popover-"+this.updateAttachment(t))},o._getContent=function(){return this._element.getAttribute("data-bs-content")||this.config.content},o._cleanTipClass=function(){var t=this.getTipElement(),e=t.getAttribute("class").match(Ke);null!==e&&e.length>0&&e.map((function(t){return t.trim()})).forEach((function(e){return t.classList.remove(e)}))},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.popover"),i="object"==typeof t?t:null;if((e||!/dispose|hide/.test(t))&&(e||(e=new n(this,i),E(this,"bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"Default",get:function(){return Qe}},{key:"NAME",get:function(){return We}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return Fe}},{key:"EVENT_KEY",get:function(){return".bs.popover"}},{key:"DefaultType",get:function(){return Ue}}]),n}(Re);b((function(){var t=_();if(t){var e=t.fn[We];t.fn[We]=Ye.jQueryInterface,t.fn[We].Constructor=Ye,t.fn[We].noConflict=function(){return t.fn[We]=e,Ye.jQueryInterface}}}));var qe="scrollspy",ze={offset:10,method:"auto",target:""},Ve={offset:"number",method:"string",target:"(string|element)"},Xe=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._scrollElement="BODY"===e.tagName?window:e,i._config=i._getConfig(n),i._selector=i._config.target+" .nav-link, "+i._config.target+" .list-group-item, "+i._config.target+" .dropdown-item",i._offsets=[],i._targets=[],i._activeTarget=null,i._scrollHeight=0,H.on(i._scrollElement,"scroll.bs.scrollspy",(function(t){return i._process(t)})),i.refresh(),i._process(),i}i(o,t);var r=o.prototype;return r.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?"offset":"position",n="auto"===this._config.method?e:this._config.method,i="position"===n?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),q.find(this._selector).map((function(t){var e=l(t),o=e?q.findOne(e):null;if(o){var r=o.getBoundingClientRect();if(r.width||r.height)return[Y[n](o).top+i,e]}return null})).filter((function(t){return t})).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},r.dispose=function(){t.prototype.dispose.call(this),H.off(this._scrollElement,".bs.scrollspy"),this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},r._getConfig=function(t){if("string"!=typeof(t=n({},ze,"object"==typeof t&&t?t:{})).target&&d(t.target)){var e=t.target.id;e||(e=s(qe),t.target.id=e),t.target="#"+e}return p(qe,t,Ve),t},r._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},r._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},r._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},r._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;){this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t li > .active":".active";e=(e=q.find(o,i))[e.length-1]}var r=null;if(e&&(r=H.trigger(e,"hide.bs.tab",{relatedTarget:this._element})),!(H.trigger(this._element,"show.bs.tab",{relatedTarget:e}).defaultPrevented||null!==r&&r.defaultPrevented)){this._activate(this._element,i);var s=function(){H.trigger(e,"hidden.bs.tab",{relatedTarget:t._element}),H.trigger(t._element,"shown.bs.tab",{relatedTarget:e})};n?this._activate(n,n.parentNode,s):s()}}},o._activate=function(t,e,n){var i=this,o=(!e||"UL"!==e.nodeName&&"OL"!==e.nodeName?q.children(e,".active"):q.find(":scope > li > .active",e))[0],r=n&&o&&o.classList.contains("fade"),s=function(){return i._transitionComplete(t,o,n)};if(o&&r){var a=u(o);o.classList.remove("show"),H.one(o,"transitionend",s),h(o,a)}else s()},o._transitionComplete=function(t,e,n){if(e){e.classList.remove("active");var i=q.findOne(":scope > .dropdown-menu .active",e.parentNode);i&&i.classList.remove("active"),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!1)}(t.classList.add("active"),"tab"===t.getAttribute("role")&&t.setAttribute("aria-selected",!0),v(t),t.classList.contains("fade")&&t.classList.add("show"),t.parentNode&&t.parentNode.classList.contains("dropdown-menu"))&&(t.closest(".dropdown")&&q.find(".dropdown-toggle").forEach((function(t){return t.classList.add("active")})),t.setAttribute("aria-expanded",!0));n&&n()},n.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.tab")||new n(this);if("string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t]()}}))},e(n,null,[{key:"DATA_KEY",get:function(){return"bs.tab"}}]),n}(R);H.on(document,"click.bs.tab.data-api",'[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',(function(t){t.preventDefault(),(T(this,"bs.tab")||new $e(this)).show()})),b((function(){var t=_();if(t){var e=t.fn.tab;t.fn.tab=$e.jQueryInterface,t.fn.tab.Constructor=$e,t.fn.tab.noConflict=function(){return t.fn.tab=e,$e.jQueryInterface}}}));var Ge={animation:"boolean",autohide:"boolean",delay:"number"},Ze={animation:!0,autohide:!0,delay:5e3},Je=function(t){function o(e,n){var i;return(i=t.call(this,e)||this)._config=i._getConfig(n),i._timeout=null,i._setListeners(),i}i(o,t);var r=o.prototype;return r.show=function(){var t=this;if(!H.trigger(this._element,"show.bs.toast").defaultPrevented){this._clearTimeout(),this._config.animation&&this._element.classList.add("fade");var e=function(){t._element.classList.remove("showing"),t._element.classList.add("show"),H.trigger(t._element,"shown.bs.toast"),t._config.autohide&&(t._timeout=setTimeout((function(){t.hide()}),t._config.delay))};if(this._element.classList.remove("hide"),v(this._element),this._element.classList.add("showing"),this._config.animation){var n=u(this._element);H.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.hide=function(){var t=this;if(this._element.classList.contains("show")&&!H.trigger(this._element,"hide.bs.toast").defaultPrevented){var e=function(){t._element.classList.add("hide"),H.trigger(t._element,"hidden.bs.toast")};if(this._element.classList.remove("show"),this._config.animation){var n=u(this._element);H.one(this._element,"transitionend",e),h(this._element,n)}else e()}},r.dispose=function(){this._clearTimeout(),this._element.classList.contains("show")&&this._element.classList.remove("show"),H.off(this._element,"click.dismiss.bs.toast"),t.prototype.dispose.call(this),this._config=null},r._getConfig=function(t){return t=n({},Ze,Y.getDataAttributes(this._element),"object"==typeof t&&t?t:{}),p("toast",t,this.constructor.DefaultType),t},r._setListeners=function(){var t=this;H.on(this._element,"click.dismiss.bs.toast",'[data-bs-dismiss="toast"]',(function(){return t.hide()}))},r._clearTimeout=function(){clearTimeout(this._timeout),this._timeout=null},o.jQueryInterface=function(t){return this.each((function(){var e=T(this,"bs.toast");if(e||(e=new o(this,"object"==typeof t&&t)),"string"==typeof t){if(void 0===e[t])throw new TypeError('No method named "'+t+'"');e[t](this)}}))},e(o,null,[{key:"DefaultType",get:function(){return Ge}},{key:"Default",get:function(){return Ze}},{key:"DATA_KEY",get:function(){return"bs.toast"}}]),o}(R);return b((function(){var t=_();if(t){var e=t.fn.toast;t.fn.toast=Je.jQueryInterface,t.fn.toast.Constructor=Je,t.fn.toast.noConflict=function(){return t.fn.toast=e,Je.jQueryInterface}}})),{Alert:K,Button:Q,Carousel:Z,Collapse:nt,Dropdown:Te,Modal:Le,Popover:Ye,ScrollSpy:Xe,Tab:$e,Toast:Je,Tooltip:Re}})); //# sourceMappingURL=bootstrap.bundle.min.js.map -------------------- END OF FILE -------------------- ### FILE 88: RR COM/assets/js/custom.js - Type: JS - Size: 0 B - Path: RR COM/assets/js - Name: custom.js ------------------------------------------------------------ -------------------- END OF FILE -------------------- ### FILE 89: RR COM/assets/js/jquery-1.11.0.min.js - Type: JS - Size: 94.12 KB - Path: RR COM/assets/js - Name: jquery-1.11.0.min.js ------------------------------------------------------------ /*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f }}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("