name('cloud.console'); } $r2 = Route::get('/api/console/health', [CloudConsoleController::class, 'apiHealth']); if ($withNames) { $r2->name('cloud.console.health'); } $r3 = Route::get('/projects/{slug}/console', [CloudConsoleController::class, 'tenantConsole']); if ($withNames) { $r3->name('cloud.console.project'); } // Chß╗æt chß║╖n bß║úo mß║¡t x├íc thß╗▒c tß║¡p trung cho to├án bß╗Ö API ─æiß╗üu khiß╗ân Route::middleware(['auth:web'])->group(function () use ($withNames) { $routes = [ ['post', '/api/console/media/upload', 'uploadMedia', 'cloud.console.media.upload'], ['post', '/api/console/media/{id}/update', 'updateMedia', 'cloud.console.media.update'], ['post', '/api/console/media/{id}/toggle-protect', 'toggleProtectMedia', 'cloud.console.media.toggle_protect'], ['post', '/api/console/media/bulk-protect', 'bulkProtectMedia', 'cloud.console.media.bulk_protect'], ['delete', '/api/console/media/{id}', 'deleteMedia', 'cloud.console.media.delete'], ['post', '/api/console/media/cleanup', 'cleanupMedia', 'cloud.console.media.cleanup'], ['post', '/api/console/media/restore/{id}', 'restoreMedia', 'cloud.console.media.restore'], ['delete', '/api/console/media/trash/empty', 'emptyTrashMedia', 'cloud.console.media.empty_trash'], ['post', '/api/console/media/settings', 'saveMediaSettings', 'cloud.console.media.settings'], ['post', '/api/console/media/bulk-delete', 'bulkDeleteMedia', 'cloud.console.media.bulk_delete'], ['post', '/api/console/media/bulk-move', 'bulkMoveMedia', 'cloud.console.media.bulk_move'], ['post', '/api/console/media/bulk-copy', 'bulkCopyMedia', 'cloud.console.media.bulk_copy'], ['post', '/api/console/media/save-transformed', 'saveTransformedMedia', 'cloud.console.media.save_transformed'], ['post', '/api/console/media/sync', 'syncMedia', 'cloud.console.media.sync'], ['post', '/api/console/projects/create', 'createProject', 'cloud.console.projects.create'], ['post', '/api/console/projects/{id}/update', 'updateProject', 'cloud.console.projects.update'], ['post', '/api/console/projects/{id}/toggle-service', 'toggleProjectService', 'cloud.console.projects.toggle_service'], ['post', '/api/console/services/{id}/status', 'updateServiceStatus', 'cloud.console.services.status'], ['post', '/api/console/services/{id}/config', 'updateServiceConfig', 'cloud.console.services.config'], ['post', '/api/console/services/global-settings', 'saveGlobalServiceSettings', 'cloud.console.services.global_settings'], ['post', '/api/console/projects/{id}/regenerate-keys', 'regenerateProjectKeys', 'cloud.console.projects.regenerate_keys'], ['post', '/api/console/projects/{id}/save-firebase', 'saveProjectFirebase', 'cloud.console.projects.save_firebase'], ['post', '/api/console/projects/{id}/policies/save', 'saveProjectPolicies', 'cloud.console.projects.policies.save'], ['post', '/api/console/projects/{id}/articles/save', 'saveProjectArticle', 'cloud.console.projects.articles.save'], ['post', '/api/console/articles/save', 'saveGlobalArticle', 'cloud.console.articles.save'], ['get', '/api/console/articles/{id}', 'getArticle', 'cloud.console.articles.show'], ['post', '/api/console/articles/{id}/affiliate-sync', 'syncArticleAffiliate', 'cloud.console.articles.affiliate.sync'], ['post', '/api/console/articles/{id}/ping-indexing', 'pingArticleIndexing', 'cloud.console.articles.ping_indexing'], ['post', '/api/console/articles/ai-assist', 'aiAssistArticle', 'cloud.console.articles.ai_assist'], ['post', '/api/console/projects/{id}/articles/ai-assist', 'aiAssistProjectArticle', 'cloud.console.projects.articles.ai_assist'], ['delete', '/api/console/projects/{id}/articles/{articleId}', 'deleteProjectArticle', 'cloud.console.projects.articles.delete'], ['post', '/api/console/articles/bulk-delete', 'bulkDeleteArticles', 'cloud.console.articles.bulk_delete'], ['post', '/api/console/articles/bulk-status', 'bulkUpdateArticleStatus', 'cloud.console.articles.bulk_status'], ['post', '/api/console/articles/{id}/source-images/scan', 'scanArticleSourceImages', 'cloud.console.articles.source_images.scan'], ['post', '/api/console/articles/{id}/source-images/import', 'importSourceImage', 'cloud.console.articles.source_images.import'], ['post', '/api/console/articles/{id}/suggest-cover-prompts', 'suggestCoverPrompts', 'cloud.console.articles.suggest_cover_prompts'], ['post', '/api/console/articles/{id}/generate-cover', 'generateArticleCover', 'cloud.console.articles.generate_cover'], ['post', '/api/console/projects/{id}/categories/save', 'saveProjectCategory', 'cloud.console.projects.categories.save'], ['delete', '/api/console/projects/{id}/categories/{categoryId}', 'deleteProjectCategory', 'cloud.console.projects.categories.delete'], ['post', '/api/console/projects/{id}/pages/save', 'saveProjectPage', 'cloud.console.projects.pages.save'], ['delete', '/api/console/projects/{id}/pages/{pageId}', 'deleteProjectPage', 'cloud.console.projects.pages.delete'], ['post', '/api/console/projects/{id}/article-settings/save', 'saveProjectArticleSettings', 'cloud.console.projects.article_settings.save'], ['post', '/api/console/seo/global-settings', 'saveGlobalSeoSettings', 'cloud.console.seo.global_settings'], ['post', '/api/console/seo/global/save', 'saveGlobalSeoSettings', null], ['post', '/api/console/projects/{id}/seo/settings', 'saveProjectSeoSettings', 'cloud.console.projects.seo.settings'], ['post', '/api/console/projects/{id}/seo/save', 'saveProjectSeoSettings', null], ['post', '/api/console/projects/{id}/seo/indexnow/ping', 'pingIndexNow', 'cloud.console.projects.seo.indexnow.ping'], ['get', '/api/console/seo/google-indexing/status', 'getGoogleIndexingStatus', 'cloud.console.seo.google_indexing.status'], ['post', '/api/console/seo/google-indexing/settings', 'saveGoogleIndexingSettings', 'cloud.console.seo.google_indexing.settings'], ['post', '/api/console/seo/google-indexing/test', 'testGoogleIndexing', 'cloud.console.seo.google_indexing.test'], ['post', '/api/console/seo/google-indexing/push', 'pushGoogleIndexing', 'cloud.console.seo.google_indexing.push'], // Smart Internal Links Service Endpoints ['get', '/api/console/seo/internal-links/stats', 'getInternalLinkStats', 'cloud.console.seo.internal_links.stats'], ['post', '/api/console/seo/internal-links/preview', 'previewInternalLinksBatch', 'cloud.console.seo.internal_links.preview'], ['post', '/api/console/seo/internal-links/apply', 'applyInternalLinksBatch', 'cloud.console.seo.internal_links.apply'], ['post', '/api/console/seo/internal-links/custom-rules', 'saveInternalLinkCustomRules', 'cloud.console.seo.internal_links.custom_rules'], ['post', '/api/console/seo/internal-links/rescue-orphans', 'rescueInternalLinksOrphans', 'cloud.console.seo.internal_links.rescue_orphans'], // YouTube Analytics Service Endpoints ['post', '/api/console/projects/{id}/youtube-analytics/sync', 'syncProjectYouTubeAnalytics', 'cloud.console.projects.youtube_analytics.sync'], ['post', '/api/console/projects/{id}/youtube-analytics/audience', 'saveProjectYouTubeAudience', 'cloud.console.projects.youtube_analytics.audience'], ['post', '/api/console/projects/{id}/youtube-analytics/settings', 'saveProjectYouTubeSettings', 'cloud.console.projects.youtube_analytics.settings'], ['post', '/api/console/projects/{id}/youtube-analytics/test', 'testProjectYouTubeConnection', 'cloud.console.projects.youtube_analytics.test'], // Media Kit Proprietary Endpoints ['post', '/api/console/projects/{id}/mediakit/videos/save', 'saveMediaKitVideos', 'cloud.console.projects.mediakit.videos.save'], ['post', '/api/console/projects/{id}/mediakit/packages/save', 'saveMediaKitPackages', 'cloud.console.projects.mediakit.packages.save'], ['post', '/api/console/projects/{id}/mediakit/revenue/save', 'saveMediaKitRevenue', 'cloud.console.projects.mediakit.revenue.save'], ['post', '/api/console/projects/{id}/mediakit/channel/switch', 'switchProjectMediaKitChannel', 'cloud.console.projects.mediakit.channel.switch'], // AI Center Core Endpoints ['post', '/api/console/ai/agents/{id}/toggle', 'toggleAiAgent', 'cloud.console.ai.agents.toggle'], ['post', '/api/console/ai/agents/{id}/update', 'updateAiAgent', 'cloud.console.ai.agents.update'], ['post', '/api/console/ai/sources/save', 'saveAiSource', 'cloud.console.ai.sources.save'], ['post', '/api/console/ai/sources/{id}/toggle', 'toggleAiSource', 'cloud.console.ai.sources.toggle'], ['delete', '/api/console/ai/sources/{id}', 'deleteAiSource', 'cloud.console.ai.sources.delete'], ['post', '/api/console/ai/queue/{id}/action', 'actionAiQueue', 'cloud.console.ai.queue.action'], ['post', '/api/console/ai/trigger-job', 'triggerAiJob', 'cloud.console.ai.trigger_job'], ['post', '/api/console/ai/collection/settings', 'saveAiCollectionSettings', 'cloud.console.ai.collection.settings'], ['post', '/api/console/ai/production/settings', 'saveAiProductionSettings', 'cloud.console.ai.production.settings'], ['post', '/api/console/ai/collection/cleanup', 'cleanupAiCollection', 'cloud.console.ai.collection.cleanup'], ['post', '/api/console/ai/collection/clear-rss-logs', 'clearRssLogs', 'cloud.console.ai.collection.clear_rss_logs'], ['post', '/api/console/ai/settings', 'saveAiSettings', 'cloud.console.ai.settings'], ['post', '/api/console/ai/test-connection', 'testAiConnection', 'cloud.console.ai.test_connection'], ['post', '/api/console/ai/characters/save', 'saveAiCharacter', 'cloud.console.ai.characters.save'], ['post', '/api/console/ai/characters/{id}/toggle', 'toggleAiCharacter', 'cloud.console.ai.characters.toggle'], ['post', '/api/console/ai/characters/test-generate', 'testGenerateCharacter', 'cloud.console.ai.characters.test_generate'], // AI Tools & Engines Endpoints ['get', '/api/console/ai/tools/antigravity/state', 'getAntigravityStateApi', 'cloud.console.ai.tools.antigravity.state'], ['post', '/api/console/ai/tools/antigravity/dispatch', 'dispatchAntigravityTask', 'cloud.console.ai.tools.antigravity.dispatch'], ['post', '/api/console/ai/tools/antigravity/chat', 'executeAntigravityChat', 'cloud.console.ai.tools.antigravity.chat'], ['post', '/api/console/ai/tools/antigravity/stream', 'streamAntigravityTerminal', 'cloud.console.ai.tools.antigravity.stream'], ['get', '/api/console/ai/tools/antigravity/auth', 'getAntigravityAuthApi', 'cloud.console.ai.tools.antigravity.auth'], ['post', '/api/console/ai/tools/antigravity/auth/save', 'saveAntigravityAuth', 'cloud.console.ai.tools.antigravity.auth.save'], ['post', '/api/console/ai/keys/save', 'saveGeminiApiKey', 'cloud.console.ai.keys.save'], ['post', '/api/console/ai/keys/delete', 'deleteGeminiApiKey', 'cloud.console.ai.keys.delete'], ['post', '/api/console/ai/keys/test', 'testGeminiApiKey', 'cloud.console.ai.keys.test'], ['post', '/api/console/ai/directives/delete', 'deleteAiDirective', 'cloud.console.ai.directives.delete'], ['post', '/api/console/ai/directives/process-now', 'processAiDirectiveNow', 'cloud.console.ai.directives.process_now'], ['post', '/api/console/analytics/master/save', 'saveMasterGa4Config', 'cloud.console.analytics.master_save'], ['post', '/api/console/analytics/project/save', 'saveProjectGa4Config', 'cloud.console.analytics.project_save'], ['get', '/api/console/analytics/project/data', 'getProjectAnalyticsData', 'cloud.console.analytics.project_data'], ['post', '/api/console/analytics/test', 'testGa4Connection', 'cloud.console.analytics.test'], ['post', '/api/console/analytics/project/sync-now', 'syncProjectGa4Live', 'cloud.console.analytics.project_sync_now'], ['post', '/api/console/ai/tools/antigravity/auth/logout', 'logoutAntigravityAuth', 'cloud.console.ai.tools.antigravity.auth.logout'], // Developer Center & AI Sentinel Endpoints ['post', '/api/console/developer/git/backup', 'gitBackup', 'cloud.console.developer.git_backup'], ['post', '/api/console/developer/git/rollback', 'gitRollback', 'cloud.console.developer.git_rollback'], ['get', '/api/console/developer/git/commits', 'getGitCommits', 'cloud.console.developer.git_commits'], ['post', '/api/console/developer/sentinel/audit', 'runSentinelAudit', 'cloud.console.developer.sentinel_audit'], ['post', '/api/console/developer/sentinel/cleanup', 'runSentinelCleanup', 'cloud.console.developer.sentinel_cleanup'], // Affiliate Hub & Deals Engine Endpoints ['get', '/api/console/affiliate/deals', 'getAffiliateDeals', 'cloud.console.affiliate.deals'], ['post', '/api/console/affiliate/deals/save', 'saveAffiliateDeal', 'cloud.console.affiliate.deals.save'], ['delete', '/api/console/affiliate/deals/{id}', 'deleteAffiliateDeal', 'cloud.console.affiliate.deals.delete'], ['post', '/api/console/affiliate/deals/{id}/swap-link', 'swapAffiliateDealLink', 'cloud.console.affiliate.deals.swap_link'], ['post', '/api/console/affiliate/deals/{id}/label', 'updateAffiliateDealLabel', 'cloud.console.affiliate.deals.label'], ['post', '/api/console/affiliate/deals/{id}/update-details', 'updateAffiliateDealDetails', 'cloud.console.affiliate.deals.update_details'], ['post', '/api/console/affiliate/deals/quick-pass', 'quickPassAffiliateDeal', 'cloud.console.affiliate.deals.quick_pass'], ['post', '/api/console/affiliate/test-connection', 'testAffiliateConnection', 'cloud.console.affiliate.test_connection'], ['get', '/api/console/affiliate/conversions', 'getAffiliateConversions', 'cloud.console.affiliate.conversions'], ['post', '/api/console/affiliate/sync-conversions', 'syncAffiliateConversions', 'cloud.console.affiliate.sync_conversions'], ['post', '/api/console/affiliate/settings/save', 'saveAffiliateSettings', 'cloud.console.affiliate.settings.save'], ]; foreach ($routes as [$method, $uri, $action, $name]) { $r = Route::$method($uri, [CloudConsoleController::class, $action]); if ($withNames && ! empty($name)) { $r->name($name); } } // Module Tß╗▒ ─Éß╗Öng H├│a YouTube to Article $ytRoutes = [ ['get', '/api/console/youtube/channels', 'getChannels', 'cloud.console.youtube.channels'], ['post', '/api/console/youtube/channels/save', 'saveChannel', 'cloud.console.youtube.channels.save'], ['delete', '/api/console/youtube/channels/{id}', 'deleteChannel', 'cloud.console.youtube.channels.delete'], ['post', '/api/console/youtube/channels/{id}/scan', 'scanChannelNow', 'cloud.console.youtube.channels.scan'], ['get', '/api/console/youtube/queue', 'getQueue', 'cloud.console.youtube.queue'], ['post', '/api/console/youtube/queue/{id}/upload-sub', 'uploadCapcutSub', 'cloud.console.youtube.queue.upload_sub'], ['post', '/api/console/youtube/queue/{id}/process-now', 'processQueueItemNow', 'cloud.console.youtube.queue.process_now'], ['post', '/api/console/youtube/queue/{id}/publish-now', 'publishQueueItemNow', 'cloud.console.youtube.queue.publish_now'], ['delete', '/api/console/youtube/queue/{id}', 'deleteQueueItem', 'cloud.console.youtube.queue.delete'], ['post', '/api/console/youtube/lab/generate', 'generateFromLink', 'cloud.console.youtube.lab.generate'], ['get', '/api/console/youtube/settings', 'getSettings', 'cloud.console.youtube.settings'], ['post', '/api/console/youtube/settings/save', 'saveSettings', 'cloud.console.youtube.settings.save'], ['get', '/api/console/youtube/report', 'getReport', 'cloud.console.youtube.report'], ['post', '/api/console/youtube/queue/retry-failed', 'retryFailedQueue', 'cloud.console.youtube.queue.retry_failed'], ['post', '/api/console/youtube/queue/run-next', 'runNextBatchNow', 'cloud.console.youtube.queue.run_next'], ['post', '/api/console/youtube/queue/recalculate-schedule', 'recalculateQueueSchedule', 'cloud.console.youtube.queue.recalculate_schedule'], ]; foreach ($ytRoutes as [$method, $uri, $action, $name]) { $r = Route::$method($uri, [YouTubeConsoleController::class, $action]); if ($withNames && ! empty($name)) { $r->name($name); } } // Module Tự Động Hóa Shopee to Article $shopeeRoutes = [ ['post', '/api/console/shopee/parse-link', 'parseLink', 'cloud.console.shopee.parse_link'], ['post', '/api/console/shopee/parse-reviews', 'parseReviews', 'cloud.console.shopee.parse_reviews'], ['post', '/api/console/shopee/generate-article', 'generateArticle', 'cloud.console.shopee.generate_article'], ]; foreach ($shopeeRoutes as [$method, $uri, $action, $name]) { $r = Route::$method($uri, [ShopeeConsoleController::class, $action]); if ($withNames && ! empty($name)) { $r->name($name); } } // Module Trung T├óm Chiß║┐n Dß╗ïch MKT (Campaign Center) $campaignRoutes = [ ['get', '/api/console/campaigns', 'index', 'cloud.console.campaigns.index'], ['post', '/api/console/campaigns/plan', 'plan', 'cloud.console.campaigns.plan'], ['post', '/api/console/campaigns/create', 'store', 'cloud.console.campaigns.create'], ['post', '/api/console/campaigns/{id}/generate-article/{articleId}', 'generateArticle', 'cloud.console.campaigns.generate_article'], ['post', '/api/console/campaigns/{id}/toggle-status', 'toggleStatus', 'cloud.console.campaigns.toggle_status'], ['delete', '/api/console/campaigns/{id}', 'destroy', 'cloud.console.campaigns.destroy'], ]; foreach ($campaignRoutes as [$method, $uri, $action, $name]) { $r = Route::$method($uri, [CampaignController::class, $action]); if ($withNames && ! empty($name)) { $r->name($name); } } }); Route::get('/admin', fn () => redirect('/'.ProjectSubdomainContract::CENTRAL_ADMIN_PATH)); Route::get('/admin/{any}', fn ($any) => redirect('/'.ProjectSubdomainContract::CENTRAL_ADMIN_PATH.'/'.$any))->where('any', '.*'); }; // ─É─âng k├╜ domain ch├¡nh admin.dntvlabs.com (c├│ g├ín t├¬n route chuß║⌐n) v├á fallback kh├┤ng tr├╣ng t├¬n Route::domain('admin.dntvlabs.com')->group(fn () => $registerConsoleRoutes(true)); Route::group([], fn () => $registerConsoleRoutes(false)); // 2. Trß╗Ñ cß╗Öt Subdomain chuy├¬n biß╗çt: Project Media Kit (Tenant Project 'mediakit') Route::domain('mediakit.dntvlabs.com')->group(function () { Route::get('/console', [CloudConsoleController::class, 'tenantConsole']) ->defaults('tenant', 'mediakit'); Route::get('/', fn () => view('mediakit.home')); Route::get('/{channel}', function (string $channel) { $project = Project::where('slug', 'mediakit')->first(); return view('mediakit.index', [ 'project' => $project, 'channel' => ltrim($channel, '@'), ]); })->name('mediakit.channel'); }); // 3. Trß╗Ñ cß╗Öt Subdomain chuy├¬n biß╗çt: Brand Parking Domain cho Affiliate Deals (deal.dntvlabs.com) Route::domain('deal.dntvlabs.com')->group(function () { Route::get('/d/{code}', [AffiliateRedirectController::class, 'redirectDeal'])->name('deal.redirect.short'); Route::get('/{code}', [AffiliateRedirectController::class, 'redirectDeal'])->name('deal.redirect'); Route::get('/', fn () => redirect()->away('https://dntvlabs.com')); }); // 2. Trß╗Ñ cß╗Öt 2 Cß║Ñp Domain (Tier 1): Giao diß╗çn ng╞░ß╗¥i d├╣ng cuß╗æi d├ánh cho tß╗½ng dß╗▒ ├ín vß╗ç tinh // Phß╗Ñc vß╗Ñ URL: https://{tenant}.dntvlabs.com/ (loß║íi trß╗½ c├íc subdomain hß╗ç thß╗æng ─æ├ú bß║úo l╞░u) Route::domain('{tenant}.dntvlabs.com')->group(function () { $tenantRegex = '^(?!admin$|api$|content$|mail$|media$|mediakit$|service$|services$|status$|vpn$|gateway$|dev$|panel$|auth$|app$|directus$|deal$)[a-z0-9\-]+$'; Route::get('/console', [CloudConsoleController::class, 'tenantConsole']) ->where('tenant', $tenantRegex) ->name('tenant.console'); // SEO Service DNTV Labs: Feeds, Sitemaps, Robots & AI Manifests Route::get('/feed', fn (string $tenant) => TenantSeoService::renderRssFeed($tenant))->where('tenant', $tenantRegex)->name('tenant.feed'); Route::get('/rss', fn (string $tenant) => TenantSeoService::renderRssFeed($tenant))->where('tenant', $tenantRegex); Route::get('/sitemap.xml', fn (string $tenant) => TenantSeoService::renderSitemap($tenant))->where('tenant', $tenantRegex)->name('tenant.sitemap'); Route::get('/sitemap-news.xml', fn (string $tenant) => TenantSeoService::renderNewsSitemap($tenant))->where('tenant', $tenantRegex)->name('tenant.sitemap.news'); Route::get('/sitemap-video.xml', fn (string $tenant) => TenantSeoService::renderVideoSitemap($tenant))->where('tenant', $tenantRegex)->name('tenant.sitemap.video'); Route::get('/robots.txt', fn (string $tenant) => TenantSeoService::renderRobotsTxt($tenant))->where('tenant', $tenantRegex)->name('tenant.robots'); Route::get('/ads.txt', [AdsTxtController::class, 'index'])->name('tenant.ads.txt'); Route::get('/llms.txt', fn (string $tenant) => TenantSeoService::renderLlmsTxt($tenant, false))->where('tenant', $tenantRegex)->name('tenant.llms'); Route::get('/llms-full.txt', fn (string $tenant) => TenantSeoService::renderLlmsTxt($tenant, true))->where('tenant', $tenantRegex)->name('tenant.llms.full'); Route::get('/{key}.txt', fn (string $tenant, string $key) => TenantSeoService::renderIndexNowKey($tenant, $key))->where('tenant', $tenantRegex)->where('key', '^[a-zA-Z0-9\-]+$')->name('tenant.indexnow.key'); // Chuy├¬n mß╗Ñc b├ái viß║┐t: /c/{slug} // Central Policy Public Routes Route::get('/privacy', [TenantPublicController::class, 'privacyPolicy']) ->where('tenant', $tenantRegex)->name('tenant.privacy'); Route::get('/terms', [TenantPublicController::class, 'termsOfService']) ->where('tenant', $tenantRegex)->name('tenant.terms'); Route::get('/affiliate-disclosure', [TenantPublicController::class, 'affiliateDisclosure']) ->where('tenant', $tenantRegex)->name('tenant.affiliate_disclosure'); Route::get('/cookies', [TenantPublicController::class, 'cookiePolicy']) ->where('tenant', $tenantRegex)->name('tenant.cookies'); Route::get('/video', [TenantPublicController::class, 'videoHub']) ->where('tenant', $tenantRegex) ->name('tenant.video.hub'); Route::get('/v', [TenantPublicController::class, 'videoHub']) ->where('tenant', $tenantRegex); Route::get('/v/{slug}', [TenantPublicController::class, 'videoWatch']) ->where('tenant', $tenantRegex) ->name('tenant.video.watch'); Route::get('/c/{slug}', [TenantPublicController::class, 'category']) ->where('tenant', $tenantRegex) ->name('tenant.category'); // Chi tiß║┐t b├ái viß║┐t chuß║⌐n: /a/{slug} // Reaction cß║úm x├║c 1-chß║ím: /a/{slug}/react Route::post('/a/{slug}/react', [TenantPublicController::class, 'reactArticle']) ->where('tenant', $tenantRegex) ->name('tenant.article.react'); Route::get('/a/{slug}', [TenantPublicController::class, 'showArticle']) ->where('tenant', $tenantRegex) ->name('tenant.article'); // Trang chß╗º tin tß╗⌐c dß╗▒ ├ín: / Route::get('/', [TenantPublicController::class, 'index']) ->where('tenant', $tenantRegex) ->name('tenant.public'); }); // Fallback named login route (d├ánh cho Laravel default auth guards / session invalidations) Route::get('/login', fn () => redirect('/'.ProjectSubdomainContract::CENTRAL_ADMIN_PATH.'/login'))->name('login'); // 3. Central Web Landing Page (https://dntvlabs.com/) Route::get('/', function () { return view('welcome'); }); // Global shortlink redirect fallback: /d/{code} Route::get('/d/{code}', [AffiliateRedirectController::class, 'redirectDeal'])->name('global.deal.redirect'); // Google OAuth2 Socialite Endpoints Route::get('/auth/google', [GoogleAuthController::class, 'redirect'])->name('auth.google'); Route::get('/auth/google/callback', [GoogleAuthController::class, 'callback'])->name('auth.google.callback'); // Firebase Authentication Login Endpoint Route::post('/auth/firebase/login', [FirebaseAuthController::class, 'login']); // OAuth2 / OpenID Connect Provider Endpoints for Single Sign-On (SSO) Route::get('/.well-known/openid-configuration', [OidcProviderController::class, 'discovery']); Route::get('/oauth/authorize', [OidcProviderController::class, 'authorize']); Route::post('/oauth/token', [OidcProviderController::class, 'token']); Route::get('/oauth/token', [OidcProviderController::class, 'token']); Route::get('/oauth/userinfo', [OidcProviderController::class, 'userinfo']); Route::post('/oauth/userinfo', [OidcProviderController::class, 'userinfo']); // Dynamic IAB-compliant ads.txt route for main domain and subdomains Route::get('/ads.txt', [AdsTxtController::class, 'index'])->name('ads.txt'); ℼ佄呃偙⁅瑨汭ਾ格浴慬杮∽楶•汣獡㵳栢昭汵捳潲汬猭潭瑯≨ਾ格慥㹤 †㰠敭慴挠慨獲瑥∽呕ⵆ∸ਾ††洼瑥⁡慮敭∽楶睥潰瑲•潣瑮湥㵴眢摩桴搽癥捩ⵥ楷瑤ⱨ椠楮楴污猭慣敬ㄽ〮㸢 †㰠楴汴㹥〴‴‭桋듃杮吠곃桔뫡禥吠慲杮簠䐠呎⁖敔档⼼楴汴㹥 †㰠敭慴渠浡㵥爢扯瑯≳挠湯整瑮∽潮湩敤ⱸ映汯潬≷ਾ†† †㰠ⴡ‭慆楶潣ⴭਾ††氼湩敲㵬椢潣≮琠灹㵥椢慭敧瀯杮•牨晥∽是癡捩湯瀮杮㸢 †㰠楬歮爠汥∽桳牯捴瑵椠潣≮栠敲㵦⼢慦楶潣⹮捩≯ਾ††氼湩敲㵬愢灰敬琭畯档椭潣≮栠敲㵦⼢慦楶潣⹮湰≧ਾ †㰠ⴡ‭桔浥⁥睓瑩档牥匠牣灩⁴䌨醻杮䘠問⥃ⴠ㸭 †㰠捳楲瑰ਾ††††晩⠠潬慣卬潴慲敧朮瑥瑉浥✨整档瑟敨敭⤧㴠㴽✠慤歲⤧笠 †††††搠捯浵湥⹴潤畣敭瑮汅浥湥⹴汣獡䱳獩⹴摡⡤搧牡❫㬩 †††素攠獬⁥੻††††††潤畣敭瑮搮捯浵湥䕴敬敭瑮挮慬獳楌瑳爮浥癯⡥搧牡❫㬩 †††素 †㰠猯牣灩㹴ਊ††ℼⴭ吠楡睬湩⁤千⁓䑃⁎ⴭਾ††猼牣灩⁴牳㵣栢瑴獰⼺振湤琮楡睬湩捤獳挮浯㸢⼼捳楲瑰ਾ††猼牣灩㹴 †††琠楡睬湩⹤潣普杩㴠笠 †††††搠牡䵫摯㩥✠汣獡❳ਬ††††††桴浥㩥笠 †††††††攠瑸湥㩤笠 †††††††††挠汯牯㩳笠 †††††††††††戠慲摮›⁻〵›⌧捥敦晦Ⱗ㔠〰›⌧㘰㙢㑤Ⱗ㘠〰›⌧㠰ㄹ㉢Ⱗ㜠〰›⌧攰㐷〹‧੽††††††††††੽††††††††੽††††††੽††††੽††⼼捳楲瑰ਾ†† †㰠楬歮爠汥∽牰捥湯敮瑣•牨晥∽瑨灴㩳⼯潦瑮⹳潧杯敬灡獩挮浯㸢 †㰠楬歮爠汥∽牰捥湯敮瑣•牨晥∽瑨灴㩳⼯潦瑮⹳獧慴楴⹣潣≭挠潲獳牯杩湩ਾ††氼湩牨晥∽瑨灴㩳⼯潦瑮⹳潧杯敬灡獩挮浯振獳㼲慦業祬倽畬⭳慊慫瑲⭡慓獮眺桧䁴〳㬰〴㬰〵㬰〶㬰〷㬰〸☰慦業祬䨽瑥牂楡獮䴫湯㩯杷瑨㑀〰㔻〰㜻〰搦獩汰祡猽慷≰爠汥∽瑳汹獥敨瑥㸢 †㰠捳楲瑰搠晥牥猠捲∽瑨灴㩳⼯摣⹮獪敤楬牶渮瑥港浰愯灬湩橥䁳⸳⹸⽸楤瑳振湤洮湩樮≳㰾猯牣灩㹴ਊ††猼祴敬ਾ††††潢祤笠映湯⵴慦業祬›倧畬⁳慊慫瑲⁡慓獮Ⱗ猠湡⵳敳楲㭦素 †††⸠汧獡⵳慮⁶⁻慢正牤灯昭汩整㩲戠畬⡲㈱硰㬩ⴠ敷止瑩戭捡摫潲⵰楦瑬牥›汢牵ㄨ瀲⥸※੽††⼼瑳汹㹥㰊栯慥㹤㰊潢祤砠搭瑡㵡笢ਠ††慤歲潍敤›潬慣卬潴慲敧朮瑥瑉浥✨整档瑟敨敭⤧㴠㴽✠慤歲Ⱗ †琠杯汧呥敨敭⤨笠 †††琠楨⹳慤歲潍敤㴠℠桴獩搮牡䵫摯㭥 †††椠⁦琨楨⹳慤歲潍敤
੻††††††潤畣敭瑮搮捯浵湥䕴敬敭瑮挮慬獳楌瑳愮摤✨慤歲⤧਻††††††潬慣卬潴慲敧献瑥瑉浥✨整档瑟敨敭Ⱗ✠慤歲⤧਻††††⁽汥敳笠 †††††搠捯浵湥⹴潤畣敭瑮汅浥湥⹴汣獡䱳獩⹴敲潭敶✨慤歲⤧਻††††††潬慣卬潴慲敧献瑥瑉浥✨整档瑟敨敭Ⱗ✠楬桧❴㬩 †††素 †素紊•汣獡㵳洢湩栭昭汵汦硥映敬⵸潣杢猭慬整㔭‰慤歲戺ⵧ汳瑡ⵥ㔹‰整瑸猭慬整㠭〰搠牡㩫整瑸猭慬整ㄭ〰琠慲獮瑩潩⵮潣潬獲搠牵瑡潩⵮〲∰ਾ †㰠ⴡ‭效摡牥琠믡榑朠ꎺⴭਾ††格慥敤⁲汣獡㵳朢慬獳渭癡戠ⵧ桷瑩⽥㔹搠牡㩫杢猭慬整㤭〵㤯‵潢摲牥戭戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰瑳捩祫琠灯〭稠㐭‰牴湡楳楴湯挭汯牯⁳畤慲楴湯㈭〰㸢 †††㰠楤⁶汣獡㵳洢硡眭㜭汸洠⵸畡潴瀠⵸‴浳瀺⵸‶杬瀺⵸∸ਾ††††††搼癩挠慬獳∽汦硥椠整獭挭湥整⁲番瑳晩⵹敢睴敥⵨㘱猠㩭⵨㠱㸢 †††††††㰠⁡牨晥∽∯挠慬獳∽汦硥椠整獭挭湥整⁲慧⵰″牧畯≰ਾ††††††††††搼癩挠慬獳∽⵨〱眠ㄭ‰潲湵敤ⵤ砲杢札慲楤湥⵴潴琭⁲牦浯挭慹⵮〶‰楶ⵡ湩楤潧㘭〰琠ⵯ異灲敬㘭〰瀠〭㔮猠慨潤⵷摭朠潲灵栭癯牥猺慨潤⵷祣湡㘭〰㌯‰牴湡楳楴湯㸢 †††††††††††㰠楤⁶汣獡㵳眢昭汵⵨畦汬戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ㔹‰潲湵敤ⵤㅛ瀴嵸映敬⁸瑩浥⵳散瑮牥樠獵楴祦挭湥整≲ਾ††††††††††††††猼慰汣獡㵳昢湯⵴汢捡整瑸琭慲獮慰敲瑮戠ⵧ汣灩琭硥⁴杢札慲楤湥⵴潴爭映潲⵭祣湡㘭〰琠ⵯ異灲敬㘭〰琠硥⵴杬㸢㱔猯慰㹮 †††††††††††㰠搯癩ਾ††††††††††⼼楤㹶 †††††††††㰠楤㹶 †††††††††††㰠楤⁶汣獡㵳昢湯⵴汢捡整瑸砭牴捡楫杮琭杩瑨琠硥⵴汳瑡ⵥ〹‰慤歲琺硥⵴桷瑩⁥汦硥椠整獭挭湥整⁲慧⵰⸱‵敬摡湩ⵧ潮敮㸢 †††††††††††††㰠灳湡䐾呎㱖猯慰㹮 †††††††††††††㰠灳湡挠慬獳∽整瑸琭慲獮慰敲瑮戠ⵧ汣灩琭硥⁴杢札慲楤湥⵴潴爭映潲⵭祣湡㘭〰琠ⵯ湩楤潧㘭〰搠牡㩫牦浯挭慹⵮〴‰慤歲琺ⵯ湩楤潧㐭〰㸢䕔䡃⼼灳湡ਾ††††††††††††⼼楤㹶 †††††††††††㰠⁰汣獡㵳琢硥⵴ㅛ瀰嵸琠硥⵴汳瑡ⵥ〴‰慤歲琺硥⵴汳瑡ⵥ〵‰潦瑮洭湯牴捡楫杮眭摩牥甠灰牥慣敳洠⵴⸰∵吾捥⁨…䥁䴠条穡湩㱥瀯ਾ††††††††††⼼楤㹶 †††††††㰠愯ਾ †††††††㰠楤⁶汣獡㵳昢敬⁸瑩浥⵳散瑮牥朠灡㈭㸢 †††††††††㰠畢瑴湯琠灹㵥戢瑵潴≮䀠汣捩㵫琢杯汧呥敨敭⤨• †††††††††††††挠慬獳∽⵰⸲‵潲湵敤ⵤ砲潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰杢猭慬整㔭‰慤歲戺ⵧ汳瑡ⵥ〹‰整瑸猭慬整㘭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥戺ⵧ汳瑡ⵥ〱‰慤歲栺癯牥戺ⵧ汳瑡ⵥ〸‰潨敶㩲整瑸挭慹⵮〶‰慤歲栺癯牥琺硥⵴祣湡㐭〰琠慲獮瑩潩畣獲牯瀭楯瑮牥ਢ††††††††††††††楴汴㵥䌢畨莻釄믡榕匠ꇃ杮⼠吠믡榑㸢 †††††††††††㰠灳湡砠猭潨㵷™慤歲潍敤•汣獡㵳琢硥⵴慢敳㸢鿰馌⼼灳湡ਾ††††††††††††猼慰⵸桳睯∽慤歲潍敤•汣獡㵳琢硥⵴慢敳㸢飢辸⼼灳湡ਾ††††††††††⼼畢瑴湯ਾ††††††††††愼栠敲㵦⼢•汣獡㵳瀢⵸‴祰㈭爠畯摮摥砭整瑸砭⁳潦瑮戭汯⁤杢挭慹⵮〶‰潨敶㩲杢挭慹⵮〷‰整瑸眭楨整猠慨潤⵷獸琠慲獮瑩潩≮ਾ††††††††††††牔湡⁧桃믡ધ††††††††††⼼㹡 †††††††㰠搯癩ਾ††††††⼼楤㹶 †††㰠搯癩ਾ††⼼敨摡牥ਾ †㰠ⴡ‭慍湩䌠湯整瑮㐠㐰ⴠ㸭 †㰠慭湩挠慬獳∽汦硥札潲⁷汦硥椠整獭挭湥整⁲番瑳晩⵹散瑮牥瀠⵸‴浳瀺⵸‶杬瀺⵸‸祰ㄭ∶ਾ††††搼癩挠慬獳∽慭⵸⵷砲⵷畦汬琠硥⵴散瑮牥猠慰散礭㠭㸢 †††††ਠ††††††ℼⴭ䌠湯猠믡ₑ〴‴桰湯⁧썣採⁨敔档ⴠ㸭 †††††㰠楤⁶汣獡㵳爢汥瑡癩⁥湩楬敮戭潬正㸢 †††††††㰠楤⁶汣獡㵳琢硥⵴砸浳琺硥⵴砹潦瑮戭慬正映湯⵴潭潮琠慲正湩ⵧ楴桧整⁲整瑸琭慲獮慰敲瑮戠ⵧ汣灩琭硥⁴杢札慲楤湥⵴潴爭映潲⵭祣湡㔭〰瘠慩椭摮杩ⵯ〵‰潴瀭牵汰ⵥ〶‰敳敬瑣渭湯≥ਾ††††††††††〴਴††††††††⼼楤㹶 †††††††㰠楤⁶汣獡㵳愢獢汯瑵⁥琭灯㌭ⴠ楲桧⵴″硰㈭㔮瀠⵹⸰‵潲湵敤ⵤ畦汬琠硥⵴ㅛ瀰嵸映湯⵴潭潮映湯⵴潢摬戠ⵧ敲ⵤ〱‰慤歲戺ⵧ敲ⵤ㔹⼰〶琠硥⵴敲ⵤ〶‰慤歲琺硥⵴敲ⵤ〴‰潢摲牥戠牯敤⵲敲ⵤ〲‰慤歲戺牯敤⵲敲ⵤ〹‰桳摡睯砭≳ਾ††††††††††䅐䕇丠呏䘠問䑎 †††††††㰠搯癩ਾ††††††⼼楤㹶ਊ††††††ℼⴭ吠썩疪쐠膻☠吠써溴⁧썢澡ⴠ㸭 †††††㰠楤⁶汣獡㵳猢慰散礭㌭㸢 †††††††㰠ㅨ挠慬獳∽整瑸㈭汸猠㩭整瑸㌭汸映湯⵴硥牴扡汯⁤整瑸猭慬整㤭〰搠牡㩫整瑸眭楨整琠慲正湩ⵧ楴桧≴ਾ††††††††††桋듃杮吠곃桔뫡禥吠慲杮夠꫃⁵Ꞻੵ††††††††⼼ㅨਾ††††††††瀼挠慬獳∽整瑸猭浳琺硥⵴慢敳琠硥⵴汳瑡ⵥ〶‰慤歲琺硥⵴汳瑡ⵥ〴‰慭⵸⵷杬洠⵸畡潴氠慥楤杮爭汥硡摥㸢 †††††††††吠敨爠畯整猠瑩浥灡瘭摩潥砮汭挠畯摬渠瑯戠⁥潦湵⹤ †††††††㰠瀯ਾ††††††⼼楤㹶ਊ††††††ℼⴭ쌠ₔ썔涬䬠뾺桎湡⁨ⴭਾ††††††搼癩挠慬獳∽慭⵸⵷摭洠⵸畡潴㸢 †††††††㰠潦浲愠瑣潩㵮⼢•敭桴摯∽䕇≔挠慬獳∽敲慬楴敶㸢 †††††††††㰠湩異⁴祴数∽整瑸•慮敭∽≱瀠慬散潨摬牥∽썔涬欠뾺썢榠瘠뾺ⱴ琠楨뫡璿戠믡ⲋ䄠⹉⸮• †††††††††††††汣獡㵳眢昭汵汰ㄭ‰牰㈭‴祰㌭爠畯摮摥㈭汸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰整瑸砭⁳整瑸猭慬整㤭〰搠牡㩫整瑸眭楨整瀠慬散潨摬牥猭慬整㐭〰映捯獵漺瑵楬敮渭湯⁥潦畣㩳潢摲牥挭慹⵮〵‰潦畣㩳楲杮㈭映捯獵爺湩ⵧ祣湡㔭〰㈯‰桳摡睯砭⁳牴湡楳楴湯㸢 †††††††††㰠癳⁧汣獡㵳眢㐭栠㐭琠硥⵴汳瑡ⵥ〴‰扡潳畬整氠晥⵴⸳‵潴⵰⸳∵映汩㵬渢湯≥猠牴歯㵥挢牵敲瑮潃潬≲瘠敩䉷硯∽‰‰㐲㈠∴ਾ††††††††††††瀼瑡⁨瑳潲敫氭湩捥灡∽潲湵≤猠牴歯ⵥ楬敮潪湩∽潲湵≤猠牴歯ⵥ楷瑤㵨㈢•㵤䴢ㄲ㈠氱㘭㘭㉭㔭㝡㜠〠ㄠⴱ㐱〠㜠㜠〠〠ㄱ‴稰⼢ਾ††††††††††⼼癳㹧 †††††††††㰠畢瑴湯琠灹㵥猢扵業≴挠慬獳∽扡潳畬整爠杩瑨㈭琠灯㈭瀠⵸″祰ㄭ㔮爠畯摮摥砭杢挭慹⵮〶‰潨敶㩲杢挭慹⵮〷‰整瑸眭楨整琠硥⵴獸映湯⵴潢摬琠慲獮瑩潩≮ਾ††††††††††††썔涬 †††††††††㰠戯瑵潴㹮 †††††††㰠是牯㹭 †††††㰠搯癩ਾ †††††㰠ⴡ‭ꎻ⁩뷃䌠畨썹溪䴠믡接倠閻䈠뾺ⴭਾ††††††搼癩挠慬獳∽瑰㘭戠牯敤⵲⁴潢摲牥猭慬整㈭〰搠牡㩫潢摲牥猭慬整㠭〰㠯‰灳捡ⵥ⵹∳ਾ††††††††猼慰汣獡㵳琢硥⵴獸映湯⵴敳業潢摬琠硥⵴汳瑡ⵥ〴‰灵数捲獡⁥牴捡楫杮眭摩牥戠潬正㸢桋ꇃ桰ꇃ挠ꇃ⁣档祵꫃ꖻ⁣桴믡溋⁨써溠㩨⼼灳湡ਾ††††††††搼癩挠慬獳∽汦硥映敬⵸牷灡樠獵楴祦挭湥整⁲慧⵰∲ਾ††††††††††愼栠敲㵦⼢⽣浳牡灴潨敮⵳慴汢瑥≳挠慬獳∽硰㌭瀠⵹⸱‵潲湵敤ⵤ汸琠硥⵴獸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰潨敶㩲潢摲牥挭慹⵮〵‰整瑸猭慬整㜭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥琺硥⵴祣湡㘭〰琠慲獮瑩潩汦硥椠整獭挭湥整⁲慧⵰⸱∵ਾ††††††††††††猼慰㹮鿰놓⼼灳湡‾猼慰㹮郄螻桴ꆺ㱩猯慰㹮 †††††††††㰠愯ਾ††††††††††愼栠敲㵦⼢⽣慬瑰灯⵳潣灭瑵牥≳挠慬獳∽硰㌭瀠⵹⸱‵潲湵敤ⵤ汸琠硥⵴獸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰潨敶㩲潢摲牥挭慹⵮〵‰整瑸猭慬整㜭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥琺硥⵴祣湡㘭〰琠慲獮瑩潩汦硥椠整獭挭湥整⁲慧⵰⸱∵ਾ††††††††††††猼慰㹮鿰뮒⼼灳湡‾猼慰㹮慌瑰灯☠倠㱃猯慰㹮 †††††††††㰠愯ਾ††††††††††愼栠敲㵦⼢⽣牡楴楦楣污椭瑮汥楬敧据≥挠慬獳∽硰㌭瀠⵹⸱‵潲湵敤ⵤ汸琠硥⵴獸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰潨敶㩲潢摲牥挭慹⵮〵‰整瑸猭慬整㜭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥琺硥⵴祣湡㘭〰琠慲獮瑩潩汦硥椠整獭挭湥整⁲慧⵰⸱∵ਾ††††††††††††猼慰㹮鿰隤⼼灳湡‾猼慰㹮䥁⼼灳湡ਾ††††††††††⼼㹡 †††††††††㰠⁡牨晥∽振愯摵潩札慥≲挠慬獳∽硰㌭瀠⵹⸱‵潲湵敤ⵤ汸琠硥⵴獸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰潨敶㩲潢摲牥挭慹⵮〵‰整瑸猭慬整㜭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥琺硥⵴祣湡㘭〰琠慲獮瑩潩汦硥椠整獭挭湥整⁲慧⵰⸱∵ਾ††††††††††††猼慰㹮鿰ꞎ⼼灳湡‾猼慰㹮苃桴湡㱨猯慰㹮 †††††††††㰠愯ਾ††††††††††愼栠敲㵦⼢⽣整档琭敲摮≳挠慬獳∽硰㌭瀠⵹⸱‵潲湵敤ⵤ汸琠硥⵴獸戠ⵧ桷瑩⁥慤歲戺ⵧ汳瑡ⵥ〹‰潢摲牥戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰潨敶㩲潢摲牥挭慹⵮〵‰整瑸猭慬整㜭〰搠牡㩫整瑸猭慬整㌭〰栠癯牥琺硥⵴祣湡㘭〰琠慲獮瑩潩汦硥椠整獭挭湥整⁲慧⵰⸱∵ਾ††††††††††††猼慰㹮髢㲡猯慰㹮㰠灳湡堾⁵왨鮻杮⼼灳湡ਾ††††††††††⼼㹡 †††††††㰠搯癩ਾ††††††⼼楤㹶ਊ††††††ℼⴭ丠뫃⁴썈溠⁨郄믡溙⁧ⴭਾ††††††搼癩挠慬獳∽瑰㐭㸢 †††††††㰠⁡牨晥∽∯挠慬獳∽湩楬敮昭敬⁸瑩浥⵳散瑮牥朠灡㈭瀠⵸‶祰㌭爠畯摮摥㈭汸戠ⵧ牧摡敩瑮琭ⵯ⁲牦浯挭慹⵮〶‰潴椭摮杩ⵯ〶‰潨敶㩲牦浯挭慹⵮〷‰潨敶㩲潴椭摮杩ⵯ〷‰整瑸眭楨整映湯⵴潢摬琠硥⵴浳猠慨潤⵷摭猠慨潤⵷祣湡㘭〰㈯‰潨敶㩲桳摡睯挭慹⵮〶⼰〳琠慲獮瑩潩≮ਾ††††††††††猼慰㹮곢辸⼼灳湡ਾ††††††††††猼慰㹮畑祡嘠믡₁牔湡⁧桃믡₧乄噔吠捥㱨猯慰㹮 †††††††㰠愯ਾ††††††⼼楤㹶ਊ††††⼼楤㹶 †㰠洯楡㹮ਊ††ℼⴭ䘠潯整⁲醻⁩楧뫡溣ⴠ㸭 †㰠潦瑯牥挠慬獳∽潢摲牥琭戠牯敤⵲汳瑡ⵥ〲‰慤歲戺牯敤⵲汳瑡ⵥ〸‰整瑸挭湥整⁲祰㘭琠硥⵴獸琠硥⵴汳瑡ⵥ〴∰ਾ††††挦灯㭹㈠㈰‶乄噔吠捥⹨䄠汬爠杩瑨⁳敲敳癲摥ਮ††⼼潦瑯牥ਾ㰊戯摯㹹㰊栯浴㹬�