{
  "version": 3,
  "sources": ["/cdn/shop/t/5/assets/kob-ownership-allocation-planning.js?kob_build=number_shopify_payment_v1"],
  "sourcesContent": ["(() => {\n  const parseJson = (value, fallback = {}) => { try { return JSON.parse(String(value || '')); } catch (_) { return fallback; } };\n  const apiError = async (response) => {\n    const payload = await response.json().catch(() => ({}));\n    const error = new Error(payload.error || `request_failed_${response.status}`);\n    error.code = payload.error || 'request_failed';\n    error.status = response.status;\n    throw error;\n  };\n  const bootstrapPlanning = async (root, inlineConfig) => {\n    const endpoint = String(root.dataset.oapEndpoint || '').replace(/\\/$/, '');\n    const campaignId = String(new URLSearchParams(window.location.search).get('campaign_id') || root.dataset.oapCampaignId || inlineConfig.campaign_id || '').trim();\n    const bootstrapEndpoint = String(root.dataset.oapBootstrapEndpoint || '/tools/collection-access');\n    const api = async (path, options = {}) => {\n      const headers = { ...(options.headers || {}) };\n      if (!(options.body instanceof FormData) && !Object.keys(headers).some((key) => key.toLowerCase() === 'content-type')) {\n        headers['content-type'] = 'application/json';\n      }\n      const response = await fetch(`${endpoint}${path}`, {\n        cache: 'no-store', credentials: options.credentials || 'omit', method: options.method || 'GET',\n        headers, body: options.body,\n      });\n      if (!response.ok) return apiError(response);\n      const payload = await response.json();\n      if (!payload.ok) { const error = new Error(payload.error || 'request_failed'); error.code = payload.error || 'request_failed'; throw error; }\n      return payload;\n    };\n    let bootstrap;\n    try {\n      bootstrap = await api(`/owner/access?campaign_id=${encodeURIComponent(campaignId)}`, { credentials: 'include' });\n    } catch (_) {\n      const url = new URL(bootstrapEndpoint, window.location.origin);\n      url.searchParams.set('campaign_id', campaignId);\n      url.searchParams.set('owner_nonce', crypto.randomUUID().replaceAll('-', '') + crypto.randomUUID().replaceAll('-', ''));\n      const response = await fetch(url, { credentials: 'same-origin', cache: 'no-store' });\n      if (!response.ok) return apiError(response);\n      bootstrap = await response.json();\n      if (!bootstrap.ok) { const error = new Error(bootstrap.error || 'bootstrap_failed'); error.code = bootstrap.error || 'bootstrap_failed'; throw error; }\n    }\n    const exchange = await api('/owner/access', {\n      method: 'POST', headers: { authorization: `Bearer ${bootstrap.assertion}` },\n      body: JSON.stringify({ scope: bootstrap.scope }),\n    });\n    const payload = await api(`/admin/campaigns/${encodeURIComponent(campaignId)}/allocation-planning`, {\n      headers: { authorization: `Bearer ${exchange.token}` },\n    });\n    const allocationApi = (path, options = {}) => api(path, {\n      ...options,\n      headers: { authorization: `Bearer ${exchange.token}`, ...(options.headers || {}) },\n    });\n    const allocationAssetApi = async (path) => {\n      const response = await fetch(`${endpoint}${path}`, {\n        cache: 'no-store', credentials: 'omit',\n        headers: { authorization: `Bearer ${exchange.token}` },\n      });\n      if (!response.ok) return apiError(response);\n      return response.blob();\n    };\n    let numberAllocation = null;\n    let numberAllocationError = null;\n    let numberChoiceWindow = null;\n    let numberSettlementWorkspace = null;\n    let numberPaymentWorkspace = null;\n    let numberShippingHandoff = null;\n    let homepageNudgePolicy = null;\n    try {\n      const numberPayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/number-allocation`);\n      numberAllocation = numberPayload.number_allocation || null;\n    } catch (error) {\n      numberAllocationError = error.code || 'number_allocation_unavailable';\n    }\n    try {\n      const choicePayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/number-choice-window`);\n      numberChoiceWindow = choicePayload.window || null;\n    } catch (_) {\n      numberChoiceWindow = null;\n    }\n    try {\n      const settlementPayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/number-choice-settlement`);\n      numberSettlementWorkspace = settlementPayload.settlement_workspace || null;\n    } catch (_) {\n      numberSettlementWorkspace = null;\n    }\n    try {\n      const paymentPayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/number-payment-workspace`);\n      numberPaymentWorkspace = paymentPayload.payment_workspace || null;\n    } catch (_) {\n      numberPaymentWorkspace = null;\n    }\n    try {\n      const shippingPayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/number-shipping-handoff`);\n      numberShippingHandoff = shippingPayload.shipping_handoff || null;\n    } catch (_) {\n      numberShippingHandoff = null;\n    }\n    try {\n      const nudgePayload = await allocationApi(`/admin/campaigns/${encodeURIComponent(campaignId)}/homepage-nudge-policy`);\n      homepageNudgePolicy = nudgePayload.homepage_nudge_policy || null;\n    } catch (_) {\n      homepageNudgePolicy = null;\n    }\n    return { ...inlineConfig, ...payload.planning, allocationApi, allocationAssetApi, number_allocation: numberAllocation,\n      number_allocation_error: numberAllocationError, number_choice_window: numberChoiceWindow,\n      number_settlement_workspace: numberSettlementWorkspace, number_payment_workspace: numberPaymentWorkspace,\n      number_shipping_handoff: numberShippingHandoff, homepage_nudge_policy: homepageNudgePolicy };\n  };\n\n  const mount = (root, config) => {\n  const storageKey = `kob-oap:${config.campaign_id}:prototype-v2`;\n  const legacyStorageKey = `kob-oap:${config.campaign_id}:prototype-v1`;\n  const money = new Intl.NumberFormat('en-US');\n  const JST_OFFSET_MS = 9 * 60 * 60 * 1000;\n  const isoToJstInput = (value) => {\n    const parsed = new Date(value);\n    if (!Number.isFinite(parsed.getTime())) return '';\n    return new Date(parsed.getTime() + JST_OFFSET_MS).toISOString().slice(0, 16);\n  };\n  const clamp = (value, min, max) => Math.min(max, Math.max(min, Number(value) || 0));\n  const escapeHtml = (value) => String(value ?? '').replace(/[&<>'\"]/g, (char) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', \"'\": '&#39;', '\"': '&quot;' })[char]);\n  const sourceCapacity = Math.max(1, Math.trunc(Number(config.customer_capacity) || 28));\n  const sourcePartnerReserve = Math.max(0, Math.trunc(Number(config.partner_reserve) || 0));\n  const editionTotal = Math.max(sourceCapacity + sourcePartnerReserve, Math.trunc(Number(config.edition_total) || 0));\n  const eligibilityMode = ['points_only', 'holding_or_points'].includes(config.eligibility_mode) ? config.eligibility_mode : 'points_only';\n  const eligibilityPointsFloor = Math.max(0, Math.trunc(Number(config.eligibility_points_floor) || 0));\n  const isAllocationEligible = (collector) => eligibilityMode === 'holding_or_points'\n    ? collector.distinctModels > 0 || collector.eligiblePoints >= eligibilityPointsFloor\n    : collector.eligiblePoints >= eligibilityPointsFloor;\n\n  const collectors = [];\n  let sequence = 1;\n  config.groups.forEach((group) => group.rows.forEach(([eligiblePoints, physicalItems, reviewStatus, protectedIdentity, protectedCollectorId]) => {\n    const collectorNumber = sequence++;\n    collectors.push({\n      id: `Collector ${String(collectorNumber).padStart(2, '0')}`,\n      collectorId: protectedCollectorId || `DEMO-COLLECTOR-${String(collectorNumber).padStart(3, '0')}`,\n      ownerId: protectedIdentity?.owner_id || `DEMO-OWNER-${String(collectorNumber).padStart(3, '0')}`,\n      displayName: protectedIdentity?.display_name || `Demo collector ${String(collectorNumber).padStart(2, '0')}`,\n      syntheticIdentity: !protectedIdentity,\n      distinctModels: Number(group.distinct_models),\n      physicalItems: Number(physicalItems),\n      duplicateItems: Math.max(0, Number(physicalItems) - Number(group.distinct_models)),\n      eligiblePoints: Number(eligiblePoints),\n      reviewStatus,\n    });\n  }));\n\n  const buildDemoNumberAllocation = () => {\n    const labels = ['0', '00', '000', ...Array.from({ length: 30 }, (_, index) => String(index + 1))];\n    const members = collectors.slice(0, 29).map((collector, index) => ({\n      collector_id: collector.collectorId,\n      allocation_source: index < 26 ? 'accepted_guaranteed' : 'public_draw_winner',\n      source_audit_code: `DEMO-${String(index + 1).padStart(3, '0')}`,\n      points_cost: index < 26 ? 6000 : 2925,\n      identity: { display_name: collector.displayName, email: `collector-${String(index + 1).padStart(2, '0')}@example.com` },\n    }));\n    const guaranteeLabels = new Set(['000', '2', '6', '7', '16', '22']);\n    const available = labels.filter((label) => !['0', '00', '1', '8'].includes(label));\n    return {\n      source_authority: { settlement_id: 'DEMO-SETTLEMENT', draw_setup_id: 'DEMO-DRAW-SETUP', public_draw_id: 'DEMO-PUBLIC-DRAW', receipt_hash: 'demo-receipt' },\n      entitlement: { snapshot_id: null, count: 29, accepted_guaranteed_count: 26, public_draw_winner_count: 3, observed_at: '2026-08-26T13:40:33.345Z', source_hash: 'demo-source', frozen: false, members },\n      suggested_manifest: { labels, locked_labels: ['0', '00', '1', '8'], high_interest_labels: ['30'], special_bid_labels: ['30'], manual_assignments: [] },\n      manifest: {\n        manifest_id: 'DEMO-MANIFEST', revision: 1, status: 'reviewed_draft', items: labels.map((label, index) => ({\n          label, canonical_key: label, display_order: index + 1, state: ['0', '00', '1', '8'].includes(label) ? 'locked' : 'available', assigned_collector_id: null, metadata: label === '30' ? { high_interest: true, allocation_mode: 'special_bid' } : {},\n        })),\n        preview: { algorithm: 'kob-signature-number-scheme-c-v3-multi-candidate-choice', threshold_bps: 5000, entitlement_count: 29, manifest_count: 33, available_count: 29, locked_count: 4, manual_assigned_count: 0, special_bid_count: 1, guarantee_count: 6, guarantee_collector_count: 5, multi_guarantee_collector_count: 1, multi_guarantee_collectors: [{ collector_id: members[0]?.collector_id, labels: ['16', '22'], identity: members[0]?.identity }], zero_history_count: 8, blockers: [], numbers: labels.map((label, index) => ({\n          label, state: ['0', '00', '1', '8'].includes(label) ? 'locked' : 'available', metadata: label === '30' ? { high_interest: true, allocation_mode: 'special_bid' } : {}, N: guaranteeLabels.has(label) ? 5 : index % 4 ? 4 : 0, dominant_n: guaranteeLabels.has(label) ? 5 : index % 4 ? 2 : 0, dominant_share_bps: guaranteeLabels.has(label) ? 10000 : index % 4 ? 5000 : 0, guarantee_status: ['0', '00', '1', '8'].includes(label) ? 'removed_by_overlay' : label === '30' ? 'special_bid' : guaranteeLabels.has(label) ? 'guaranteed' : index % 4 ? 'below_threshold' : 'no_history', guarantee_collector_id: guaranteeLabels.has(label) ? (['16', '22'].includes(label) ? members[0]?.collector_id : members[available.indexOf(label) % members.length]?.collector_id) : null,\n        })) },\n      },\n    };\n  };\n\n  const sourceFrozen = config.source_mode === 'frozen_snapshot';\n  root.querySelectorAll('[data-oap-release-code]').forEach((node) => { node.textContent = config.release_code || config.campaign_id; });\n  root.querySelectorAll('[data-oap-release-title]').forEach((node) => { node.textContent = config.release_title || 'Ownership campaign'; });\n  root.querySelectorAll('[data-oap-source-label]').forEach((node) => { node.textContent = sourceFrozen ? 'Frozen snapshot' : 'Projected'; });\n  root.querySelectorAll('[data-oap-source-copy]').forEach((node) => { node.textContent = sourceFrozen ? 'Reviewed campaign snapshot' : 'Unresolved reviews assumed approved'; });\n  root.querySelectorAll('[data-oap-source-note]').forEach((node) => { node.textContent = sourceFrozen ? `Frozen ${config.source_frozen_at || ''}`.trim() : 'Read-only planning source'; });\n  root.querySelectorAll('[data-oap-total]').forEach((node) => { node.textContent = String(config.review_counts?.total ?? collectors.length); });\n  root.querySelectorAll('[data-oap-review-counts]').forEach((node) => { node.textContent = `${config.review_counts?.completed ?? collectors.length} completed \u00B7 ${config.review_counts?.in_review ?? 0} in review`; });\n  root.querySelectorAll('[data-oap-duplicate-collectors]').forEach((node) => { node.textContent = String(config.duplicate_counts?.collectors ?? collectors.filter((row) => row.duplicateItems > 0).length); });\n  root.querySelectorAll('[data-oap-duplicate-items]').forEach((node) => { node.textContent = `${config.duplicate_counts?.physical_items ?? collectors.reduce((sum, row) => sum + row.duplicateItems, 0)} extra physical items \u00B7 tier unchanged`; });\n\n  const defaults = [\n    {\n      id: 'A', name: 'Balanced draft', tiers: [\n        { id: crypto.randomUUID(), name: 'A \u00B7 Core', min: 5, max: 6, points: 6000, seats: 14 },\n        { id: crypto.randomUUID(), name: 'B \u00B7 Four models', min: 4, max: 4, points: 6000, seats: 5 },\n        { id: crypto.randomUUID(), name: 'C \u00B7 Emerging', min: 0, max: 3, points: 2925, seats: 9 },\n      ],\n    },\n    {\n      id: 'B', name: 'Core-first draft', tiers: [\n        { id: crypto.randomUUID(), name: 'A \u00B7 Complete', min: 6, max: 6, points: 8000, seats: 6 },\n        { id: crypto.randomUUID(), name: 'B \u00B7 Established', min: 4, max: 5, points: 6000, seats: 13 },\n        { id: crypto.randomUUID(), name: 'C \u00B7 Developing', min: 0, max: 3, points: 2925, seats: 9 },\n      ],\n    },\n    {\n      id: 'C', name: 'Four-rank draft', tiers: [\n        { id: crypto.randomUUID(), name: 'A \u00B7 Complete', min: 6, max: 6, points: 9000, seats: 6 },\n        { id: crypto.randomUUID(), name: 'B \u00B7 Five models', min: 5, max: 5, points: 6500, seats: 8 },\n        { id: crypto.randomUUID(), name: 'C \u00B7 Three to four', min: 3, max: 4, points: 5000, seats: 8 },\n        { id: crypto.randomUUID(), name: 'D \u00B7 New collectors', min: 0, max: 2, points: 2925, seats: 6 },\n      ],\n    },\n  ];\n\n  const cloneScenario = (scenario) => ({\n    ...scenario,\n    tiers: scenario.tiers.map((tier) => ({ ...tier, id: crypto.randomUUID() })),\n  });\n  const freshDefaults = () => defaults.map(cloneScenario);\n  const saved = (() => {\n    try { return JSON.parse(localStorage.getItem(storageKey) || localStorage.getItem(legacyStorageKey)); } catch { return null; }\n  })();\n  const initialNumberWorkspace = config.number_allocation || (root.dataset.oapRemote === 'true'\n    ? { entitlement: null, suggested_manifest: null, manifest: null }\n    : buildDemoNumberAllocation());\n  const initialNumberManifest = initialNumberWorkspace.manifest?.items?.length\n    ? {\n      labels: initialNumberWorkspace.manifest.items.map((item) => item.label),\n      locked_labels: initialNumberWorkspace.manifest.items.filter((item) => item.state === 'locked').map((item) => item.label),\n      high_interest_labels: initialNumberWorkspace.manifest.items.filter((item) => item.metadata?.high_interest).map((item) => item.label),\n      special_bid_labels: initialNumberWorkspace.manifest.items.filter((item) => item.metadata?.allocation_mode === 'special_bid').map((item) => item.label),\n      manual_assignments: initialNumberWorkspace.manifest.items.filter((item) => item.state === 'manual_assigned').map((item) => ({ label: item.label, collector_id: item.assigned_collector_id })),\n    }\n    : initialNumberWorkspace.suggested_manifest;\n  const demoNumberPaymentPreview = (() => {\n    if (!config.demo_number_payment_preview) return null;\n    const members = initialNumberWorkspace.entitlement?.members || [];\n    const labels = (initialNumberWorkspace.manifest?.items || [])\n      .filter((item) => item.state !== 'locked')\n      .map((item) => item.label)\n      .slice(0, members.length);\n    const payableRateMicros = 49400;\n    return {\n      algorithm: 'kob-ownership-number-payment-batch-v1',\n      campaign_id: config.campaign_id,\n      settlement_id: 'DEMO-NUMBER-SETTLEMENT',\n      entitlement_count: members.length,\n      request_count: members.length,\n      policy: { mode: 'alipay_primary_shopify_fallback', primary_channel: 'alipay', payment_window_days: 7, fx_buffer_bps: 300 },\n      fx_snapshot: { source: 'ECB', reference_date: '2026-08-29', observed_at: '2026-08-30T02:15:00.000Z', reference_rmb_per_jpy_micros: 47961, payable_rmb_per_jpy_micros: payableRateMicros, buffer_bps: 300 },\n      blockers: [],\n      rows: members.map((member, index) => {\n        const serialLabel = labels[index] || String(index + 1);\n        const specialBidJpy = serialLabel === '30' ? 5000 : 0;\n        const totalJpy = 80000 + specialBidJpy;\n        return {\n          collector_id: member.collector_id,\n          serial_label: serialLabel,\n          canonical_number_key: serialLabel,\n          assignment_source: index < 6 ? 'guarantee' : `preference_${(index % 3) + 1}`,\n          points_cost: Number(member.points_cost || 0),\n          points_balance_observed: Number(member.points_cost || 0) + 1800,\n          active_points_reservations: 0,\n          available_points: Number(member.points_cost || 0) + 1800,\n          base_price_jpy: 80000,\n          special_bid_jpy: specialBidJpy,\n          total_jpy: totalJpy,\n          payable_rmb_minor: Math.ceil((totalJpy * payableRateMicros / 1000000) / 10) * 1000,\n          primary_channel: 'alipay',\n        };\n      }),\n    };\n  })();\n  const demoNumberPaymentWorkspace = config.demo_number_payment_preview ? {\n    choice_window: { status: 'frozen', entitlement_count: 29, response_count: 29 },\n    settlement: { settlement_id: 'DEMO-NUMBER-SETTLEMENT', entitlement_count: 29, frozen_at: '2026-08-29T10:30:00.000Z' },\n    policy: { policy_id: 'DEMO-POLICY', revision: 1, mode: 'alipay_primary_shopify_fallback', payment_window_days: 7, fx_buffer_bps: 300 },\n    alipay_asset: { payment_asset_id: 'DEMO-ASSET', version: 2, content_sha256: 'd'.repeat(64) },\n    batch: null,\n    capabilities: { external_writes_enabled: false, email_delivery_enabled: false, reconciliation_writes_enabled: true },\n    review_summary: { total: 29, awaiting_review: 26, proof_missing: 23, delivery_missing: 21,\n      shopify_requested: 1, paid: 1, recovery_required: 1 },\n    preview_requests: demoNumberPaymentPreview.rows.map((row, index) => ({\n      payment_request_id: `DEMO-PAYMENT-${index + 1}`,\n      collector_id: row.collector_id,\n      serial_label: row.serial_label,\n      total_jpy: row.total_jpy,\n      payable_rmb_minor: row.payable_rmb_minor,\n      points_cost: row.points_cost,\n      status: index === 0 ? 'paid' : index === 2 ? 'channel_switch_requested' : 'awaiting_payment',\n      primary_channel: 'alipay', active_channel: 'alipay',\n      identity: initialNumberWorkspace.entitlement.members.find((member) => member.collector_id === row.collector_id)?.identity || {},\n      reservation: { reservation_id: `DEMO-RESERVATION-${index + 1}`, status: index === 0 ? 'consumed' : 'active', points_event_id: index === 0 ? `DEMO-POINTS-${index + 1}` : '' },\n      delivery: index < 8 ? { delivery_submission_id: `DEMO-DELIVERY-${index + 1}`, recipient_name: `Collector ${index + 1}`,\n        phone: `1380000${String(index + 1).padStart(4, '0')}`, address: `Shanghai delivery address ${index + 1}`, revision: 1 } : null,\n      proof: index < 6 ? { proof_upload_id: `DEMO-PROOF-${index + 1}`, version: 1, file_name: `payment-${index + 1}.jpg` } : null,\n      review: index === 0 ? { review_id: 'DEMO-REVIEW-1', status: 'applied', points_balance_before: 6000,\n        points_balance_after: 4500, applied_at: '2026-08-31T03:00:00.000Z' }\n        : index === 3 ? { review_id: 'DEMO-REVIEW-4', status: 'recovery_required', last_error: 'demo_recovery_required' } : null,\n    })),\n  } : null;\n  let state = {\n    activeScenario: saved?.activeScenario || 'A',\n    scenarios: Array.isArray(saved?.scenarios) && saved.scenarios.length === 3 ? saved.scenarios : freshDefaults(),\n    playerCapacity: Math.trunc(clamp(saved?.playerCapacity ?? sourceCapacity, 1, editionTotal)),\n    filter: 'all',\n    savedPlan: config.saved_plan || null,\n    planBusy: false,\n    planMessage: '',\n    pendingSaveRequestId: null,\n    pendingLockRequestId: null,\n    choiceWindow: config.choice_window || null,\n    choiceLoaded: Boolean(config.choice_window),\n    choiceBusy: false,\n    choiceMessage: '',\n    pendingChoiceRequestId: null,\n    previewBusy: false,\n    previewMessage: '',\n    settlementData: config.choice_settlement || null,\n    settlementLoaded: Boolean(config.choice_settlement),\n    settlementBusy: false,\n    settlementMessage: '',\n    pendingFreezeRequestId: null,\n    pendingDrawSaveRequestId: null,\n    pendingDrawLockRequestId: null,\n    pendingPublicDrawSaveRequestId: null,\n    pendingPublicDrawCommitRequestId: null,\n    pendingPublicDrawFinalizeRequestId: null,\n    rehearsal: null,\n    rehearsalBusy: false,\n    rehearsalMessage: '',\n    rehearsalViewerUrl: '',\n    pendingRehearsalRequestId: null,\n    numberWorkspace: initialNumberWorkspace,\n    numberLabels: [...(initialNumberManifest?.labels || [])],\n    numberLockedLabels: new Set(initialNumberManifest?.locked_labels || []),\n    numberHighInterestLabels: new Set(initialNumberManifest?.high_interest_labels || []),\n    numberSpecialBidLabels: new Set(initialNumberManifest?.special_bid_labels || []),\n    numberManualAssignments: [...(initialNumberManifest?.manual_assignments || [])],\n    numberPreview: initialNumberWorkspace.manifest?.preview || null,\n    numberBusy: false,\n    numberMessage: config.number_allocation_error ? `Number workspace is not ready: ${config.number_allocation_error}.` : '',\n    pendingNumberSaveRequestId: null,\n    numberLockBusy: false,\n    pendingNumberLockRequestId: null,\n    numberChoicePreview: null,\n    numberChoiceBusy: false,\n    numberOwnerPreviewBusy: false,\n    numberOwnerPreviewMessage: '',\n    pendingNumberChoiceOpenRequestId: null,\n    pendingNumberChoiceRequestId: null,\n    numberChoiceWindow: config.number_choice_window || null,\n    numberSettlementWorkspace: config.number_settlement_workspace || null,\n    numberSettlementPreview: null,\n    numberSettlementBusy: false,\n    numberSettlementMessage: '',\n    pendingNumberSettlementCommitRequestId: null,\n    pendingNumberSettlementCloseRequestId: null,\n    pendingNumberSettlementFreezeRequestId: null,\n    numberPaymentWorkspace: config.number_payment_workspace || demoNumberPaymentWorkspace,\n    numberPaymentPolicyPreview: null,\n    numberPaymentBatchPreview: config.number_payment_batch_preview || null,\n    numberPaymentBatchPreviewToken: config.number_payment_batch_preview_token || null,\n    numberPaymentBusy: false,\n    numberPaymentMessage: '',\n    numberPaymentEmailMessage: '',\n    numberPaymentOpeningPreview: config.demo_number_payment_preview ? {\n      opens_at: '2026-08-30T10:00:00.000Z', payment_deadline_at: '2026-09-06T10:00:00.000Z',\n    } : null,\n    numberPaymentOpeningPreviewToken: null,\n    numberPaymentOpeningPreviewHash: '',\n    numberPaymentOpeningMessage: '',\n    numberPaymentEmailReviewedOpeningHash: '',\n    pendingNumberPaymentPolicyRequestId: null,\n    pendingNumberPaymentAssetRequestId: null,\n    pendingNumberPaymentBatchRequestId: null,\n    pendingNumberPaymentBatchFreezeRequestId: null,\n    pendingNumberPaymentOpenRequestId: null,\n    numberPaymentReviewFilter: 'all',\n    numberPaymentReviewSelection: null,\n    numberPaymentReviewBusy: false,\n    numberPaymentReviewMessage: '',\n    pendingNumberPaymentReviewRequestId: null,\n    numberShopifyBusy: false,\n    numberShopifyPreview: null,\n    numberShopifySelection: null,\n    pendingNumberShopifyReviewRequestId: null,\n    pendingNumberShopifyCreateRequestId: null,\n    numberShippingHandoff: config.number_shipping_handoff || null,\n    numberShippingPreview: null,\n    numberShippingBusy: false,\n    numberShippingMessage: '',\n    numberShippingSecret: null,\n    pendingNumberShippingRequestId: null,\n  };\n  if (state.savedPlan?.candidate?.tiers?.length) {\n    const savedKey = ['A', 'B', 'C'].includes(state.savedPlan.candidate.key) ? state.savedPlan.candidate.key : 'A';\n    const savedIndex = state.scenarios.findIndex((scenario) => scenario.id === savedKey);\n    state.scenarios[savedIndex] = {\n      id: savedKey,\n      name: state.savedPlan.candidate.name,\n      tiers: state.savedPlan.candidate.tiers.map((tier) => ({\n        id: crypto.randomUUID(),\n        name: tier.name,\n        min: Number(tier.min_models),\n        max: Number(tier.max_models),\n        points: Number(tier.points_cost),\n        seats: Number(tier.target_slots),\n      })),\n    };\n    state.activeScenario = savedKey;\n    state.playerCapacity = Math.trunc(clamp(state.savedPlan.player_capacity, 1, editionTotal));\n  }\n\n  const refs = {\n    distribution: root.querySelector('[data-oap-distribution]'),\n    compare: root.querySelector('[data-oap-compare]'),\n    tabs: root.querySelector('[data-oap-tabs]'),\n    tierList: root.querySelector('[data-oap-tier-list]'),\n    status: root.querySelector('[data-oap-status]'),\n    collectors: root.querySelector('[data-oap-collectors]'),\n    filter: root.querySelector('[data-oap-filter]'),\n    activeLabel: root.querySelector('[data-oap-active-label]'),\n    activeName: root.querySelector('[data-oap-active-name]'),\n    playerCapacity: root.querySelector('[data-oap-player-capacity]'),\n    parameterStatus: root.querySelector('[data-oap-parameter-status]'),\n    approval: root.querySelector('[data-oap-approval]'),\n    approvalState: root.querySelector('[data-oap-approval-state]'),\n    approvalCopy: root.querySelector('[data-oap-approval-copy]'),\n    approvalPreview: root.querySelector('[data-oap-approval-preview]'),\n    saveDraft: root.querySelector('[data-oap-save-draft]'),\n    openLock: root.querySelector('[data-oap-open-lock]'),\n    lockDialog: root.querySelector('[data-oap-lock-dialog]'),\n    lockSummary: root.querySelector('[data-oap-lock-summary]'),\n    lockConfirmation: root.querySelector('[data-oap-lock-confirmation]'),\n    confirmLock: root.querySelector('[data-oap-confirm-lock]'),\n    choiceWindow: root.querySelector('[data-oap-choice-window]'),\n    choiceState: root.querySelector('[data-oap-choice-state]'),\n    choiceOpens: root.querySelector('[data-oap-choice-opens]'),\n    choiceCloses: root.querySelector('[data-oap-choice-closes]'),\n    prepareChoice: root.querySelector('[data-oap-prepare-choice]'),\n    choiceMessage: root.querySelector('[data-oap-choice-message]'),\n    ownerPreview: root.querySelector('[data-oap-owner-preview]'),\n    previewCollector: root.querySelector('[data-oap-preview-collector]'),\n    previewLocale: root.querySelector('[data-oap-preview-locale]'),\n    previewResult: root.querySelector('[data-oap-preview-result]'),\n    previewNudge: root.querySelector('[data-oap-preview-nudge]'),\n    previewMessage: root.querySelector('[data-oap-preview-message]'),\n    homepageReminderType: root.querySelector('[data-oap-homepage-reminder-type]'),\n    homepageReminderLocale: root.querySelector('[data-oap-homepage-reminder-locale]'),\n    homepageReminderEnabled: root.querySelector('[data-oap-homepage-reminder-enabled]'),\n    homepageReminderTitle: root.querySelector('[data-oap-homepage-reminder-title]'),\n    homepageReminderBody: root.querySelector('[data-oap-homepage-reminder-body]'),\n    homepageReminderCta: root.querySelector('[data-oap-homepage-reminder-cta]'),\n    homepageReminderLater: root.querySelector('[data-oap-homepage-reminder-later]'),\n    homepageReminderPreview: root.querySelector('[data-oap-homepage-reminder-preview]'),\n    homepageReminderSave: root.querySelector('[data-oap-homepage-reminder-save]'),\n    homepageReminderMessage: root.querySelector('[data-oap-homepage-reminder-message]'),\n    settlement: root.querySelector('[data-oap-settlement]'),\n    settlementState: root.querySelector('[data-oap-settlement-state]'),\n    settlementMessage: root.querySelector('[data-oap-settlement-message]'),\n    choiceMetrics: root.querySelector('[data-oap-choice-metrics]'),\n    choiceRows: root.querySelector('[data-oap-choice-rows]'),\n    choiceRowCount: root.querySelector('[data-oap-choice-row-count]'),\n    refreshSettlement: root.querySelector('[data-oap-refresh-settlement]'),\n    freezeSummary: root.querySelector('[data-oap-freeze-summary]'),\n    freezeConfirm: root.querySelector('[data-oap-freeze-confirm]'),\n    freeze: root.querySelector('[data-oap-freeze]'),\n    drawStep: root.querySelector('[data-oap-draw-step]'),\n    drawPoints: root.querySelector('[data-oap-draw-points]'),\n    saveDraw: root.querySelector('[data-oap-save-draw]'),\n    drawMetrics: root.querySelector('[data-oap-draw-metrics]'),\n    drawList: root.querySelector('[data-oap-draw-list]'),\n    drawRows: root.querySelector('[data-oap-draw-rows]'),\n    drawRowCount: root.querySelector('[data-oap-draw-row-count]'),\n    drawLockPanel: root.querySelector('[data-oap-draw-lock-panel]'),\n    drawHash: root.querySelector('[data-oap-draw-hash]'),\n    drawLockConfirm: root.querySelector('[data-oap-draw-lock-confirm]'),\n    lockDraw: root.querySelector('[data-oap-lock-draw]'),\n    publicDrawStep: root.querySelector('[data-oap-public-draw-step]'),\n    publicDrawTime: root.querySelector('[data-oap-public-draw-time]'),\n    setPublicDrawTime: root.querySelector('[data-oap-set-public-draw-time]'),\n    savePublicDraw: root.querySelector('[data-oap-save-public-draw]'),\n    publicDrawMetrics: root.querySelector('[data-oap-public-draw-metrics]'),\n    publicDrawRoom: root.querySelector('[data-oap-public-room]'),\n    publicDrawUrl: root.querySelector('[data-oap-public-draw-url]'),\n    openPublicDraw: root.querySelector('[data-oap-open-public-draw]'),\n    publicDrawCommitPanel: root.querySelector('[data-oap-public-draw-commit-panel]'),\n    publicDrawHash: root.querySelector('[data-oap-public-draw-hash]'),\n    publicDrawCommitConfirm: root.querySelector('[data-oap-public-draw-commit-confirm]'),\n    commitPublicDraw: root.querySelector('[data-oap-commit-public-draw]'),\n    publicDrawFinalizePanel: root.querySelector('[data-oap-public-draw-finalize-panel]'),\n    publicDrawReceipt: root.querySelector('[data-oap-public-draw-receipt]'),\n    publicDrawFinalizeConfirm: root.querySelector('[data-oap-public-draw-finalize-confirm]'),\n    finalizePublicDraw: root.querySelector('[data-oap-finalize-public-draw]'),\n    rehearsalTime: root.querySelector('[data-oap-rehearsal-time]'),\n    setRehearsalTime: root.querySelector('[data-oap-set-rehearsal-time]'),\n    rehearsalEmail: root.querySelector('[data-oap-rehearsal-email]'),\n    rehearsalConfirm: root.querySelector('[data-oap-rehearsal-confirm]'),\n    createRehearsal: root.querySelector('[data-oap-create-rehearsal]'),\n    openRehearsal: root.querySelector('[data-oap-open-rehearsal]'),\n    rehearsalMetrics: root.querySelector('[data-oap-rehearsal-metrics]'),\n    rehearsalMessage: root.querySelector('[data-oap-rehearsal-message]'),\n    numberWorkspace: root.querySelector('[data-oap-number-workspace]'),\n    numberState: root.querySelector('[data-oap-number-state]'),\n    numberEntitlementMetrics: root.querySelector('[data-oap-number-entitlement-metrics]'),\n    numberMemberCount: root.querySelector('[data-oap-number-member-count]'),\n    numberMembers: root.querySelector('[data-oap-number-members]'),\n    numberLabels: root.querySelector('[data-oap-number-labels]'),\n    numberResetManifest: root.querySelector('[data-oap-number-reset-manifest]'),\n    numberLocks: root.querySelector('[data-oap-number-locks]'),\n    numberSpecialBidLabel: root.querySelector('[data-oap-number-special-bid-label]'),\n    numberSpecialBidInterest: root.querySelector('[data-oap-number-special-bid-interest]'),\n    numberBidFields: [...root.querySelectorAll('[data-oap-number-bid-field]')],\n    numberManualRows: root.querySelector('[data-oap-number-manual-rows]'),\n    numberAddManual: root.querySelector('[data-oap-number-add-manual]'),\n    numberPreviewButton: root.querySelector('[data-oap-number-preview]'),\n    numberSave: root.querySelector('[data-oap-number-save]'),\n    numberMessage: root.querySelector('[data-oap-number-message]'),\n    numberPreviewMetrics: root.querySelector('[data-oap-number-preview-metrics]'),\n    numberPreviewList: root.querySelector('[data-oap-number-preview-list]'),\n    numberLockConfirm: root.querySelector('[data-oap-number-lock-confirm]'),\n    numberLock: root.querySelector('[data-oap-number-lock]'),\n    numberBasePrice: root.querySelector('[data-oap-number-base-price]'),\n    numberBidIncrement: root.querySelector('[data-oap-number-bid-increment]'),\n    numberChoiceOpens: root.querySelector('[data-oap-number-choice-opens]'),\n    numberChoiceCloses: root.querySelector('[data-oap-number-choice-closes]'),\n    numberChoiceSummary: root.querySelector('[data-oap-number-choice-summary]'),\n    numberChoiceMessage: root.querySelector('[data-oap-number-choice-message]'),\n    numberChoicePreviewButton: root.querySelector('[data-oap-number-choice-preview]'),\n    numberChoiceSave: root.querySelector('[data-oap-number-choice-save]'),\n    numberChoiceOpenPanel: root.querySelector('[data-oap-number-choice-open-panel]'),\n    numberChoiceOpenConfirm: root.querySelector('[data-oap-number-choice-open-confirm]'),\n    numberChoiceOpen: root.querySelector('[data-oap-number-choice-open]'),\n    numberOwnerPreview: root.querySelector('[data-oap-number-owner-preview]'),\n    numberPreviewCollector: root.querySelector('[data-oap-number-preview-collector]'),\n    numberPreviewLocale: root.querySelector('[data-oap-number-preview-locale]'),\n    numberPreviewActual: root.querySelector('[data-oap-number-preview-actual]'),\n    numberPreviewMessage: root.querySelector('[data-oap-number-preview-message]'),\n    numberSettlementMetrics: root.querySelector('[data-oap-number-settlement-metrics]'),\n    numberSettlementMessage: root.querySelector('[data-oap-number-settlement-message]'),\n    numberSettlementList: root.querySelector('[data-oap-number-settlement-list]'),\n    numberSettlementListStatus: root.querySelector('[data-oap-number-settlement-list-status]'),\n    numberSettlementListRows: root.querySelector('[data-oap-number-settlement-list-rows]'),\n    numberSettlementCommit: root.querySelector('[data-oap-number-settlement-commit]'),\n    numberSettlementClose: root.querySelector('[data-oap-number-settlement-close]'),\n    numberSettlementPreview: root.querySelector('[data-oap-number-settlement-preview]'),\n    numberSettlementFreezeConfirm: root.querySelector('[data-oap-number-settlement-freeze-confirm]'),\n    numberSettlementFreeze: root.querySelector('[data-oap-number-settlement-freeze]'),\n    numberPaymentMode: root.querySelector('[data-oap-number-payment-mode]'),\n    numberPaymentMetrics: root.querySelector('[data-oap-number-payment-metrics]'),\n    numberPaymentPreview: root.querySelector('[data-oap-number-payment-preview]'),\n    numberPaymentSave: root.querySelector('[data-oap-number-payment-save]'),\n    numberPaymentMessage: root.querySelector('[data-oap-number-payment-message]'),\n    numberPaymentEmailReadiness: root.querySelector('[data-oap-number-payment-email-readiness]'),\n    numberPaymentAssetFile: root.querySelector('[data-oap-number-payment-asset-file]'),\n    numberPaymentAssetUpload: root.querySelector('[data-oap-number-payment-asset-upload]'),\n    numberPaymentBatchPreview: root.querySelector('[data-oap-number-payment-batch-preview]'),\n    numberPaymentBatchPrepare: root.querySelector('[data-oap-number-payment-batch-prepare]'),\n    numberPaymentBatchPanel: root.querySelector('[data-oap-number-payment-batch-panel]'),\n    numberPaymentBatchStatus: root.querySelector('[data-oap-number-payment-batch-status]'),\n    numberPaymentBatchSummary: root.querySelector('[data-oap-number-payment-batch-summary]'),\n    numberPaymentBatchRows: root.querySelector('[data-oap-number-payment-batch-rows]'),\n    numberPaymentBatchFreezeConfirm: root.querySelector('[data-oap-number-payment-batch-freeze-confirm]'),\n    numberPaymentBatchFreeze: root.querySelector('[data-oap-number-payment-batch-freeze]'),\n    numberPaymentOpensAt: root.querySelector('[data-oap-number-payment-opens-at]'),\n    numberPaymentOpeningPreview: root.querySelector('[data-oap-number-payment-opening-preview]'),\n    numberPaymentOpeningMessage: root.querySelector('[data-oap-number-payment-opening-message]'),\n    numberPaymentEmailPanel: root.querySelector('[data-oap-number-payment-email-panel]'),\n    numberPaymentEmailRequest: root.querySelector('[data-oap-number-payment-email-request]'),\n    numberPaymentSubmission: root.querySelector('[data-oap-number-payment-submission]'),\n    numberPaymentEmailPreview: root.querySelector('[data-oap-number-payment-email-preview]'),\n    numberPaymentEmailMessage: root.querySelector('[data-oap-number-payment-email-message]'),\n    numberPaymentEmailResult: root.querySelector('[data-oap-number-payment-email-result]'),\n    numberPaymentEmailSubject: root.querySelector('[data-oap-number-payment-email-subject]'),\n    numberPaymentEmailFrame: root.querySelector('[data-oap-number-payment-email-frame]'),\n    numberPaymentPageLocale: root.querySelector('[data-oap-number-payment-page-locale]'),\n    numberPaymentPageViewport: root.querySelector('[data-oap-number-payment-page-viewport]'),\n    numberPaymentPagePreview: root.querySelector('[data-oap-number-payment-page-preview]'),\n    numberPaymentPageResult: root.querySelector('[data-oap-number-payment-page-result]'),\n    numberPaymentPageStatus: root.querySelector('[data-oap-number-payment-page-status]'),\n    numberPaymentPageFrameShell: root.querySelector('[data-oap-number-payment-page-frame-shell]'),\n    numberPaymentPageFrame: root.querySelector('[data-oap-number-payment-page-frame]'),\n    numberPaymentOpenConfirm: root.querySelector('[data-oap-number-payment-open-confirm]'),\n    numberPaymentOpen: root.querySelector('[data-oap-number-payment-open]'),\n    paymentReviewPanel: root.querySelector('[data-oap-payment-review-panel]'),\n    paymentReviewStatus: root.querySelector('[data-oap-payment-review-status]'),\n    paymentReviewMetrics: root.querySelector('[data-oap-payment-review-metrics]'),\n    paymentReviewFilter: root.querySelector('[data-oap-payment-review-filter]'),\n    paymentReviewMessage: root.querySelector('[data-oap-payment-review-message]'),\n    paymentReviewList: root.querySelector('[data-oap-payment-review-list]'),\n    paymentCopyAll: root.querySelector('[data-oap-payment-copy-all]'),\n    paymentExport: root.querySelector('[data-oap-payment-export]'),\n    paymentReviewDialog: root.querySelector('[data-oap-payment-review-dialog]'),\n    paymentReviewDialogTitle: root.querySelector('[data-oap-payment-review-dialog-title]'),\n    paymentReviewDialogDetail: root.querySelector('[data-oap-payment-review-dialog-detail]'),\n    paymentReviewReference: root.querySelector('[data-oap-payment-review-reference]'),\n    paymentReviewNote: root.querySelector('[data-oap-payment-review-note]'),\n    paymentReviewAmountConfirm: root.querySelector('[data-oap-payment-review-amount-confirm]'),\n    paymentReviewEmailConfirm: root.querySelector('[data-oap-payment-review-email-confirm]'),\n    paymentReviewDialogMessage: root.querySelector('[data-oap-payment-review-dialog-message]'),\n    paymentReviewConfirm: root.querySelector('[data-oap-payment-review-confirm]'),\n    shopifyDialog: root.querySelector('[data-oap-shopify-dialog]'),\n    shopifyDialogTitle: root.querySelector('[data-oap-shopify-dialog-title]'),\n    shopifyDialogDetail: root.querySelector('[data-oap-shopify-dialog-detail]'),\n    shopifyDialogConfirm: root.querySelector('[data-oap-shopify-dialog-confirm]'),\n    shopifyDialogMessage: root.querySelector('[data-oap-shopify-dialog-message]'),\n    shopifyDialogSave: root.querySelector('[data-oap-shopify-dialog-save]'),\n    shippingPanel: root.querySelector('[data-oap-shipping-panel]'),\n    shippingStatus: root.querySelector('[data-oap-shipping-status]'),\n    shippingMetrics: root.querySelector('[data-oap-shipping-metrics]'),\n    shippingExpiry: root.querySelector('[data-oap-shipping-expiry]'),\n    shippingPreview: root.querySelector('[data-oap-shipping-preview]'),\n    shippingCreate: root.querySelector('[data-oap-shipping-create]'),\n    shippingRevoke: root.querySelector('[data-oap-shipping-revoke]'),\n    shippingMessage: root.querySelector('[data-oap-shipping-message]'),\n    shippingRows: root.querySelector('[data-oap-shipping-rows]'),\n    shippingSecret: root.querySelector('[data-oap-shipping-secret]'),\n    shippingUrl: root.querySelector('[data-oap-shipping-url]'),\n    shippingPin: root.querySelector('[data-oap-shipping-pin]'),\n    shippingCopyUrl: root.querySelector('[data-oap-shipping-copy-url]'),\n    shippingCopyPin: root.querySelector('[data-oap-shipping-copy-pin]'),\n  };\n  const applyStoredNumberChoiceWindow = (windowRecord) => {\n    if (!windowRecord) return;\n    if (refs.numberBasePrice) refs.numberBasePrice.value = String(windowRecord.base_price_jpy || '');\n    if (refs.numberBidIncrement && windowRecord.bid_increment_jpy != null) {\n      refs.numberBidIncrement.value = String(windowRecord.bid_increment_jpy);\n    }\n    if (refs.numberChoiceOpens) refs.numberChoiceOpens.value = isoToJstInput(windowRecord.opens_at);\n    if (refs.numberChoiceCloses) refs.numberChoiceCloses.value = isoToJstInput(windowRecord.closes_at);\n  };\n  applyStoredNumberChoiceWindow(state.numberChoiceWindow);\n  const identityTooltip = document.createElement('div');\n  identityTooltip.className = 'oap__identity-tooltip';\n  identityTooltip.setAttribute('role', 'tooltip');\n  identityTooltip.hidden = true;\n  root.appendChild(identityTooltip);\n  let activeIdentityTrigger = null;\n  let identityPinned = false;\n  let activeNudgePreview = null;\n  let nudgePreviewReturnFocus = null;\n\n  const nudgeCopy = {\n    en: {\n      lang: 'en', title: 'Your options are ready',\n      body: 'See what this release means for you, then choose what works for you.',\n      cta: 'See my options', later: 'Decide later', close: 'Close',\n    },\n    'zh-CN': {\n      lang: 'zh', title: '\u8FD9\u6B21\u53D1\u552E\uFF0C\u770B\u770B\u60A8\u53EF\u4EE5\u600E\u4E48\u9009',\n      body: '\u5148\u786E\u8BA4\u8FD9\u6B21\u9650\u5B9A\u6A21\u578B\u7684\u5B89\u6392\uFF0C\u518D\u51B3\u5B9A\u4E0B\u4E00\u6B65\u3002',\n      cta: '\u67E5\u770B\u6211\u7684\u9009\u62E9', later: '\u7A0D\u540E\u518D\u770B', close: '\u5173\u95ED',\n    },\n    ja: {\n      lang: 'ja', title: '\u4ECA\u56DE\u306E\u3054\u6848\u5185\u3092\u3054\u7528\u610F\u3057\u307E\u3057\u305F',\n      body: '\u4ECA\u56DE\u306E\u5185\u5BB9\u3092\u78BA\u8A8D\u3057\u3066\u3001\u3054\u5E0C\u671B\u306B\u5408\u3046\u3082\u306E\u3092\u304A\u9078\u3073\u3044\u305F\u3060\u3051\u307E\u3059\u3002',\n      cta: '\u9078\u629E\u80A2\u3092\u898B\u308B', later: '\u3042\u3068\u3067\u898B\u308B', close: '\u9589\u3058\u308B',\n    },\n  };\n  const defaultHomepageNudgePolicy = {\n    version: 'kob-homepage-nudge-policy-v1', revision: 0, source: 'default', reminders: {\n      allocation_choice: { enabled: true, copy: { en: nudgeCopy.en, zh: nudgeCopy['zh-CN'], ja: nudgeCopy.ja } },\n      number_choice: { enabled: true, copy: {\n        en: { lang: 'en', title: 'Your number is still waiting', body: 'Your number choice is not complete yet. Take a moment to finish it before the window closes.', cta: 'Choose my number', later: 'Decide later', close: 'Close' },\n        zh: { lang: 'zh', title: '\u8FD9\u6B21\u7684\u53F7\u7801\uFF0C\u8FD8\u7B49\u60A8\u6765\u9009', body: '\u9009\u53F7\u8FD8\u6CA1\u6709\u5B8C\u6210\u3002\u8BF7\u5728\u622A\u6B62\u524D\u770B\u4E00\u770B\uFF0C\u4E3A\u8FD9\u53F0\u6A21\u578B\u9009\u597D\u53F7\u7801\u3002', cta: '\u524D\u5F80\u9009\u53F7', later: '\u7A0D\u540E\u518D\u770B', close: '\u5173\u95ED' },\n        ja: { lang: 'ja', title: '\u4ECA\u56DE\u306E\u30CA\u30F3\u30D0\u30FC\u3092\u9078\u3073\u307E\u3057\u3087\u3046', body: '\u30CA\u30F3\u30D0\u30FC\u9078\u629E\u304C\u307E\u3060\u5B8C\u4E86\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u671F\u9650\u307E\u3067\u306B\u3001\u3054\u5E0C\u671B\u3092\u304A\u77E5\u3089\u305B\u304F\u3060\u3055\u3044\u3002', cta: '\u30CA\u30F3\u30D0\u30FC\u3092\u9078\u3076', later: '\u3042\u3068\u3067\u898B\u308B', close: '\u9589\u3058\u308B' },\n      } },\n      payment_information: { enabled: true, copy: {\n        en: { lang: 'en', title: 'Complete your payment details', body: 'Your purchase place is confirmed. Add your delivery details so we can prepare the next step.', cta: 'Continue', later: 'Do this later', close: 'Close' },\n        zh: { lang: 'zh', title: '\u8BF7\u5B8C\u6210\u4ED8\u6B3E\u4FE1\u606F', body: '\u60A8\u7684\u8D2D\u4E70\u540D\u989D\u5DF2\u7ECF\u786E\u8BA4\u3002\u8BF7\u586B\u5199\u6536\u8D27\u4FE1\u606F\uFF0C\u6211\u4EEC\u4F1A\u636E\u6B64\u51C6\u5907\u540E\u7EED\u6D41\u7A0B\u3002', cta: '\u7EE7\u7EED\u586B\u5199', later: '\u7A0D\u540E\u5904\u7406', close: '\u5173\u95ED' },\n        ja: { lang: 'ja', title: '\u304A\u652F\u6255\u3044\u60C5\u5831\u3092\u3054\u5165\u529B\u304F\u3060\u3055\u3044', body: '\u3054\u8CFC\u5165\u67A0\u306F\u78BA\u5B9A\u3057\u3066\u3044\u307E\u3059\u3002\u304A\u5C4A\u3051\u5148\u3092\u5165\u529B\u3059\u308B\u3068\u3001\u6B21\u306E\u624B\u7D9A\u304D\u3078\u9032\u3081\u307E\u3059\u3002', cta: '\u5165\u529B\u3092\u7D9A\u3051\u308B', later: '\u3042\u3068\u3067', close: '\u9589\u3058\u308B' },\n      } },\n    },\n  };\n  let homepageNudgePolicy = config.homepage_nudge_policy\n    ? JSON.parse(JSON.stringify(config.homepage_nudge_policy))\n    : JSON.parse(JSON.stringify(defaultHomepageNudgePolicy));\n\n  const activeScenario = () => state.scenarios.find((scenario) => scenario.id === state.activeScenario) || state.scenarios[0];\n  const partnerReserve = () => Math.max(0, editionTotal - state.playerCapacity);\n  const eligibleCollectors = () => collectors.filter(isAllocationEligible);\n  const save = () => localStorage.setItem(storageKey, JSON.stringify({\n    activeScenario: state.activeScenario,\n    scenarios: state.scenarios,\n    playerCapacity: state.playerCapacity,\n  }));\n\n  function analyzeTargetBoundary(tier, population) {\n    const balances = population.map((collector) => collector.eligiblePoints).sort((a, b) => b - a);\n    const target = Math.max(0, Math.trunc(Number(tier.seats) || 0));\n    const total = balances.length;\n    if (target > total) return { kind: 'above_population', target, total };\n    if (!total) return { kind: target === 0 ? 'exact' : 'above_population', target, total, minCost: 0, maxCost: 1000000, targetBalance: null, nextBalance: null };\n    if (target === 0) {\n      return { kind: 'exact', target, total, minCost: balances[0] + 1, maxCost: 1000000, targetBalance: null, nextBalance: balances[0] };\n    }\n\n    const targetBalance = balances[target - 1];\n    const nextBalance = target < total ? balances[target] : null;\n    if (nextBalance !== null && targetBalance === nextBalance) {\n      const tiedBalance = targetBalance;\n      const firstTieIndex = balances.findIndex((balance) => balance === tiedBalance);\n      const lastTieIndex = balances.lastIndexOf(tiedBalance);\n      return {\n        kind: 'boundary_tie', target, total, targetBalance, nextBalance,\n        tiedBalance, reduceTargetTo: firstTieIndex, increaseTargetTo: lastTieIndex + 1,\n        tiedCollectors: lastTieIndex - firstTieIndex + 1,\n      };\n    }\n\n    return {\n      kind: 'exact', target, total, targetBalance, nextBalance,\n      minCost: nextBalance === null ? 0 : nextBalance + 1,\n      maxCost: targetBalance,\n    };\n  }\n\n  function simulate(scenario) {\n    const tierResults = scenario.tiers.map((tier) => {\n      const population = collectors.filter((collector) => isAllocationEligible(collector)\n        && collector.distinctModels >= Number(tier.min) && collector.distinctModels <= Number(tier.max));\n      const boundary = analyzeTargetBoundary(tier, population);\n      return {\n        ...tier,\n        total: population.length,\n        qualified: population.filter((collector) => collector.eligiblePoints >= Number(tier.points)).length,\n        duplicates: population.filter((collector) => collector.duplicateItems > 0).length,\n        duplicateItems: population.reduce((sum, collector) => sum + collector.duplicateItems, 0),\n        collectorIds: population.map((collector) => collector.id),\n        boundary,\n      };\n    });\n    const assignments = new Map();\n    const errors = [];\n    const warnings = [];\n\n    scenario.tiers.forEach((tier, index) => {\n      if (!String(tier.name || '').trim()) errors.push(`Tier ${index + 1} needs a name.`);\n      if (Number(tier.min) > Number(tier.max)) errors.push(`${tier.name || `Tier ${index + 1}`} has a minimum above its maximum.`);\n      if (Number(tier.min) < 0 || Number(tier.max) > config.eligible_model_count) errors.push(`${tier.name || `Tier ${index + 1}`} must stay between 0 and ${config.eligible_model_count} distinct models.`);\n      if (Number(tier.points) < 0 || Number(tier.seats) < 0) errors.push(`${tier.name || `Tier ${index + 1}`} cannot use a negative requirement or seat target.`);\n      const result = tierResults[index];\n      if (result.boundary.kind === 'above_population') {\n        errors.push(`${tier.name || `Tier ${index + 1}`} requests ${result.boundary.target} slots but contains only ${result.boundary.total} collectors.`);\n      } else if (result.boundary.kind === 'boundary_tie') {\n        errors.push(`${tier.name || `Tier ${index + 1}`} target ${result.boundary.target} cuts through a ${money.format(result.boundary.tiedBalance)}-Point tie. Use ${result.boundary.reduceTargetTo} or ${result.boundary.increaseTargetTo} slots.`);\n      } else if (Number(tier.points) < result.boundary.minCost || Number(tier.points) > result.boundary.maxCost) {\n        errors.push(`${tier.name || `Tier ${index + 1}`} cost must be ${money.format(result.boundary.minCost)}\u2013${money.format(result.boundary.maxCost)} Points to match ${result.boundary.target} slots exactly.`);\n      }\n    });\n\n    collectors.forEach((collector) => {\n      if (!isAllocationEligible(collector)) {\n        assignments.set(collector.id, { matches: 0, tier: null, qualified: false, excluded: true });\n        return;\n      }\n      const matches = tierResults.filter((tier) => collector.distinctModels >= Number(tier.min) && collector.distinctModels <= Number(tier.max));\n      if (matches.length !== 1) {\n        assignments.set(collector.id, { matches: matches.length, tier: null, qualified: false });\n        return;\n      }\n      const tier = matches[0];\n      const qualified = collector.eligiblePoints >= Number(tier.points);\n      assignments.set(collector.id, { matches: 1, tier, qualified });\n    });\n\n    const overlapCount = Array.from(assignments.values()).filter((row) => !row.excluded && row.matches > 1).length;\n    const unassignedCount = Array.from(assignments.values()).filter((row) => !row.excluded && row.matches === 0).length;\n    if (overlapCount) errors.push(`${overlapCount} collectors match more than one tier.`);\n    if (unassignedCount) errors.push(`${unassignedCount} collectors are outside every tier.`);\n\n    const targetSeats = tierResults.reduce((sum, tier) => sum + Number(tier.seats || 0), 0);\n    if (targetSeats > state.playerCapacity) errors.push(`Seat targets exceed the ${state.playerCapacity}-unit Collector capacity by ${targetSeats - state.playerCapacity}.`);\n\n    tierResults.forEach((tier) => {\n      tier.overflow = Math.max(0, tier.qualified - Number(tier.seats));\n      tier.shortage = Math.max(0, Number(tier.seats) - tier.qualified);\n      if (tier.overflow) warnings.push(`${tier.name} has ${tier.overflow} qualified collectors above its target; no within-tier winner is selected.`);\n      if (tier.shortage) warnings.push(`${tier.name} is short of its target by ${tier.shortage}.`);\n    });\n\n    const qualified = tierResults.reduce((sum, tier) => sum + tier.qualified, 0);\n    const filledWithoutSelection = tierResults.reduce((sum, tier) => sum + Math.min(tier.qualified, Number(tier.seats)), 0);\n    const overflow = tierResults.reduce((sum, tier) => sum + tier.overflow, 0);\n    const baseDrawSlots = Math.max(0, state.playerCapacity - filledWithoutSelection);\n    return { scenario, tierResults, assignments, errors, warnings, targetSeats, qualified, filledWithoutSelection, overflow, shortage: baseDrawSlots, baseDrawSlots, valid: errors.length === 0 };\n  }\n\n  function renderDistribution() {\n    const population = eligibleCollectors();\n    const counts = Array.from({ length: config.eligible_model_count + 1 }, (_, count) => ({ count, collectors: population.filter((row) => row.distinctModels === count).length }));\n    const max = Math.max(1, ...counts.map((row) => row.collectors));\n    refs.distribution.innerHTML = counts.map((row) => `<div class=\"oap__bar\"><strong>${row.collectors}</strong><div class=\"oap__bar-track\"><i class=\"oap__bar-fill\" style=\"height:${Math.max(5, (row.collectors / max) * 100)}%\"></i></div><span>${row.count} distinct model${row.count === 1 ? '' : 's'}</span></div>`).join('');\n  }\n\n  function renderCompare(results) {\n    refs.compare.innerHTML = results.map((result) => {\n      const flag = result.errors.length\n        ? `${result.errors[0]}${result.errors.length > 1 ? ` \u00B7 +${result.errors.length - 1} more` : ''}`\n        : result.overflow\n          ? `${result.overflow} qualified collector${result.overflow === 1 ? '' : 's'} remain unresolved`\n          : result.baseDrawSlots\n            ? `${result.baseDrawSlots} base draw slot${result.baseDrawSlots === 1 ? '' : 's'} before later declines or expiries`\n            : 'Capacity covered without within-tier ranking';\n      const good = !result.errors.length && !result.overflow;\n      return `<article class=\"oap__compare-card${result.scenario.id === state.activeScenario ? ' oap__compare-card--active' : ''}\" data-oap-compare-card=\"${result.scenario.id}\">\n        <header><div><span>Candidate ${result.scenario.id}</span><h3>${escapeHtml(result.scenario.name)}</h3></div><button type=\"button\" data-oap-open=\"${result.scenario.id}\">Edit</button></header>\n        <div class=\"oap__compare-metrics\"><div><strong>${result.tierResults.length}</strong><span>Tiers</span></div><div><strong>${result.filledWithoutSelection}/${state.playerCapacity}</strong><span>Guaranteed</span></div><div><strong>${result.baseDrawSlots}</strong><span>Base draw</span></div><div><strong>${result.overflow}</strong><span>Overflow</span></div></div>\n        <p class=\"oap__compare-flag${good ? ' oap__compare-flag--good' : ''}\">${escapeHtml(flag)}</p>\n      </article>`;\n    }).join('');\n  }\n\n  function renderTabs() {\n    refs.tabs.innerHTML = state.scenarios.map((scenario) => `<button class=\"oap__scenario-tab\" type=\"button\" role=\"tab\" aria-selected=\"${scenario.id === state.activeScenario}\" data-oap-tab=\"${scenario.id}\">Candidate ${scenario.id} \u00B7 ${escapeHtml(scenario.name)}</button>`).join('');\n  }\n\n  function renderEditor(result) {\n    refs.activeLabel.textContent = `Candidate ${result.scenario.id}`;\n    refs.activeName.textContent = result.scenario.name;\n    refs.tierList.innerHTML = result.tierResults.map((tier, index) => {\n      const boundary = tier.boundary;\n      const boundarySummary = boundary.kind === 'boundary_tie'\n        ? `<div class=\"oap__boundary-alert\"><strong>Target crosses a tied balance</strong><span>${boundary.tiedCollectors} collectors have ${money.format(boundary.tiedBalance)} Points across this boundary. Change allocation to ${boundary.reduceTargetTo} or ${boundary.increaseTargetTo}.</span></div>`\n        : boundary.kind === 'above_population'\n          ? `<div class=\"oap__boundary-alert\"><strong>Allocation exceeds this tier</strong><span>Only ${boundary.total} collectors are in this holding range.</span></div>`\n          : `<div class=\"oap__boundary-grid\">\n              <span>Target boundary<strong>${boundary.targetBalance === null ? 'None' : `${money.format(boundary.targetBalance)} Points`}</strong></span>\n              <span>Next balance<strong>${boundary.nextBalance === null ? 'No next collector' : `${money.format(boundary.nextBalance)} Points`}</strong></span>\n              <span>Exact-match cost<strong>${money.format(boundary.minCost)}\u2013${money.format(boundary.maxCost)} Points</strong></span>\n            </div>`;\n      return `<article class=\"oap__tier\" data-oap-tier=\"${tier.id}\">\n      <div class=\"oap__tier-fields\">\n        <label>Name<input value=\"${escapeHtml(tier.name)}\" data-oap-tier-field=\"name\" aria-label=\"Tier ${index + 1} name\"></label>\n        <label>Min models<input type=\"number\" inputmode=\"numeric\" min=\"0\" max=\"${config.eligible_model_count}\" value=\"${tier.min}\" data-oap-tier-field=\"min\" aria-label=\"${escapeHtml(tier.name)} minimum distinct models\"></label>\n        <label>Max models<input type=\"number\" inputmode=\"numeric\" min=\"0\" max=\"${config.eligible_model_count}\" value=\"${tier.max}\" data-oap-tier-field=\"max\" aria-label=\"${escapeHtml(tier.name)} maximum distinct models\"></label>\n        <label>Planned allocation<input type=\"number\" inputmode=\"numeric\" min=\"0\" max=\"${state.playerCapacity}\" step=\"1\" value=\"${tier.seats}\" data-oap-tier-field=\"seats\" aria-label=\"${escapeHtml(tier.name)} planned allocation\"></label>\n        <label>KoB Points cost<input type=\"number\" inputmode=\"numeric\" min=\"0\" step=\"1\" value=\"${tier.points}\" data-oap-tier-field=\"points\" aria-label=\"${escapeHtml(tier.name)} KoB Points cost\"></label>\n      </div>\n      <div class=\"oap__tier-analysis\">\n        <div class=\"oap__tier-boundary\">${boundarySummary}</div>\n        <div class=\"oap__tier-result\"><strong>${tier.qualified} capable / ${tier.total} total</strong>${tier.overflow ? `${tier.overflow} overflow` : tier.shortage ? `${tier.shortage} short` : 'Target covered'}${tier.duplicateItems ? ` \u00B7 ${tier.duplicateItems} duplicate item${tier.duplicateItems === 1 ? '' : 's'} noted` : ''}</div>\n        <button class=\"oap__tier-remove\" type=\"button\" data-oap-remove-tier=\"${tier.id}\" aria-label=\"Remove ${escapeHtml(tier.name)}\">\u00D7</button>\n      </div>\n    </article>`;\n    }).join('');\n\n    const issues = [...result.errors, ...result.warnings];\n    const drawUnit = `base draw slot${result.baseDrawSlots === 1 ? '' : 's'}`;\n    const partnerUnits = partnerReserve();\n    refs.status.className = `oap__scenario-status${result.errors.length ? ' oap__scenario-status--blocked' : ''}`;\n    refs.status.innerHTML = `<strong>${result.errors.length ? 'Scenario blocked' : 'Read-only simulation'}</strong><span> \u00B7 ${result.filledWithoutSelection} guaranteed slots \u00B7 ${result.baseDrawSlots} ${drawUnit} \u00B7 ${partnerUnits} partner unit${partnerUnits === 1 ? '' : 's'}.</span><p>Each later guaranteed-slot decline or expiry adds one unit to the final draw without changing the ${state.playerCapacity}-unit Collector capacity.</p>${issues.length ? `<ul>${issues.map((issue) => `<li>${escapeHtml(issue)}</li>`).join('')}</ul>` : '<p>No capacity, coverage or same-tier overflow warning.</p>'}`;\n  }\n\n  function renderCampaignControls() {\n    const eligible = eligibleCollectors().length;\n    const excluded = collectors.length - eligible;\n    root.querySelectorAll('[data-oap-edition-total]').forEach((node) => { node.textContent = String(editionTotal); });\n    root.querySelectorAll('[data-oap-customer-capacity]').forEach((node) => { node.textContent = String(state.playerCapacity); });\n    root.querySelectorAll('[data-oap-partner-reserve], [data-oap-parameter-partner-reserve]').forEach((node) => { node.textContent = String(partnerReserve()); });\n    root.querySelectorAll('[data-oap-eligible-total]').forEach((node) => { node.textContent = String(eligible); });\n    root.querySelectorAll('[data-oap-excluded-total]').forEach((node) => { node.textContent = `${excluded} excluded from this pool`; });\n    root.querySelectorAll('[data-oap-eligibility-rule]').forEach((node) => {\n      node.textContent = eligibilityMode === 'holding_or_points'\n        ? `1+ model or ${money.format(eligibilityPointsFloor)} Points`\n        : `${money.format(eligibilityPointsFloor)}+ release-eligible Points`;\n    });\n    root.querySelectorAll('[data-oap-eligibility-note]').forEach((node) => {\n      node.textContent = eligibilityMode === 'holding_or_points'\n        ? 'Either condition admits the collector'\n        : 'Current C12S campaign exception';\n    });\n    if (refs.playerCapacity) {\n      refs.playerCapacity.max = String(editionTotal);\n      refs.playerCapacity.value = String(state.playerCapacity);\n    }\n    if (refs.parameterStatus) refs.parameterStatus.innerHTML = `<strong>${state.playerCapacity} Collector units + ${partnerReserve()} partner units = ${editionTotal} total.</strong> Capacity changes never create an additional physical unit.`;\n  }\n\n  function renderCollectors(result) {\n    hideIdentity(null, true);\n    const visible = collectors.filter((collector) => {\n      const assignment = result.assignments.get(collector.id);\n      if (state.filter === 'eligible') return !assignment?.excluded;\n      if (state.filter === 'ineligible') return assignment?.excluded;\n      if (state.filter === 'duplicate') return collector.duplicateItems > 0;\n      if (state.filter === 'in_review') return collector.reviewStatus === 'in_review';\n      if (state.filter === 'cannot_pay') return !assignment?.excluded && assignment?.tier && !assignment.qualified;\n      if (state.filter === 'overflow') return assignment?.qualified && assignment?.tier?.overflow > 0;\n      return true;\n    });\n\n    refs.collectors.innerHTML = visible.map((collector) => {\n      const assignment = result.assignments.get(collector.id);\n      const tier = assignment?.tier;\n      const capability = assignment?.excluded ? '<span class=\"oap__pill oap__pill--excluded\">Excluded from pool</span>'\n        : !tier ? '<span class=\"oap__pill oap__pill--warn\">Rule gap</span>'\n        : assignment.qualified ? '<span class=\"oap__pill oap__pill--good\">Can meet cost</span>' : '<span class=\"oap__pill oap__pill--warn\">Below cost</span>';\n      return `<tr${assignment?.excluded ? ' class=\"oap__collector-row--excluded\"' : ''}>\n        <td><button class=\"oap__collector-identity\" type=\"button\" data-oap-identity=\"${escapeHtml(collector.id)}\" aria-label=\"Show identity for ${escapeHtml(collector.id)}\">${escapeHtml(collector.id)}</button></td>\n        <td>${collector.distinctModels}</td>\n        <td>${collector.physicalItems}</td>\n        <td>${collector.duplicateItems ? `<span class=\"oap__duplicate\">+${collector.duplicateItems} same-model item${collector.duplicateItems === 1 ? '' : 's'}</span>` : '<span class=\"oap__muted\">None</span>'}</td>\n        <td>${money.format(collector.eligiblePoints)}</td>\n        <td>${collector.reviewStatus === 'in_review' ? '<span class=\"oap__pill oap__pill--warn\">Assumed approved</span>' : '<span class=\"oap__muted\">Completed</span>'}</td>\n        <td>${assignment?.excluded ? '<span class=\"oap__muted\">Audit only</span>' : tier ? escapeHtml(tier.name) : '<span class=\"oap__pill oap__pill--warn\">Unassigned</span>'}</td>\n        <td>${capability}${assignment?.qualified && tier?.overflow ? '<br><small class=\"oap__duplicate\">Unresolved tier overflow</small>' : ''}</td>\n      </tr>`;\n    }).join('') || '<tr><td colspan=\"8\">No collectors match this filter.</td></tr>';\n  }\n\n  function showIdentity(trigger) {\n    const collector = collectors.find((row) => row.id === trigger.dataset.oapIdentity);\n    if (!collector) return;\n    activeIdentityTrigger = trigger;\n    identityTooltip.innerHTML = `<span>Owner ID</span><strong>${escapeHtml(collector.ownerId)}</strong><span>Name</span><strong>${escapeHtml(collector.displayName)}</strong>${collector.syntheticIdentity ? '<small>Synthetic identity in this local prototype. The formal owner workbench loads protected values.</small>' : ''}`;\n    identityTooltip.hidden = false;\n    const rect = trigger.getBoundingClientRect();\n    const tooltipRect = identityTooltip.getBoundingClientRect();\n    const left = Math.min(window.innerWidth - tooltipRect.width - 12, Math.max(12, rect.left));\n    const below = rect.bottom + 8;\n    const top = below + tooltipRect.height <= window.innerHeight - 12 ? below : Math.max(12, rect.top - tooltipRect.height - 8);\n    identityTooltip.style.left = `${left}px`;\n    identityTooltip.style.top = `${top}px`;\n  }\n\n  function hideIdentity(trigger, force = false) {\n    if (identityPinned && !force) return;\n    if (trigger && activeIdentityTrigger !== trigger) return;\n    identityPinned = false;\n    activeIdentityTrigger = null;\n    identityTooltip.hidden = true;\n  }\n\n  const normalizedCandidate = (scenario) => ({\n    key: String(scenario?.id || scenario?.key || 'candidate'),\n    name: String(scenario?.name || 'Reviewed allocation plan'),\n    tiers: (scenario?.tiers || []).map((tier) => ({\n      name: String(tier.name || ''),\n      min_models: Number(tier.min_models ?? tier.min),\n      max_models: Number(tier.max_models ?? tier.max),\n      points_cost: Number(tier.points_cost ?? tier.points),\n      target_slots: Number(tier.target_slots ?? tier.seats),\n    })),\n  });\n\n  const decisionSignature = (candidate, capacity = state.playerCapacity) => JSON.stringify({\n    edition_total: editionTotal,\n    player_capacity: Number(capacity),\n    eligibility_mode: eligibilityMode,\n    eligibility_points_floor: eligibilityPointsFloor,\n    candidate: normalizedCandidate(candidate),\n  });\n\n  function localPlanFromResult(result, status = 'reviewed_draft') {\n    const members = collectors.map((collector) => {\n      const assignment = result.assignments.get(collector.id);\n      return {\n        collector_id: collector.collectorId,\n        tier_index: assignment?.tier ? result.tierResults.findIndex((tier) => tier.id === assignment.tier.id) : null,\n        outcome: assignment?.excluded ? 'excluded' : assignment?.qualified ? 'guaranteed' : 'draw_pool',\n        eligible_points: collector.eligiblePoints,\n        distinct_models: collector.distinctModels,\n        physical_items: collector.physicalItems,\n        points_cost: assignment?.tier ? Number(assignment.tier.points) : null,\n      };\n    });\n    const guaranteed = members.filter((member) => member.outcome === 'guaranteed').length;\n    const drawPool = members.filter((member) => member.outcome === 'draw_pool').length;\n    const excluded = members.filter((member) => member.outcome === 'excluded').length;\n    return {\n      plan_id: `LOCAL-PLAN-${Date.now()}`,\n      plan_revision: Number(state.savedPlan?.plan_revision || 0) + 1,\n      status,\n      candidate: normalizedCandidate(result.scenario),\n      edition_total: editionTotal,\n      player_capacity: state.playerCapacity,\n      partner_reserve: partnerReserve(),\n      eligibility_mode: eligibilityMode,\n      eligibility_points_floor: eligibilityPointsFloor,\n      applicant_count: members.length,\n      eligible_collector_count: members.length - excluded,\n      excluded_collector_count: excluded,\n      guaranteed_count: guaranteed,\n      base_draw_count: Math.max(0, state.playerCapacity - guaranteed),\n      draw_pool_count: drawPool,\n      preview: { tiers: result.tierResults.map((tier, index) => ({\n        tier_index: index,\n        name: tier.name,\n        min_models: Number(tier.min),\n        max_models: Number(tier.max),\n        points_cost: Number(tier.points),\n        target_slots: Number(tier.seats),\n        population_count: tier.total,\n        guaranteed_count: tier.qualified,\n      })) },\n      members,\n      created_at: new Date().toISOString(),\n      locked_at: status === 'locked' ? new Date().toISOString() : null,\n    };\n  }\n\n  function renderMemberGroup(plan, outcome, title) {\n    const rows = (plan.members || []).filter((member) => member.outcome === outcome);\n    const items = rows.map((member) => {\n      const collector = collectors.find((row) => row.collectorId === member.collector_id);\n      const identity = collector ? `${collector.id} \u00B7 ${collector.displayName}` : member.collector_id;\n      const tier = member.tier_index === null ? 'Audit only' : plan.candidate?.tiers?.[member.tier_index]?.name || `Tier ${Number(member.tier_index) + 1}`;\n      return `<li><strong>${escapeHtml(identity)}</strong><span>${escapeHtml(tier)} \u00B7 ${money.format(member.eligible_points)} Points</span></li>`;\n    }).join('');\n    return `<details class=\"oap__plan-members\"${outcome === 'guaranteed' ? ' open' : ''}><summary>${escapeHtml(title)} <strong>${rows.length}</strong></summary><ul>${items || '<li>No collectors</li>'}</ul></details>`;\n  }\n\n  function renderApproval(result) {\n    if (!refs.approval) return;\n    const plan = state.savedPlan;\n    const locked = plan?.status === 'locked';\n    const currentSignature = decisionSignature(result.scenario);\n    const savedSignature = plan ? decisionSignature(plan.candidate, plan.player_capacity) : '';\n    const dirty = Boolean(plan && currentSignature !== savedSignature);\n    refs.approvalState.textContent = locked ? `Locked plan \u00B7 revision ${plan.plan_revision}`\n      : plan ? `Reviewed Draft \u00B7 revision ${plan.plan_revision}` : 'No server draft saved';\n    refs.approvalState.className = `oap__approval-state${locked ? ' oap__approval-state--locked' : ''}`;\n    refs.approvalCopy.textContent = state.planMessage || (locked\n      ? 'This allocation plan is immutable. The editor above remains available only for comparison.'\n      : dirty ? 'The active candidate differs from the saved draft. Save a new reviewed revision before locking.'\n      : plan ? 'The saved draft matches the active candidate and is ready for final review.'\n      : 'Save the active, unblocked candidate to create a versioned final preview.');\n    refs.saveDraft.disabled = state.planBusy || locked || !result.valid || result.overflow > 0;\n    refs.saveDraft.textContent = state.planBusy ? 'Working\u2026' : plan && !locked ? 'Save new reviewed revision' : 'Save reviewed draft';\n    refs.openLock.disabled = state.planBusy || !plan || locked || dirty;\n    refs.openLock.hidden = !plan || locked;\n    refs.approvalPreview.hidden = !plan;\n    if (!plan) {\n      refs.approvalPreview.innerHTML = '';\n      return;\n    }\n    const tiers = plan.preview?.tiers || plan.candidate?.tiers || [];\n    refs.approvalPreview.innerHTML = `\n      <div class=\"oap__plan-metrics\">\n        <div><span>Collector capacity</span><strong>${plan.player_capacity}</strong><small>${plan.partner_reserve} partner unit${plan.partner_reserve === 1 ? '' : 's'}</small></div>\n        <div><span>Guaranteed</span><strong>${plan.guaranteed_count}</strong><small>Uniform tier costs</small></div>\n        <div><span>Base draw</span><strong>${plan.base_draw_count}</strong><small>Before later declines</small></div>\n        <div><span>Draw pool now</span><strong>${plan.draw_pool_count}</strong><small>${plan.excluded_collector_count} excluded</small></div>\n      </div>\n      <div class=\"oap__plan-tier-table\"><table><thead><tr><th>Tier</th><th>Holding range</th><th>KoB Points</th><th>Guaranteed</th></tr></thead><tbody>${tiers.map((tier) => `<tr><td>${escapeHtml(tier.name)}</td><td>${tier.min_models}\u2013${tier.max_models}</td><td>${money.format(tier.points_cost)}</td><td>${tier.guaranteed_count ?? tier.target_slots} / ${tier.population_count ?? '\u2014'}</td></tr>`).join('')}</tbody></table></div>\n      <div class=\"oap__plan-member-groups\">\n        ${renderMemberGroup(plan, 'guaranteed', 'Guaranteed offer list')}\n        ${renderMemberGroup(plan, 'draw_pool', 'Initial draw pool')}\n        ${renderMemberGroup(plan, 'excluded', 'Excluded audit records')}\n      </div>`;\n  }\n\n  const formatJst = (value) => {\n    const date = new Date(value);\n    if (Number.isNaN(date.getTime())) return '\u2014';\n    return new Intl.DateTimeFormat('en-CA', {\n      timeZone: 'Asia/Tokyo', year: 'numeric', month: '2-digit', day: '2-digit',\n      hour: '2-digit', minute: '2-digit', hour12: false,\n    }).format(date).replace(',', '') + ' JST';\n  };\n\n  const jstInputToIso = (value) => {\n    const clean = String(value || '').trim();\n    if (!/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$/.test(clean)) throw new Error('choice_window_time_invalid');\n    const date = new Date(`${clean}:00+09:00`);\n    if (Number.isNaN(date.getTime())) throw new Error('choice_window_time_invalid');\n    return date.toISOString();\n  };\n\n  const localInputToIso = (value) => {\n    const date = new Date(String(value || '').trim());\n    if (Number.isNaN(date.getTime())) throw new Error('public_draw_time_invalid');\n    return date.toISOString();\n  };\n\n  const isoToLocalInput = (value) => {\n    const date = new Date(value);\n    if (Number.isNaN(date.getTime())) return '';\n    const offset = date.getTimezoneOffset() * 60_000;\n    return new Date(date.getTime() - offset).toISOString().slice(0, 19);\n  };\n\n  function renderChoiceWindow() {\n    if (!refs.choiceWindow) return;\n    const windowRecord = state.choiceWindow;\n    const planLocked = state.savedPlan?.status === 'locked';\n    refs.choiceState.textContent = !state.choiceLoaded ? 'Checking'\n      : windowRecord ? `${windowRecord.status} \u00B7 revision ${windowRecord.revision}`\n      : planLocked ? 'Ready to prepare' : 'Locked plan required';\n    refs.choiceState.className = `oap__choice-state${windowRecord ? ' oap__choice-state--prepared' : ''}`;\n    refs.choiceOpens.disabled = state.choiceBusy || Boolean(windowRecord) || !planLocked;\n    refs.choiceCloses.disabled = state.choiceBusy || Boolean(windowRecord) || !planLocked;\n    refs.prepareChoice.disabled = state.choiceBusy || Boolean(windowRecord) || !state.choiceLoaded || !planLocked;\n    refs.prepareChoice.hidden = Boolean(windowRecord);\n    refs.prepareChoice.textContent = state.choiceBusy ? 'Preparing\u2026' : 'Prepare read-only window';\n    refs.choiceMessage.textContent = state.choiceMessage || (!state.choiceLoaded\n      ? 'Checking the protected campaign state.'\n      : windowRecord\n        ? `${formatJst(windowRecord.opens_at)} \u2192 ${formatJst(windowRecord.closes_at)} \u00B7 ${windowRecord.email_job_count || 0} email jobs queued. Scheduled delivery begins at the opening time.`\n        : planLocked\n          ? 'Review both JST times, then prepare the immutable window. Collector responses, reminders and email delivery stay off.'\n          : 'Lock the reviewed Allocation Plan before preparing a Collector choice window.');\n    renderOwnerPreview();\n  }\n\n  const choiceLabel = (decision) => ({\n    accept_guaranteed: 'Keep purchase slot',\n    enter_draw: 'Join draw',\n    decline_all: 'Leave release',\n    no_response: 'No response',\n  })[decision] || decision || '\u2014';\n\n  const outcomeLabel = (outcome) => outcome === 'guaranteed' ? 'Guaranteed offer' : 'Initial draw pool';\n\n  const settlementIdentity = (row) => {\n    const identity = row?.identity || {};\n    const name = identity.display_name || 'Name unavailable';\n    const email = identity.email || '';\n    return `<strong>${escapeHtml(name)}</strong>${email && email.toLowerCase() !== name.toLowerCase() ? `<small class=\"oap__muted\">${escapeHtml(email)}</small>` : ''}`;\n  };\n\n  function renderRehearsal() {\n    if (!refs.createRehearsal) return;\n    const rehearsal = state.rehearsal;\n    if (!refs.rehearsalTime.value) {\n      refs.rehearsalTime.value = isoToLocalInput(new Date(Date.now() + 3 * 60_000));\n    }\n    refs.rehearsalTime.disabled = state.rehearsalBusy;\n    refs.setRehearsalTime.disabled = state.rehearsalBusy;\n    refs.rehearsalEmail.disabled = state.rehearsalBusy;\n    refs.rehearsalConfirm.disabled = state.rehearsalBusy;\n    refs.createRehearsal.disabled = state.rehearsalBusy || !refs.rehearsalConfirm.checked;\n    refs.createRehearsal.textContent = state.rehearsalBusy ? 'Creating rehearsal\u2026' : 'Create rehearsal & open draw room';\n    refs.openRehearsal.hidden = !state.rehearsalViewerUrl;\n    if (state.rehearsalViewerUrl) refs.openRehearsal.href = state.rehearsalViewerUrl;\n    refs.rehearsalMetrics.innerHTML = rehearsal ? `\n      <div><span>Status</span><strong>${escapeHtml(rehearsal.status.replaceAll('_', ' '))}</strong><small>Isolated QA record</small></div>\n      <div><span>Reveal</span><strong>${escapeHtml(formatJst(rehearsal.round_time))}</strong><small>Exact Quicknet boundary</small></div>\n      <div><span>Draw slots</span><strong>${rehearsal.draw_slots}</strong><small>Current projected returns</small></div>\n      <div><span>Candidates</span><strong>${rehearsal.candidate_count}</strong><small>Includes test viewer</small></div>\n      <div><span>drand round</span><strong>${money.format(rehearsal.drand_round)}</strong><small>Committed future signal</small></div>\n      <div><span>Receipt</span><strong>${rehearsal.receipt_hash ? 'Verified' : 'Pending'}</strong><small>${rehearsal.receipt_hash ? 'Result finalized' : 'Wait for reveal'}</small></div>` : '';\n    refs.rehearsalMessage.textContent = state.rehearsalMessage || (rehearsal\n      ? 'This is the latest isolated rehearsal record. Its private viewer link is shown only in the browser session that created it.'\n      : 'Set a future time to test the actual backend commitment, countdown and result effect.');\n  }\n\n  function setRehearsalTimeFromNow() {\n    if (state.rehearsalBusy || !refs.rehearsalTime) return;\n    refs.rehearsalTime.value = isoToLocalInput(new Date(Date.now() + 3 * 60_000));\n    state.rehearsalMessage = 'Reveal time reset to three minutes from now. Confirm the isolated rehearsal when ready.';\n    renderRehearsal();\n  }\n\n  function renderSettlement() {\n    if (!refs.settlement) return;\n    renderRehearsal();\n    const data = state.settlementData;\n    const status = data?.choice_status;\n    const settlement = data?.settlement;\n    const setup = data?.draw_setup;\n    const publicDraw = data?.public_draw;\n    const locked = setup?.status === 'locked';\n    refs.settlementState.textContent = !state.settlementLoaded ? 'Checking'\n      : locked ? 'Candidate manifest locked'\n        : settlement ? 'Choice settlement frozen'\n          : status?.deadline_passed ? 'Ready to freeze' : 'Collecting responses';\n    refs.settlementState.className = `oap__settlement-state${locked ? ' oap__settlement-state--locked' : status?.deadline_passed ? ' oap__settlement-state--ready' : ''}`;\n    refs.refreshSettlement.disabled = state.settlementBusy || !state.settlementLoaded;\n    refs.refreshSettlement.textContent = state.settlementBusy ? 'Refreshing\u2026' : 'Refresh';\n\n    if (!status) {\n      refs.choiceMetrics.innerHTML = '';\n      refs.choiceRows.innerHTML = '';\n      refs.choiceRowCount.textContent = '0';\n      refs.freezeSummary.innerHTML = '<strong>Choice data unavailable.</strong> Reload the protected workbench before settlement.';\n      refs.freeze.disabled = true;\n      refs.drawStep.hidden = true;\n      refs.publicDrawStep.hidden = true;\n      refs.settlementMessage.textContent = state.settlementMessage || 'Loading the protected choice status.';\n      return;\n    }\n\n    const counts = status.counts || {};\n    refs.choiceMetrics.innerHTML = `\n      <div><span>Keep slot</span><strong>${counts.accept_guaranteed || 0}</strong><small>Guaranteed retained</small></div>\n      <div><span>Join draw</span><strong>${counts.enter_draw || 0}</strong><small>Affirmative entries</small></div>\n      <div><span>Leave release</span><strong>${counts.decline_all || 0}</strong><small>Saved full exits</small></div>\n      <div><span>No response</span><strong>${counts.no_response || 0}</strong><small>Defaults to full exit</small></div>\n      <div><span>Draw slots</span><strong>${status.expected_draw_slots || 0}</strong><small>If frozen now</small></div>\n      <div><span>Draw entrants</span><strong>${status.expected_draw_entrants || 0}</strong><small>Explicit choice only</small></div>`;\n    refs.choiceRows.innerHTML = (status.rows || []).map((row) => `<tr>\n      <td>${settlementIdentity(row)}</td>\n      <td>${escapeHtml(outcomeLabel(row.original_outcome))}</td>\n      <td><span class=\"oap__pill${row.recorded_decision === 'no_response' ? ' oap__pill--warn' : ''}\">${escapeHtml(choiceLabel(row.recorded_decision))}</span></td>\n      <td>${escapeHtml(choiceLabel(row.effective_decision))}</td>\n      <td>${row.responded_at ? escapeHtml(formatJst(row.responded_at)) : '\u2014'}</td>\n    </tr>`).join('');\n    refs.choiceRowCount.textContent = String(status.rows?.length || 0);\n\n    const deadline = formatJst(status.closes_at);\n    refs.freezeSummary.innerHTML = settlement\n      ? `<strong>Frozen ${escapeHtml(formatJst(settlement.frozen_at))}.</strong> ${settlement.accepted_guaranteed} guaranteed offers remain; ${settlement.returned_guaranteed} returned units plus the base draw create ${settlement.draw_slots} draw slot${settlement.draw_slots === 1 ? '' : 's'}. Snapshot <code>${escapeHtml(settlement.snapshot_hash)}</code>.`\n      : status.deadline_passed\n        ? `<strong>The fixed deadline (${escapeHtml(deadline)}) has passed.</strong> Freezing will preserve ${status.eligible_count} effective decisions, including ${counts.no_response || 0} unanswered account${counts.no_response === 1 ? '' : 's'} resolved as full exits.`\n        : `<strong>Responses remain open until ${escapeHtml(deadline)}.</strong> The backend will reject late changes automatically. Return after the deadline to create the settlement.`;\n    refs.freezeConfirm.disabled = state.settlementBusy || Boolean(settlement) || !status.deadline_passed;\n    if (settlement) refs.freezeConfirm.checked = true;\n    refs.freeze.disabled = state.settlementBusy || Boolean(settlement) || !status.deadline_passed || !refs.freezeConfirm.checked;\n    refs.freeze.textContent = state.settlementBusy ? 'Freezing\u2026' : settlement ? 'Choice settlement frozen' : 'Freeze choice settlement';\n\n    refs.drawStep.hidden = !settlement;\n    if (!settlement) {\n      refs.settlementMessage.textContent = state.settlementMessage || (status.deadline_passed\n        ? 'Review the status, confirm the settlement, then freeze it once.'\n        : 'Choice status is live. Refresh at any time; no Collector record is changed.');\n      return;\n    }\n    if (setup && document.activeElement !== refs.drawPoints) refs.drawPoints.value = String(setup.points_cost);\n    refs.drawPoints.disabled = state.settlementBusy || locked;\n    refs.saveDraw.disabled = state.settlementBusy || locked;\n    refs.saveDraw.textContent = state.settlementBusy ? 'Saving\u2026' : setup ? 'Save revised setup' : 'Save draw setup';\n    refs.drawMetrics.innerHTML = setup ? `\n      <div><span>Draw slots</span><strong>${setup.draw_slots}</strong><small>From frozen choices</small></div>\n      <div><span>Entrants</span><strong>${setup.entrant_count}</strong><small>Explicit draw choices</small></div>\n      <div><span>Points cost</span><strong>${money.format(setup.points_cost)}</strong><small>Frozen eligibility check</small></div>\n      <div><span>Qualified</span><strong>${setup.qualified_count}</strong><small>Candidate manifest</small></div>\n      <div><span>Insufficient</span><strong>${setup.insufficient_count}</strong><small>Outside draw list</small></div>\n      <div><span>Unfilled</span><strong>${setup.unfilled_slots}</strong><small>If candidates are fewer</small></div>`\n      : `<div><span>Draw slots</span><strong>${settlement.draw_slots}</strong><small>Frozen value</small></div><div><span>Entrants</span><strong>${settlement.draw_entrant_count}</strong><small>Set Points to qualify</small></div>`;\n    refs.drawList.hidden = !setup;\n    refs.drawRows.innerHTML = (setup?.members || []).map((row) => `<tr>\n      <td><code>${escapeHtml(row.audit_code)}</code></td>\n      <td>${settlementIdentity(row)}</td>\n      <td>${money.format(row.eligible_points)}</td>\n      <td><span class=\"oap__pill${row.eligibility_status === 'qualified' ? ' oap__pill--good' : ' oap__pill--warn'}\">${row.eligibility_status === 'qualified' ? 'Qualified' : 'Points insufficient'}</span></td>\n    </tr>`).join('');\n    refs.drawRowCount.textContent = String(setup?.members?.length || 0);\n    refs.drawLockPanel.hidden = !setup;\n    refs.drawHash.textContent = setup?.manifest_hash || '\u2014';\n    refs.drawLockConfirm.disabled = state.settlementBusy || locked;\n    if (locked) refs.drawLockConfirm.checked = true;\n    refs.lockDraw.disabled = state.settlementBusy || locked || !refs.drawLockConfirm.checked;\n    refs.lockDraw.textContent = state.settlementBusy ? 'Locking\u2026' : locked ? 'Candidate manifest locked' : 'Lock draw candidate manifest';\n    refs.publicDrawStep.hidden = !locked;\n    if (locked) {\n      const committed = ['committed', 'result_finalized'].includes(publicDraw?.status);\n      const finalized = publicDraw?.status === 'result_finalized';\n      if (!refs.publicDrawTime.value) {\n        refs.publicDrawTime.value = isoToLocalInput(publicDraw?.round_time || new Date(Date.now() + 10 * 60_000));\n      } else if (publicDraw && document.activeElement !== refs.publicDrawTime) {\n        refs.publicDrawTime.value = isoToLocalInput(publicDraw.round_time);\n      }\n      refs.publicDrawTime.disabled = state.settlementBusy || committed;\n      refs.setPublicDrawTime.disabled = state.settlementBusy || committed;\n      refs.savePublicDraw.disabled = state.settlementBusy || committed;\n      refs.savePublicDraw.textContent = state.settlementBusy ? 'Saving\u2026' : publicDraw ? 'Save revised event draft' : 'Save event draft';\n      refs.publicDrawMetrics.innerHTML = publicDraw ? `\n        <div><span>Status</span><strong>${escapeHtml(publicDraw.status.replaceAll('_', ' '))}</strong><small>${committed ? 'Immutable commitment' : 'Not public yet'}</small></div>\n        <div><span>Reveal</span><strong>${escapeHtml(formatJst(publicDraw.round_time))}</strong><small>${escapeHtml(Intl.DateTimeFormat().resolvedOptions().timeZone || 'Local time zone')}</small></div>\n        <div><span>drand round</span><strong>${money.format(publicDraw.drand_round)}</strong><small>Quicknet \u00B7 3 seconds</small></div>\n        <div><span>Draw slots</span><strong>${publicDraw.draw_slots}</strong><small>From locked settlement</small></div>\n        <div><span>Candidates</span><strong>${setup.qualified_count}</strong><small>Anonymous manifest</small></div>\n        <div><span>Receipt</span><strong>${finalized ? 'Verified' : 'Pending'}</strong><small>${finalized ? `${publicDraw.winners?.length || 0} selected` : 'No result yet'}</small></div>`\n        : `<div><span>Manifest</span><strong>Locked</strong><small>${setup.qualified_count} anonymous candidates</small></div><div><span>Next step</span><strong>Set reveal</strong><small>No randomness is requested while drafting</small></div>`;\n      const publicRoomUrl = new URL(config.public_draw_url || '/pages/kob-ownership-public-draw', location.origin);\n      publicRoomUrl.searchParams.set('campaign_id', config.campaign_id);\n      refs.publicDrawRoom.hidden = !committed;\n      refs.publicDrawUrl.textContent = committed ? publicRoomUrl.toString() : '\u2014';\n      refs.openPublicDraw.href = committed ? publicRoomUrl.toString() : '#';\n      refs.openPublicDraw.setAttribute('aria-disabled', String(!committed));\n      refs.publicDrawCommitPanel.hidden = !publicDraw || finalized;\n      refs.publicDrawHash.textContent = publicDraw?.commitment_hash || '\u2014';\n      refs.publicDrawCommitConfirm.disabled = state.settlementBusy || committed;\n      if (committed) refs.publicDrawCommitConfirm.checked = true;\n      refs.commitPublicDraw.disabled = state.settlementBusy || committed || !refs.publicDrawCommitConfirm.checked;\n      refs.commitPublicDraw.textContent = state.settlementBusy ? 'Committing\u2026' : committed ? 'Future round committed' : 'Commit future round';\n      refs.publicDrawFinalizePanel.hidden = !committed;\n      refs.publicDrawReceipt.textContent = finalized ? publicDraw.receipt_hash : `Round ${publicDraw?.drand_round || '\u2014'} \u00B7 ${formatJst(publicDraw?.round_time)}`;\n      refs.publicDrawFinalizeConfirm.disabled = state.settlementBusy || finalized;\n      if (finalized) refs.publicDrawFinalizeConfirm.checked = true;\n      const roundReached = committed && Date.now() >= Date.parse(publicDraw?.round_time || '');\n      refs.finalizePublicDraw.disabled = state.settlementBusy || finalized || !roundReached || !refs.publicDrawFinalizeConfirm.checked;\n      refs.finalizePublicDraw.textContent = state.settlementBusy ? 'Verifying\u2026' : finalized ? 'Verified receipt finalized'\n        : roundReached ? 'Retry same round now' : 'Automatic verification armed';\n    }\n    refs.settlementMessage.textContent = state.settlementMessage || (locked\n      ? publicDraw?.status === 'result_finalized'\n        ? 'The drand beacon and deterministic result receipt are finalized. No Points, inventory or orders were changed.'\n        : publicDraw?.status === 'committed'\n          ? 'The future drand round is committed and immutable. At reveal time, the Worker will verify that exact round and record the result automatically; the manual control is fallback only.'\n          : 'The candidate manifest is immutable. Set a future reveal time, review its exact Quicknet round, then commit it before randomness exists.'\n      : setup\n        ? 'Inspect every candidate and the manifest hash before locking. Locking does not select a winner.'\n        : 'Enter the Points requirement to calculate the exact qualified list.');\n  }\n\n  function setPublicDrawTimeFromNow() {\n    const draw = state.settlementData?.public_draw;\n    if (state.settlementBusy || ['committed', 'result_finalized'].includes(draw?.status)) return;\n    refs.publicDrawTime.value = isoToLocalInput(new Date(Date.now() + 10 * 60_000));\n    state.settlementMessage = 'Reveal time set to ten minutes from now. Save the draft to calculate the exact Quicknet round.';\n    renderSettlement();\n  }\n\n  function previewCollectorLabel(member) {\n    const collector = collectors.find((row) => row.collectorId === member.collector_id);\n    const number = collector?.id || 'Collector';\n    const tier = member.tier_index === null\n      ? 'No tier'\n      : state.savedPlan?.candidate?.tiers?.[Number(member.tier_index)]?.name || `Tier ${Number(member.tier_index) + 1}`;\n    const outcome = member.outcome === 'guaranteed' ? 'Guaranteed'\n      : member.outcome === 'draw_pool' ? 'Draw pool' : 'Not in purchase or draw list';\n    return `${number} \u00B7 ${tier} \u00B7 ${outcome}`;\n  }\n\n  function renderOwnerPreview() {\n    if (!refs.ownerPreview) return;\n    const available = Boolean(state.choiceWindow && state.savedPlan?.status === 'locked');\n    refs.ownerPreview.hidden = !available;\n    if (!available) return;\n    const members = (state.savedPlan.members || []).filter((member) => ['guaranteed', 'draw_pool', 'excluded'].includes(member.outcome));\n    const selected = refs.previewCollector.value;\n    refs.previewCollector.innerHTML = members.map((member) => `<option value=\"${escapeHtml(member.collector_id)}\">${escapeHtml(previewCollectorLabel(member))}</option>`).join('');\n    if (members.some((member) => member.collector_id === selected)) refs.previewCollector.value = selected;\n    refs.previewCollector.disabled = state.previewBusy || !members.length;\n    refs.previewLocale.disabled = state.previewBusy || !members.length;\n    refs.previewResult.disabled = state.previewBusy || !members.length || typeof config.allocationApi !== 'function';\n    refs.previewNudge.disabled = state.previewBusy;\n    refs.previewResult.textContent = state.previewBusy ? 'Loading actual data\u2026' : 'Preview actual result';\n    refs.previewMessage.textContent = state.previewMessage || (members.length\n      ? 'The popup preview is visual only. No Collector response, Points, inventory, order, email or reminder state will be changed.'\n      : 'No eligible Collector result is available in the locked plan.');\n  }\n\n  function closeNudgePreview() {\n    if (!activeNudgePreview) return;\n    activeNudgePreview.remove();\n    activeNudgePreview = null;\n    if (document.querySelector('[data-kob-choice-nudge]')?.hidden !== false) {\n      document.documentElement.classList.remove('kob-choice-nudge-open');\n    }\n    const returnFocus = nudgePreviewReturnFocus;\n    nudgePreviewReturnFocus = null;\n    returnFocus?.focus({ preventScroll: true });\n  }\n\n  function buildNudgePreview() {\n    const source = document.querySelector('[data-kob-choice-nudge]');\n    if (source) return source.cloneNode(true);\n    const node = document.createElement('div');\n    node.className = 'kob-choice-nudge';\n    node.innerHTML = `\n      <div class=\"kob-choice-nudge__backdrop\" data-kob-choice-nudge-close></div>\n      <section class=\"kob-choice-nudge__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"KoBOwnerChoiceNudgePreviewTitle\">\n        <button class=\"kob-choice-nudge__close\" type=\"button\" data-kob-choice-nudge-close>\u00D7</button>\n        <p class=\"kob-choice-nudge__eyebrow\">KoB Bespoke Release</p>\n        <h2 id=\"KoBOwnerChoiceNudgePreviewTitle\"></h2>\n        <p></p>\n        <div class=\"kob-choice-nudge__actions\">\n          <a href=\"#\" class=\"kob-choice-nudge__primary\"></a>\n          <button type=\"button\" class=\"kob-choice-nudge__secondary\" data-kob-choice-nudge-close></button>\n        </div>\n      </section>`;\n    return node;\n  }\n\n  function openNudgePreview(copy, returnFocus = refs.previewNudge) {\n    closeNudgePreview();\n    const preview = buildNudgePreview();\n    const dialog = preview.querySelector('[role=\"dialog\"]');\n    const title = preview.querySelector('h2');\n    const body = preview.querySelector('.kob-choice-nudge__dialog > p:not(.kob-choice-nudge__eyebrow)');\n    const primary = preview.querySelector('.kob-choice-nudge__primary');\n    const secondary = preview.querySelector('.kob-choice-nudge__secondary');\n    const closeButton = preview.querySelector('.kob-choice-nudge__close');\n    preview.removeAttribute('data-kob-choice-nudge');\n    preview.setAttribute('data-oap-nudge-preview', '');\n    preview.removeAttribute('data-storage-key');\n    preview.lang = copy.lang;\n    const eyebrow = preview.querySelector('.kob-choice-nudge__eyebrow');\n    if (eyebrow) eyebrow.textContent = String(copy.lang || '').startsWith('zh') ? 'KoB\u7279\u522B\u4F5C\u54C1' : copy.lang === 'ja' ? 'KoB\u9650\u5B9A\u30E2\u30C7\u30EB' : 'KoB Bespoke Release';\n    preview.hidden = false;\n    if (dialog) dialog.setAttribute('aria-labelledby', 'KoBOwnerChoiceNudgePreviewTitle');\n    if (title) { title.id = 'KoBOwnerChoiceNudgePreviewTitle'; title.textContent = copy.title; }\n    if (body) body.textContent = copy.body;\n    if (primary) { primary.textContent = copy.cta; primary.setAttribute('href', '#'); }\n    if (secondary) secondary.textContent = copy.later;\n    if (closeButton) closeButton.setAttribute('aria-label', copy.close);\n    nudgePreviewReturnFocus = returnFocus;\n    activeNudgePreview = preview;\n    document.body.appendChild(preview);\n    document.documentElement.classList.add('kob-choice-nudge-open');\n    preview.querySelectorAll('[data-kob-choice-nudge-close]').forEach((node) => node.addEventListener('click', closeNudgePreview));\n    primary?.addEventListener('click', (event) => event.preventDefault());\n    primary?.focus({ preventScroll: true });\n  }\n\n  function previewHomepageNudge() {\n    openNudgePreview(nudgeCopy[refs.previewLocale?.value] || nudgeCopy.en, refs.previewNudge);\n  }\n\n  function selectedHomepageReminder() {\n    const type = refs.homepageReminderType?.value || 'payment_information';\n    const locale = refs.homepageReminderLocale?.value || 'en';\n    return { type, locale, reminder: homepageNudgePolicy.reminders[type],\n      copy: homepageNudgePolicy.reminders[type]?.copy?.[locale] };\n  }\n\n  function captureHomepageReminderFields() {\n    if (!refs.homepageReminderEnabled) return;\n    const current = selectedHomepageReminder();\n    if (!current.reminder || !current.copy) return;\n    current.reminder.enabled = Boolean(refs.homepageReminderEnabled?.checked);\n    current.copy.title = refs.homepageReminderTitle?.value.trim() || current.copy.title;\n    current.copy.body = refs.homepageReminderBody?.value.trim() || current.copy.body;\n    current.copy.cta = refs.homepageReminderCta?.value.trim() || current.copy.cta;\n    current.copy.later = refs.homepageReminderLater?.value.trim() || current.copy.later;\n  }\n\n  function renderHomepageReminderFields() {\n    if (!refs.homepageReminderEnabled) return;\n    const current = selectedHomepageReminder();\n    if (!current.reminder || !current.copy) return;\n    refs.homepageReminderEnabled.checked = current.reminder.enabled !== false;\n    refs.homepageReminderTitle.value = current.copy.title || '';\n    refs.homepageReminderBody.value = current.copy.body || '';\n    refs.homepageReminderCta.value = current.copy.cta || '';\n    refs.homepageReminderLater.value = current.copy.later || '';\n  }\n\n  function previewConfiguredHomepageReminder() {\n    if (!refs.homepageReminderPreview) return;\n    captureHomepageReminderFields();\n    const { locale, copy } = selectedHomepageReminder();\n    openNudgePreview({ ...copy, lang: locale }, refs.homepageReminderPreview);\n  }\n\n  async function saveHomepageReminderPolicy() {\n    if (!refs.homepageReminderSave || typeof config.allocationApi !== 'function') return;\n    captureHomepageReminderFields();\n    refs.homepageReminderSave.disabled = true;\n    refs.homepageReminderMessage.textContent = 'Saving the reviewed reminder settings\u2026';\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/homepage-nudge-policy`, {\n        method: 'POST', body: JSON.stringify({\n          request_id: `ORV_HOMEPAGE_NUDGE_SAVE:${crypto.randomUUID()}`,\n          expected_revision: Number(homepageNudgePolicy.revision || 0),\n          policy: { version: homepageNudgePolicy.version, reminders: homepageNudgePolicy.reminders },\n        }),\n      });\n      homepageNudgePolicy = response.homepage_nudge_policy;\n      refs.homepageReminderMessage.textContent = `Revision ${homepageNudgePolicy.revision} saved. This changes reminder copy and switches only; it does not contact a Collector.`;\n    } catch (error) {\n      refs.homepageReminderMessage.textContent = error.code === 'ownership_homepage_nudge_revision_changed'\n        ? 'The reminder settings changed in another session. Reload before saving again.'\n        : 'Reminder settings could not be saved. No storefront reminder was changed.';\n    } finally {\n      refs.homepageReminderSave.disabled = false;\n      renderHomepageReminderFields();\n    }\n  }\n\n  async function previewActualResult() {\n    if (state.previewBusy || !state.choiceWindow || typeof config.allocationApi !== 'function') return;\n    const collectorId = refs.previewCollector.value;\n    if (!collectorId) return;\n    state.previewBusy = true;\n    state.previewMessage = '';\n    renderOwnerPreview();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-choice-preview`, {\n        method: 'POST',\n        body: JSON.stringify({ collector_id: collectorId }),\n      });\n      sessionStorage.setItem('kob-owner-allocation-choice-preview-v1', JSON.stringify({\n        version: 1,\n        campaignId: config.campaign_id,\n        createdAt: Date.now(),\n        returnTo: `${location.pathname}${location.search}`,\n        payload: response,\n      }));\n      const locale = refs.previewLocale.value;\n      const prefix = locale === 'zh-CN' ? '/zh' : locale === 'ja' ? '/ja' : '';\n      const target = new URL(`${prefix}/pages/kob-release-result`, location.origin);\n      target.searchParams.set('campaign_id', config.campaign_id);\n      target.searchParams.set('owner_preview', '1');\n      location.assign(target.toString());\n    } catch (error) {\n      state.previewMessage = error.code === 'allocation_choice_points_unavailable'\n        ? 'Current Shopify Points could not be read. Try this collector again shortly.'\n        : 'The protected preview could not be opened. Reload the planning page and try again.';\n      state.previewBusy = false;\n      renderOwnerPreview();\n    }\n  }\n\n  async function loadChoiceWindow() {\n    if (typeof config.allocationApi !== 'function') {\n      state.choiceLoaded = true;\n      renderChoiceWindow();\n      return;\n    }\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-choice-window`);\n      state.choiceWindow = response.window || null;\n    } catch (_) {\n      state.choiceMessage = 'The choice-window state could not be loaded. Reload before preparing it.';\n    } finally {\n      state.choiceLoaded = true;\n      renderChoiceWindow();\n    }\n  }\n\n  async function prepareChoiceWindow() {\n    if (state.choiceBusy || state.choiceWindow || state.savedPlan?.status !== 'locked' || typeof config.allocationApi !== 'function') return;\n    let opensAt;\n    let closesAt;\n    try {\n      opensAt = jstInputToIso(refs.choiceOpens.value);\n      closesAt = jstInputToIso(refs.choiceCloses.value);\n      const duration = Date.parse(closesAt) - Date.parse(opensAt);\n      if (duration < 3 * 86400000 || duration > 7 * 86400000) throw new Error('choice_window_duration_invalid');\n    } catch (_) {\n      state.choiceMessage = 'Choose a window between three and seven full days.';\n      renderChoiceWindow();\n      return;\n    }\n    state.choiceBusy = true;\n    state.choiceMessage = '';\n    state.pendingChoiceRequestId ||= `OAP_CHOICE_PREPARE:${crypto.randomUUID()}`;\n    renderChoiceWindow();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-choice-window`, {\n        method: 'POST',\n        body: JSON.stringify({\n          request_id: state.pendingChoiceRequestId,\n          opens_at: opensAt,\n          closes_at: closesAt,\n          result_page_handle: 'kob-release-result',\n          next_release_hint: { maker: 'Make Up', brand: 'Lamborghini' },\n        }),\n      });\n      state.choiceWindow = response.window;\n      state.pendingChoiceRequestId = null;\n      state.choiceMessage = `${formatJst(response.window.opens_at)} \u2192 ${formatJst(response.window.closes_at)} \u00B7 read-only window prepared. No email was sent.`;\n    } catch (error) {\n      state.choiceMessage = error.code === 'allocation_choice_window_already_prepared'\n        ? 'A window already exists. Reload to show the authoritative record.'\n        : 'The window was not prepared. The same request can be retried safely.';\n    } finally {\n      state.choiceBusy = false;\n      renderChoiceWindow();\n    }\n  }\n\n  async function loadSettlement() {\n    if (typeof config.allocationApi !== 'function') {\n      state.settlementLoaded = true;\n      renderSettlement();\n      return;\n    }\n    state.settlementBusy = true;\n    renderSettlement();\n    try {\n      state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-public-draw`);\n      state.settlementMessage = '';\n    } catch (_) {\n      state.settlementMessage = 'Choice status could not be loaded. Refresh this protected workbench before settlement.';\n    } finally {\n      state.settlementBusy = false;\n      state.settlementLoaded = true;\n      renderSettlement();\n    }\n  }\n\n  async function loadRehearsal() {\n    if (typeof config.allocationApi !== 'function') return;\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-draw-rehearsal`);\n      state.rehearsal = response.rehearsal || null;\n    } catch (_) {\n      state.rehearsalMessage = 'The latest rehearsal record could not be loaded. Formal allocation data is unaffected.';\n    }\n    renderRehearsal();\n  }\n\n  async function createRehearsal() {\n    if (state.rehearsalBusy || !refs.rehearsalConfirm.checked || typeof config.allocationApi !== 'function') return;\n    let scheduledAt;\n    try { scheduledAt = localInputToIso(refs.rehearsalTime.value); } catch (_) {\n      state.rehearsalMessage = 'Choose a valid future rehearsal time.';\n      renderRehearsal();\n      return;\n    }\n    const previewWindow = window.open('about:blank', '_blank');\n    if (previewWindow) previewWindow.opener = null;\n    state.rehearsalBusy = true;\n    state.rehearsalMessage = '';\n    state.pendingRehearsalRequestId ||= `OAP_DRAW_REHEARSAL:${crypto.randomUUID()}`;\n    renderRehearsal();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-draw-rehearsal`, {\n        method: 'POST',\n        body: JSON.stringify({\n          request_id: state.pendingRehearsalRequestId,\n          scheduled_at: scheduledAt,\n          viewer_email: refs.rehearsalEmail.value,\n          viewer_page_url: `${location.origin}/pages/kob-ownership-draw-rehearsal`,\n          confirm_rehearsal: true,\n        }),\n      });\n      state.rehearsal = response.rehearsal;\n      state.rehearsalViewerUrl = response.viewer_url || '';\n      state.pendingRehearsalRequestId = null;\n      refs.rehearsalConfirm.checked = false;\n      state.rehearsalMessage = 'Rehearsal committed from the current saved choices. The formal settlement and Candidate A were not changed.';\n      if (previewWindow && response.viewer_url) previewWindow.location.replace(response.viewer_url);\n      else previewWindow?.close();\n    } catch (error) {\n      previewWindow?.close();\n      state.rehearsalMessage = error.code === 'ownership_draw_rehearsal_writes_disabled'\n        ? 'Rehearsal writes are still fail-closed.'\n        : error.code === 'ownership_draw_rehearsal_time_too_soon'\n          ? 'Choose a reveal time at least two minutes in the future.'\n          : error.code === 'ownership_draw_rehearsal_viewer_not_found'\n            ? 'The test viewer email was not found in Shopify Customers.'\n            : 'The rehearsal was not created. No formal allocation record changed.';\n    } finally {\n      state.rehearsalBusy = false;\n      renderRehearsal();\n    }\n  }\n\n  function localFreezeSettlement() {\n    const status = state.settlementData.choice_status;\n    const rows = (status.rows || []).map((row, index) => ({\n      ...row,\n      audit_code: `KOB-DEMO-${String(index + 1).padStart(4, '0')}`,\n    }));\n    return {\n      settlement_id: 'LOCAL-DEMO-SETTLEMENT',\n      snapshot_hash: 'd'.repeat(64),\n      frozen_at: new Date().toISOString(),\n      eligible_count: status.eligible_count,\n      accepted_guaranteed: status.counts.accept_guaranteed,\n      returned_guaranteed: status.returned_guaranteed,\n      draw_slots: status.expected_draw_slots,\n      draw_entrant_count: status.expected_draw_entrants,\n      no_response_count: status.counts.no_response,\n      rows,\n    };\n  }\n\n  async function freezeSettlement() {\n    const status = state.settlementData?.choice_status;\n    if (state.settlementBusy || !status?.deadline_passed || state.settlementData?.settlement || !refs.freezeConfirm.checked) return;\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingFreezeRequestId ||= `OAP_CHOICE_FREEZE:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-choice-settlement/freeze`, {\n          method: 'POST',\n          body: JSON.stringify({\n            request_id: state.pendingFreezeRequestId,\n            expected_revision: state.choiceWindow?.revision || 0,\n            confirm_freeze: true,\n          }),\n        });\n      } else {\n        state.settlementData = {\n          ...state.settlementData,\n          choice_status: { ...status, window_status: 'closed', accepts_responses: false },\n          settlement: localFreezeSettlement(),\n        };\n      }\n      state.pendingFreezeRequestId = null;\n      if (state.choiceWindow) state.choiceWindow = { ...state.choiceWindow, status: 'closed', revision: Number(state.choiceWindow.revision || 0) + 1 };\n      state.settlementMessage = 'Choice settlement frozen. Review the returned slots before setting the draw Points requirement.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'allocation_choice_deadline_not_reached'\n        ? 'The fixed response deadline has not passed. Settlement remains unavailable.'\n        : error.code === 'ownership_allocation_settlement_writes_disabled'\n          ? 'Settlement writes are not enabled yet. The live status remains read-only.'\n          : 'The settlement was not frozen. Refresh the authoritative status before trying again.';\n    } finally {\n      state.settlementBusy = false;\n      renderChoiceWindow();\n      renderSettlement();\n    }\n  }\n\n  function localDrawSetup(pointsCost) {\n    const settlement = state.settlementData.settlement;\n    const members = settlement.rows.filter((row) => row.effective_decision === 'enter_draw').map((row) => ({\n      collector_id: row.collector_id,\n      audit_code: row.audit_code,\n      original_outcome: row.original_outcome,\n      eligible_points: row.eligible_points,\n      eligibility_status: row.eligible_points >= pointsCost ? 'qualified' : 'points_insufficient',\n      identity: row.identity,\n    }));\n    const qualified = members.filter((row) => row.eligibility_status === 'qualified').length;\n    return {\n      draw_setup_id: `LOCAL-DRAW-${Date.now()}`,\n      revision: Number(state.settlementData.draw_setup?.revision || 0) + 1,\n      status: 'reviewed_draft',\n      points_cost: pointsCost,\n      draw_slots: settlement.draw_slots,\n      entrant_count: members.length,\n      qualified_count: qualified,\n      insufficient_count: members.length - qualified,\n      unfilled_slots: Math.max(0, settlement.draw_slots - qualified),\n      source_hash: settlement.snapshot_hash,\n      manifest_hash: String(pointsCost).padStart(8, '0') + 'c'.repeat(56),\n      members,\n    };\n  }\n\n  async function saveDrawSetup() {\n    const settlement = state.settlementData?.settlement;\n    if (state.settlementBusy || !settlement || state.settlementData?.draw_setup?.status === 'locked') return;\n    const pointsCost = Math.max(0, Math.trunc(Number(refs.drawPoints.value) || 0));\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingDrawSaveRequestId ||= `OAP_DRAW_SAVE:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-draw-setup`, {\n          method: 'POST', body: JSON.stringify({ request_id: state.pendingDrawSaveRequestId, points_cost: pointsCost }),\n        });\n      } else {\n        state.settlementData = { ...state.settlementData, draw_setup: localDrawSetup(pointsCost) };\n      }\n      state.pendingDrawSaveRequestId = null;\n      refs.drawLockConfirm.checked = false;\n      state.settlementMessage = 'Draw setup saved. Check the exact qualified and insufficient lists before locking.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'ownership_allocation_settlement_writes_disabled'\n        ? 'Draw setup writes are not enabled yet.'\n        : 'The draw setup was not saved. The same request can be retried safely.';\n    } finally {\n      state.settlementBusy = false;\n      renderSettlement();\n    }\n  }\n\n  async function lockDrawSetup() {\n    const setup = state.settlementData?.draw_setup;\n    if (state.settlementBusy || !setup || setup.status !== 'reviewed_draft' || !refs.drawLockConfirm.checked) return;\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingDrawLockRequestId ||= `OAP_DRAW_LOCK:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-draw-setup/lock`, {\n          method: 'POST',\n          body: JSON.stringify({ request_id: state.pendingDrawLockRequestId, expected_revision: setup.revision, confirm_lock: true }),\n        });\n      } else {\n        state.settlementData = { ...state.settlementData, draw_setup: { ...setup, status: 'locked', locked_at: new Date().toISOString() } };\n      }\n      state.pendingDrawLockRequestId = null;\n      state.settlementMessage = 'Candidate manifest locked. No winner has been selected.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'ownership_allocation_settlement_writes_disabled'\n        ? 'Draw setup writes are not enabled yet.'\n        : 'The candidate manifest was not locked. Refresh the authoritative setup before retrying.';\n    } finally {\n      state.settlementBusy = false;\n      renderSettlement();\n    }\n  }\n\n  const clientSha256 = async (value) => {\n    const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(String(value)));\n    return [...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, '0')).join('');\n  };\n\n  async function localPublicDrawDraft(scheduledAt) {\n    const setup = state.settlementData.draw_setup;\n    const roundTime = new Date(Math.ceil(new Date(scheduledAt).getTime() / 3000) * 3000).toISOString();\n    const commitmentHash = await clientSha256(JSON.stringify({\n      version: 1, campaign_id: config.campaign_id, manifest_hash: setup.manifest_hash,\n      draw_slots: setup.draw_slots, round_time: roundTime,\n    }));\n    return {\n      public_draw_id: 'LOCAL-PUBLIC-DRAW', status: 'reviewed_draft',\n      algorithm: 'kob-drand-sha256-fisher-yates-v1', network: 'quicknet',\n      chain_hash: '52db9ba70e0cc0f6eaf7803dd07447a1f5477735fd3f661792ba94600c84e971',\n      scheduled_at: roundTime, drand_round: Math.floor((new Date(roundTime).getTime() - 1692803367000) / 3000) + 1,\n      round_time: roundTime, draw_slots: setup.draw_slots, manifest_hash: setup.manifest_hash,\n      commitment_hash: commitmentHash, committed_at: null, receipt_hash: null, finalized_at: null,\n      receipt: null, winners: [],\n    };\n  }\n\n  async function savePublicDrawDraft() {\n    const setup = state.settlementData?.draw_setup;\n    if (state.settlementBusy || setup?.status !== 'locked' || ['committed', 'result_finalized'].includes(state.settlementData?.public_draw?.status)) return;\n    let scheduledAt;\n    try { scheduledAt = localInputToIso(refs.publicDrawTime.value); } catch (_) {\n      state.settlementMessage = 'Choose a valid future reveal time before saving the event draft.';\n      renderSettlement();\n      return;\n    }\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingPublicDrawSaveRequestId ||= `OAP_PUBLIC_DRAW_SAVE:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-public-draw`, {\n          method: 'POST', body: JSON.stringify({ request_id: state.pendingPublicDrawSaveRequestId, scheduled_at: scheduledAt }),\n        });\n      } else {\n        state.settlementData = { ...state.settlementData, public_draw: await localPublicDrawDraft(scheduledAt) };\n      }\n      state.pendingPublicDrawSaveRequestId = null;\n      refs.publicDrawCommitConfirm.checked = false;\n      state.settlementMessage = 'Event draft saved. Check the exact reveal time, Quicknet round and commitment hash before publishing the commitment.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'ownership_allocation_public_draw_writes_disabled'\n        ? 'Public draw writes are still fail-closed. The event remains a reviewed local design.'\n        : error.code === 'ownership_public_draw_time_too_soon'\n          ? 'Choose a reveal time at least one minute in the future.'\n          : 'The public draw draft was not saved. Refresh the authoritative state before retrying.';\n    } finally {\n      state.settlementBusy = false;\n      renderSettlement();\n    }\n  }\n\n  async function commitPublicDrawEvent() {\n    const draw = state.settlementData?.public_draw;\n    if (state.settlementBusy || draw?.status !== 'reviewed_draft' || !refs.publicDrawCommitConfirm.checked) return;\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingPublicDrawCommitRequestId ||= `OAP_PUBLIC_DRAW_COMMIT:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-public-draw/commit`, {\n          method: 'POST', body: JSON.stringify({\n            request_id: state.pendingPublicDrawCommitRequestId,\n            expected_commitment_hash: draw.commitment_hash,\n            confirm_commit: true,\n          }),\n        });\n      } else {\n        state.settlementData = { ...state.settlementData, public_draw: { ...draw, status: 'committed', committed_at: new Date().toISOString() } };\n      }\n      state.pendingPublicDrawCommitRequestId = null;\n      state.settlementMessage = 'Future Quicknet round committed. The manifest, slots, algorithm and reveal round can no longer change.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'ownership_allocation_public_draw_writes_disabled'\n        ? 'Public draw commitment writes are still fail-closed.'\n        : error.code === 'ownership_public_draw_commitment_too_late'\n          ? 'This reveal time is too close. Save a later event draft, then commit it.'\n          : 'The future round was not committed. Refresh before retrying.';\n    } finally {\n      state.settlementBusy = false;\n      renderSettlement();\n    }\n  }\n\n  async function finalizePublicDrawEvent() {\n    const draw = state.settlementData?.public_draw;\n    if (state.settlementBusy || draw?.status !== 'committed' || Date.now() < Date.parse(draw.round_time) || !refs.publicDrawFinalizeConfirm.checked) return;\n    state.settlementBusy = true;\n    state.settlementMessage = '';\n    state.pendingPublicDrawFinalizeRequestId ||= `OAP_PUBLIC_DRAW_FINALIZE:${crypto.randomUUID()}`;\n    renderSettlement();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        state.settlementData = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-public-draw/finalize`, {\n          method: 'POST', body: JSON.stringify({ request_id: state.pendingPublicDrawFinalizeRequestId, confirm_finalize: true }),\n        });\n      } else {\n        const codes = (state.settlementData.draw_setup?.members || []).filter((row) => row.eligibility_status === 'qualified').map((row) => row.audit_code);\n        const winners = codes.slice(0, Math.min(draw.draw_slots, codes.length)).map((audit_code, index) => ({ rank: index + 1, audit_code }));\n        state.settlementData = { ...state.settlementData, public_draw: {\n          ...draw, status: 'result_finalized', finalized_at: new Date().toISOString(),\n          receipt_hash: await clientSha256(`${draw.commitment_hash}:${codes.join(',')}`), winners,\n        } };\n      }\n      state.pendingPublicDrawFinalizeRequestId = null;\n      state.settlementMessage = 'The committed drand beacon was verified and the reproducible result receipt was finalized. No Points or inventory changed.';\n    } catch (error) {\n      state.settlementMessage = error.code === 'ownership_allocation_public_draw_writes_disabled'\n        ? 'Public draw result writes are still fail-closed.'\n        : error.code === 'ownership_public_draw_round_not_reached'\n          ? 'The committed Quicknet round has not arrived yet.'\n          : 'The committed beacon could not be verified. No result was recorded; retry the same exact round.';\n    } finally {\n      state.settlementBusy = false;\n      renderSettlement();\n    }\n  }\n\n  async function saveReviewedDraft() {\n    const result = simulate(activeScenario());\n    if (!result.valid || result.overflow > 0 || state.planBusy) return;\n    state.planBusy = true;\n    state.planMessage = '';\n    renderApproval(result);\n    state.pendingSaveRequestId ||= `OAP_SAVE:${crypto.randomUUID()}`;\n    const payload = {\n      request_id: state.pendingSaveRequestId,\n      edition_total: editionTotal,\n      player_capacity: state.playerCapacity,\n      eligibility_mode: eligibilityMode,\n      eligibility_points_floor: eligibilityPointsFloor,\n      candidate: normalizedCandidate(result.scenario),\n    };\n    try {\n      if (typeof config.allocationApi === 'function') {\n        const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-planning/draft`, {\n          method: 'POST', body: JSON.stringify(payload),\n        });\n        state.savedPlan = response.plan;\n      } else {\n        state.savedPlan = localPlanFromResult(result);\n      }\n      state.pendingSaveRequestId = null;\n      state.planMessage = 'Reviewed Draft saved. Verify every tier and collector group below before locking.';\n    } catch (error) {\n      state.planMessage = error.code === 'allocation_plan_invalid'\n        ? 'The server rejected this candidate. Review the blocking rule above and save again.'\n        : 'Draft was not saved. The same request can be retried safely.';\n    } finally {\n      state.planBusy = false;\n      render();\n    }\n  }\n\n  function openLockDialog() {\n    const plan = state.savedPlan;\n    if (!plan || plan.status !== 'reviewed_draft') return;\n    refs.lockConfirmation.checked = false;\n    refs.confirmLock.disabled = true;\n    refs.lockSummary.innerHTML = `<strong>${escapeHtml(plan.candidate?.name || 'Reviewed plan')}</strong><span>${plan.player_capacity} Collector units \u00B7 ${plan.guaranteed_count} guaranteed \u00B7 ${plan.base_draw_count} base draw \u00B7 ${plan.partner_reserve} partner unit${plan.partner_reserve === 1 ? '' : 's'}</span>`;\n    refs.lockDialog.hidden = false;\n  }\n\n  function closeLockDialog() {\n    if (state.planBusy) return;\n    refs.lockDialog.hidden = true;\n  }\n\n  async function confirmPlanLock() {\n    const plan = state.savedPlan;\n    if (!plan || plan.status !== 'reviewed_draft' || !refs.lockConfirmation.checked || state.planBusy) return;\n    state.planBusy = true;\n    refs.confirmLock.disabled = true;\n    state.pendingLockRequestId ||= `OAP_LOCK:${crypto.randomUUID()}`;\n    try {\n      if (typeof config.allocationApi === 'function') {\n        const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/allocation-planning/lock`, {\n          method: 'POST',\n          body: JSON.stringify({\n            request_id: state.pendingLockRequestId,\n            expected_plan_revision: plan.plan_revision,\n            confirm_lock: true,\n          }),\n        });\n        state.savedPlan = response.plan;\n      } else {\n        state.savedPlan = { ...plan, status: 'locked', locked_at: new Date().toISOString() };\n      }\n      state.pendingLockRequestId = null;\n      state.planMessage = 'Allocation plan locked. No invitation, inventory reservation or KoB Points deduction has been created.';\n      refs.lockDialog.hidden = true;\n    } catch (error) {\n      state.planMessage = error.code === 'allocation_plan_source_changed'\n        ? 'The frozen source changed after this draft was saved. Save and review a fresh draft before locking.'\n        : 'The plan was not locked. The same lock request can be retried safely.';\n    } finally {\n      state.planBusy = false;\n      render();\n    }\n  }\n\n  const numberManifestPayload = () => ({\n    labels: state.numberLabels,\n    locked_labels: [...state.numberLockedLabels],\n    high_interest_labels: [...state.numberHighInterestLabels],\n    special_bid_labels: [...state.numberSpecialBidLabels],\n    manual_assignments: state.numberManualAssignments.filter((row) => row.label && row.collector_id),\n    threshold_bps: 5000,\n  });\n\n  const currentDemoNumberPreview = () => {\n    const baseline = buildDemoNumberAllocation().manifest.preview;\n    const manualByLabel = new Map(state.numberManualAssignments\n      .filter((row) => row.label && row.collector_id)\n      .map((row) => [row.label, row.collector_id]));\n    const specialLabel = [...state.numberSpecialBidLabels][0] || '';\n    const numbers = state.numberLabels.map((label, index) => {\n      const source = baseline.numbers.find((row) => row.label === label) || {\n        N: 0, dominant_n: 0, dominant_share_bps: 0, guarantee_collector_id: null,\n      };\n      const stateName = manualByLabel.has(label) ? 'manual_assigned'\n        : state.numberLockedLabels.has(label) ? 'locked' : 'available';\n      const metadata = {\n        ...(state.numberHighInterestLabels.has(label) ? { high_interest: true } : {}),\n        ...(label === specialLabel ? { allocation_mode: 'special_bid' } : {}),\n      };\n      const guaranteeStatus = stateName !== 'available' ? 'removed_by_overlay'\n        : label === specialLabel ? 'special_bid'\n          : !Number(source.N || 0) ? 'no_history'\n            : Number(source.dominant_share_bps || 0) > 5000 ? 'guaranteed' : 'below_threshold';\n      return {\n        ...source,\n        label,\n        canonical_key: label,\n        display_order: index + 1,\n        state: stateName,\n        assigned_collector_id: manualByLabel.get(label) || null,\n        metadata,\n        guarantee_status: guaranteeStatus,\n        guarantee_collector_id: guaranteeStatus === 'guaranteed' ? source.guarantee_collector_id : null,\n      };\n    });\n    const availableCount = numbers.filter((row) => row.state === 'available').length;\n    const manualAssignedCount = numbers.filter((row) => row.state === 'manual_assigned').length;\n    const requiredCount = Math.max(0, Number(state.numberWorkspace?.entitlement?.count || 0) - manualAssignedCount);\n    const blockers = availableCount === requiredCount ? [] : [{\n      code: 'ownership_number_available_count_mismatch',\n      available_count: availableCount,\n      required_count: requiredCount,\n    }];\n    return {\n      ...baseline,\n      manifest_count: numbers.length,\n      available_count: availableCount,\n      locked_count: numbers.filter((row) => row.state === 'locked').length,\n      manual_assigned_count: manualAssignedCount,\n      special_bid_count: numbers.filter((row) => row.metadata?.allocation_mode === 'special_bid').length,\n      guarantee_count: numbers.filter((row) => row.guarantee_status === 'guaranteed').length,\n      zero_history_count: numbers.filter((row) => Number(row.N || 0) === 0).length,\n      blockers,\n      numbers,\n    };\n  };\n\n  const markNumberEdited = () => {\n    state.numberPreview = null;\n    state.numberMessage = 'Setup changed. Run a fresh Scheme C preview before saving.';\n    state.pendingNumberSaveRequestId = null;\n  };\n\n  const renderNumberChoiceConfig = () => {\n    if (!refs.numberChoiceSummary) return;\n    const specialBidLabel = [...state.numberSpecialBidLabels][0] || '';\n    const hasSpecialBid = Boolean(specialBidLabel);\n    const base = Math.max(0, Number(refs.numberBasePrice?.value || 0));\n    const increment = Math.max(0, Number(refs.numberBidIncrement?.value || 0));\n    const validIncrement = !hasSpecialBid || (increment >= 1000 && increment % 1000 === 0);\n    const opensAt = jstInputToIso(refs.numberChoiceOpens?.value);\n    const closesAt = jstInputToIso(refs.numberChoiceCloses?.value);\n    const validWindow = Boolean(opensAt) && Boolean(closesAt) && Date.parse(closesAt) > Date.parse(opensAt);\n    const storedWindow = state.numberChoiceWindow;\n    const scheduleChanged = Boolean(storedWindow) && (opensAt !== storedWindow.opens_at || closesAt !== storedWindow.closes_at);\n    refs.numberChoiceSummary.innerHTML = [\n      ['Special allocation', hasSpecialBid ? `#${specialBidLabel} \u00B7 sealed bid` : 'None \u00B7 ordinary allocation only'],\n      ['Minimum step', !hasSpecialBid ? 'Not used' : validIncrement ? `\u00A5${increment.toLocaleString('ja-JP')}` : 'Invalid'],\n      ['Collector email reference', hasSpecialBid ? 'Added automatically \u00B7 display only' : 'Not used'],\n      ['Payment conversion', 'Calculated later when preparing payment'],\n      ['Window \u00B7 JST', validWindow ? `${formatJst(opensAt)} \u2192 ${formatJst(closesAt)}` : 'Dates required'],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    refs.numberBidFields.forEach((field) => {\n      field.classList.toggle('is-disabled', !hasSpecialBid);\n      const control = field.querySelector('input, button');\n      if (control) control.disabled = !hasSpecialBid || Boolean(storedWindow) || state.numberChoiceBusy;\n    });\n    const ready = base > 0 && validIncrement && validWindow;\n    refs.numberChoiceMessage.textContent = base <= 0 ? 'Add the fixed product price in JPY.'\n      : !validIncrement ? 'Bid increment must be a positive \u00A51,000 multiple.'\n        : !validWindow ? 'Add a valid opening and closing time.'\n          : storedWindow && storedWindow.status !== 'draft'\n            ? `Choice window is ${storedWindow.status}. Its schedule can no longer be amended.`\n          : storedWindow && !scheduleChanged\n            ? `Draft v${storedWindow.revision || 1} is stored as ${formatJst(storedWindow.opens_at)} \u2192 ${formatJst(storedWindow.closes_at)}.`\n          : state.numberChoicePreview\n            ? `${storedWindow ? 'JST schedule correction' : 'Choice-window'} preview passed: base \u00A5${base.toLocaleString('ja-JP')}; ${hasSpecialBid ? `#${specialBidLabel} uses a sealed JPY bid.` : 'no special bid is configured.'}`\n            : `Configuration is internally consistent in JST: base \u00A5${base.toLocaleString('ja-JP')}; ${hasSpecialBid ? `#${specialBidLabel} is the only special-bid label.` : 'all offered labels use ordinary allocation.'}`;\n    const manifestLocked = state.numberWorkspace?.manifest?.status === 'locked';\n    const draftEditable = !storedWindow || storedWindow.status === 'draft';\n    refs.numberBasePrice.disabled = Boolean(storedWindow) || state.numberChoiceBusy;\n    refs.numberChoicePreviewButton.disabled = state.numberChoiceBusy || !ready || !manifestLocked || !draftEditable\n      || (Boolean(storedWindow) && !scheduleChanged);\n    refs.numberChoiceSave.textContent = storedWindow ? 'Save JST schedule correction' : 'Save choice-window draft';\n    refs.numberChoiceSave.disabled = state.numberChoiceBusy || !ready || !manifestLocked || !draftEditable\n      || !state.numberChoicePreview || typeof config.allocationApi !== 'function'\n      || (Boolean(storedWindow) && !scheduleChanged);\n    if (refs.numberChoiceOpenPanel) refs.numberChoiceOpenPanel.hidden = !storedWindow || storedWindow.status !== 'draft';\n    if (refs.numberChoiceOpen) refs.numberChoiceOpen.disabled = state.numberChoiceBusy || !storedWindow\n      || storedWindow.status !== 'draft' || scheduleChanged || !refs.numberChoiceOpenConfirm?.checked\n      || typeof config.allocationApi !== 'function';\n    renderNumberOwnerPreview();\n  };\n\n  function renderNumberSettlement() {\n    if (!refs.numberSettlementMetrics) return;\n    const workspace = state.numberSettlementWorkspace || {};\n    const choice = workspace.window || state.numberChoiceWindow || null;\n    const commitment = workspace.commitment || null;\n    const settlement = workspace.settlement || null;\n    const responses = Number(choice?.response_count || 0);\n    const entitlements = Number(state.numberWorkspace?.entitlement?.count || 0);\n    const previewAssignments = Array.isArray(state.numberSettlementPreview?.assignments)\n      ? state.numberSettlementPreview.assignments : [];\n    const memberByCollector = new Map((state.numberWorkspace?.entitlement?.members || [])\n      .map((member) => [String(member.collector_id || ''), member]));\n    const manifestOrder = new Map((state.numberWorkspace?.manifest?.items || [])\n      .map((item, index) => [String(item.canonical_key || item.label || ''), Number(item.display_order || index + 1)]));\n    const assignmentCollectorKeys = previewAssignments.map((row) => String(row.collector_id || '')).filter(Boolean);\n    const assignmentNumberKeys = previewAssignments.map((row) => String(row.canonical_number_key || '')).filter(Boolean);\n    const expectedAssignments = Number(state.numberSettlementPreview?.entitlement_count || entitlements || 0);\n    const assignmentListReady = Boolean(state.numberSettlementPreview)\n      && expectedAssignments > 0\n      && Number(state.numberSettlementPreview.assigned_count || 0) === expectedAssignments\n      && previewAssignments.length === expectedAssignments\n      && assignmentCollectorKeys.length === expectedAssignments\n      && assignmentNumberKeys.length === expectedAssignments\n      && new Set(assignmentCollectorKeys).size === expectedAssignments\n      && new Set(assignmentNumberKeys).size === expectedAssignments\n      && assignmentCollectorKeys.every((collectorId) => memberByCollector.has(collectorId));\n    const deadlinePassed = Boolean(choice?.closes_at) && Date.now() >= Date.parse(choice.closes_at);\n    refs.numberSettlementMetrics.innerHTML = [\n      ['Collector responses', choice ? `${responses} / ${entitlements}` : 'Not available'],\n      ['No response', choice ? String(Math.max(0, entitlements - responses)) : '\u2014'],\n      ['Quicknet commitment', commitment ? `Round ${Number(commitment.drand_round).toLocaleString('en-US')} \u00B7 ${formatJst(commitment.round_time)}` : 'Not committed'],\n      ['Commitment workflow', commitment?.commitment_method === 'automatic_at_window_open'\n        ? 'Automatic \u00B7 fixed when window opened'\n        : commitment?.commitment_method === 'owner_approved_schedule_supersession'\n          ? 'Owner-approved audited schedule change'\n          : commitment ? 'Manual recovery \u00B7 legacy window' : 'Pending automatic open transaction'],\n      ['Window status', choice?.status || 'Not prepared'],\n      ['Final allocation', settlement ? `${settlement.assignment_count} assignments \u00B7 frozen` : state.numberSettlementPreview ? `${state.numberSettlementPreview.assigned_count} assignments \u00B7 preview` : 'Not frozen'],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    refs.numberSettlementCommit.disabled = state.numberSettlementBusy || !choice || choice.status !== 'open'\n      || deadlinePassed || Boolean(commitment) || typeof config.allocationApi !== 'function';\n    refs.numberSettlementClose.disabled = state.numberSettlementBusy || !choice || choice.status !== 'open'\n      || !deadlinePassed || !commitment || typeof config.allocationApi !== 'function';\n    refs.numberSettlementPreview.disabled = state.numberSettlementBusy || !choice || choice.status !== 'closed'\n      || !commitment || Date.now() < Date.parse(commitment.round_time) || typeof config.allocationApi !== 'function';\n    if (refs.numberSettlementList && refs.numberSettlementListRows && refs.numberSettlementListStatus) {\n      refs.numberSettlementList.hidden = !state.numberSettlementPreview;\n      const sourceLabel = (source) => ({\n        manual: 'Owner assignment',\n        special_bid: 'Sealed special bid',\n        guarantee: 'Long-term collection number',\n        no_response_guarantee: 'No response \u00B7 long-term collection number',\n        preference_1: 'First preference',\n        preference_2: 'Second preference',\n        preference_3: 'Third preference',\n        no_response_public_random: 'No response \u00B7 public-random remaining number',\n        responded_public_random_fallback: 'Responded \u00B7 public-random remaining number',\n      })[source] || source || 'Unknown';\n      const auditDetail = (row) => {\n        const audit = row.audit || {};\n        if (row.assignment_source === 'special_bid') {\n          const bid = Number(row.special_bid_jpy || audit.bid_jpy || 0);\n          return `+\u00A5${bid.toLocaleString('ja-JP')} \u00B7 ${Number(audit.tied_count || 1)} highest bidder(s)`;\n        }\n        if (String(row.assignment_source || '').startsWith('preference_')) {\n          return `${Number(audit.applicant_count || 1)} applicant(s) \u00B7 winning weight ${Number(audit.winner_weight || 1)}`;\n        }\n        if (row.assignment_source === 'guarantee' || row.assignment_source === 'no_response_guarantee') {\n          return `${Number(audit.candidate_count || 1)} eligible candidate(s)${audit.defaulted ? ' \u00B7 automatic default' : ''}`;\n        }\n        if (row.assignment_source === 'responded_public_random_fallback'\n          || row.assignment_source === 'no_response_public_random') {\n          return `Committed remaining-pool order ${Number(audit.order || 0) || '\u2014'}`;\n        }\n        return 'Reviewed manifest assignment';\n      };\n      const ordered = [...previewAssignments].sort((a, b) => {\n        const aKey = String(a.canonical_number_key || '');\n        const bKey = String(b.canonical_number_key || '');\n        return Number(manifestOrder.get(aKey) || 9999) - Number(manifestOrder.get(bKey) || 9999)\n          || aKey.localeCompare(bKey, 'en', { numeric: true });\n      });\n      refs.numberSettlementListRows.innerHTML = ordered.map((row) => {\n        const member = memberByCollector.get(String(row.collector_id || '')) || {};\n        const identity = member.identity || {};\n        const displayName = identity.display_name || member.source_audit_code || 'Identity unavailable';\n        const email = identity.email || '';\n        return `<tr><td><strong class=\"oap__number-settlement-label\">#${escapeHtml(row.serial_label || row.canonical_number_key)}</strong></td><td><strong>${escapeHtml(displayName)}</strong>${email && email.toLowerCase() !== displayName.toLowerCase() ? `<small>${escapeHtml(email)}</small>` : ''}</td><td><span class=\"oap__pill\">${escapeHtml(sourceLabel(row.assignment_source))}</span></td><td>${escapeHtml(auditDetail(row))}</td></tr>`;\n      }).join('');\n      refs.numberSettlementListStatus.textContent = state.numberSettlementPreview\n        ? assignmentListReady ? `${expectedAssignments}/${expectedAssignments} complete \u00B7 unique` : `${previewAssignments.length}/${expectedAssignments} \u00B7 incomplete`\n        : '';\n      refs.numberSettlementList.dataset.state = assignmentListReady ? 'ready' : 'blocked';\n    }\n    if (refs.numberSettlementFreezeConfirm) {\n      refs.numberSettlementFreezeConfirm.disabled = !assignmentListReady || state.numberSettlementBusy\n        || Number(state.numberSettlementPreview?.blockers?.length || 0) > 0 || Boolean(settlement);\n      if (refs.numberSettlementFreezeConfirm.disabled) refs.numberSettlementFreezeConfirm.checked = false;\n    }\n    refs.numberSettlementFreeze.disabled = state.numberSettlementBusy || !state.numberSettlementPreview\n      || !assignmentListReady\n      || Number(state.numberSettlementPreview.blockers?.length || 0) > 0\n      || !refs.numberSettlementFreezeConfirm?.checked || Boolean(settlement)\n      || typeof config.allocationApi !== 'function';\n    refs.numberSettlementMessage.textContent = state.numberSettlementMessage || (settlement\n      ? `Scheme C is frozen. Audit hash ${settlement.result_hash}.`\n      : state.numberSettlementPreview\n        ? `Preview ${state.numberSettlementPreview.result_hash}: ${state.numberSettlementPreview.default_guarantee_count} unanswered Signature Number default(s), ${state.numberSettlementPreview.default_random_count} unanswered public-random assignment(s), ${state.numberSettlementPreview.responded_fallback_count || 0} responding Collector remaining-number assignment(s), ${state.numberSettlementPreview.blockers.length} blocker(s).`\n        : !commitment && choice?.status === 'open'\n          ? 'This open window predates automatic commitment or its opening transaction was interrupted. Use Retry automatic commitment before the deadline.'\n          : commitment && choice?.status === 'open' && !deadlinePassed\n            ? `Round ${Number(commitment.drand_round).toLocaleString('en-US')} is fixed for the first Quicknet boundary at or after ${formatJst(choice.closes_at)}. No pre-deadline action is required.`\n            : commitment && choice?.status === 'open'\n              ? 'The deadline has passed. Close responses, then preview the verified result.'\n              : choice?.status === 'closed'\n                ? 'Responses are closed. Preview the exact verified Quicknet result before freezing.'\n                : 'The number-choice window is not ready.');\n  }\n\n  async function refreshNumberSettlement() {\n    if (typeof config.allocationApi !== 'function') return;\n    const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-settlement`);\n    state.numberSettlementWorkspace = response.settlement_workspace || null;\n    if (state.numberSettlementWorkspace?.window) state.numberChoiceWindow = state.numberSettlementWorkspace.window;\n  }\n\n  async function commitNumberSettlementRound() {\n    if (state.numberSettlementBusy || typeof config.allocationApi !== 'function') return;\n    state.numberSettlementBusy = true;\n    state.pendingNumberSettlementCommitRequestId ||= crypto.randomUUID();\n    renderNumberSettlement();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-settlement/commit`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberSettlementCommitRequestId, confirm_commit: true }),\n      });\n      state.pendingNumberSettlementCommitRequestId = null;\n      state.numberSettlementWorkspace = { ...(state.numberSettlementWorkspace || {}), commitment: response.commitment };\n      state.numberSettlementMessage = `Recovery succeeded. Quicknet round ${Number(response.commitment.drand_round).toLocaleString('en-US')} is committed for ${formatJst(response.commitment.round_time)}.`;\n    } catch (error) {\n      state.numberSettlementMessage = `Quicknet commitment was not saved: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberSettlementBusy = false;\n      renderNumberSettlement();\n    }\n  }\n\n  async function closeNumberChoices() {\n    if (state.numberSettlementBusy || typeof config.allocationApi !== 'function') return;\n    if (!window.confirm('Close Collector number choices now? The backend already rejects late responses. This records the immutable close event.')) return;\n    state.numberSettlementBusy = true;\n    state.pendingNumberSettlementCloseRequestId ||= crypto.randomUUID();\n    renderNumberSettlement();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-settlement/close`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberSettlementCloseRequestId, confirm_close: true }),\n      });\n      state.pendingNumberSettlementCloseRequestId = null;\n      state.numberChoiceWindow = response.window;\n      await refreshNumberSettlement();\n      state.numberSettlementMessage = 'Collector responses are closed. No default or final number has been frozen yet.';\n    } catch (error) {\n      state.numberSettlementMessage = `Number choices were not closed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberSettlementBusy = false;\n      renderNumberSettlement();\n      renderNumberChoiceConfig();\n    }\n  }\n\n  async function previewFinalNumberSettlement() {\n    if (state.numberSettlementBusy || typeof config.allocationApi !== 'function') return;\n    state.numberSettlementBusy = true;\n    state.numberSettlementPreview = null;\n    renderNumberSettlement();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-settlement/preview`, {\n        method: 'POST', body: JSON.stringify({}),\n      });\n      state.numberSettlementPreview = response.preview;\n      state.numberSettlementMessage = '';\n    } catch (error) {\n      state.numberSettlementMessage = `Final Scheme C preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberSettlementBusy = false;\n      renderNumberSettlement();\n    }\n  }\n\n  async function freezeFinalNumberSettlement() {\n    const previewAssignments = Array.isArray(state.numberSettlementPreview?.assignments)\n      ? state.numberSettlementPreview.assignments : [];\n    const expectedAssignments = Number(state.numberSettlementPreview?.entitlement_count || 0);\n    const assignmentListComplete = expectedAssignments > 0 && previewAssignments.length === expectedAssignments\n      && new Set(previewAssignments.map((row) => String(row.collector_id || '')).filter(Boolean)).size === expectedAssignments\n      && new Set(previewAssignments.map((row) => String(row.canonical_number_key || '')).filter(Boolean)).size === expectedAssignments;\n    if (state.numberSettlementBusy || !state.numberSettlementPreview || !assignmentListComplete\n      || !refs.numberSettlementFreezeConfirm?.checked\n      || typeof config.allocationApi !== 'function') return;\n    state.numberSettlementBusy = true;\n    state.pendingNumberSettlementFreezeRequestId ||= crypto.randomUUID();\n    renderNumberSettlement();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-settlement/freeze`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberSettlementFreezeRequestId,\n          expected_result_hash: state.numberSettlementPreview.result_hash, confirm_freeze: true }),\n      });\n      state.pendingNumberSettlementFreezeRequestId = null;\n      state.numberSettlementPreview = null;\n      refs.numberSettlementFreezeConfirm.checked = false;\n      await refreshNumberSettlement();\n      state.numberPaymentWorkspace = { ...(state.numberPaymentWorkspace || {}), settlement: response.settlement,\n        choice_window: { ...(state.numberPaymentWorkspace?.choice_window || {}), status: 'frozen' } };\n      state.numberSettlementMessage = `Final number allocation frozen: ${response.settlement.result_hash}. No payment, Points, order or email action ran.`;\n    } catch (error) {\n      state.numberSettlementMessage = `Final number allocation was not frozen: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberSettlementBusy = false;\n      renderNumberSettlement();\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  function numberPaymentPolicyInput() {\n    return {\n      mode: refs.numberPaymentMode?.value || 'alipay_primary_shopify_fallback',\n      payment_window_days: 7,\n      fx_buffer_bps: 300,\n    };\n  }\n\n  function numberPaymentBlockerLabel(blocker) {\n    if (!blocker) return 'Ready';\n    if (blocker.code === 'ownership_number_payment_points_insufficient') {\n      return `Points shortfall \u00B7 needs ${money.format(Number(blocker.required_points || 0))}`;\n    }\n    if (blocker.code === 'ownership_number_payment_assignment_missing') return 'Final number missing';\n    if (blocker.code === 'ownership_number_payment_alipay_asset_required') return 'Alipay QR missing';\n    return String(blocker.code || 'Review required').replace(/^ownership_number_payment_/, '').replaceAll('_', ' ');\n  }\n\n  function renderNumberPaymentBatchPreview() {\n    if (!refs.numberPaymentBatchPanel) return;\n    const preview = state.numberPaymentBatchPreview;\n    refs.numberPaymentBatchPanel.hidden = !preview;\n    if (!preview) return;\n    const rows = Array.isArray(preview.rows) ? preview.rows : [];\n    const blockers = Array.isArray(preview.blockers) ? preview.blockers : [];\n    const collectorBlockers = new Map(blockers.filter((blocker) => blocker.collector_id)\n      .map((blocker) => [blocker.collector_id, blocker]));\n    const members = new Map((state.numberWorkspace?.entitlement?.members || [])\n      .map((member) => [member.collector_id, member]));\n    const manifestOrder = new Map((state.numberWorkspace?.manifest?.items || [])\n      .map((item, index) => [String(item.label), Number(item.display_order || index + 1)]));\n    const orderedRows = [...rows].sort((a, b) => (manifestOrder.get(String(a.serial_label)) || 9999)\n      - (manifestOrder.get(String(b.serial_label)) || 9999));\n    const jpyTotal = rows.reduce((sum, row) => sum + Number(row.total_jpy || 0), 0);\n    const rmbMinorTotal = rows.reduce((sum, row) => sum + Number(row.payable_rmb_minor || 0), 0);\n    const fx = preview.fx_snapshot;\n    const globalBlockers = blockers.filter((blocker) => !blocker.collector_id);\n    refs.numberPaymentBatchPanel.dataset.state = blockers.length ? 'blocked' : 'ready';\n    if (refs.numberPaymentBatchStatus) refs.numberPaymentBatchStatus.textContent = blockers.length\n      ? `Blocked \u00B7 ${blockers.length} issue${blockers.length === 1 ? '' : 's'}`\n      : `Ready \u00B7 ${rows.length}/${Number(preview.entitlement_count || rows.length)} checked`;\n    if (refs.numberPaymentBatchSummary) {\n      const observed = fx?.observed_at ? new Date(fx.observed_at).toLocaleString('en-GB', { timeZone: 'Asia/Tokyo', hour12: false }) + ' JST' : '\u2014';\n      const rawRate = fx?.reference_rmb_per_jpy_micros == null ? '\u2014' : `RMB ${(Number(fx.reference_rmb_per_jpy_micros) / 1000000).toFixed(6)} / JPY`;\n      const payableRate = fx?.payable_rmb_per_jpy_micros == null ? 'Not used' : `RMB ${(Number(fx.payable_rmb_per_jpy_micros) / 1000000).toFixed(6)} / JPY`;\n      refs.numberPaymentBatchSummary.innerHTML = [\n        ['FX source', fx?.source || 'Shopify only'],\n        ['Reference date', fx?.reference_date || '\u2014'],\n        ['Observed', observed],\n        ['Reference rate', rawRate],\n        ['Payable rate', fx ? `${payableRate} \u00B7 +${Number(fx.buffer_bps || 0) / 100}%` : payableRate],\n        ['Total JPY', `\u00A5${money.format(jpyTotal)}`],\n        ['Total RMB', fx ? `\u00A5${money.format(rmbMinorTotal / 100)}` : 'Not used'],\n        ['Blockers', blockers.length ? `${blockers.length} \u00B7 ${globalBlockers.map(numberPaymentBlockerLabel).join(', ') || 'see rows'}` : 'None'],\n      ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    }\n    if (refs.numberPaymentBatchRows) refs.numberPaymentBatchRows.innerHTML = orderedRows.map((row) => {\n      const member = members.get(row.collector_id) || {};\n      const identity = member.identity || {};\n      const person = identity.display_name || member.source_audit_code || row.collector_id;\n      const email = identity.email || '';\n      const blocker = collectorBlockers.get(row.collector_id);\n      const bid = Number(row.special_bid_jpy || 0);\n      return `<tr data-state=\"${blocker ? 'blocked' : 'ready'}\">\n        <td><strong class=\"oap__payment-number\">${escapeHtml(row.serial_label)}</strong><small>${escapeHtml(row.assignment_source || '')}</small></td>\n        <td><strong>${escapeHtml(person)}</strong>${email ? `<small>${escapeHtml(email)}</small>` : ''}</td>\n        <td><strong>\u00A5${escapeHtml(money.format(Number(row.total_jpy || 0)))}</strong>${bid ? `<small>Base \u00A5${escapeHtml(money.format(Number(row.base_price_jpy || 0)))} + bid \u00A5${escapeHtml(money.format(bid))}</small>` : '<small>Base price</small>'}</td>\n        <td><strong>${row.payable_rmb_minor == null ? '\u2014' : `\u00A5${escapeHtml(money.format(Number(row.payable_rmb_minor) / 100))}`}</strong></td>\n        <td><strong>${escapeHtml(money.format(Number(row.points_cost || 0)))}</strong></td>\n        <td><strong>${escapeHtml(money.format(Number(row.available_points || 0)))}</strong>${Number(row.active_points_reservations || 0) ? `<small>${escapeHtml(money.format(Number(row.active_points_reservations)))} already reserved</small>` : ''}</td>\n        <td><span class=\"oap__payment-review\">${escapeHtml(numberPaymentBlockerLabel(blocker))}</span></td>\n      </tr>`;\n    }).join('');\n  }\n\n  function paymentReviewState(row) {\n    if (row.review?.status === 'recovery_required' || row.review?.status === 'processing'\n      || row.shopify_receipt?.status === 'recovery_required' || row.shopify_receipt?.status === 'processing') return 'recovery';\n    if (row.status === 'paid') return 'paid';\n    if (row.active_channel === 'shopify' || row.status === 'channel_switch_requested') return 'shopify';\n    if (!row.delivery || row.reservation?.status !== 'active') return 'incomplete';\n    return 'ready';\n  }\n\n  function paymentReviewLabel(row) {\n    const status = paymentReviewState(row);\n    if (status === 'paid') return 'Paid \u00B7 Points consumed';\n    if (status === 'recovery') return row.review?.status === 'processing' ? 'Processing requires inspection' : 'Recovery required';\n    if (status === 'shopify') {\n      if (row.shopify_job?.status === 'draft_created' && row.shopify_job?.invoice_url) return 'Shopify payment link ready';\n      if (row.shopify_job?.status === 'replacing') return 'Replacing inventory-linked Draft';\n      if (row.shopify_job?.status === 'cancelling') return 'Returning to Alipay';\n      if (row.shopify_job?.status === 'cancelled') return 'Shopify Draft cancelled \u00B7 Alipay active';\n      if (row.shopify_job?.status === 'reviewed') return 'Shopify request reviewed';\n      if (row.shopify_job?.status === 'recovery_required') return 'Shopify recovery required';\n      return 'Shopify payment requested';\n    }\n    if (status === 'incomplete') return !row.delivery ? 'Address missing' : 'Active Points reservation required';\n    return row.proof ? 'Ready for Alipay review' : 'Ready for Alipay review \u00B7 no proof uploaded';\n  }\n\n  function deliveryClipboard(row) {\n    if (!row?.delivery) return '';\n    return [row.delivery.recipient_name, row.delivery.phone, row.delivery.address].filter(Boolean).join('\\n');\n  }\n\n  function renderShippingHandoff() {\n    if (!refs.shippingPanel) return;\n    const workspace = state.numberShippingHandoff;\n    const payment = state.numberPaymentWorkspace;\n    const batchActive = ['payment_open', 'closed'].includes(payment?.batch?.status);\n    refs.shippingPanel.hidden = !batchActive;\n    if (refs.shippingPanel.hidden) return;\n    const source = workspace?.source || { paid: 0, ready: 0, blockers: 0 };\n    const handoff = workspace?.handoff;\n    const active = handoff?.status === 'active' && Date.parse(handoff.expires_at) > Date.now();\n    refs.shippingStatus.textContent = active ? `${handoff.entered_count} / ${handoff.item_count} entered`\n      : handoff ? handoff.status : 'No active handoff';\n    refs.shippingMetrics.innerHTML = [\n      ['Paid', Number(source.paid || 0)], ['Ready addresses', Number(source.ready || 0)],\n      ['Paid blockers', Number(source.blockers || 0)], ['Snapshot items', Number(handoff?.item_count || 0)],\n      ['Entered', Number(handoff?.entered_count || 0)], ['Expires', handoff ? formatJst(handoff.expires_at) : '\u2014'],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    refs.shippingExpiry.disabled = state.numberShippingBusy || active;\n    refs.shippingPreview.disabled = state.numberShippingBusy || active || typeof config.allocationApi !== 'function';\n    refs.shippingCreate.disabled = state.numberShippingBusy || active || !state.numberShippingPreview\n      || state.numberShippingPreview.blockers?.length || !workspace?.capabilities?.writes_enabled\n      || typeof config.allocationApi !== 'function';\n    refs.shippingRevoke.disabled = state.numberShippingBusy || !active || !workspace?.capabilities?.writes_enabled;\n    const rows = state.numberShippingPreview?.rows || [];\n    refs.shippingRows.innerHTML = rows.length ? rows.map((row) => `<div><strong>#${escapeHtml(row.number)}</strong><span>${escapeHtml(row.recipient)} \u00B7 ${escapeHtml(row.phone)}<br>${escapeHtml(row.address)}</span></div>`).join('') : '';\n    refs.shippingRows.hidden = !rows.length;\n    refs.shippingSecret.hidden = !state.numberShippingSecret;\n    if (state.numberShippingSecret) {\n      refs.shippingUrl.value = state.numberShippingSecret.url;\n      refs.shippingPin.value = state.numberShippingSecret.pin;\n    }\n    refs.shippingMessage.textContent = state.numberShippingMessage || (active\n      ? 'The delegate link is active. The limited number is visible on each card but is never included in copied delivery text.'\n      : source.ready ? 'Preview the current paid delivery snapshot. Creating it returns the share link and PIN once.'\n        : 'No confirmed paid delivery is ready yet.');\n  }\n\n  async function copyPaymentText(value, successMessage) {\n    if (!value) return;\n    try {\n      await navigator.clipboard.writeText(value);\n      state.numberPaymentReviewMessage = successMessage;\n    } catch (_) {\n      state.numberPaymentReviewMessage = 'Copy failed. Use the CSV download or copy the visible details manually.';\n    }\n    renderPaymentReview();\n  }\n\n  function renderPaymentReview() {\n    if (!refs.paymentReviewPanel) return;\n    const workspace = state.numberPaymentWorkspace || {};\n    const requests = Array.isArray(workspace.preview_requests) ? workspace.preview_requests : [];\n    const batchActive = ['payment_open', 'closed'].includes(workspace.batch?.status)\n      || (root.dataset.oapRemote !== 'true' && config.demo_number_payment_preview === true);\n    refs.paymentReviewPanel.hidden = !batchActive || !requests.length;\n    if (refs.paymentReviewPanel.hidden) return;\n    const summary = workspace.review_summary || {};\n    const deliveryCount = requests.filter((row) => row.delivery).length;\n    refs.paymentReviewStatus.textContent = `${Number(summary.paid || 0)} paid \u00B7 ${Number(summary.awaiting_review || 0)} awaiting review`;\n    refs.paymentReviewMetrics.innerHTML = [\n      ['Payment requests', Number(summary.total ?? requests.length)],\n      ['Ready / awaiting', Number(summary.awaiting_review || 0)],\n      ['No proof \u00B7 optional', Number(summary.proof_missing || 0)],\n      ['Shopify route', Number(summary.shopify_requested || 0)],\n      ['Paid', Number(summary.paid || 0)],\n      ['Recovery', Number(summary.recovery_required || 0)],\n      ['Delivery saved', `${deliveryCount} / ${requests.length}`],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    if (refs.paymentReviewFilter) refs.paymentReviewFilter.value = state.numberPaymentReviewFilter;\n    const filtered = requests.filter((row) => state.numberPaymentReviewFilter === 'all'\n      || paymentReviewState(row) === state.numberPaymentReviewFilter);\n    refs.paymentReviewList.innerHTML = filtered.length ? filtered.map((row) => {\n      const identity = row.identity || {};\n      const reviewState = paymentReviewState(row);\n      const rmb = row.payable_rmb_minor == null ? '\u2014' : `RMB \u00A5${money.format(Number(row.payable_rmb_minor) / 100)}`;\n      const canReview = reviewState === 'ready' && workspace.capabilities?.reconciliation_writes_enabled === true;\n      const canRecover = reviewState === 'recovery' && row.review?.status === 'recovery_required'\n        && workspace.capabilities?.reconciliation_writes_enabled === true;\n      const shopifyRecovery = reviewState === 'recovery' && Boolean(row.shopify_receipt);\n      const shopifyJob = row.shopify_job;\n      const shopifyAction = reviewState !== 'shopify' ? ''\n        : shopifyJob?.status === 'draft_created' && shopifyJob.invoice_url\n          ? `<button type=\"button\" data-oap-shopify-copy-link=\"${escapeHtml(row.payment_request_id)}\">Copy Shopify link</button>`\n          : shopifyJob?.status === 'reviewed'\n            ? workspace.capabilities?.shopify_automation_enabled\n              ? '<button type=\"button\" disabled>Automatic creation queued</button>'\n              : `<button type=\"button\" class=\"oap__primary-action\" data-oap-shopify-create=\"${escapeHtml(row.payment_request_id)}\" ${workspace.capabilities?.shopify_draft_writes_enabled ? '' : 'disabled'}>${workspace.capabilities?.shopify_draft_writes_enabled ? 'Create Shopify payment link' : 'Draft creation gate closed'}</button>`\n            : ['replacing', 'cancelling'].includes(shopifyJob?.status)\n              ? '<button type=\"button\" disabled>Automatic update in progress</button>'\n              : shopifyJob?.status === 'cancelled'\n                ? '<button type=\"button\" disabled>Returned to Alipay</button>'\n            : shopifyJob?.status === 'recovery_required'\n              ? '<button type=\"button\" disabled>Recovery required</button>'\n              : workspace.capabilities?.shopify_automation_enabled\n                ? '<button type=\"button\" disabled>Automatic review queued</button>'\n                : `<button type=\"button\" data-oap-shopify-preview=\"${escapeHtml(row.payment_request_id)}\">Review Shopify request</button>`;\n      return `<article class=\"oap__payment-review-card\" data-state=\"${escapeHtml(reviewState)}\">\n        <header><div><span class=\"oap__payment-review-card__number\">#${escapeHtml(row.serial_label)}</span><div><strong>${escapeHtml(identity.display_name || 'Name unavailable')}</strong><small>${escapeHtml(identity.email || '')}</small></div></div><span>${escapeHtml(paymentReviewLabel(row))}</span></header>\n        <dl><div><dt>Amount</dt><dd>JPY \u00A5${escapeHtml(money.format(Number(row.total_jpy || 0)))} \u00B7 ${escapeHtml(rmb)}</dd></div><div><dt>KoB Points</dt><dd>${escapeHtml(money.format(Number(row.points_cost || 0)))} \u00B7 ${escapeHtml(row.reservation?.status || 'no reservation')}</dd></div><div><dt>Delivery</dt><dd>${row.delivery ? `${escapeHtml(row.delivery.recipient_name)} \u00B7 ${escapeHtml(row.delivery.phone)}<br>${escapeHtml(row.delivery.address)}` : 'Not submitted'}</dd></div></dl>\n        <div class=\"oap__payment-review-card__actions\">\n          <button type=\"button\" data-oap-payment-copy=\"${escapeHtml(row.payment_request_id)}\" ${row.delivery ? '' : 'disabled'}>Copy delivery</button>\n          <button type=\"button\" data-oap-payment-proof-view=\"${escapeHtml(row.proof?.proof_upload_id || '')}\" ${row.proof ? '' : 'disabled'}>View proof</button>\n          ${shopifyAction}\n          ${canRecover ? `<button type=\"button\" data-oap-payment-recover=\"${escapeHtml(row.review.review_id)}\">Recover safely</button>`\n            : reviewState === 'shopify' ? '' : shopifyRecovery ? '<button type=\"button\" disabled>Shopify recovery required</button>'\n              : `<button type=\"button\" class=\"oap__primary-action\" data-oap-payment-review=\"${escapeHtml(row.payment_request_id)}\" ${canReview ? '' : 'disabled'}>${reviewState === 'paid' ? 'Confirmed' : workspace.capabilities?.reconciliation_writes_enabled ? 'Review payment' : 'Confirmation gate closed'}</button>`}\n        </div>\n      </article>`;\n    }).join('') : '<p class=\"oap__number-message\">No payment requests match this filter.</p>';\n    if (refs.paymentCopyAll) refs.paymentCopyAll.disabled = !deliveryCount;\n    if (refs.paymentExport) refs.paymentExport.disabled = !deliveryCount || typeof config.allocationAssetApi !== 'function';\n    if (refs.paymentReviewMessage) refs.paymentReviewMessage.textContent = state.numberPaymentReviewMessage\n      || (deliveryCount === requests.length ? 'All delivery details are available.' : `${requests.length - deliveryCount} delivery submission(s) are still missing.`);\n  }\n\n  function openPaymentReviewDialog(paymentRequestId) {\n    const row = (state.numberPaymentWorkspace?.preview_requests || []).find((item) => item.payment_request_id === paymentRequestId);\n    if (!row || paymentReviewState(row) !== 'ready' || !refs.paymentReviewDialog) return;\n    state.numberPaymentReviewSelection = paymentRequestId;\n    state.pendingNumberPaymentReviewRequestId = null;\n    refs.paymentReviewDialogTitle.textContent = `Confirm Alipay payment \u00B7 #${row.serial_label}`;\n    refs.paymentReviewDialogDetail.innerHTML = `<dl class=\"oap__payment-review-dialog__detail\">\n      <div><dt>Collector</dt><dd>${escapeHtml(row.identity?.display_name || 'Name unavailable')}<br>${escapeHtml(row.identity?.email || '')}</dd></div>\n      <div><dt>Frozen amount</dt><dd>RMB \u00A5${escapeHtml(money.format(Number(row.payable_rmb_minor || 0) / 100))}<br>JPY \u00A5${escapeHtml(money.format(Number(row.total_jpy || 0)))}</dd></div>\n      <div><dt>KoB Points</dt><dd>${escapeHtml(money.format(Number(row.points_cost || 0)))} will be consumed from the reserved amount.</dd></div>\n      <div><dt>Delivery</dt><dd>${escapeHtml(row.delivery?.recipient_name || '')} \u00B7 ${escapeHtml(row.delivery?.phone || '')}<br>${escapeHtml(row.delivery?.address || '')}</dd></div>\n      <div><dt>Payment proof</dt><dd>${row.proof ? `${escapeHtml(row.proof.file_name || 'Uploaded proof')} \u00B7 v${escapeHtml(Number(row.proof.version || 1))}` : 'Not uploaded \u00B7 verify the transfer using its amount and Alipay remark email.'}</dd></div>\n    </dl>`;\n    refs.paymentReviewReference.value = '';\n    refs.paymentReviewNote.value = '';\n    refs.paymentReviewAmountConfirm.checked = false;\n    refs.paymentReviewEmailConfirm.checked = false;\n    refs.paymentReviewDialogMessage.textContent = 'This action marks the payment paid and consumes the reserved Points. It is protected by an idempotent recovery record.';\n    refs.paymentReviewConfirm.disabled = true;\n    refs.paymentReviewDialog.showModal();\n  }\n\n  function renderPaymentReviewDialogAction() {\n    if (!refs.paymentReviewConfirm) return;\n    refs.paymentReviewConfirm.disabled = state.numberPaymentReviewBusy\n      || !refs.paymentReviewReference?.value.trim()\n      || !refs.paymentReviewAmountConfirm?.checked\n      || !refs.paymentReviewEmailConfirm?.checked;\n  }\n\n  async function previewShopifyPaymentRequest(paymentRequestId) {\n    if (state.numberShopifyBusy || typeof config.allocationApi !== 'function' || !refs.shopifyDialog) return;\n    state.numberShopifyBusy = true;\n    state.numberShopifySelection = paymentRequestId;\n    state.numberShopifyPreview = null;\n    refs.shopifyDialogTitle.textContent = 'Review Shopify payment request';\n    refs.shopifyDialogDetail.innerHTML = '';\n    refs.shopifyDialogMessage.textContent = 'Checking the frozen request and its exact Shopify product variant\u2026';\n    refs.shopifyDialogConfirm.checked = false;\n    refs.shopifyDialogSave.disabled = true;\n    refs.shopifyDialog.showModal();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-shopify/preview`, {\n        method: 'POST', body: JSON.stringify({ payment_request_id: paymentRequestId }),\n      });\n      state.numberShopifyPreview = response;\n      const plan = response.plan;\n      refs.shopifyDialogDetail.innerHTML = `<dl class=\"oap__payment-review-dialog__detail\">\n        <div><dt>Collector</dt><dd>${escapeHtml(plan.email)}</dd></div>\n        <div><dt>Allocated number</dt><dd>#${escapeHtml(plan.serial_label)}</dd></div>\n        <div><dt>Shopify product</dt><dd>${escapeHtml(plan.product.title)}<br>${escapeHtml(plan.product.variant_title || 'Default variant')}</dd></div>\n        <div><dt>Frozen amount</dt><dd>JPY \u00A5${escapeHtml(money.format(Number(plan.total_jpy || 0)))}</dd></div>\n        <div><dt>KoB Points</dt><dd>${escapeHtml(money.format(Number(plan.points_cost || 0)))} remain reserved until payment is confirmed.</dd></div>\n      </dl>`;\n      refs.shopifyDialogMessage.textContent = 'Saving this review does not create a Draft Order or send an invoice.';\n    } catch (error) {\n      refs.shopifyDialogMessage.textContent = `Shopify request preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberShopifyBusy = false;\n      refs.shopifyDialogSave.disabled = !state.numberShopifyPreview || !refs.shopifyDialogConfirm.checked;\n    }\n  }\n\n  async function saveReviewedShopifyPaymentRequest() {\n    if (state.numberShopifyBusy || !state.numberShopifyPreview || !refs.shopifyDialogConfirm.checked\n      || typeof config.allocationApi !== 'function') return;\n    state.numberShopifyBusy = true;\n    state.pendingNumberShopifyReviewRequestId ||= crypto.randomUUID();\n    refs.shopifyDialogSave.disabled = true;\n    refs.shopifyDialogMessage.textContent = 'Saving the reviewed Shopify request\u2026';\n    try {\n      await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-shopify/prepare`, {\n        method: 'POST', body: JSON.stringify({\n          request_id: state.pendingNumberShopifyReviewRequestId,\n          payment_request_id: state.numberShopifySelection,\n          preview: state.numberShopifyPreview.plan,\n          preview_token: state.numberShopifyPreview.preview_token,\n        }),\n      });\n      state.pendingNumberShopifyReviewRequestId = null;\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentReviewMessage = 'Shopify request reviewed. No Draft Order or email was created.';\n      refs.shopifyDialog.close();\n      renderPaymentReview();\n    } catch (error) {\n      refs.shopifyDialogMessage.textContent = `Shopify review was not saved: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberShopifyBusy = false;\n      refs.shopifyDialogSave.disabled = !state.numberShopifyPreview || !refs.shopifyDialogConfirm.checked;\n    }\n  }\n\n  async function createReviewedShopifyPaymentLink(paymentRequestId) {\n    if (state.numberShopifyBusy || typeof config.allocationApi !== 'function') return;\n    const row = (state.numberPaymentWorkspace?.preview_requests || []).find((item) => item.payment_request_id === paymentRequestId);\n    if (!row?.shopify_job || !window.confirm(`Create one real Shopify Draft Order for #${row.serial_label} at JPY \u00A5${money.format(Number(row.total_jpy || 0))}? No invoice email will be sent by this action.`)) return;\n    state.numberShopifyBusy = true;\n    state.pendingNumberShopifyCreateRequestId ||= crypto.randomUUID();\n    state.numberPaymentReviewMessage = `Creating the Shopify payment link for #${row.serial_label}\u2026`;\n    renderPaymentReview();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-shopify/create`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberShopifyCreateRequestId,\n          payment_request_id: paymentRequestId, confirm_create: true }),\n      });\n      state.pendingNumberShopifyCreateRequestId = null;\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentReviewMessage = `Shopify payment link for #${row.serial_label} is ready. The Collector can see it after refreshing the payment page; no invoice email was sent.`;\n      if (response.job?.invoice_url) await navigator.clipboard.writeText(response.job.invoice_url).catch(() => {});\n    } catch (error) {\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentReviewMessage = `Shopify link creation stopped: ${error.code || 'request_failed'}. Do not retry if the card shows Recovery required.`;\n    } finally {\n      state.numberShopifyBusy = false;\n      renderPaymentReview();\n    }\n  }\n\n  function renderNumberPaymentPolicy() {\n    if (!refs.numberPaymentMetrics) return;\n    const workspace = state.numberPaymentWorkspace || {};\n    const choice = workspace.choice_window || (state.numberChoiceWindow ? {\n      status: state.numberChoiceWindow.status,\n      entitlement_count: state.numberWorkspace?.entitlement?.count || 0,\n      response_count: state.numberChoiceWindow.response_count || 0,\n    } : null);\n    const policy = workspace.policy;\n    if (policy && refs.numberPaymentMode && !state.numberPaymentPolicyPreview) refs.numberPaymentMode.value = policy.mode;\n    const settled = Boolean(workspace.settlement);\n    const batch = workspace.batch;\n    const asset = workspace.alipay_asset;\n    const batchPreview = state.numberPaymentBatchPreview;\n    const batchFrozen = batch?.status === 'frozen';\n    const batchOpen = batch?.status === 'payment_open';\n    const openingPreview = state.numberPaymentOpeningPreview;\n    const openingReady = batchOpen || Boolean(openingPreview);\n    const externalReady = workspace.capabilities?.external_writes_enabled === true\n      && workspace.capabilities?.email_delivery_enabled === true;\n    const alipayMode = (refs.numberPaymentMode?.value || '').startsWith('alipay');\n    const previewRmbTotal = batchPreview?.rows?.reduce((sum, row) => sum + Number(row.payable_rmb_minor || 0), 0) || 0;\n    const previewJpyTotal = batchPreview?.rows?.reduce((sum, row) => sum + Number(row.total_jpy || 0), 0) || 0;\n    renderNumberPaymentBatchPreview();\n    renderPaymentReview();\n    renderShippingHandoff();\n    refs.numberPaymentMetrics.innerHTML = [\n      ['Collector responses', choice ? `${Number(choice.response_count || 0)} / ${Number(choice.entitlement_count || 0)}` : 'Not available'],\n      ['Scheme C', settled ? 'Final number allocation frozen' : 'Waiting for final settlement'],\n      ['Payment mode', alipayMode ? 'Alipay primary \u00B7 Shopify on request' : 'Shopify only'],\n      ['Payment window', '7 days \u00B7 one batch-wide deadline'],\n      ['Protected QR', alipayMode ? (asset ? `Version ${asset.version} \u00B7 ${asset.content_sha256.slice(0, 10)}` : 'Required before batch preview') : 'Not used'],\n      ['RMB authority', batch ? `Stored in batch ${batch.batch_hash?.slice(0, 10) || ''}`\n        : batchPreview?.fx_snapshot ? `${batchPreview.fx_snapshot.reference_date} \u00B7 one release-wide rate` : 'Not calculated yet'],\n      ['Payment batch', batch ? `${batch.status} \u00B7 ${batch.request_count} requests`\n        : batchPreview ? `${batchPreview.request_count} requests \u00B7 ${batchPreview.blockers.length} blocker(s)` : 'Not prepared'],\n      ['Payment opens \u00B7 JST', batchOpen ? formatJst(batch.opened_at)\n        : openingPreview ? formatJst(openingPreview.opens_at) : 'Not scheduled'],\n      ['Payment deadline \u00B7 JST', batchOpen ? formatJst(batch.payment_deadline_at)\n        : openingPreview ? formatJst(openingPreview.payment_deadline_at) : 'Not scheduled'],\n      ['Preview totals', batchPreview ? `JPY ${money.format(previewJpyTotal)}${alipayMode ? ` \u00B7 RMB \u00A5${(previewRmbTotal / 100).toFixed(2)}` : ''}` : '\u2014'],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    refs.numberPaymentMode.disabled = state.numberPaymentBusy || Boolean(batch);\n    refs.numberPaymentPreview.disabled = state.numberPaymentBusy || Boolean(batch) || typeof config.allocationApi !== 'function';\n    refs.numberPaymentSave.disabled = state.numberPaymentBusy || Boolean(batch)\n      || !state.numberPaymentPolicyPreview || typeof config.allocationApi !== 'function';\n    refs.numberPaymentSave.textContent = state.numberPaymentBusy ? 'Saving\u2026' : policy ? 'Save revised payment policy' : 'Save reviewed payment policy';\n    if (refs.numberPaymentAssetFile) refs.numberPaymentAssetFile.disabled = state.numberPaymentBusy || Boolean(batch) || !alipayMode;\n    if (refs.numberPaymentAssetUpload) refs.numberPaymentAssetUpload.disabled = state.numberPaymentBusy || Boolean(batch)\n      || !alipayMode || !refs.numberPaymentAssetFile?.files?.length || typeof config.allocationApi !== 'function';\n    if (refs.numberPaymentBatchPreview) refs.numberPaymentBatchPreview.disabled = state.numberPaymentBusy || Boolean(batch)\n      || !settled || !policy || (alipayMode && !asset)\n      || (typeof config.allocationApi !== 'function' && !config.demo_number_payment_preview);\n    if (refs.numberPaymentBatchPrepare) refs.numberPaymentBatchPrepare.disabled = state.numberPaymentBusy || Boolean(batch)\n      || !batchPreview || Boolean(batchPreview.blockers?.length) || !state.numberPaymentBatchPreviewToken\n      || typeof config.allocationApi !== 'function';\n    if (refs.numberPaymentBatchFreezeConfirm) {\n      refs.numberPaymentBatchFreezeConfirm.disabled = state.numberPaymentBusy || batch?.status !== 'reviewed_draft';\n      if (batchFrozen) refs.numberPaymentBatchFreezeConfirm.checked = true;\n    }\n    if (refs.numberPaymentBatchFreeze) refs.numberPaymentBatchFreeze.disabled = state.numberPaymentBusy\n      || batch?.status !== 'reviewed_draft' || !refs.numberPaymentBatchFreezeConfirm?.checked\n      || typeof config.allocationApi !== 'function';\n    if (refs.numberPaymentOpensAt) {\n      if (batchOpen) refs.numberPaymentOpensAt.value = isoToJstInput(batch.opened_at);\n      else if (batchFrozen && !refs.numberPaymentOpensAt.value) {\n        refs.numberPaymentOpensAt.value = isoToJstInput(new Date(Date.now() + 15 * 60 * 1000));\n      }\n      refs.numberPaymentOpensAt.disabled = state.numberPaymentBusy || !batchFrozen || batchOpen;\n    }\n    if (refs.numberPaymentOpeningPreview) refs.numberPaymentOpeningPreview.disabled = state.numberPaymentBusy\n      || !batchFrozen || !refs.numberPaymentOpensAt?.value || typeof config.allocationApi !== 'function';\n    if (refs.numberPaymentOpeningMessage) refs.numberPaymentOpeningMessage.textContent = state.numberPaymentOpeningMessage\n      || (batchOpen\n        ? `Payment is scheduled for ${formatJst(batch.opened_at)}. The shared deadline is ${formatJst(batch.payment_deadline_at)}.`\n        : openingPreview\n          ? `Preview: payment and email open ${formatJst(openingPreview.opens_at)}; every payment is due ${formatJst(openingPreview.payment_deadline_at)}.`\n          : batchFrozen\n            ? 'Choose a future JST time. Previewing calculates one seven-day deadline without opening payment or sending email.'\n            : 'Freeze the payment batch before preparing its opening schedule.');\n    if (refs.numberPaymentEmailReadiness) {\n      refs.numberPaymentEmailReadiness.innerHTML = batchOpen\n        ? '<strong>Result &amp; payment email preview:</strong> the opening schedule is stored. The exact recipient message can be rendered below.'\n        : batchFrozen\n          ? openingPreview\n            ? '<strong>Result &amp; payment email preview:</strong> the proposed JST schedule now supplies the exact shared deadline. Review a real recipient below.'\n            : '<strong>Result &amp; payment email preview:</strong> preview the JST opening schedule first so the email has an exact seven-day deadline.'\n        : batch\n          ? '<strong>Result &amp; payment email preview:</strong> freeze the reviewed payment batch first.'\n        : settled\n          ? '<strong>Result &amp; payment email preview:</strong> Scheme C is frozen. Prepare and freeze the payment batch next; the actual email preview will then use its stored values.'\n          : '<strong>Result &amp; payment email preview:</strong> waiting for the final Scheme C settlement and frozen payment batch. This settings check does not render an email.';\n    }\n    if (refs.numberPaymentEmailPanel) {\n      const requests = Array.isArray(workspace.preview_requests) ? workspace.preview_requests : [];\n      const members = new Map((state.numberWorkspace?.entitlement?.members || []).map((member) => [member.collector_id, member]));\n      const previous = refs.numberPaymentEmailRequest?.value || '';\n      refs.numberPaymentEmailPanel.hidden = !openingReady || !requests.length;\n      if (refs.numberPaymentEmailRequest && openingReady) {\n        refs.numberPaymentEmailRequest.innerHTML = requests.map((request) => {\n          const member = members.get(request.collector_id) || {};\n          const identity = member.identity || {};\n          const person = identity.display_name || member.source_audit_code || request.collector_id;\n          const email = identity.email ? ` \u00B7 ${identity.email}` : '';\n          const response = `${request.delivery ? ' \u00B7 address saved' : ''}${request.proof ? ' \u00B7 proof uploaded' : ''}`;\n          return `<option value=\"${escapeHtml(request.payment_request_id)}\">#${escapeHtml(request.serial_label)} \u00B7 ${escapeHtml(person)}${escapeHtml(email)}${response}</option>`;\n        }).join('');\n        if (requests.some((request) => request.payment_request_id === previous)) refs.numberPaymentEmailRequest.value = previous;\n      }\n      if (refs.numberPaymentSubmission) {\n        const selected = requests.find((request) => request.payment_request_id === refs.numberPaymentEmailRequest?.value);\n        refs.numberPaymentSubmission.innerHTML = selected ? `\n          <p><strong>Delivery</strong><span>${selected.delivery\n            ? `${escapeHtml(selected.delivery.recipient_name)} \u00B7 ${escapeHtml(selected.delivery.phone)}<br>${escapeHtml(selected.delivery.address)}`\n            : 'Not submitted'}</span></p>\n          <p><strong>Alipay proof</strong><span>${selected.proof\n            ? `${escapeHtml(selected.proof.file_name)} \u00B7 v${Number(selected.proof.version || 1)} <button type=\"button\" data-oap-number-payment-proof-view=\"${escapeHtml(selected.proof.proof_upload_id)}\">View protected proof</button>`\n            : 'Not uploaded'}</span></p>` : '';\n      }\n      if (refs.numberPaymentEmailPreview) refs.numberPaymentEmailPreview.disabled = state.numberPaymentBusy\n        || !openingReady || !refs.numberPaymentEmailRequest?.value || typeof config.allocationApi !== 'function';\n      if (refs.numberPaymentPagePreview) refs.numberPaymentPagePreview.disabled = state.numberPaymentBusy\n        || !openingReady || !refs.numberPaymentEmailRequest?.value;\n      if (refs.numberPaymentPageFrameShell) refs.numberPaymentPageFrameShell.dataset.viewport\n        = refs.numberPaymentPageViewport?.value === 'mobile' ? 'mobile' : 'desktop';\n      if (refs.numberPaymentEmailMessage) refs.numberPaymentEmailMessage.textContent = state.numberPaymentEmailMessage\n        || (openingReady ? 'Choose a recipient and render the exact trilingual message. Nothing will be sent.' : '');\n    }\n    if (refs.numberPaymentOpenConfirm) {\n      refs.numberPaymentOpenConfirm.disabled = state.numberPaymentBusy || !batchFrozen || !openingPreview\n        || state.numberPaymentEmailReviewedOpeningHash !== state.numberPaymentOpeningPreviewHash;\n      if (batchOpen) refs.numberPaymentOpenConfirm.checked = true;\n    }\n    if (refs.numberPaymentOpen) {\n      refs.numberPaymentOpen.disabled = state.numberPaymentBusy || !batchFrozen || !openingPreview\n        || state.numberPaymentEmailReviewedOpeningHash !== state.numberPaymentOpeningPreviewHash\n        || !refs.numberPaymentOpenConfirm?.checked || !externalReady || typeof config.allocationApi !== 'function';\n      refs.numberPaymentOpen.textContent = batchOpen ? 'Payment opening scheduled'\n        : externalReady ? 'Open payment & schedule result emails' : 'External delivery gate is closed';\n    }\n    refs.numberPaymentMessage.textContent = state.numberPaymentMessage || (batch\n      ? batchFrozen\n        ? 'The payment batch and release-wide RMB rate are frozen. Required KoB Points are reserved, not deducted. Payment is still closed.'\n        : batchOpen\n          ? `Payment opens ${formatJst(batch.opened_at)}; ${Number(batch.email_job_count || 0)} result emails are queued for that time.`\n          : 'The reviewed payment draft exists. Its exchange rate and payable amounts are stored; review and freeze it to reserve Points.'\n      : batchPreview\n        ? batchPreview.blockers.length\n          ? `Payment batch preview has ${batchPreview.blockers.length} blocker(s). Nothing was written.`\n          : 'Payment batch preview passed. Preparing it stores one rate and 29 payment requests, but does not reserve Points.'\n      : policy\n        ? `Payment policy v${policy.revision} is stored. Scheme C may finish later; no RMB amount, Points reservation, invoice or email exists yet.`\n        : settled\n          ? 'Scheme C is ready. Review and save the payment policy before preparing the frozen payment batch.'\n          : 'You may prepare this policy now. The system will refuse FX capture, Points reservation, invoices and email until Scheme C is frozen.');\n  }\n\n  async function refreshNumberPaymentWorkspace() {\n    if (typeof config.allocationApi !== 'function') return;\n    const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-workspace`);\n    state.numberPaymentWorkspace = response.payment_workspace || null;\n  }\n\n  async function refreshShippingHandoff() {\n    if (typeof config.allocationApi !== 'function') return;\n    const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-shipping-handoff`);\n    state.numberShippingHandoff = response.shipping_handoff || null;\n  }\n\n  async function previewShippingHandoff() {\n    if (state.numberShippingBusy || typeof config.allocationApi !== 'function') return;\n    state.numberShippingBusy = true; state.numberShippingSecret = null;\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-shipping-handoff/preview`, {\n        method: 'POST', body: JSON.stringify({ expires_in_days: Number(refs.shippingExpiry.value || 14) }),\n      });\n      state.numberShippingPreview = response.preview;\n      state.numberShippingMessage = response.preview.blockers.length\n        ? `${response.preview.blockers.length} paid shipment(s) still need a complete address.`\n        : `Preview ready: ${response.preview.rows.length} paid delivery record(s). No share link has been created.`;\n    } catch (error) { state.numberShippingMessage = `Shipping preview failed: ${error.code || 'request_failed'}.`; }\n    state.numberShippingBusy = false; renderShippingHandoff();\n  }\n\n  async function createShippingHandoff() {\n    if (state.numberShippingBusy || !state.numberShippingPreview || typeof config.allocationApi !== 'function') return;\n    state.numberShippingBusy = true; state.pendingNumberShippingRequestId ||= crypto.randomUUID();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-shipping-handoff/create`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberShippingRequestId,\n          expires_in_days: Number(refs.shippingExpiry.value || 14), expected_snapshot_hash: state.numberShippingPreview.snapshot_hash }),\n      });\n      state.pendingNumberShippingRequestId = null; state.numberShippingSecret = response.secret;\n      await refreshShippingHandoff();\n      state.numberShippingMessage = response.secret\n        ? 'Handoff created. Copy the link and PIN now; the PIN cannot be displayed again.'\n        : 'This request was already applied. Revoke it and create a new handoff if the original PIN was not saved.';\n    } catch (error) { state.numberShippingMessage = `Shipping handoff was not created: ${error.code || 'request_failed'}.`; }\n    state.numberShippingBusy = false; renderShippingHandoff();\n  }\n\n  async function revokeShippingHandoff() {\n    const handoff = state.numberShippingHandoff?.handoff;\n    if (!handoff || state.numberShippingBusy || typeof config.allocationApi !== 'function') return;\n    state.numberShippingBusy = true;\n    try {\n      await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-shipping-handoff/${encodeURIComponent(handoff.handoff_id)}/revoke`, {\n        method: 'POST', body: JSON.stringify({ request_id: crypto.randomUUID() }),\n      });\n      state.numberShippingPreview = null; state.numberShippingSecret = null; await refreshShippingHandoff();\n      state.numberShippingMessage = 'The handoff link and every device session were revoked.';\n    } catch (error) { state.numberShippingMessage = `Handoff revocation failed: ${error.code || 'request_failed'}.`; }\n    state.numberShippingBusy = false; renderShippingHandoff();\n  }\n\n  async function openProtectedPaymentProof(proofUploadId, button) {\n    if (!proofUploadId || typeof config.allocationAssetApi !== 'function') return;\n    if (button) button.disabled = true;\n    const previewWindow = window.open('about:blank', '_blank');\n    if (previewWindow) previewWindow.opener = null;\n    try {\n      const blob = await config.allocationAssetApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-proof/${encodeURIComponent(proofUploadId)}`);\n      const objectUrl = URL.createObjectURL(blob);\n      if (previewWindow) previewWindow.location.href = objectUrl;\n      setTimeout(() => URL.revokeObjectURL(objectUrl), 60000);\n    } catch (_) {\n      previewWindow?.close();\n      state.numberPaymentReviewMessage = 'The protected payment proof could not be opened.';\n      renderPaymentReview();\n    } finally {\n      if (button) button.disabled = false;\n    }\n  }\n\n  async function confirmSelectedAlipayPayment() {\n    const row = (state.numberPaymentWorkspace?.preview_requests || [])\n      .find((item) => item.payment_request_id === state.numberPaymentReviewSelection);\n    if (!row || state.numberPaymentReviewBusy || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentReviewBusy = true;\n    state.pendingNumberPaymentReviewRequestId ||= crypto.randomUUID();\n    refs.paymentReviewDialogMessage.textContent = 'Confirming payment and reconciling KoB Points\u2026';\n    renderPaymentReviewDialogAction();\n    try {\n      await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-review/alipay/confirm`, {\n        method: 'POST', body: JSON.stringify({\n          request_id: state.pendingNumberPaymentReviewRequestId,\n          payment_request_id: row.payment_request_id,\n          delivery_submission_id: row.delivery?.delivery_submission_id,\n          proof_upload_id: row.proof?.proof_upload_id,\n          payment_reference: refs.paymentReviewReference.value,\n          owner_note: refs.paymentReviewNote.value,\n          amount_confirmed: refs.paymentReviewAmountConfirm.checked,\n          remark_email_confirmed: refs.paymentReviewEmailConfirm.checked,\n        }),\n      });\n      state.pendingNumberPaymentReviewRequestId = null;\n      await Promise.all([refreshNumberPaymentWorkspace(), refreshShippingHandoff()]);\n      state.numberPaymentReviewMessage = `Payment for #${row.serial_label} is confirmed and its reserved KoB Points were consumed.`;\n      refs.paymentReviewDialog.close();\n    } catch (error) {\n      refs.paymentReviewDialogMessage.textContent = error.code === 'ownership_number_payment_recovery_required'\n        ? 'The operation stopped in a recoverable state. Close this dialog and use \u201CRecover safely\u201D; do not confirm it again.'\n        : `Payment was not confirmed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentReviewBusy = false;\n      renderPaymentReviewDialogAction();\n      renderPaymentReview();\n    }\n  }\n\n  async function recoverPaymentReview(reviewId) {\n    if (!reviewId || state.numberPaymentReviewBusy || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentReviewBusy = true;\n    state.numberPaymentReviewMessage = 'Checking the authoritative Shopify balance before recovery\u2026';\n    renderPaymentReview();\n    try {\n      await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-review/${encodeURIComponent(reviewId)}/recover`, {\n        method: 'POST', body: JSON.stringify({ request_id: crypto.randomUUID() }),\n      });\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentReviewMessage = 'Recovery completed. Payment and Points records now agree.';\n    } catch (error) {\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentReviewMessage = `Recovery stopped safely: ${error.code || 'request_failed'}. No second deduction was assumed.`;\n    } finally {\n      state.numberPaymentReviewBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function downloadPaymentDeliveryCsv() {\n    if (typeof config.allocationAssetApi !== 'function') return;\n    refs.paymentExport.disabled = true;\n    try {\n      const blob = await config.allocationAssetApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-delivery-export?format=csv`);\n      const objectUrl = URL.createObjectURL(blob);\n      const link = document.createElement('a');\n      link.href = objectUrl;\n      link.download = `kob-${config.campaign_id}-delivery.csv`;\n      link.click();\n      setTimeout(() => URL.revokeObjectURL(objectUrl), 10000);\n      state.numberPaymentReviewMessage = 'Private UTF-8 delivery CSV downloaded. It contains the current saved address version only.';\n    } catch (error) {\n      state.numberPaymentReviewMessage = `Delivery export failed: ${error.code || 'request_failed'}.`;\n    }\n    renderPaymentReview();\n  }\n\n  async function uploadNumberPaymentAsset() {\n    if (state.numberPaymentBusy || !refs.numberPaymentAssetFile?.files?.length\n      || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.pendingNumberPaymentAssetRequestId ||= crypto.randomUUID();\n    renderNumberPaymentPolicy();\n    try {\n      const form = new FormData();\n      form.set('request_id', state.pendingNumberPaymentAssetRequestId);\n      form.set('file', refs.numberPaymentAssetFile.files[0]);\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-asset/alipay`, {\n        method: 'POST', body: form,\n      });\n      state.pendingNumberPaymentAssetRequestId = null;\n      refs.numberPaymentAssetFile.value = '';\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentMessage = `Protected Alipay QR v${response.asset.version} stored. It is not a public theme asset.`;\n    } catch (error) {\n      state.numberPaymentMessage = `Alipay QR was not stored: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function previewNumberPaymentBatch() {\n    if (state.numberPaymentBusy || (typeof config.allocationApi !== 'function' && !config.demo_number_payment_preview)) return;\n    state.numberPaymentBusy = true;\n    state.numberPaymentBatchPreview = null;\n    state.numberPaymentBatchPreviewToken = null;\n    renderNumberPaymentPolicy();\n    try {\n      const response = config.demo_number_payment_preview\n        ? { preview: demoNumberPaymentPreview, preview_token: 'DEMO-PREVIEW-TOKEN' }\n        : await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-batch/preview`, {\n          method: 'POST', body: JSON.stringify({}),\n        });\n      state.numberPaymentBatchPreview = response.preview;\n      state.numberPaymentBatchPreviewToken = response.preview_token;\n      state.numberPaymentMessage = response.preview.blockers.length\n        ? `Payment batch preview found ${response.preview.blockers.length} blocker(s). No data was written.`\n        : 'Payment batch preview passed using current Points and one fresh release-wide RMB rate. No data was written.';\n      requestAnimationFrame(() => refs.numberPaymentBatchPanel?.scrollIntoView({ block: 'nearest', behavior: 'smooth' }));\n    } catch (error) {\n      state.numberPaymentMessage = `Payment batch preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function prepareNumberPaymentBatch() {\n    if (state.numberPaymentBusy || !state.numberPaymentBatchPreview || !state.numberPaymentBatchPreviewToken\n      || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.pendingNumberPaymentBatchRequestId ||= crypto.randomUUID();\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-batch/prepare`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberPaymentBatchRequestId,\n          preview: state.numberPaymentBatchPreview, preview_token: state.numberPaymentBatchPreviewToken }),\n      });\n      state.pendingNumberPaymentBatchRequestId = null;\n      state.numberPaymentBatchPreview = null;\n      state.numberPaymentBatchPreviewToken = null;\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentMessage = `Reviewed payment draft ${response.payment_batch.batch_hash} prepared. No Points, order or email action ran.`;\n    } catch (error) {\n      state.numberPaymentMessage = `Reviewed payment draft was not prepared: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function freezeNumberPaymentBatch() {\n    const batch = state.numberPaymentWorkspace?.batch;\n    if (state.numberPaymentBusy || batch?.status !== 'reviewed_draft'\n      || !refs.numberPaymentBatchFreezeConfirm?.checked || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.pendingNumberPaymentBatchFreezeRequestId ||= crypto.randomUUID();\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-batch/freeze`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberPaymentBatchFreezeRequestId,\n          expected_batch_hash: batch.batch_hash, confirm_freeze: true }),\n      });\n      state.pendingNumberPaymentBatchFreezeRequestId = null;\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentMessage = `${response.payment_batch.request_count} Points reservations are frozen. No Points were deducted and payment remains closed.`;\n    } catch (error) {\n      state.numberPaymentMessage = `Payment batch was not frozen: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function previewNumberPaymentOpening() {\n    const batch = state.numberPaymentWorkspace?.batch;\n    const opensAt = jstInputToIso(refs.numberPaymentOpensAt?.value);\n    if (state.numberPaymentBusy || batch?.status !== 'frozen' || !opensAt\n      || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.numberPaymentOpeningPreview = null;\n    state.numberPaymentOpeningPreviewToken = null;\n    state.numberPaymentOpeningPreviewHash = '';\n    state.numberPaymentEmailReviewedOpeningHash = '';\n    state.numberPaymentEmailMessage = '';\n    if (refs.numberPaymentEmailResult) refs.numberPaymentEmailResult.hidden = true;\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-opening/preview`, {\n        method: 'POST', body: JSON.stringify({ opens_at: opensAt }),\n      });\n      state.numberPaymentOpeningPreview = response.preview;\n      state.numberPaymentOpeningPreviewToken = response.preview_token;\n      state.numberPaymentOpeningPreviewHash = response.preview_hash;\n      state.numberPaymentOpeningMessage = `Preview ready: opens ${formatJst(response.preview.opens_at)}; shared deadline ${formatJst(response.preview.payment_deadline_at)}. No data was written.`;\n    } catch (error) {\n      state.numberPaymentOpeningMessage = `Opening preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function previewNumberPaymentEmail() {\n    if (state.numberPaymentBusy || !refs.numberPaymentEmailRequest?.value\n      || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.numberPaymentEmailMessage = '';\n    if (refs.numberPaymentEmailResult) refs.numberPaymentEmailResult.hidden = true;\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-email/preview`, {\n        method: 'POST', body: JSON.stringify({\n          payment_request_id: refs.numberPaymentEmailRequest.value,\n          ...(state.numberPaymentWorkspace?.batch?.status === 'frozen' ? {\n            opening_preview: state.numberPaymentOpeningPreview,\n            opening_preview_token: state.numberPaymentOpeningPreviewToken,\n          } : {}),\n        }),\n      });\n      if (refs.numberPaymentEmailSubject) refs.numberPaymentEmailSubject.textContent = response.email.subject;\n      if (refs.numberPaymentEmailFrame) refs.numberPaymentEmailFrame.srcdoc = response.email.html;\n      if (refs.numberPaymentEmailResult) refs.numberPaymentEmailResult.hidden = false;\n      state.numberPaymentEmailReviewedOpeningHash = state.numberPaymentOpeningPreviewHash\n        || state.numberPaymentWorkspace?.batch?.batch_hash || '';\n      state.numberPaymentEmailMessage = 'Actual trilingual email rendered from the frozen request. No email was sent.';\n    } catch (error) {\n      state.numberPaymentEmailMessage = `Email preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  const maskPaymentPreviewEmail = (value) => {\n    const email = String(value || '').trim().toLowerCase();\n    const at = email.indexOf('@');\n    if (at < 1) return 'KoB account';\n    const local = email.slice(0, at);\n    return `${local.slice(0, Math.min(2, local.length))}***${email.slice(at)}`;\n  };\n\n  const paymentPreviewQrDataUrl = () => `data:image/svg+xml;charset=utf-8,${encodeURIComponent(`\n    <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 360 360\">\n      <rect width=\"360\" height=\"360\" fill=\"#fff\"/><g fill=\"#17263a\">\n      <path d=\"M24 24h104v104H24zm20 20v64h64V44zm188-20h104v104H232zm20 20v64h64V44zM24 232h104v104H24zm20 20v64h64v-64z\"/>\n      <path d=\"M156 24h24v24h-24zm48 0h20v44h-20zm-52 48h44v20h-44zm12 40h20v44h-20zm40-20h20v64h-20zm-52 88h24v24h-24zm48-16h24v24h-24zm40 0h20v40h-20zm40 0h56v20h-56zm-128 56h44v20h-44zm64-8h20v44h-20zm40 0h24v24h-24zm48 0h32v20h-32zm-148 48h20v76h-20zm40 16h24v24h-24zm40-16h20v76h-20zm40 0h60v20h-60zm16 40h44v20h-44zm-16 36h60v20h-60z\"/>\n      </g><text x=\"180\" y=\"348\" text-anchor=\"middle\" font-family=\"Arial,sans-serif\" font-size=\"12\" fill=\"#647084\">OWNER PREVIEW \u00B7 QR POSITION</text>\n    </svg>`)}`;\n\n  const blobToDataUrl = (blob) => new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.addEventListener('load', () => resolve(String(reader.result || '')), { once: true });\n    reader.addEventListener('error', () => reject(new Error('payment_qr_decode_failed')), { once: true });\n    reader.readAsDataURL(blob);\n  });\n\n  const replaceNumberPaymentPreviewFrame = (srcdoc) => {\n    const current = refs.numberPaymentPageFrame;\n    if (!current) return null;\n    const replacement = current.cloneNode(false);\n    current.replaceWith(replacement);\n    refs.numberPaymentPageFrame = replacement;\n    // Assign srcdoc only after the replacement iframe is connected. Chromium\n    // usually accepts a pre-insertion assignment, but some embedded/mobile\n    // browser paths discard that navigation and leave an apparently successful\n    // preview as a blank frame.\n    replacement.srcdoc = srcdoc;\n    return replacement;\n  };\n\n  async function previewNumberPaymentPage() {\n    const requestId = refs.numberPaymentEmailRequest?.value;\n    const workspace = state.numberPaymentWorkspace || {};\n    const request = (workspace.preview_requests || []).find((row) => row.payment_request_id === requestId);\n    const opening = workspace.batch?.status === 'payment_open' ? {\n      opens_at: workspace.batch.opened_at, payment_deadline_at: workspace.batch.payment_deadline_at,\n    } : state.numberPaymentOpeningPreview;\n    if (state.numberPaymentBusy || !request || !opening?.payment_deadline_at || !refs.numberPaymentPageFrame) return;\n    state.numberPaymentBusy = true;\n    state.numberPaymentEmailMessage = '';\n    if (refs.numberPaymentPageResult) refs.numberPaymentPageResult.hidden = true;\n    renderNumberPaymentPolicy();\n    try {\n      const locale = ['zh', 'ja'].includes(refs.numberPaymentPageLocale?.value)\n        ? refs.numberPaymentPageLocale.value : 'en';\n      const localePrefix = locale === 'zh' ? '/zh' : locale === 'ja' ? '/ja' : '';\n      const shellUrl = config.demo_number_payment_preview\n        ? new URL('../ownership-number-payment/index.html', location.href)\n        : new URL(`${localePrefix}/pages/kob-number-payment?campaign_id=${encodeURIComponent(config.campaign_id)}&owner_preview_shell=1`, location.origin);\n      if (config.demo_number_payment_preview) {\n        shellUrl.searchParams.set('locale', locale);\n      }\n      const response = await fetch(shellUrl, { credentials: 'same-origin', cache: 'no-store' });\n      if (!response.ok) throw new Error(`payment_page_shell_${response.status}`);\n      const shell = new DOMParser().parseFromString(await response.text(), 'text/html');\n      const paymentRoot = shell.querySelector('[data-kob-number-payment]');\n      const cssNode = shell.querySelector('link[href*=\"kob-number-payment.css\"]');\n      const localizationNode = shell.querySelector('script[src*=\"kob-number-payment-localization.js\"]');\n      const paymentNode = shell.querySelector('script[src*=\"kob-number-payment.js\"]');\n      if (!paymentRoot || !cssNode || !localizationNode || !paymentNode) throw new Error('payment_page_shell_invalid');\n      const members = new Map((state.numberWorkspace?.entitlement?.members || [])\n        .map((member) => [member.collector_id, member]));\n      const identity = members.get(request.collector_id)?.identity || {};\n      const mode = workspace.batch?.mode || workspace.policy?.mode || 'alipay_primary_shopify_fallback';\n      let previewQr = paymentPreviewQrDataUrl();\n      let usesProtectedQr = false;\n      if (mode !== 'shopify_only' && !config.demo_number_payment_preview) {\n        if (typeof config.allocationAssetApi !== 'function') throw new Error('payment_qr_preview_unavailable');\n        const qrBlob = await config.allocationAssetApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-asset/alipay`);\n        previewQr = await blobToDataUrl(qrBlob);\n        usesProtectedQr = true;\n      }\n      const payload = {\n        ok: true, state: 'open',\n        campaign: { campaign_id: config.campaign_id,\n          title: config.release_title || root.querySelector('[data-oap-release-title]')?.textContent?.trim() || config.campaign_id },\n        identity: { email_masked: maskPaymentPreviewEmail(identity.email) },\n        delivery: request.delivery || null,\n        proof: request.proof ? { ...request.proof, uploaded: true } : null,\n        payment: {\n          serial_label: request.serial_label, total_jpy: Number(request.total_jpy),\n          payable_rmb_minor: request.payable_rmb_minor == null ? null : Number(request.payable_rmb_minor),\n          points_cost: Number(request.points_cost), mode,\n          active_channel: mode === 'shopify_only' ? 'shopify' : 'alipay', status: 'awaiting_payment',\n          opened_at: opening.opens_at, payment_deadline_at: opening.payment_deadline_at,\n          shopify_invoice_url: null, alipay_qr_available: mode !== 'shopify_only',\n        },\n      };\n      paymentRoot.dataset.preview = 'true';\n      paymentRoot.dataset.previewQr = previewQr;\n      const qrNode = paymentRoot.querySelector('[data-kob-np-qr]');\n      if (qrNode) {\n        qrNode.setAttribute('src', previewQr);\n        qrNode.setAttribute('alt', 'Protected Alipay business payment QR code');\n      }\n      paymentRoot.querySelector('[data-kob-np-preview]')?.remove();\n      const payloadNode = shell.createElement('script');\n      payloadNode.type = 'application/json';\n      payloadNode.dataset.kobNpPreview = '';\n      payloadNode.textContent = JSON.stringify(payload).replaceAll('<', '\\\\u003c');\n      paymentRoot.prepend(payloadNode);\n      const absolute = (value) => new URL(value, shellUrl).href;\n      const lang = locale === 'zh' ? 'zh-CN' : locale;\n      replaceNumberPaymentPreviewFrame(`<!doctype html><html lang=\"${lang}\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><base href=\"${shellUrl.origin}/\"><link rel=\"stylesheet\" href=\"${absolute(cssNode.getAttribute('href'))}\"><style>body{margin:0}.kob-owner-preview-banner{padding:10px 18px;background:#15243a;color:#fff;font:700 11px/1.4 Arial,sans-serif;letter-spacing:.12em;text-align:center;text-transform:uppercase}</style></head><body><div class=\"kob-owner-preview-banner\">Preview mode \u00B7 payment disabled</div>${paymentRoot.outerHTML}<script src=\"${absolute(localizationNode.getAttribute('src'))}\"><\\/script><script src=\"${absolute(paymentNode.getAttribute('src'))}\"><\\/script></body></html>`);\n      if (refs.numberPaymentPageFrameShell) refs.numberPaymentPageFrameShell.dataset.viewport\n        = refs.numberPaymentPageViewport?.value === 'mobile' ? 'mobile' : 'desktop';\n      if (refs.numberPaymentPageStatus) refs.numberPaymentPageStatus.textContent\n        = `${config.demo_number_payment_preview ? 'Demo \u00B7 ' : ''}#${request.serial_label} \u00B7 ${locale === 'zh' ? '\u7B80\u4F53\u4E2D\u6587' : locale === 'ja' ? '\u65E5\u672C\u8A9E' : 'English'} \u00B7 ${usesProtectedQr ? `protected QR v${workspace.alipay_asset?.version || '?'}` : 'QR position preview'} \u00B7 no writes`;\n      if (refs.numberPaymentPageResult) refs.numberPaymentPageResult.hidden = false;\n      state.numberPaymentEmailMessage = usesProtectedQr\n        ? 'Collector payment page rendered with the protected QR. Every payment action remains disabled or simulated.'\n        : 'Collector payment page rendered from the frozen request. The QR is a safe position preview and every payment action is disabled or simulated.';\n      requestAnimationFrame(() => refs.numberPaymentPageResult?.scrollIntoView({ block: 'nearest', behavior: 'smooth' }));\n    } catch (error) {\n      state.numberPaymentEmailMessage = `Payment page preview failed: ${error.message || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function openNumberPaymentBatch() {\n    const batch = state.numberPaymentWorkspace?.batch;\n    if (state.numberPaymentBusy || batch?.status !== 'frozen' || !state.numberPaymentOpeningPreview\n      || !state.numberPaymentOpeningPreviewToken || !refs.numberPaymentOpenConfirm?.checked\n      || state.numberPaymentEmailReviewedOpeningHash !== state.numberPaymentOpeningPreviewHash\n      || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.pendingNumberPaymentOpenRequestId ||= crypto.randomUUID();\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-batch/open`, {\n        method: 'POST', body: JSON.stringify({\n          request_id: state.pendingNumberPaymentOpenRequestId,\n          opening_preview: state.numberPaymentOpeningPreview,\n          opening_preview_token: state.numberPaymentOpeningPreviewToken,\n          confirm_open: true,\n        }),\n      });\n      state.pendingNumberPaymentOpenRequestId = null;\n      state.numberPaymentOpeningPreview = null;\n      state.numberPaymentOpeningPreviewToken = null;\n      state.numberPaymentOpeningPreviewHash = '';\n      await refreshNumberPaymentWorkspace();\n      state.numberPaymentMessage = `Payment opens ${formatJst(response.payment_batch.opens_at)}. ${response.payment_batch.email_job_count} result emails are queued for that time; deadline ${formatJst(response.payment_batch.payment_deadline_at)}.`;\n    } catch (error) {\n      state.numberPaymentMessage = `Payment was not opened: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function previewNumberPaymentPolicy() {\n    if (state.numberPaymentBusy || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.numberPaymentMessage = '';\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-policy/preview`, {\n        method: 'POST', body: JSON.stringify(numberPaymentPolicyInput()),\n      });\n      state.numberPaymentPolicyPreview = response.preview;\n      state.numberPaymentMessage = 'Payment settings check passed. No exchange rate was fetched and no Points, payment request, order or email was created.';\n    } catch (error) {\n      state.numberPaymentPolicyPreview = null;\n      state.numberPaymentMessage = `Payment settings check failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  async function saveNumberPaymentPolicy() {\n    if (state.numberPaymentBusy || !state.numberPaymentPolicyPreview || typeof config.allocationApi !== 'function') return;\n    state.numberPaymentBusy = true;\n    state.pendingNumberPaymentPolicyRequestId ||= crypto.randomUUID();\n    renderNumberPaymentPolicy();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-payment-policy`, {\n        method: 'POST', body: JSON.stringify({\n          ...numberPaymentPolicyInput(), request_id: state.pendingNumberPaymentPolicyRequestId,\n        }),\n      });\n      state.numberPaymentWorkspace = { ...(state.numberPaymentWorkspace || {}), policy: response.policy };\n      state.pendingNumberPaymentPolicyRequestId = null;\n      state.numberPaymentPolicyPreview = null;\n      state.numberPaymentMessage = `Payment policy v${response.policy.revision} saved. No FX, Points, payment, order or email action was run.`;\n    } catch (error) {\n      state.numberPaymentMessage = `Payment policy was not saved: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberPaymentBusy = false;\n      renderNumberPaymentPolicy();\n    }\n  }\n\n  function renderNumberOwnerPreview() {\n    if (!refs.numberOwnerPreview) return;\n    const members = state.numberWorkspace?.entitlement?.members || [];\n    const available = Boolean(state.numberChoiceWindow && state.numberWorkspace?.manifest?.status === 'locked' && members.length);\n    refs.numberOwnerPreview.hidden = !available;\n    if (!available) return;\n    const selected = refs.numberPreviewCollector.value;\n    refs.numberPreviewCollector.innerHTML = members.map((member, index) => `<option value=\"${escapeHtml(member.collector_id)}\">${escapeHtml(member.source_audit_code || `Collector ${String(index + 1).padStart(2, '0')}`)}</option>`).join('');\n    if (members.some((member) => member.collector_id === selected)) refs.numberPreviewCollector.value = selected;\n    refs.numberPreviewCollector.disabled = state.numberOwnerPreviewBusy;\n    refs.numberPreviewLocale.disabled = state.numberOwnerPreviewBusy;\n    refs.numberPreviewActual.disabled = state.numberOwnerPreviewBusy || typeof config.allocationApi !== 'function';\n    refs.numberPreviewActual.textContent = state.numberOwnerPreviewBusy ? 'Loading actual data\u2026' : 'Preview actual page';\n    refs.numberPreviewMessage.textContent = state.numberOwnerPreviewMessage\n      || 'No Collector choice, email, Points, inventory, number allocation or order is changed by this preview.';\n  }\n\n  async function previewActualNumberChoice() {\n    if (state.numberOwnerPreviewBusy || typeof config.allocationApi !== 'function') return;\n    const collectorId = refs.numberPreviewCollector?.value;\n    if (!collectorId) return;\n    state.numberOwnerPreviewBusy = true;\n    state.numberOwnerPreviewMessage = '';\n    renderNumberOwnerPreview();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-window/collector-preview`, {\n        method: 'POST', body: JSON.stringify({ collector_id: collectorId }),\n      });\n      sessionStorage.setItem('kob-owner-number-choice-preview-v1', JSON.stringify({\n        version: 1,\n        campaignId: config.campaign_id,\n        createdAt: Date.now(),\n        returnTo: `${location.pathname}${location.search}`,\n        payload: response,\n      }));\n      const locale = refs.numberPreviewLocale?.value || 'en';\n      const prefix = locale === 'zh-CN' ? '/zh' : locale === 'ja' ? '/ja' : '';\n      const target = new URL(`${prefix}/pages/kob-number-choice`, location.origin);\n      target.searchParams.set('campaign_id', config.campaign_id);\n      target.searchParams.set('owner_preview', '1');\n      location.assign(target.toString());\n    } catch (error) {\n      state.numberOwnerPreviewMessage = `The protected preview could not be opened: ${error.code || 'request_failed'}.`;\n      state.numberOwnerPreviewBusy = false;\n      renderNumberOwnerPreview();\n    }\n  }\n\n  const numberChoicePayload = () => ({\n    base_price_jpy: Number(refs.numberBasePrice.value),\n    special_bid_label: [...state.numberSpecialBidLabels][0] || null,\n    bid_increment_jpy: state.numberSpecialBidLabels.size ? Number(refs.numberBidIncrement.value) : null,\n    opens_at: jstInputToIso(refs.numberChoiceOpens.value),\n    closes_at: jstInputToIso(refs.numberChoiceCloses.value),\n  });\n\n  function renderNumberWorkspace() {\n    if (!refs.numberWorkspace) return;\n    const workspace = state.numberWorkspace;\n    const entitlement = workspace?.entitlement;\n    if (!entitlement) {\n      refs.numberState.textContent = 'Not ready';\n      refs.numberMessage.textContent = state.numberMessage || 'Finalize the purchase allocation and public draw before preparing numbers.';\n      refs.numberPreviewButton.disabled = true;\n      refs.numberSave.disabled = true;\n      refs.numberLock.disabled = true;\n      refs.numberResetManifest.disabled = true;\n      refs.numberLabels.disabled = true;\n      refs.numberSpecialBidLabel.disabled = true;\n      refs.numberSpecialBidInterest.disabled = true;\n      refs.numberAddManual.disabled = true;\n      return;\n    }\n    refs.numberState.textContent = workspace.manifest?.status === 'locked' ? 'Locked'\n      : workspace.manifest ? `Reviewed draft v${workspace.manifest.revision}`\n        : entitlement.frozen ? 'Entitlement frozen' : 'Ready to preview';\n    refs.numberEntitlementMetrics.innerHTML = [\n      ['Final allocation', entitlement.count],\n      ['Guaranteed', entitlement.accepted_guaranteed_count],\n      ['Draw winners', entitlement.public_draw_winner_count],\n      ['Observation', entitlement.frozen ? 'Frozen' : 'Preview only'],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('');\n    refs.numberMemberCount.textContent = String(entitlement.count || 0);\n    refs.numberMembers.innerHTML = (entitlement.members || []).map((member, index) => `\n      <div><span>${String(index + 1).padStart(2, '0')}</span><strong>${escapeHtml(member.identity?.display_name || member.source_audit_code || 'Collector')}</strong><small>${escapeHtml(member.allocation_source === 'public_draw_winner' ? 'Public draw winner' : 'Accepted guaranteed')} \u00B7 ${money.format(Number(member.points_cost || 0))} Points</small></div>\n    `).join('');\n    if (refs.numberLabels.value !== state.numberLabels.join('\\n')) refs.numberLabels.value = state.numberLabels.join('\\n');\n    refs.numberLabels.disabled = state.numberBusy || workspace.manifest?.status === 'locked';\n    refs.numberLocks.innerHTML = state.numberLabels.map((label) => `\n      <label><input type=\"checkbox\" data-oap-number-lock=\"${escapeHtml(label)}\" ${state.numberLockedLabels.has(label) ? 'checked' : ''} ${state.numberBusy || workspace.manifest?.status === 'locked' ? 'disabled' : ''}><span>${escapeHtml(label)}</span></label>\n    `).join('');\n    const selectedSpecialBidLabel = [...state.numberSpecialBidLabels][0] || '';\n    refs.numberSpecialBidLabel.innerHTML = `<option value=\"\">No sealed bid for this release</option>${state.numberLabels.map((label) => `<option value=\"${escapeHtml(label)}\" ${selectedSpecialBidLabel === label ? 'selected' : ''}>#${escapeHtml(label)}</option>`).join('')}`;\n    refs.numberSpecialBidLabel.disabled = state.numberBusy || workspace.manifest?.status === 'locked';\n    refs.numberSpecialBidInterest.checked = Boolean(selectedSpecialBidLabel && state.numberHighInterestLabels.has(selectedSpecialBidLabel));\n    refs.numberSpecialBidInterest.disabled = state.numberBusy || !selectedSpecialBidLabel || workspace.manifest?.status === 'locked';\n    const members = entitlement.members || [];\n    refs.numberManualRows.innerHTML = state.numberManualAssignments.map((row, index) => `\n      <div class=\"oap__number-manual-row\" data-oap-number-manual-row=\"${index}\">\n        <label><span>Label</span><select data-oap-number-manual-label><option value=\"\">Choose</option>${state.numberLabels.map((label) => `<option value=\"${escapeHtml(label)}\" ${row.label === label ? 'selected' : ''}>${escapeHtml(label)}</option>`).join('')}</select></label>\n        <label><span>Collector</span><select data-oap-number-manual-collector><option value=\"\">Choose</option>${members.map((member) => `<option value=\"${escapeHtml(member.collector_id)}\" ${row.collector_id === member.collector_id ? 'selected' : ''}>${escapeHtml(member.identity?.display_name || member.source_audit_code)}</option>`).join('')}</select></label>\n        <button type=\"button\" data-oap-number-remove-manual=\"${index}\">Remove</button>\n      </div>\n    `).join('') || '<p class=\"oap__number-empty\">No manual assignment. The algorithm remains authoritative.</p>';\n    refs.numberAddManual.disabled = state.numberBusy || workspace.manifest?.status === 'locked';\n    refs.numberResetManifest.disabled = state.numberBusy || workspace.manifest?.status === 'locked';\n    refs.numberPreviewButton.disabled = state.numberBusy || workspace.manifest?.status === 'locked';\n    refs.numberMessage.textContent = state.numberMessage || (state.numberPreview ? 'Preview is current. Review all blockers and guarantees before saving.' : 'Run a preview after every manifest or Owner-control change.');\n    const preview = state.numberPreview;\n    refs.numberPreviewMetrics.innerHTML = preview ? [\n      ['Offered labels', preview.available_count], ['Locked', preview.locked_count],\n      ['Manual', preview.manual_assigned_count], ['Special bid', preview.special_bid_count || 0], ['Guaranteed numbers', preview.guarantee_count],\n      ['Guaranteed Collectors', preview.guarantee_collector_count ?? preview.guarantee_count],\n      ['Multiple options', preview.multi_guarantee_collector_count || 0],\n      ['No history', preview.zero_history_count], ['Blockers', preview.blockers?.length || 0],\n    ].map(([label, value]) => `<div><span>${escapeHtml(label)}</span><strong>${escapeHtml(value)}</strong></div>`).join('') : '';\n    const multipleOptions = (preview?.multi_guarantee_collectors || []).map((entry) => {\n      const identity = entry.identity || members.find((member) => member.collector_id === entry.collector_id)?.identity;\n      return `<div class=\"oap__number-preview-row\" data-state=\"multiple_options\"><strong>${escapeHtml((entry.labels || []).join(' / '))}</strong><span>${escapeHtml(identity?.display_name || 'Collector')} \u00B7 chooses one guaranteed number</span><small>All unselected candidates return to ordinary preferences. This does not block saving.</small></div>`;\n    }).join('');\n    refs.numberPreviewList.innerHTML = preview ? `${multipleOptions}${(preview.numbers || []).map((row) => {\n      const identity = row.guarantee_identity || members.find((member) => member.collector_id === row.guarantee_collector_id)?.identity;\n      const status = row.state === 'locked' ? 'Owner locked' : row.state === 'manual_assigned' ? 'Manual assignment'\n        : row.guarantee_status === 'special_bid' ? 'Sealed JPY special bid'\n        : row.guarantee_status === 'guaranteed' ? `Guaranteed \u00B7 ${identity?.display_name || 'Collector'}`\n          : row.guarantee_status === 'tied_dominant' ? 'Tie at the boundary' : row.guarantee_status === 'no_history' ? 'No ownership history' : 'Preference stage';\n      return `<div class=\"oap__number-preview-row\" data-state=\"${escapeHtml(row.guarantee_status || row.state)}\"><strong>${escapeHtml(row.label)}</strong><span>${escapeHtml(status)}</span><small>N=${Number(row.N || 0)} \u00B7 dominant ${Number(row.dominant_n || 0)}/${Number(row.N || 0)} \u00B7 ${(Number(row.dominant_share_bps || 0) / 100).toFixed(0)}%</small>${row.metadata?.high_interest ? `<em>${row.metadata?.allocation_mode === 'special_bid' ? 'High interest \u00B7 special bid' : 'High interest notice'}</em>` : ''}</div>`;\n    }).join('')}` : '';\n    const canSave = preview && !(preview.blockers?.length) && typeof config.allocationApi === 'function' && workspace.manifest?.status !== 'locked';\n    refs.numberSave.disabled = state.numberBusy || !canSave;\n    refs.numberLockConfirm.disabled = state.numberBusy || workspace.manifest?.status === 'locked' || workspace.manifest?.status !== 'reviewed_draft';\n    refs.numberLock.disabled = state.numberBusy || workspace.manifest?.status !== 'reviewed_draft' || !refs.numberLockConfirm.checked;\n    renderNumberChoiceConfig();\n  }\n\n  async function previewNumberAllocation() {\n    if (state.numberBusy) return;\n    state.numberBusy = true;\n    state.numberMessage = 'Calculating Scheme C from the authoritative final pool.';\n    renderNumberWorkspace();\n    try {\n      if (typeof config.allocationApi === 'function') {\n        const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-allocation/preview`, {\n          method: 'POST', body: JSON.stringify(numberManifestPayload()),\n        });\n        state.numberPreview = response.preview;\n      } else {\n        state.numberPreview = currentDemoNumberPreview();\n      }\n      state.numberMessage = state.numberPreview.blockers?.length\n        ? `${state.numberPreview.blockers.length} blocking issue(s) must be resolved before saving.`\n        : 'Scheme C preview passed. No number has been assigned and no Collector window has been opened.';\n    } catch (error) {\n      state.numberMessage = `Preview could not be completed: ${error.code || 'request_failed'}.`;\n      state.numberPreview = null;\n    } finally {\n      state.numberBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  async function saveNumberAllocationDraft() {\n    if (state.numberBusy || !state.numberPreview || state.numberPreview.blockers?.length || typeof config.allocationApi !== 'function') return;\n    state.numberBusy = true;\n    state.numberMessage = 'Saving the reviewed setup and freezing its entitlement observation.';\n    state.pendingNumberSaveRequestId ||= crypto.randomUUID();\n    renderNumberWorkspace();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-allocation/draft`, {\n        method: 'POST', body: JSON.stringify({ ...numberManifestPayload(), request_id: state.pendingNumberSaveRequestId }),\n      });\n      state.numberWorkspace = response.number_allocation;\n      state.numberPreview = response.number_allocation.manifest?.preview || null;\n      state.pendingNumberSaveRequestId = null;\n      state.numberMessage = 'Reviewed setup saved. The entitlement and ownership observation are now frozen; Collector choices are still closed.';\n    } catch (error) {\n      state.numberMessage = `Setup was not saved: ${error.code || 'request_failed'}. The same request can be retried safely.`;\n    } finally {\n      state.numberBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  async function lockNumberAllocationManifest() {\n    const manifest = state.numberWorkspace?.manifest;\n    if (!manifest || manifest.status !== 'reviewed_draft' || !refs.numberLockConfirm.checked || state.numberLockBusy) return;\n    if (typeof config.allocationApi !== 'function') {\n      manifest.status = 'locked';\n      manifest.locked_at = new Date().toISOString();\n      state.numberMessage = 'Local demo manifest locked. No remote data was changed.';\n      renderNumberWorkspace();\n      return;\n    }\n    state.numberLockBusy = true;\n    state.numberBusy = true;\n    state.numberMessage = 'Locking the reviewed manifest. No Collector window is being opened.';\n    state.pendingNumberLockRequestId ||= crypto.randomUUID();\n    renderNumberWorkspace();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-allocation/lock`, {\n        method: 'POST', body: JSON.stringify({ request_id: state.pendingNumberLockRequestId,\n          manifest_id: manifest.manifest_id, revision: manifest.revision, manifest_hash: manifest.manifest_hash }),\n      });\n      state.numberWorkspace = response.number_allocation;\n      state.numberPreview = response.number_allocation.manifest?.preview || null;\n      state.pendingNumberLockRequestId = null;\n      state.numberMessage = 'Manifest locked. Next, preview the Collector choice window.';\n    } catch (error) {\n      state.numberMessage = `Manifest was not locked: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberLockBusy = false;\n      state.numberBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  async function previewNumberChoiceWindow() {\n    if (state.numberChoiceBusy || state.numberWorkspace?.manifest?.status !== 'locked') return;\n    state.numberChoiceBusy = true;\n    state.numberChoicePreview = null;\n    renderNumberWorkspace();\n    try {\n      const payload = numberChoicePayload();\n      state.numberChoicePreview = typeof config.allocationApi === 'function'\n        ? (await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-window/preview`, { method: 'POST', body: JSON.stringify(payload) })).preview\n        : { ...payload, side_effects: 'preview_only' };\n    } catch (error) {\n      refs.numberChoiceMessage.textContent = `Choice preview failed: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberChoiceBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  async function saveNumberChoiceWindowDraft() {\n    if (state.numberChoiceBusy || !state.numberChoicePreview || typeof config.allocationApi !== 'function') return;\n    state.numberChoiceBusy = true;\n    state.pendingNumberChoiceRequestId ||= crypto.randomUUID();\n    renderNumberWorkspace();\n    try {\n      const existing = state.numberChoiceWindow;\n      const response = existing\n        ? await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-window/amend`, {\n          method: 'POST', body: JSON.stringify({\n            request_id: state.pendingNumberChoiceRequestId,\n            expected_revision: existing.revision || 1,\n            opens_at: jstInputToIso(refs.numberChoiceOpens.value),\n            closes_at: jstInputToIso(refs.numberChoiceCloses.value),\n            reason: 'Correct Owner-entered schedule to Japan Standard Time',\n          }),\n        })\n        : await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-window`, {\n          method: 'POST', body: JSON.stringify({ ...numberChoicePayload(), request_id: state.pendingNumberChoiceRequestId }),\n        });\n      state.numberChoiceWindow = response.window || state.numberChoiceWindow;\n      applyStoredNumberChoiceWindow(state.numberChoiceWindow);\n      state.pendingNumberChoiceRequestId = null;\n      state.numberChoicePreview = null;\n      refs.numberChoiceMessage.textContent = existing\n        ? `JST schedule correction saved as draft v${response.window?.revision || '?'}. Collector access remains closed.`\n        : `Choice-window draft saved (${response.window?.status || 'draft'}). Collector access remains closed.`;\n    } catch (error) {\n      refs.numberChoiceMessage.textContent = `Choice-window draft was not saved: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberChoiceBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  async function openNumberChoiceWindow() {\n    const existing = state.numberChoiceWindow;\n    if (state.numberChoiceBusy || !existing || existing.status !== 'draft'\n      || !refs.numberChoiceOpenConfirm?.checked || typeof config.allocationApi !== 'function') return;\n    state.numberChoiceBusy = true;\n    state.pendingNumberChoiceOpenRequestId ||= crypto.randomUUID();\n    renderNumberWorkspace();\n    try {\n      const response = await config.allocationApi(`/admin/campaigns/${encodeURIComponent(config.campaign_id)}/number-choice-window/open`, {\n        method: 'POST', body: JSON.stringify({\n          request_id: state.pendingNumberChoiceOpenRequestId,\n          expected_revision: existing.revision || 1,\n          confirm_open: true,\n        }),\n      });\n      state.numberChoiceWindow = response.window || state.numberChoiceWindow;\n      if (response.commitment) {\n        state.numberSettlementWorkspace = {\n          ...(state.numberSettlementWorkspace || {}),\n          window: state.numberChoiceWindow,\n          commitment: response.commitment,\n        };\n      }\n      state.pendingNumberChoiceOpenRequestId = null;\n      refs.numberChoiceOpenConfirm.checked = false;\n      refs.numberChoiceMessage.textContent = `Collector choices are ${state.numberChoiceWindow.status}. ${Number(state.numberChoiceWindow.email_job_count || 0)} email jobs are queued; automatic delivery begins at ${formatJst(state.numberChoiceWindow.opens_at)}. The deadline-derived Quicknet round is already fixed.`;\n    } catch (error) {\n      refs.numberChoiceMessage.textContent = `Collector choices were not opened: ${error.code || 'request_failed'}.`;\n    } finally {\n      state.numberChoiceBusy = false;\n      renderNumberWorkspace();\n    }\n  }\n\n  function render() {\n    renderCampaignControls();\n    renderDistribution();\n    const results = state.scenarios.map(simulate);\n    const active = results.find((result) => result.scenario.id === state.activeScenario) || results[0];\n    renderCompare(results);\n    renderTabs();\n    renderEditor(active);\n    renderCollectors(active);\n    renderApproval(active);\n    renderChoiceWindow();\n    renderSettlement();\n    renderNumberWorkspace();\n    renderNumberSettlement();\n    renderNumberPaymentPolicy();\n    save();\n  }\n\n  const markPlanEdited = () => {\n    state.pendingSaveRequestId = null;\n    state.pendingLockRequestId = null;\n    state.planMessage = '';\n  };\n\n  refs.tabs.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-oap-tab]');\n    if (!button) return;\n    markPlanEdited();\n    state.activeScenario = button.dataset.oapTab;\n    render();\n  });\n  refs.compare.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-oap-open]');\n    if (!button) return;\n    markPlanEdited();\n    state.activeScenario = button.dataset.oapOpen;\n    render();\n  });\n  refs.tierList.addEventListener('change', (event) => {\n    const field = event.target.closest('[data-oap-tier-field]');\n    if (!field) return;\n    const tier = activeScenario().tiers.find((item) => item.id === field.closest('[data-oap-tier]').dataset.oapTier);\n    if (!tier) return;\n    markPlanEdited();\n    const key = field.dataset.oapTierField;\n    const maximum = key === 'points' ? 1000000 : key === 'seats' ? state.playerCapacity : config.eligible_model_count;\n    tier[key] = key === 'name' ? field.value : Math.trunc(clamp(field.value, 0, maximum));\n    render();\n  });\n  refs.tierList.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-oap-remove-tier]');\n    if (!button) return;\n    markPlanEdited();\n    const scenario = activeScenario();\n    if (scenario.tiers.length <= 1) return;\n    scenario.tiers = scenario.tiers.filter((tier) => tier.id !== button.dataset.oapRemoveTier);\n    render();\n  });\n  root.querySelector('[data-oap-add-tier]').addEventListener('click', () => {\n    markPlanEdited();\n    activeScenario().tiers.push({ id: crypto.randomUUID(), name: `Tier ${activeScenario().tiers.length + 1}`, min: 0, max: 0, points: 0, seats: 0 });\n    render();\n  });\n  root.querySelector('[data-oap-reset]').addEventListener('click', () => {\n    markPlanEdited();\n    const index = state.scenarios.findIndex((scenario) => scenario.id === state.activeScenario);\n    state.scenarios[index] = cloneScenario(defaults[index]);\n    render();\n  });\n  root.querySelector('[data-oap-reset-all]').addEventListener('click', () => {\n    markPlanEdited();\n    state.scenarios = freshDefaults();\n    state.activeScenario = 'A';\n    render();\n  });\n  root.querySelector('[data-oap-copy]').addEventListener('click', () => {\n    markPlanEdited();\n    const source = activeScenario();\n    const targetId = source.id === 'A' ? 'B' : source.id === 'B' ? 'C' : 'A';\n    const targetIndex = state.scenarios.findIndex((scenario) => scenario.id === targetId);\n    state.scenarios[targetIndex] = { ...cloneScenario(source), id: targetId, name: `${source.name} copy` };\n    state.activeScenario = targetId;\n    render();\n  });\n  refs.filter.addEventListener('change', () => {\n    state.filter = refs.filter.value;\n    renderCollectors(simulate(activeScenario()));\n  });\n  refs.playerCapacity?.addEventListener('change', () => {\n    markPlanEdited();\n    state.playerCapacity = Math.trunc(clamp(refs.playerCapacity.value, 1, editionTotal));\n    render();\n  });\n  refs.saveDraft?.addEventListener('click', saveReviewedDraft);\n  refs.openLock?.addEventListener('click', openLockDialog);\n  refs.lockConfirmation?.addEventListener('change', () => {\n    refs.confirmLock.disabled = !refs.lockConfirmation.checked || state.planBusy;\n  });\n  refs.confirmLock?.addEventListener('click', confirmPlanLock);\n  refs.prepareChoice?.addEventListener('click', prepareChoiceWindow);\n  refs.previewResult?.addEventListener('click', previewActualResult);\n  refs.previewNudge?.addEventListener('click', previewHomepageNudge);\n  refs.homepageReminderType?.addEventListener('change', renderHomepageReminderFields);\n  refs.homepageReminderLocale?.addEventListener('change', renderHomepageReminderFields);\n  [refs.homepageReminderEnabled, refs.homepageReminderTitle, refs.homepageReminderBody,\n    refs.homepageReminderCta, refs.homepageReminderLater].filter(Boolean)\n    .forEach((field) => field.addEventListener('input', captureHomepageReminderFields));\n  refs.homepageReminderPreview?.addEventListener('click', previewConfiguredHomepageReminder);\n  refs.homepageReminderSave?.addEventListener('click', saveHomepageReminderPolicy);\n  refs.refreshSettlement?.addEventListener('click', loadSettlement);\n  refs.freezeConfirm?.addEventListener('change', renderSettlement);\n  refs.freeze?.addEventListener('click', freezeSettlement);\n  refs.saveDraw?.addEventListener('click', saveDrawSetup);\n  refs.drawLockConfirm?.addEventListener('change', renderSettlement);\n  refs.lockDraw?.addEventListener('click', lockDrawSetup);\n  refs.savePublicDraw?.addEventListener('click', savePublicDrawDraft);\n  refs.setPublicDrawTime?.addEventListener('click', setPublicDrawTimeFromNow);\n  refs.publicDrawCommitConfirm?.addEventListener('change', renderSettlement);\n  refs.commitPublicDraw?.addEventListener('click', commitPublicDrawEvent);\n  refs.publicDrawFinalizeConfirm?.addEventListener('change', renderSettlement);\n  refs.finalizePublicDraw?.addEventListener('click', finalizePublicDrawEvent);\n  refs.rehearsalConfirm?.addEventListener('change', renderRehearsal);\n  refs.setRehearsalTime?.addEventListener('click', setRehearsalTimeFromNow);\n  refs.createRehearsal?.addEventListener('click', createRehearsal);\n  refs.numberLabels?.addEventListener('change', () => {\n    state.numberLabels = refs.numberLabels.value.split(/[\\n,]+/).map((value) => value.trim()).filter(Boolean);\n    state.numberLockedLabels = new Set([...state.numberLockedLabels].filter((label) => state.numberLabels.includes(label)));\n    state.numberHighInterestLabels = new Set([...state.numberHighInterestLabels].filter((label) => state.numberLabels.includes(label)));\n    state.numberSpecialBidLabels = new Set([...state.numberSpecialBidLabels].filter((label) => state.numberLabels.includes(label)));\n    state.numberManualAssignments = state.numberManualAssignments.filter((row) => state.numberLabels.includes(row.label));\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberResetManifest?.addEventListener('click', () => {\n    const suggested = state.numberWorkspace.suggested_manifest || {};\n    state.numberLabels = [...(suggested.labels || [])];\n    state.numberLockedLabels = new Set(suggested.locked_labels || []);\n    state.numberHighInterestLabels = new Set(suggested.high_interest_labels || []);\n    state.numberSpecialBidLabels = new Set(suggested.special_bid_labels || []);\n    state.numberManualAssignments = [...(suggested.manual_assignments || [])];\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberLocks?.addEventListener('change', (event) => {\n    const input = event.target.closest('[data-oap-number-lock]');\n    if (!input) return;\n    if (input.checked) state.numberLockedLabels.add(input.dataset.oapNumberLock);\n    else state.numberLockedLabels.delete(input.dataset.oapNumberLock);\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberSpecialBidLabel?.addEventListener('change', () => {\n    const previous = [...state.numberSpecialBidLabels][0] || '';\n    const selected = refs.numberSpecialBidLabel.value;\n    state.numberSpecialBidLabels = new Set(selected ? [selected] : []);\n    if (previous && previous !== selected) state.numberHighInterestLabels.delete(previous);\n    if (selected) {\n      state.numberHighInterestLabels.add(selected);\n      state.numberLockedLabels.delete(selected);\n      state.numberManualAssignments = state.numberManualAssignments.filter((row) => row.label !== selected);\n    }\n    markNumberEdited();\n    state.numberChoicePreview = null;\n    renderNumberWorkspace();\n  });\n  refs.numberSpecialBidInterest?.addEventListener('change', () => {\n    const selected = [...state.numberSpecialBidLabels][0] || '';\n    if (!selected) return;\n    if (refs.numberSpecialBidInterest.checked) state.numberHighInterestLabels.add(selected);\n    else state.numberHighInterestLabels.delete(selected);\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberAddManual?.addEventListener('click', () => {\n    state.numberManualAssignments.push({ label: '', collector_id: '' });\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberManualRows?.addEventListener('change', (event) => {\n    const row = event.target.closest('[data-oap-number-manual-row]');\n    if (!row) return;\n    const index = Number(row.dataset.oapNumberManualRow);\n    if (event.target.matches('[data-oap-number-manual-label]')) state.numberManualAssignments[index].label = event.target.value;\n    if (event.target.matches('[data-oap-number-manual-collector]')) state.numberManualAssignments[index].collector_id = event.target.value;\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberManualRows?.addEventListener('click', (event) => {\n    const button = event.target.closest('[data-oap-number-remove-manual]');\n    if (!button) return;\n    state.numberManualAssignments.splice(Number(button.dataset.oapNumberRemoveManual), 1);\n    markNumberEdited();\n    renderNumberWorkspace();\n  });\n  refs.numberPreviewButton?.addEventListener('click', previewNumberAllocation);\n  refs.numberSave?.addEventListener('click', saveNumberAllocationDraft);\n  refs.numberLockConfirm?.addEventListener('change', renderNumberWorkspace);\n  refs.numberLock?.addEventListener('click', lockNumberAllocationManifest);\n  [refs.numberBasePrice, refs.numberBidIncrement, refs.numberChoiceOpens, refs.numberChoiceCloses]\n    .filter(Boolean).forEach((field) => field.addEventListener('input', () => { state.numberChoicePreview = null; renderNumberChoiceConfig(); }));\n  refs.numberChoicePreviewButton?.addEventListener('click', previewNumberChoiceWindow);\n  refs.numberChoiceSave?.addEventListener('click', saveNumberChoiceWindowDraft);\n  refs.numberChoiceOpenConfirm?.addEventListener('change', renderNumberWorkspace);\n  refs.numberChoiceOpen?.addEventListener('click', openNumberChoiceWindow);\n  refs.numberPreviewActual?.addEventListener('click', previewActualNumberChoice);\n  refs.numberSettlementCommit?.addEventListener('click', commitNumberSettlementRound);\n  refs.numberSettlementClose?.addEventListener('click', closeNumberChoices);\n  refs.numberSettlementPreview?.addEventListener('click', previewFinalNumberSettlement);\n  refs.numberSettlementFreezeConfirm?.addEventListener('change', renderNumberSettlement);\n  refs.numberSettlementFreeze?.addEventListener('click', freezeFinalNumberSettlement);\n  refs.numberPaymentMode?.addEventListener('change', () => {\n    state.numberPaymentPolicyPreview = null;\n    state.numberPaymentBatchPreview = null;\n    state.numberPaymentBatchPreviewToken = null;\n    state.numberPaymentMessage = 'Payment mode changed. Run a fresh settings check before saving.';\n    renderNumberPaymentPolicy();\n  });\n  refs.numberPaymentPreview?.addEventListener('click', previewNumberPaymentPolicy);\n  refs.numberPaymentSave?.addEventListener('click', saveNumberPaymentPolicy);\n  refs.numberPaymentAssetFile?.addEventListener('change', renderNumberPaymentPolicy);\n  refs.numberPaymentAssetUpload?.addEventListener('click', uploadNumberPaymentAsset);\n  refs.numberPaymentBatchPreview?.addEventListener('click', previewNumberPaymentBatch);\n  refs.numberPaymentBatchPrepare?.addEventListener('click', prepareNumberPaymentBatch);\n  refs.numberPaymentBatchFreezeConfirm?.addEventListener('change', renderNumberPaymentPolicy);\n  refs.numberPaymentBatchFreeze?.addEventListener('click', freezeNumberPaymentBatch);\n  refs.numberPaymentOpensAt?.addEventListener('input', () => {\n    state.numberPaymentOpeningPreview = null;\n    state.numberPaymentOpeningPreviewToken = null;\n    state.numberPaymentOpeningPreviewHash = '';\n    state.numberPaymentEmailReviewedOpeningHash = '';\n    state.numberPaymentOpeningMessage = 'Opening time changed. Run a fresh schedule preview.';\n    state.numberPaymentEmailMessage = '';\n    if (refs.numberPaymentEmailResult) refs.numberPaymentEmailResult.hidden = true;\n    if (refs.numberPaymentPageResult) refs.numberPaymentPageResult.hidden = true;\n    if (refs.numberPaymentOpenConfirm) refs.numberPaymentOpenConfirm.checked = false;\n    renderNumberPaymentPolicy();\n  });\n  refs.numberPaymentOpeningPreview?.addEventListener('click', previewNumberPaymentOpening);\n  refs.numberPaymentEmailPreview?.addEventListener('click', previewNumberPaymentEmail);\n  refs.numberPaymentPagePreview?.addEventListener('click', previewNumberPaymentPage);\n  refs.numberPaymentPageViewport?.addEventListener('change', renderNumberPaymentPolicy);\n  refs.numberPaymentPageLocale?.addEventListener('change', () => {\n    if (refs.numberPaymentPageResult) refs.numberPaymentPageResult.hidden = true;\n    state.numberPaymentEmailMessage = 'Payment-page language changed. Render the page again to review this version.';\n    renderNumberPaymentPolicy();\n  });\n  refs.numberPaymentEmailRequest?.addEventListener('change', () => {\n    if (refs.numberPaymentEmailResult) refs.numberPaymentEmailResult.hidden = true;\n    if (refs.numberPaymentPageResult) refs.numberPaymentPageResult.hidden = true;\n    state.numberPaymentEmailReviewedOpeningHash = '';\n    state.numberPaymentEmailMessage = '';\n    renderNumberPaymentPolicy();\n  });\n  refs.numberPaymentSubmission?.addEventListener('click', async (event) => {\n    const button = event.target.closest('[data-oap-number-payment-proof-view]');\n    if (button) await openProtectedPaymentProof(button.dataset.oapNumberPaymentProofView, button);\n  });\n  refs.paymentReviewFilter?.addEventListener('change', () => {\n    state.numberPaymentReviewFilter = refs.paymentReviewFilter.value;\n    renderPaymentReview();\n  });\n  refs.paymentReviewList?.addEventListener('click', async (event) => {\n    const proof = event.target.closest('[data-oap-payment-proof-view]');\n    if (proof) return openProtectedPaymentProof(proof.dataset.oapPaymentProofView, proof);\n    const copy = event.target.closest('[data-oap-payment-copy]');\n    if (copy) {\n      const row = (state.numberPaymentWorkspace?.preview_requests || []).find((item) => item.payment_request_id === copy.dataset.oapPaymentCopy);\n      return copyPaymentText(deliveryClipboard(row), `Delivery details for #${row?.serial_label || ''} copied.`);\n    }\n    const review = event.target.closest('[data-oap-payment-review]');\n    if (review) return openPaymentReviewDialog(review.dataset.oapPaymentReview);\n    const recover = event.target.closest('[data-oap-payment-recover]');\n    if (recover) return recoverPaymentReview(recover.dataset.oapPaymentRecover);\n    const shopifyPreview = event.target.closest('[data-oap-shopify-preview]');\n    if (shopifyPreview) return previewShopifyPaymentRequest(shopifyPreview.dataset.oapShopifyPreview);\n    const shopifyCreate = event.target.closest('[data-oap-shopify-create]');\n    if (shopifyCreate) return createReviewedShopifyPaymentLink(shopifyCreate.dataset.oapShopifyCreate);\n    const shopifyCopy = event.target.closest('[data-oap-shopify-copy-link]');\n    if (shopifyCopy) {\n      const row = (state.numberPaymentWorkspace?.preview_requests || []).find((item) => item.payment_request_id === shopifyCopy.dataset.oapShopifyCopyLink);\n      return copyPaymentText(row?.shopify_job?.invoice_url || row?.shopify_invoice_url,\n        `Shopify payment link for #${row?.serial_label || ''} copied.`);\n    }\n  });\n  refs.paymentCopyAll?.addEventListener('click', () => {\n    const text = (state.numberPaymentWorkspace?.preview_requests || []).map(deliveryClipboard).filter(Boolean).join('\\n\\n');\n    copyPaymentText(text, 'All currently saved delivery details were copied in number order.');\n  });\n  refs.paymentExport?.addEventListener('click', downloadPaymentDeliveryCsv);\n  refs.shippingPreview?.addEventListener('click', previewShippingHandoff);\n  refs.shippingCreate?.addEventListener('click', createShippingHandoff);\n  refs.shippingRevoke?.addEventListener('click', revokeShippingHandoff);\n  refs.shippingCopyUrl?.addEventListener('click', async () => {\n    try { await navigator.clipboard.writeText(refs.shippingUrl.value); state.numberShippingMessage = 'Shipping handoff link copied.'; }\n    catch (_) { state.numberShippingMessage = 'Link copy failed. Select the visible link and copy it manually.'; }\n    renderShippingHandoff();\n  });\n  refs.shippingCopyPin?.addEventListener('click', async () => {\n    try { await navigator.clipboard.writeText(refs.shippingPin.value); state.numberShippingMessage = 'Shipping handoff PIN copied.'; }\n    catch (_) { state.numberShippingMessage = 'PIN copy failed. Select the visible PIN and copy it manually.'; }\n    renderShippingHandoff();\n  });\n  [refs.paymentReviewReference, refs.paymentReviewAmountConfirm, refs.paymentReviewEmailConfirm]\n    .filter(Boolean).forEach((field) => field.addEventListener('input', renderPaymentReviewDialogAction));\n  refs.paymentReviewConfirm?.addEventListener('click', confirmSelectedAlipayPayment);\n  refs.shopifyDialogConfirm?.addEventListener('change', () => {\n    refs.shopifyDialogSave.disabled = state.numberShopifyBusy || !state.numberShopifyPreview || !refs.shopifyDialogConfirm.checked;\n  });\n  refs.shopifyDialogSave?.addEventListener('click', saveReviewedShopifyPaymentRequest);\n  refs.numberPaymentOpenConfirm?.addEventListener('change', renderNumberPaymentPolicy);\n  refs.numberPaymentOpen?.addEventListener('click', openNumberPaymentBatch);\n  root.querySelectorAll('[data-oap-close-lock]').forEach((button) => button.addEventListener('click', closeLockDialog));\n  root.addEventListener('pointerover', (event) => {\n    const trigger = event.target.closest('[data-oap-identity]');\n    if (trigger && !identityPinned) showIdentity(trigger);\n  });\n  root.addEventListener('pointerout', (event) => {\n    const trigger = event.target.closest('[data-oap-identity]');\n    if (trigger && !trigger.contains(event.relatedTarget)) hideIdentity(trigger);\n  });\n  root.addEventListener('focusin', (event) => {\n    const trigger = event.target.closest('[data-oap-identity]');\n    if (trigger && !identityPinned) showIdentity(trigger);\n  });\n  root.addEventListener('focusout', (event) => {\n    const trigger = event.target.closest('[data-oap-identity]');\n    if (trigger) hideIdentity(trigger);\n  });\n  root.addEventListener('click', (event) => {\n    const trigger = event.target.closest('[data-oap-identity]');\n    if (trigger) {\n      identityPinned = true;\n      showIdentity(trigger);\n    } else if (!event.target.closest('.oap__identity-tooltip')) hideIdentity(null, true);\n  });\n  document.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape' && activeNudgePreview) closeNudgePreview();\n  });\n  document.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape') hideIdentity(null, true);\n    if (event.key === 'Escape' && refs.lockDialog && !refs.lockDialog.hidden) closeLockDialog();\n  });\n  window.addEventListener('scroll', () => {\n    if (identityPinned && activeIdentityTrigger?.isConnected) showIdentity(activeIdentityTrigger);\n    else hideIdentity(null, true);\n  }, true);\n\n  renderHomepageReminderFields();\n  render();\n  loadChoiceWindow();\n  loadSettlement();\n  loadRehearsal();\n  };\n\n  document.querySelectorAll('[data-oap-root]').forEach(async (root) => {\n    const access = root.parentElement?.querySelector('[data-oap-access]');\n    const inlineConfig = parseJson(root.querySelector('[data-oap-data]')?.textContent, {});\n    try {\n      const config = root.dataset.oapRemote === 'true' ? await bootstrapPlanning(root, inlineConfig) : inlineConfig;\n      if (!Array.isArray(config.groups)) throw new Error('allocation_data_unavailable');\n      if (access) access.hidden = true;\n      root.hidden = false;\n      mount(root, config);\n    } catch (error) {\n      console.error('Allocation Planning mount failed', error);\n      root.hidden = true;\n      if (access) {\n        access.hidden = false;\n        const title = access.querySelector('[data-oap-access-title]');\n        const copy = access.querySelector('[data-oap-access-copy]');\n        const login = access.querySelector('[data-oap-access-login]');\n        if (title) title.textContent = 'Allocation Planning unavailable';\n        if (copy) copy.textContent = 'The protected campaign data could not be opened. Return to Owner Review and try again.';\n        if (login && ['owner_session_login_required', 'owner_proxy_login_required'].includes(error.code)) login.hidden = false;\n      }\n    }\n  });\n})();\n"],
  "mappings": "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",
  "names": ["payload", "tier", "qualified"]
}
