{"tags":[{"tagId":"d98a0792-c211-4ba7-b1e9-eb2abacddabe","tagTypeId":"custom_js","name":"PGG2 Feedback","description":"PGG2 CMS Feedback Clicks & Reporting","config":{"code":"(async () => {\n Playtech.on('GAME_LAUNCH', ([\n {\n gameCode,\n gameFeed,\n launchType,\n container,\n gamePositionInCategory,\n categoryPosition,\n categoryName,\n pggCategoryName\n }\n ]) => {\n if (!Playtech.API.auth.isLoggedIn || launchType !== 'Real') {\n return;\n }\n\n const params = new URLSearchParams({\n launch_ctx: container,\n user_id: Playtech.fetchUserDetails().userId,\n launch_code: gameCode,\n brand: Playtech.Variables.casinoName,\n cplat: Playtech.API.device.formFactor,\n cat_name: categoryName,\n feed_name: gameFeed || 'Dynamic',\n game_pos: gamePositionInCategory,\n cat_pos: categoryPosition,\n pgg_cat_name: pggCategoryName\n });\n\n fetch(`https://pgg.bit.ptecha.io/feedback?${params.toString()}`);\n });\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"d6838a7c-7ce4-4a18-aa05-c7b8c31a3a89","tagTypeId":"hc_aws_message","name":"New AWS message","description":"test for HC-12871 [HC-12996]","config":{"apiUrl":"https://cache.production.api.hollandcasino.nl/v1/maintenance/message/","apiKey":"FARJ9ybYar8WL1binV6115LFBVkCKAgJ9pafQDfk"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"f5b654b1-f39e-41c3-9efa-c5adf7443573","tagTypeId":"custom_tag_type","name":"<11> - New Checkin","description":"<11> - New Checkin","config":{"beforeEndHead":"<style>\n /* start HC-11301 */\n :root {\n --biggestPossibleInt: 2147483647;\n }\n\n :root:has(.checkinFlow) {\n --help-button-z-index: calc(var(--biggestPossibleInt)) !important;\n --chat-z-index: calc(var(--biggestPossibleInt)) !important;\n }\n\n :root:has(.checkinFlow) #ada-chat-frame {\n z-index: calc(var(--biggestPossibleInt)) !important;\n }\n /* end HC-11301 */\n\n .checkinError {\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n /* HC-12293 - start */\n body:has(.btnDeclineCheckinPopup)\n [class*=\"PopupManager__layout\"]\n [class*=\"FlexButtonsBlock__flexButtonsBlock\"] {\n display: none;\n }\n /* HC-12293 - end */\n</style>\n<script>\n var checkinLoaded = Promise.withResolvers();\n\n function onCheckinLoad(checkin) {\n console.log(\"[CHECKIN] Checkin loaded\", checkin);\n checkinLoaded.resolve(checkin);\n }\n\n (() => {\n var isInitialized = false;\n\n // HC-11856 - start\n const pageDocUploadTagName = \"portal/registration/PageDocUpload\";\n const pageExternalServiceTagName =\n \"portal/registration/PageExternalService\";\n const bodyElement = document.querySelector(\"body\");\n const checkinFlowClassName = \"checkinFlow\";\n // HC-11856 - end\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[CHECKIN] \"].concat(Array.from(arguments)),\n );\n }\n }\n\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n log(\"Error getting translation\", err);\n return \"Something went wrong...\";\n }\n }\n\n function createError() {\n var errorElement = document.createElement(\"div\");\n errorElement.classList.add(\"checkinError\");\n errorElement.innerHTML = translate(\n \"playtech.mobile.system.error.default\",\n );\n\n return errorElement;\n }\n\n function getAwsRequestData() {\n var awsApiUrl = Playtech.Variables.dynamicTags.find(\n (tag) => tag.name === \"AWS_API_URL\",\n ).value;\n var regBsnXApiKey = Playtech.Variables.dynamicTags.find(\n (tag) => tag.name === \"REG_BSN_X_API_KEY\",\n ).value;\n\n if (!awsApiUrl) {\n log(\"No api url provided\");\n return;\n }\n\n if (!regBsnXApiKey) {\n log(\"BsnXApiKey not set\");\n return;\n }\n\n return {\n awsApiUrl,\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": regBsnXApiKey,\n },\n };\n }\n\n // HC-11102 - start\n async function sendErrorDataToAWS(error, checkinData) {\n try {\n var awsRequestData = getAwsRequestData();\n\n if (awsRequestData) {\n var { awsApiUrl, headers } = awsRequestData;\n var email = Playtech.fetchUserDetails().email;\n\n var options = {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n email,\n error,\n checkinData,\n }),\n };\n\n var response = await window.fetch(\n `${awsApiUrl}/BSNOnboarding/Public/Anonymous/Data`,\n options,\n );\n\n log(\"AWS response to error case\", response); // qa can check response status\n }\n } catch (err) {\n log(\"Could not submit error data to AWS\", err);\n }\n }\n // HC-11102 - end\n\n async function processCheckinData({ data, completeData }) {\n try {\n log(\"data, completeData\", data, completeData);\n await Playtech.API.server.send({\n ID: 33045,\n description: \"Update player info\",\n responses: [33006, 31008],\n changeTimestamp: new Date()\n .toISOString()\n .replace(/[TZ]/g, \" \")\n .trim(),\n // HC-11238 - send only custom11\n dataMap: {\n custom11: completeData.mapped.ocrData.userData.dataMap.custom11,\n },\n });\n\n await Playtech.API.server.checkInDotComListenerRequest({\n // HC-11269\n requestContent: btoa(\n JSON.stringify({\n ocrData: { signed: completeData.mapped.ocrData.signed },\n }),\n ),\n });\n } catch (error) {\n log(\"Error submitting checking data: \", error);\n var placeholderText = document.querySelector(\".docUploadPlaceholder\");\n if (placeholderText) {\n placeholderText.parentNode.append(createError());\n placeholderText.style.display = \"none\";\n }\n sendErrorDataToAWS(error, {\n data,\n completeData,\n });\n }\n }\n\n // HC-10924 - start\n async function sendBSN(bsn) {\n try {\n var awsRequestData = getAwsRequestData();\n var userId = Playtech.fetchUserDetails().userId;\n var temporaryToken =\n await Playtech.API.auth.getTemporaryAuthenticationToken();\n\n if (awsRequestData && temporaryToken && userId) {\n var { awsApiUrl, headers } = awsRequestData;\n var bsnEndpoint = `${awsApiUrl}/BSNOnboarding/Public/Authenticated/BSN?userId=${encodeURIComponent(\n userId,\n )}&source=checkin`;\n var options = {\n method: \"POST\",\n headers: {\n ...headers,\n sessiontoken: temporaryToken,\n },\n body: JSON.stringify({ BSN: bsn }),\n };\n\n var response = await window.fetch(bsnEndpoint, options);\n log(\"AWS BSN response\", response); // qa can check response status\n }\n } catch (e) {\n log(`Error sending BSN: ${e}`);\n }\n }\n\n function handleBSN(data, diff) {\n log(\">> onUpdate diff\", {\n diff,\n data,\n });\n if (diff.user && diff.user.bsn) {\n sendBSN(diff.user.bsn);\n }\n }\n\n // HC-10924 - end\n\n function initCheckin() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n checkin.settings.enableConsoleLog();\n }\n\n checkin.dataFlow.setOnComplete(processCheckinData); // checkin will send user data in this cb in the end of the flow\n checkin.dataFlow.setOnUpdate(handleBSN); // checkin will send user data in this cb when there's any new data\n isInitialized = true;\n }\n\n function startCheckinFlow(tags, checkin) {\n if (!isInitialized) {\n initCheckin(checkin);\n }\n // HC-11856 - start\n bodyElement.classList.add(checkinFlowClassName);\n // HC-11856 - end\n var playerData = Playtech.fetchUserDetails();\n\n checkin.settings.setLang(\n Playtech.API.language.getCurrentLanguage() === \"en_US\" ? \"en\" : \"nl\",\n );\n // HC-12160\n checkin.settings.setVariant(\"fullflow\");\n const recoveryAppId = getRecoveryAppId(tags);\n const user = { externalId: playerData.username };\n if (recoveryAppId != null) {\n user.recoveryAppId = recoveryAppId;\n }\n log(\"Pass user data to checkin\", user);\n checkin.dataFlow.setKnownData({\n idscan: {\n variants: [\"fullflow\"],\n user: user,\n },\n }); // HC-11268\n checkin.signUp.open(); // open Checkin popup\n }\n\n async function handlePageDocUpload() {\n const checkin = await checkinLoaded.promise;\n const response = await Playtech.API.user.getPlayerTags(\"\", true);\n log(\"Player tags response\", response);\n try {\n var tags = response.data.tags;\n var isCheckinFlow =\n tags.some(function (tag) {\n return tag.name === pageDocUploadTagName; // if it's a 2nd step of reg\n }) &&\n tags.some(function (tag) {\n return (\n tag.name === pageExternalServiceTagName &&\n tag.value &&\n tag.value.toLowerCase() === \"checkin\"\n );\n });\n\n if (isCheckinFlow) {\n startCheckinFlow(tags, checkin);\n }\n } catch (err) {\n throw {\n error: err,\n code: 1,\n };\n }\n }\n\n // HC-12160\n function getRecoveryAppId(tags) {\n const processidTagName = \"checkin/processid\";\n const processidTag = tags.filter(function (tag) {\n return tag.name === processidTagName;\n });\n\n return (processidTag[0] && processidTag[0].value) || null;\n }\n\n // HC-11856 - start\n function handleRemoveClass(isRemovedORModifiedTag) {\n if (isRemovedORModifiedTag) {\n log(\"Remove class\");\n bodyElement.classList.remove(checkinFlowClassName);\n }\n }\n\n function handleChangePlayerTag(e) {\n const { tag, value, removed } = e?.detail || {};\n\n if (tag === pageDocUploadTagName || tag === pageExternalServiceTagName) {\n const isRemovedORModifiedTag =\n removed ||\n (tag === pageExternalServiceTagName &&\n value?.toLowerCase() !== \"checkin\");\n handleRemoveClass(isRemovedORModifiedTag);\n }\n }\n\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handleChangePlayerTag,\n );\n\n // HC-11856 - end\n\n if (Playtech.API.auth.isLoggedIn) {\n handlePageDocUpload();\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, handlePageDocUpload);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n window.checkin?.signUp.close();\n });\n\n })();\n</script>\n<script\n src=\"https://hollandcasino-fullflow.regily.com/50fcba4f77b326fe0e1f4db038d206f9.js\"\n async\n></script>","beforeEndBody":""},"conditionIds":["2e8f68c0-2d83-4009-bf0e-9507529535dc","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"34672df7-7a22-4ff3-b45d-4fae1090acc3","tagTypeId":"custom_tag_type","name":"<8> Onboarding - TN custom START Button","description":"HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"","beforeEndBody":"<style>\n [class*=\"StepsCounter__stepCounter\"] + [class*=\"Iframe__\"],\n .docUploadContainer + [class*=\"Iframe__\"] {\n display: none;\n }\n\n .docUploadContainer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n }\n\n .docUploadContainer > * {\n margin: 1rem 0;\n }\n\n .docUploadButton.inactive {\n pointer-events: none;\n }\n\n .docUploadError {\n font-size: 80%;\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n</style>\n<script>\n (function () {\n var playerTags = [];\n var tKeys = {\n captureTooltip:\n \"playtech.mobile.system.step2.onboarding.docs.capture.tooltip\",\n startBtnText: \"system.step2.onboarding.docs.start\",\n startTooltip: \"system.step2.onboarding.docs.start.tooltip\",\n };\n const customDocUploadProvider = Playtech.Variables.dynamicTags.find(\n ({ name }) => name === \"CUSTOM_DOC_UPLOAD_PROVIDER\",\n )?.value;\n // console.log('>>> customDocUploadProvider', customDocUploadProvider)\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n throw { error: err, code: 3 };\n }\n }\n\n // start HC-11285\n function isTruNarrativeFlow() {\n try {\n return (\n playerTags.some(function (tag) {\n return tag.name === \"portal/registration/PageDocUpload\";\n }) &&\n !playerTags.some(function (tag) {\n return (\n tag.name === \"portal/registration/PageExternalService\" &&\n tag.value &&\n tag.value.toLowerCase() === customDocUploadProvider\n );\n })\n );\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n // end HC-11285\n\n function observeIframe() {\n return new Promise(function (resolve, reject) {\n try {\n var wrapper = document.querySelector(\n \"[class*=Iframe__iframeWrapper]\",\n );\n\n if (\n wrapper &&\n wrapper.querySelector(\"iframe\") &&\n wrapper.querySelector(\"iframe\").src\n ) {\n resolve(wrapper.querySelector(\"iframe\"));\n return;\n }\n\n var popupEl = getPopupContentContainer();\n\n new MutationObserver(function (mutationList, observer) {\n try {\n for (var mutation of mutationList) {\n if (\n mutation.target.querySelector(\"iframe\") &&\n mutation.target.querySelector(\"iframe\").src\n ) {\n resolve(mutation.target.querySelector(\"iframe\"));\n observer.disconnect();\n break;\n }\n }\n } catch (err) {\n reject(err);\n }\n }).observe(popupEl, {\n childList: true,\n subtree: true,\n attributes: true,\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n\n function getRedirectURL() {\n return observeIframe()\n .then(function (iframe) {\n var src = iframe.src;\n iframe.src = \"about:blank\";\n\n return src;\n })\n .catch(function (err) {\n return Promise.reject({ error: err, code: 4 });\n });\n }\n\n function getPopupContentContainer() {\n try {\n return document.querySelector(\"[class*=StepsCounter__stepCounter]\")\n .parentNode;\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function createDocUploadContainer() {\n var div = document.createElement(\"div\");\n div.classList.add(\"docUploadContainer\");\n\n return div;\n }\n\n function createDocUploadCaptureTooltip() {\n var div = document.createElement(\"div\");\n div.innerHTML = translate(tKeys.captureTooltip);\n\n return div;\n }\n\n function createDocUploadLink(src) {\n var link = document.createElement(\"a\");\n link.href = src;\n link.target = \"_blank\";\n link.classList.add(\"docUploadButton\");\n link.classList.add(\"inactive\");\n\n var btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.classList.add(\"btn\");\n btn.innerHTML = translate(tKeys.startBtnText);\n btn.disabled = true;\n\n var disable = function (isDisabled) {\n if (isDisabled) {\n btn.setAttribute(\"disabled\", \"disabled\");\n link.classList.add(\"inactive\");\n } else {\n btn.removeAttribute(\"disabled\");\n link.classList.remove(\"inactive\");\n }\n };\n\n btn.addEventListener(\"click\", function () {\n disable(true);\n });\n\n link.append(btn);\n\n return [link, disable];\n }\n\n function createError(err) {\n var div = document.createElement(\"div\");\n var error = err.error || err;\n var prefix = \"Error \" + (err.code || -1) + \": \";\n\n div.classList.add(\"docUploadError\");\n div.innerHTML =\n prefix +\n ((error.response && (error.response.data.errorMessage || err.reason)) ||\n error.message);\n\n return div;\n }\n\n function createDocUploadLinkTooltip() {\n var text = document.createElement(\"p\");\n text.innerHTML = translate(tKeys.startTooltip);\n\n return text;\n }\n\n function main() {\n try {\n if (isTruNarrativeFlow()) {\n var docUploadContainer = createDocUploadContainer();\n var capture = createDocUploadCaptureTooltip();\n var [uploadLink, disable] = createDocUploadLink();\n var uploadLinkTooltip = createDocUploadLinkTooltip();\n\n docUploadContainer.append(capture);\n docUploadContainer.append(uploadLink);\n docUploadContainer.append(uploadLinkTooltip);\n getPopupContentContainer().append(docUploadContainer);\n\n getRedirectURL()\n .then(function (url) {\n uploadLink.href = url;\n disable(false);\n })\n .catch(function (err) {\n docUploadContainer.append(createError(err));\n });\n }\n } catch (err) {\n getPopupContentContainer().append(createError(err));\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n })();\n</script>"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"a887fda8-544d-4fc7-8ec8-3fab7d512f49","tagTypeId":"custom_tag_type","name":"<5> - BlockingModalPopup","description":"popup that blocks the entire site (HC-11939). HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"","beforeEndBody":"<style>\n :root {\n --biggestPossibleInt: 2147483647;\n }\n #blockingModalPopup .hideBtn {\n display: none;\n }\n [class*=\"PopupManager__popups\"]:has(#blockingModalPopup) {\n z-index: calc(var(--biggestPossibleInt) - 1);\n position: relative; /* HC-11379 */\n }\n :root:has(#blockingModalPopup) {\n --help-button-z-index: calc(var(--biggestPossibleInt)) !important;\n --chat-z-index: calc(var(--biggestPossibleInt)) !important;\n }\n body:has(#blockingModalPopup) #ada-chat-frame {\n z-index: calc(var(--biggestPossibleInt)) !important;\n }\n\n /* start HC-11939 */\n .regily-module {\n z-index: calc(var(--biggestPossibleInt) - 2);\n }\n /* end HC-11939 */\n</style>\n\n<script>\n (function () {\n let isPopupOpened = false;\n const popupID = \"blockingModalPopup\";\n const pageHoldTagName = \"portal/registration/pageHold\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Blocking Modal Popup] \"].concat(Array.from(arguments)),\n );\n }\n }\n\n function showPopup(webContent) {\n if (isPopupOpened) {\n return;\n }\n\n Playtech.API.popup.showPopup({\n id: popupID,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: \"hideBtn\" },\n articleId: webContent,\n isModal: true,\n });\n log(\"Show Popup\");\n isPopupOpened = true;\n }\n\n function closePopup() {\n if (!isPopupOpened) {\n return;\n }\n\n log(\"Close Popup\");\n Playtech.API.popup.closePopups(popupID);\n isPopupOpened = false;\n }\n\n function handleLoggedIn({ value } = {}) {\n log(\"Web Content ID\", value);\n\n if (value) {\n showPopup(value);\n }\n }\n\n function handleChangePlayerTag(e) {\n const { tag, value, removed } = e?.detail || {};\n\n if (tag === pageHoldTagName) {\n log(\"Player tag change\");\n // HC-12296 - start\n closePopup();\n // HC-12296 - end\n if (removed) {\n log(\"Close Popup\");\n return;\n }\n\n if (value) {\n log(\"Open Popup with new WC\");\n showPopup(value);\n }\n }\n }\n\n function getPageHoldTagValue() {\n return Playtech.API.user.getPlayerTags(pageHoldTagName).then(function ({\n data,\n }) {\n log(\"Get page hold tag value\", data);\n if (data.tags[0]) {\n return {\n value: data.tags[0].value,\n };\n }\n return {};\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPageHoldTagValue().then(handleLoggedIn);\n });\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n closePopup();\n });\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handleChangePlayerTag,\n );\n if (Playtech.API.auth.isLoggedIn) {\n getPageHoldTagValue().then(handleLoggedIn);\n }\n })();\n</script>\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"322c5fc7-b67f-4c98-9558-06597561344e","tagTypeId":"custom_tag_type","name":"<4> [Regulation] - MessagePopupWithTimer","description":"HC-11601 [STC] 30s popup should be shown every time until user has confirmed deposit limits. HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"<!-- Tag start -->\n<style>\n #regulationMessagePopupWithTimer .regulationBtnContainer {\n display: none;\n }\n</style>\n\n<script>\n (function () {\n let playerTags = [];\n const POPUP_ID = \"regulationMessagePopupWithTimer\";\n const WEB_CONTENT = \"REGULATIONS_MESSAGE_WITH_TIMER\";\n const REQUIRE_CONFIRMATION_PLAYER_TAG_NAME =\n \"portal/regulation/requireConfirmation\";\n const BTN_CONTAINER_CLASS_NAME = \"regulationBtnContainer\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Regulation Message Popup With Timer] \"].concat(\n Array.from(arguments),\n ),\n );\n }\n }\n\n function shouldShowBlockingPopup() {\n try {\n return playerTags.some(function (tag) {\n return (\n tag.name === REQUIRE_CONFIRMATION_PLAYER_TAG_NAME &&\n tag.value === \"true\"\n );\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function showRegulationPopup() {\n try {\n if (shouldShowBlockingPopup()) {\n log(\"Show Popup\");\n Playtech.API.popup.showPopup({\n articleId: WEB_CONTENT,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: BTN_CONTAINER_CLASS_NAME },\n id: POPUP_ID,\n onClose: function () {\n Playtech.API.auth.logout();\n log(\"Logout user\");\n },\n });\n }\n } catch (err) {\n log(\"Error\", err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(showRegulationPopup);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(showRegulationPopup);\n }\n })();\n</script>\n<!-- Tag end -->","beforeEndBody":""},"conditionIds":["2e8f68c0-2d83-4009-bf0e-9507529535dc","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1e696d4c-ba61-483d-ae59-e74a7b8b3aa0","tagTypeId":"custom_js","name":"<3> - Pre-cache IDIN url","description":"Pre-cache IDIN url. HC-12276 - temporary fix for LOGGED_IN","config":{"code":"(function () {\n let wasCached = false;\n\n async function initiateDocumentUpload(docType) {\n await Playtech.API.server.initiateDocumentUpload({\n documentType: docType,\n service: \"trunarrative\",\n });\n\n wasCached = true;\n }\n\n async function fetchDocumentType() {\n const {\n data: { tags },\n } = await Playtech.API.user.getPlayerTags(\n \"portal/registration/PageExternalService\",\n );\n console.log(\">>> fetchDocumentType tags:\", tags);\n return tags[0]?.value;\n }\n\n async function initiateDocumentUploadIfIDIN() {\n if (wasCached) {\n return;\n }\n\n const docType = await fetchDocumentType();\n\n if (docType === \"IDIN\") {\n initiateDocumentUpload(docType);\n }\n }\n\n function playerTagChangeListener(e) {\n const { tag, value, removed } = e.detail;\n\n if (\n !wasCached &&\n tag === \"portal/registration/PageExternalService\" &&\n !removed &&\n value === \"IDIN\"\n ) {\n initiateDocumentUpload(value);\n }\n }\n\n function subscribeOnTagChange() {\n initiateDocumentUploadIfIDIN();\n\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n playerTagChangeListener,\n );\n }\n\n function unsubscribeOnTagChange() {\n Playtech.API.events.removeEventListener(\n \"player-tag-change\",\n playerTagChangeListener,\n );\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, subscribeOnTagChange);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, unsubscribeOnTagChange);\n\n if (Playtech.API.auth.isLoggedIn) {\n subscribeOnTagChange();\n }\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1d7dc88d-9050-4e85-8200-183391995c5b","tagTypeId":"custom_tag_type","name":"<2> - NEW ADA AI Integration","description":"NEW ADA AI Integration","config":{"beforeEndHead":"<style type=\"text/css\">\n iframe#ada-button-frame {\n display: none !important;\n }\n</style>\n<script>\n (function () {\n let isAdaReady = false;\n let isStarted = false;\n\n let isToggled = false;\n let isProactive = false;\n let playerTags = [];\n let proactiveMessageKey = null;\n\n const PROACTIVE_NEW_USER_TAG_NAME = \"adachatbot/proactive_new\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(console, [\"[AI ADA] \"].concat(Array.from(arguments)));\n }\n }\n\n function getJWTToken() {\n log(\"get JWT\");\n\n return Playtech.API.server.getJWTToken().then(function ({ data }) {\n return data.jwtToken;\n });\n }\n\n function toggleCallback(isDrawerOpen) {\n isToggled = isDrawerOpen;\n\n log(\"toggleCallback received\", isToggled);\n\n Playtech.API.events.dispatchEvent(\n new CustomEvent(Playtech.Events.CHAT_WINDOW_STATUS, {\n detail: {\n chat: \"ada\",\n isOpened: isDrawerOpen,\n },\n }),\n );\n }\n\n function onAdaEmbedLoaded() {\n log(\"onAdaEmbedLoaded received\");\n }\n\n function adaReadyCallback({ isRolledOut }) {\n isAdaReady = isRolledOut;\n log(\"adaReadyCallback received\", isAdaReady);\n\n if (hasProactiveNewUserTagName(playerTags)) {\n triggerProactiveMessage(proactiveMessageKey);\n }\n\n if (isProactive && !isToggled) {\n toggleBot([{ chat: \"ada\" }]);\n }\n }\n\n function getSensitiveMetaFields(token) {\n return token\n ? {\n jwt_token: token,\n }\n : {};\n }\n\n function getMetaFields(extraFields) {\n return {\n // list of predefined vars here,\n // which must be specified with empty value,\n // even if they are not ready right now\n userId: Playtech.fetchUserDetails().userId,\n ...extraFields,\n };\n }\n\n function getAdaSettings({ token, messageKey }) {\n const dataSettings = {\n cluster: \"eu\",\n toggleCallback,\n // hideMask: false,\n // language: \"NL\",\n adaReadyCallback,\n onAdaEmbedLoaded,\n mobileOverlay: true,\n handle: \"hollandcasinoai\",\n metaFields: getMetaFields(messageKey),\n sensitiveMetaFields: getSensitiveMetaFields(token),\n // greeting: \"6372813824417240bce71f1a\", // greeting we do not use.\n };\n log(\"Ada settings\", dataSettings);\n\n return dataSettings;\n }\n\n // TODO: I don't know if we need it.\n // for further usage\n // function openAnswer(answerId) {\n // if (!isAdaReady) {\n // return;\n // }\n\n // if (isToggled) {\n // log(\"triggering specific answer\", answerId);\n // window.adaEmbed.triggerAnswer(answerId);\n // } else {\n // log(\"toggling\");\n // window.adaEmbed.toggle();\n // }\n // }\n // TODO: end.\n\n function triggerProactiveMessage(messageKey) {\n log(\"triggering proactive message\", { messageKey });\n window.adaEmbed?.triggerProactive(messageKey);\n }\n\n async function startBot() {\n if (isStarted) {\n return;\n }\n\n const token = await getJWTToken();\n log(\"starting\");\n\n proactiveMessageKey = await getProactiveMessageKey();\n\n window.adaEmbed.start(\n getAdaSettings({ token, messageKey: proactiveMessageKey }),\n );\n isStarted = true;\n log(\"message Key\", { messageKey: proactiveMessageKey });\n\n if (!hasProactiveNewUserTagName(playerTags)) {\n isProactive = Boolean(metaFields);\n }\n }\n\n // TODO: I don't know if we need it.\n // for further usage\n // async function resetBot(metaFields) {\n // if (!isAdaReady) {\n // return;\n // }\n\n // const token = await getJWTToken();\n // log(\"reset\", { metaFields });\n // window.adaEmbed.reset(getAdaSettings({ token, metaFields }));\n // isStarted = true;\n // }\n // TODO: end.\n\n function stopBot() {\n if (!isStarted) {\n return;\n }\n\n log(\"stopping\");\n window.adaEmbed.stop();\n isStarted = false;\n isProactive = false;\n }\n\n function toggleBot(e) {\n if (!isAdaReady || !isStarted) {\n return;\n }\n\n if (e && e.length > 0 && e[0].chat === \"ada\") {\n log(\"toggling\");\n window.adaEmbed.toggle();\n }\n }\n\n // TODO: I think we don't need this function.\n // HC-10930\n // async function adaChatBotProactive(e) {\n // const metaFields = await getNextAnswerToRun(e);\n\n // if (metaFields) {\n // await resetBot(metaFields);\n\n // if (!isToggled) {\n // toggleBot([{ chat: \"ada\" }]);\n // }\n // }\n // }\n // TODO: end.\n\n async function openAdaChatBotProactiveTag(e) {\n proactiveMessageKey = await getProactiveMessageKey(e);\n\n if (proactiveMessageKey) {\n triggerProactiveMessage(proactiveMessageKey);\n }\n }\n\n function hasProactiveNewUserTagName(tags) {\n if (Array.isArray(tags)) {\n return tags.some(({ name }) => name === PROACTIVE_NEW_USER_TAG_NAME);\n }\n return false;\n }\n\n function handlePlayerTagChange(e) {\n if (hasProactiveNewUserTagName([{ name: e.detail?.tag }])) {\n return openAdaChatBotProactiveTag(e);\n }\n }\n\n function getSessionData() {\n try {\n return JSON.parse(sessionStorage.userModel);\n } catch (e) {\n return {};\n }\n }\n\n async function getProactiveMessageKey(e) {\n const { authType } = getSessionData();\n\n if (e) {\n const { tag, value, removed } = e.detail;\n\n if (PROACTIVE_NEW_USER_TAG_NAME === tag && !removed) {\n return {\n messageKey: value,\n };\n }\n\n return null;\n }\n\n // HC-11020 - task to add authType to sessionStorage\n if (authType === \"credentials\") {\n ({\n data: { tags: playerTags },\n } = await Playtech.API.user.getPlayerTags(PROACTIVE_NEW_USER_TAG_NAME));\n\n log(\"Player tags response\", playerTags);\n\n if (Array.isArray(playerTags)) {\n if (playerTags.length === 1) {\n return {\n messageKey: playerTags[0].value,\n };\n }\n }\n }\n return null;\n }\n\n function onLoadBot() {\n if (Playtech.API.auth.isLoggedIn) {\n startBot();\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, startBot);\n Playtech.on(Playtech.Events.LOGGED_OUT, stopBot);\n Playtech.on(Playtech.Events.CHAT_TOGGLE, toggleBot);\n Playtech.API.events.addEventListener(\n \"player-tag-change\",\n handlePlayerTagChange,\n );\n }\n\n window.onLoadBot = onLoadBot;\n })();\n</script>\n<script\n async\n id=\"__ada\"\n data-lazy\n onload=\"onLoadBot()\"\n src=\"https://static.ada.support/embed2.js\"\n></script>","beforeEndBody":""},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"1c96b0ea-3174-4ffd-9811-16ca64c17fe7","tagTypeId":"custom_tag_type","name":"<3> - IDIN Native","description":"Custom onClick handler for LaunchIDIN btn in native (PageIDINAddress). HC-12276 - temporary fix for LOGGED_IN","config":{"beforeEndHead":"<style>\n button[class*=\"IDINAddress__btnLaunch\"] {\n display: none !important;\n }\n\n .idinError {\n font-size: 80%;\n text-align: center;\n margin: 1rem 0;\n color: var(--hc-red);\n }\n\n .btn {\n display: block;\n margin: 5rem auto 3rem;\n }\n</style>\n<script>\n (function () {\n var playerTags = [];\n\n function translate(tKey) {\n try {\n return Playtech.API.translation.translate(tKey);\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function isPageIDINAddress() {\n try {\n return playerTags.some(function (tag) {\n return tag.name === \"portal/registration/PageIDINAddress\";\n });\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function getPopupContentContainer() {\n try {\n return document.querySelector(\"[class*=StepsCounter__stepCounter]\")\n .parentNode;\n } catch (err) {\n throw { error: err, code: 5 };\n }\n }\n\n function createContainer() {\n var div = document.createElement(\"div\");\n div.classList.add(\"idinContainer\");\n\n return div;\n }\n\n function createError(err) {\n var div = document.createElement(\"div\");\n var error = err.error || err;\n var prefix = \"Error \" + (err.code || -1) + \": \";\n\n div.classList.add(\"idinError\");\n div.innerHTML =\n prefix +\n ((error.response && (error.response.data.errorMessage || err.reason)) ||\n error.message);\n\n return div;\n }\n\n function appendError(err) {\n var containerEl =\n document.querySelector(\".idinContainer\") || getPopupContentContainer();\n if (containerEl) {\n containerEl.append(createError(err));\n }\n }\n\n function createNewLaunchBtn() {\n var btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.classList.add(\"btn\");\n btn.innerHTML = translate(\n \"playtech.mobile.system.hc-registration.IDINAddress.button.launchIDIN\",\n );\n\n btn.addEventListener(\"click\", function () {\n btn.setAttribute(\"disabled\", \"disabled\");\n\n var docType =\n playerTags &&\n playerTags.find(\n (tag) => tag.name === \"portal/registration/PageExternalService\",\n )?.value;\n if (docType) {\n Playtech.API.server\n .initiateDocumentUpload({\n documentType: docType,\n service: \"trunarrative\",\n })\n .then((response) => {\n var redirectURL = response.data && response.data.redirectURL;\n btn.removeAttribute(\"disabled\");\n\n Playtech.API.htcmd.sendMessage(\"openCustomTab\", {\n path: redirectURL,\n });\n })\n .catch((err) => {\n btn.removeAttribute(\"disabled\");\n appendError({ error: err, code: 2 });\n });\n } else {\n btn.removeAttribute(\"disabled\");\n appendError({ error: \"Cannot find document type\", code: 3 });\n }\n });\n\n return btn;\n }\n\n function main() {\n try {\n if (isPageIDINAddress()) {\n var containerEl = createContainer();\n var newLaunchBtn = createNewLaunchBtn();\n\n containerEl.append(newLaunchBtn);\n getPopupContentContainer().append(containerEl);\n }\n } catch (err) {\n getPopupContentContainer().append(createError(err));\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n })();\n</script>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"027718b9-8d8c-403b-a6d5-e4ed9b02e8e8","tagTypeId":"custom_js","name":"TPI Events","description":"TPI Events","config":{"code":"(() => {\n function getSid() {\n try {\n return JSON.parse(localStorage.getItem('tpi_sid'))?.id ?? 'unknown';\n } catch (error) {\n window.TPI?.track?.('error', 'error', {\n message: 'tpi_sid not found'\n });\n\n return 'error';\n }\n }\n\n function getUid() {\n try {\n return localStorage.getItem('tpi_uid') ?? 'unknown';\n } catch (error) {\n window.TPI?.track?.('error', 'error', {\n message: 'tpi_uid not found'\n });\n\n return 'error';\n }\n }\n\n async function updatePlayerTags() {\n await Playtech.API.user.setPlayerTags([\n {\n name: 'portal/tpi_sid',\n type: 'text',\n value: getSid()\n\n }, {\n name: 'portal/tpi_uid',\n type: 'text',\n value: getUid()\n }\n ]);\n }\n\n\n Playtech.on('auth:generic_login:success', () => {\n updatePlayerTags();\n });\n\n // Playtech.on('socket-response', ({\n // requestId,\n // responseId,\n // time\n // }) => {\n // window.TPI?.track?.('socket-response', 'socket', {\n // requestId,\n // responseId,\n // time\n // });\n // });\n\n // Playtech.on('pas-response', ({\n // actionName,\n // time\n // }) => {\n // window.TPI?.track?.('pas-response', 'pas', {\n // pasActionName: actionName,\n // time\n // });\n // });\n\n Playtech.on('pas-error', ({\n actionName,\n error\n }) => {\n window.TPI?.track?.('pas-error', 'pas', {\n pasActionName: actionName,\n errorCode: error?.errorCode,\n requestId: error?.requestId,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('socket-error', ({\n requestId,\n responseId,\n errorCode,\n error\n }) => {\n window.TPI?.track?.('socket-error', 'socket', {\n requestId,\n responseId,\n errorCode,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('bia-error', ({\n event,\n error\n }) => {\n window.TPI?.track?.('bia-error', 'bia', {\n event,\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error))\n });\n });\n\n Playtech.on('socket-breakdown', ({\n reason,\n requestId,\n responseId\n }) => {\n window.TPI?.track?.('socket-breakdown', 'socket', {\n reason,\n requestId,\n responseId\n });\n });\n\n\n Playtech.on('socket-notice', ({ requestId }) => {\n window.TPI?.track?.('socket-notice', 'socket', {\n requestId\n });\n });\n\n\n Playtech.on('geofencing-init', ({ geolocationType }) => {\n window.TPI?.track?.('geofencing-init', 'geofencing', {\n geolocationType\n });\n });\n\n Playtech.on('geofencing-trigger', ({ reason }) => {\n window.TPI?.track?.('geofencing-trigger', 'geofencing', {\n reason\n });\n });\n\n Playtech.on('geofencing-response', ({\n transactionID,\n time\n }) => {\n window.TPI?.track?.('geofencing-response', 'geofencing', {\n transactionID,\n time\n });\n });\n\n Playtech.on('geofencing-error', ({\n error,\n errorCode,\n message,\n response\n }) => {\n window.TPI?.track?.('geofencing-error', 'geofencing', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n errorCode,\n message,\n response\n });\n });\n\n Playtech.on('auth:generic_login:success', () => {\n window.TPI?.track?.('sso-login-success', 'login');\n });\n\n Playtech.on('auth:credentials:login', () => {\n window.TPI?.track?.('login-success', 'login');\n });\n\n Playtech.on('LOGGED_OUT', () => {\n window.TPI?.track?.('logout-success', 'login');\n });\n\n Playtech.on('LOGGED_IN_FAIL', ([error]) => {\n window.TPI?.track?.('login-error', 'login', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n });\n });\n\n Playtech.on('REGISTRATION_SUBMITTED', () => {\n window.TPI?.track?.('registration-submitted', 'registration');\n });\n\n Playtech.on('REGISTRATION_COMPLETED', () => {\n window.TPI?.track?.('registration-success', 'registration');\n });\n\n Playtech.on('REGISTRATION_FAIL', ([error]) => {\n window.TPI?.track?.('registration-error', 'registration', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n });\n });\n\n Playtech.on('DEPOSIT_FAIL', ({\n error,\n errorCode,\n errorDescription,\n errorMessage\n }) => {\n window.TPI?.track?.('deposit-error', 'deposit', {\n error: error && JSON.stringify(error, Object.getOwnPropertyNames(error)),\n errorCode,\n errorDescription,\n errorMessage\n });\n });\n\n (async () => {\n const { games = {} } = await Playtech.API.game.getGamesConfiguration();\n const { formFactor = 'mobile' } = Playtech.API.device ?? {};\n\n let latest_tpi_lid = null;\n\n Playtech.API.game.addBeforeGameLaunchHook?.((launchGameUrl) => {\n const url = new URL(launchGameUrl, document.baseURI);\n\n latest_tpi_lid = crypto.randomUUID();\n\n url.searchParams.set('tpi_lid', latest_tpi_lid);\n url.searchParams.set('tpi_sid', getSid());\n url.searchParams.set('tpi_uid', getUid());\n\n return url.toString();\n });\n\n Playtech.on('GAME_LAUNCH', ([{\n gameCode,\n container,\n gameName,\n game_pos\n }]) => {\n const {\n desktopGameType = '',\n mobileGameType = ''\n } = games[gameCode] ?? {};\n const gameType = formFactor === 'desktop' ? desktopGameType : mobileGameType;\n\n const product = gameCode.includes('gpas') ? 'GPAS' : gameCode.includes('pop') ? 'POP' : gameType.includes('LIVE') ? 'LIVE' : 'OTHER';\n\n window.TPI?.track?.('portal:game:launch', 'game', {\n product,\n gameCode,\n tpi_lid: latest_tpi_lid,\n });\n });\n })();\n\n // sportsbook\n Playtech.on('sportsbook-analytics', ({\n eventName,\n currency,\n raw\n }) => {\n const data = typeof raw === 'string' ? { data: raw } : raw;\n\n window.TPI?.track?.(`sports-${eventName}`, 'sports', {\n ...data,\n currency\n });\n });\n\n Playtech.on('player-tag-change', ({\n tag,\n value,\n removed\n }) => {\n if (removed) {\n return;\n }\n\n window.TPI?.track?.(`tag-${tag.replaceAll('/', ':')}`, 'tag', {\n value\n });\n });\n\n window.addEventListener('unhandledrejection', (event) => {\n if (event.reason?.reason && event.reason?.request) {\n // is oapi, so safe to skip\n event.preventDefault();\n }\n });\n\n window.addEventListener('online', () => {\n window.TPI?.track?.('online', 'browser', {\n effectiveType: navigator?.connection?.effectiveType ?? 'unknown'\n });\n });\n\n window.addEventListener('offline', () => {\n window.TPI?.track?.('offline', 'browser');\n });\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"9efcb0e5-d71d-4c22-945b-92bb6260a95d","tagTypeId":"custom_js","name":" EzPush","description":" EzPush integration","config":{"code":"(function() {\n var startEzPush = function() {\n if (window.EzPush) {\n return;\n }\n\n Playtech.API.common.getScript('https://ezpush.techonlinecorp.com/SDK/v2/ezpush-client.js').then(function() {\n EzPush.init({\n applicationId: '610154bd5853fced6dad05e2', // ID of application from ezpush admin\n subscribeOnInit: true, // true by default\n language: 'en', // taken from from window.navigator.language by default\n logEnabled: true, // false by default\n serviceWorkerUrl: window.SPORTS_SW_LIBRARY // optional, 'ezpush-sw.js' by default, Service-Worker-Allowed HTTP\n // header required\n }).then(function() {\n console.log('[EzPush] You are subscribed to push notifications.');\n\n if (window.EzPush && window.EzPush.pushToken) {\n var pushId = window.EzPush.pushToken;\n var deviceType = Playtech.API.device.browserName;\n var correlationId = String(Math.random()).slice(2);\n\n Playtech.API.server.send({\n ID: 35613,\n application: 'hollandcasino',\n deviceId: EzPush.hwid,\n pushId: pushId,\n deviceType: deviceType,\n correlationId: correlationId\n });\n }\n\n }).catch(function(error) {\n console.log('[EzPush] Failed to subscribe to push notifications: ', error);\n });\n });\n };\n\n Playtech.on(Playtech.Events.LOGGED_IN, startEzPush);\n\n if (Playtech.API.user.isLoggedIn()) {\n startEzPush();\n }\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"2bf293bd-336d-4de2-8d33-57fa1df1c317","tagTypeId":"custom_tag_type","name":"SportsSlideGamesStyle","description":"Sports side games config","config":{"beforeEndHead":"<style>\n :root {\n --card-control-height: 2.5rem;\n --sport-footer-height: 3rem;\n --card-popup-minimized-margin: calc(\n 100dvh -\n (\n var(--header-height) + var(--sport-footer-height) +\n var(--card-control-height)\n )\n );\n /* 152px is the height sport-footer-height + card-control-height + header-height. card-popup-minimized-margin: calc(100dvh - 140px) - it is default core value */\n } #sportsbook-side-games {\n padding: 0;\n margin: 0 auto;\n } .mobile-layout #sportsbook-side-games {\n bottom: auto;\n top: var(--header-height);\n max-height: calc(\n 100dvh - var(--header-height) - var(--sport-footer-height)\n );\n }\n #sportsbook-side-games [class*=\"CardPopup__category\"],\n #sportsbook-side-games [class*=\"contentContainer\"] {\n margin: 0 0 0.1rem 0;\n padding: 0;\n } #sportsbook-side-games [class*=\"CardPopup__buttons\"] {\n width: 100%;\n text-align: right;\n background: var(--light-theme-bg-color);\n height: var(--card-control-height);\n } #sportsbook-side-games .game-iframe {\n height: calc(\n 100dvh - var(--header-height) - var(--card-control-height) -\n var(--sport-footer-height)\n );\n } .mobile-layout\n #sportsbook-side-games\n [class*=\"GamesView__grid\"]\n [class*=\"GamesView__slide\"]:first-child,\n .tablet\n #sportsbook-side-games\n [class*=\"GamesView__grid\"]\n [class*=\"GamesView__slide\"]:first-child {\n padding: 0;\n }\n /* I use class \"tablet\" because the \"desktop-layout\" class is used for the iPad Pro*/ #sportsbook-side-games [class*=\"CloseButton__close\"] {\n display: none;\n } @media (max-width: 400px) {\n .mobile-layout #sportsbook-side-games .col-mob-4 {\n width: calc(100vw - 0.5rem);\n }\n }\n</style>","beforeEndBody":""},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","10c6a1bf-bd4b-4c65-9256-45b166858b9d"]},{"tagId":"e7115f33-a80f-4310-a46c-8672d8e57293","tagTypeId":"custom_js","name":"Advanced Dialog Game and Non-Game","description":"HC-12646 Advanced player messages with different Window types (Game / Non-Game)","config":{"code":"(function () {\r\n function getButtons({ buttons, actionId, windowSessionId }) {\r\n const { buttons: popupButtons, onClose } = Playtech.API.popup.getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n return { popupButtons, onClose };\r\n }\r\n\r\n function showPopup({ buttons, content, onClose }) {\r\n Playtech.API.popup.showPopup(\"common\", {\r\n buttons,\r\n content,\r\n onClose,\r\n });\r\n }\r\n\r\n Playtech.on(\r\n \"advanced-dialog-nongame\",\r\n ({ actionId, actionInfo: { buttons, message }, windowSessionId }) => {\r\n const { popupButtons, onClose } = getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n showPopup({\r\n buttons: popupButtons,\r\n content: message,\r\n onClose,\r\n });\r\n },\r\n );\r\n\r\n Playtech.on(\r\n \"advanced-dialog\",\r\n ({ actionId, actionInfo: { buttons, message }, windowSessionId }) => {\r\n const { popupButtons, onClose } = getButtons({\r\n buttons,\r\n actionId,\r\n windowSessionId,\r\n });\r\n\r\n showPopup({\r\n buttons: popupButtons,\r\n content: message,\r\n onClose,\r\n });\r\n },\r\n );\r\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"487101b8-7f6f-4927-b5d2-0d9a13468748","tagTypeId":"custom_tag_type","name":"LEADERBOARD_GAMETILE_CSS","description":"Updating the CSS because of leaderboard game tile issue","config":{"beforeEndHead":"<style>\n.GameLabels__label--2e4:last-of-type {\n display: none !important;\n}\n</style>","beforeEndBody":""},"conditionIds":["20d65c93-a18d-40f0-bb20-6c2053c29822","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"8809bde3-5ee0-434e-a84b-256bff07f6cb","tagTypeId":"custom_tag_type","name":"HIDE_SHADOW_LEADERBOARD_TILE","description":"Hides the Hero Banner top Shadow Gradient","config":{"beforeEndHead":"<style>\n [class*=RaceListCard__mediaContent--1Xv] [class*=RaceListCard__mediaContent--1Xv]::before {\n background: none!important;\n }\n </style>","beforeEndBody":""},"conditionIds":["4c81598f-2592-452e-b680-3c1eed17cba1","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"ad22010b-b5a9-44d0-bd4b-fb5133e12864","tagTypeId":"custom_tag_type","name":"<3> GTM and CookieBot","description":"HC-12311 Reconfigure GTM and Cookiebot on STG2","config":{"beforeEndHead":"<!-- Google Tag Manager -->\n<script data-cookieconsent=\"ignore\">\n(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'https://sgtm.hollandcasino.nl/hctm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','GTM-KGF9BMX');\n</script>\n\n<!-- Cookiebot CMP -->\n<!--<script id=\"Cookiebot\" src=\"https://consent.cookiebot.com/uc.js\" data-cbid=\"74529192-6709-483c-a1c9-c9b9c22221b3\" type=\"text/javascript\" async></script>-->","beforeEndBody":""},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"3772972c-9037-4fbf-aeeb-6d8073d6470b","tagTypeId":"page_styling","name":"Premium Style","description":"Premium Style","config":{"displayStyle":"premium"},"conditionIds":["b8cd6255-5275-430e-b4b3-34917ce3e157","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"ad5d2463-92a7-41aa-bb67-9d0f75a3c0a7","tagTypeId":"custom_tag_type","name":"ADVERTISING_PREFERENCES_FORM_EXTENSION","description":"HC-12332","config":{"beforeEndHead":"<style>\n input:-webkit-autofill,\n input:-webkit-autofill:hover, \n input:-webkit-autofill:focus, \n input:-webkit-autofill:active{\n -webkit-text-fill-color: var(--input-font-color) !important;\n }\n</style>\n<script>\n // HC-12332\n(function () {\n const API_BASE_URL = Playtech.Variables.dynamicTags.find(tag => tag.name === 'ACQ_API_BASE_URL')?.value;\n const API_KEY = Playtech.Variables.dynamicTags.find(tag => tag.name === 'ACQ_API_KEY')?.value;\n const TOKEN_ENDPOINT = '/v1/acqoptout/tokens';\n const CONFIRM_ENDPOINT = '/v1/acqoptout/tokens/confirm'; function waitForElement(selector, callback, interval = 300, timeout = 10000) {\n const start = Date.now();\n const check = () => {\n const element = document.querySelector(selector);\n if (element && element.querySelectorAll('button[type=\"button\"]')?.length >= 2) {\n callback(element);\n } else if (Date.now() - start < timeout) {\n setTimeout(check, interval);\n }\n };\n check();\n } waitForElement('form[data-form-name=\"Advertising Preferences\"]', function (form) {\n const buttons = form.querySelectorAll('button[type=\"button\"]'); const send2FAMailButton = buttons[0];\n const confirm2FAButton = buttons[1]; const twoFAInput = form.querySelector('input[name=\"promoExclusion2FAField\"]');\n const phoneInput = form.querySelector('input[name=\"promoExclusionPhoneField\"]');\n const emailInput = form.querySelector('input[name=\"promoExclusionEmailField\"]'); const twoFAInputContainer = twoFAInput?.closest('[class*=Control__control]');\n const phoneInputContainer = phoneInput?.closest('[class*=Control__control]');\n const confirm2FAButtonContainer = confirm2FAButton.closest('.cms-form-field-name-promoExclusionConfirm2FACodeButton'); const phoneLabel = form.querySelector('label[for^=\"promoExclusionPhoneField\"]');\n if (phoneLabel) phoneLabel.style.display = 'none'; const explanationText = form.querySelector('[class*=PlainText__text]');\n if (explanationText) {\n explanationText.style.display = 'none';\n } if (twoFAInputContainer) twoFAInputContainer.style.display = 'none';\n if (phoneInputContainer) phoneInputContainer.style.display = 'none';\n if (confirm2FAButtonContainer) confirm2FAButtonContainer.style.display = 'none'; let isSubmitting = false;\n let storedEmail = ''; send2FAMailButton.addEventListener('click', function () {\n document.getElementById('form-output')?.remove();\n document.getElementById('form-error')?.remove(); const email = emailInput?.value.trim() || '';\n const selectedRadio = form.querySelector('input[name=\"formType\"]:checked');\n const selectedOption = selectedRadio?.value || ''; const hasEmail = email.length > 0;\n const hasRadio = !!selectedOption;\n const errorFields = form.querySelectorAll('[class*=\"Control__invalid\"], [class*=\"ErrorMessage\"]');\n const hasVisualErrors = errorFields.length > 0; if (!hasEmail || !hasRadio || hasVisualErrors) {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.required'); // 'Vul alle vereiste velden in';\n form.parentNode.insertBefore(error, form.nextSibling);\n return;\n } if (isSubmitting) return;\n isSubmitting = true;\n send2FAMailButton.disabled = true;\n const currentLang = Playtech.API.language.getCurrentLanguage()?.substring(0, 2); const queryParams = new URLSearchParams({\n type: selectedOption,\n email: email,\n language_code: currentLang\n }).toString(); fetch(`${API_BASE_URL}${TOKEN_ENDPOINT}?${queryParams}`, {\n method: 'POST',\n headers: { 'x-api-key': API_KEY }\n })\n .then(response => {\n isSubmitting = false;\n send2FAMailButton.disabled = false; if (!response.ok) {\n return response.json().then(data => {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = data.message || Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.response.error'); // 'Kon het formulier niet verzenden. Controleer jouw code en probeer opnieuw';\n form.parentNode.insertBefore(error, form.nextSibling);\n throw new Error(data.message || 'Submission error');\n });\n } storedEmail = email; send2FAMailButton.style.display = 'none';\n if (twoFAInputContainer) twoFAInputContainer.style.display = '';\n if (phoneInputContainer) phoneInputContainer.style.display = '';\n if (confirm2FAButtonContainer) confirm2FAButtonContainer.style.display = ''; if (explanationText) explanationText.style.display = '';\n })\n .catch(err => {\n isSubmitting = false;\n send2FAMailButton.disabled = false;\n console.error(err);\n });\n }); confirm2FAButton.addEventListener('click', function () {\n document.getElementById('form-output')?.remove();\n document.getElementById('form-error')?.remove(); const phone = phoneInput?.value.trim() || '';\n const token = twoFAInput?.value.trim() || '';\n const email = storedEmail; if (!phone || !token || !email) {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.required'); //'Vul alle vereiste velden in'\n form.parentNode.insertBefore(error, form.nextSibling);\n return;\n } confirm2FAButton.disabled = true; const queryParams = new URLSearchParams({\n phone: phone,\n token: token,\n email: email\n }).toString(); fetch(`${API_BASE_URL}${CONFIRM_ENDPOINT}?${queryParams}`, {\n method: 'POST',\n headers: { 'x-api-key': API_KEY }\n })\n .then(response => {\n confirm2FAButton.disabled = false; if (!response.ok) {\n return response.json().then(data => {\n const error = document.createElement('div');\n error.id = 'form-error';\n error.style.color = 'red';\n error.style.marginTop = '1rem';\n error.textContent = data.message || Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.tooltip.code.error'); // 'Fout bij versturen. Controleer de ingevoerde code';\n form.parentNode.insertBefore(error, form.nextSibling);\n throw new Error(data.message || 'Confirmation error');\n });\n } // form.style.display = 'none';\n //\n // const successDiv = document.createElement('div');\n // successDiv.id = 'form-output';\n // successDiv.style.paddingTop = '20vh';\n // successDiv.style.paddingBottom = '20vh';\n // successDiv.style.textAlign = 'center';\n //\n // const header = document.createElement('h2');\n // header.textContent = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successTitle'); // 'Het is gelukt!';\n // header.style.marginBottom = '1rem';\n //\n // const paragraph = document.createElement('p');\n // paragraph.innerHTML = Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successMessage'); // 'We hebben je voorkeur opgeslagen en zorgen ervoor dat je er geen omkijken meer naar hebt. Toch iets wijzigen? Vul dan het formulier opnieuw in.<br><br>Let op: het kan een paar dagen duren voordat je aan- of afmelding volledig verwerkt is. In de tussentijd kun je nog advertenties van ons tegenkomen. Bedankt voor je geduld!';\n // paragraph.style.margin = '0 auto';\n // paragraph.style.maxWidth = '100%';\n // paragraph.style.lineHeight = '1.6';\n // paragraph.style.padding = '0 1rem';\n //\n //\n // successDiv.appendChild(header);\n // successDiv.appendChild(paragraph);\n //\n // form.parentNode.insertBefore(successDiv, form.nextSibling); Playtech.API.common.navigate('/');\n Playtech.API.popup.showPopup({\n title: Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successTitle'),\n content: Playtech.API.translation.translate('playtech.mobile.system.promo-exclusion.successMessage')\n });\n })\n .catch(err => {\n confirm2FAButton.disabled = false;\n console.error(err);\n });\n });\n });\n})();\n</script>","beforeEndBody":""},"conditionIds":["5dfa5ec7-2f60-4ec3-a4b2-2a26294bd859","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"2f8c08e0-cfd1-4da9-8ae1-9e2d86701048","tagTypeId":"custom_js","name":"Page time counter for specific RG pages","description":"HC-11165","config":{"code":"// HC-11165\n(function() {\n if (!Playtech.API.user.isLoggedIn()) {\n return;\n }\n\n var FIFTEEN_SECONDS = 15000;\n var ONE_MINUTE = 60000;\n var clearUrl = Playtech.API.common.getCleanUrl();\n var notificationSession = Date.now();\n\n setPlayerTag(clearUrl, notificationSession, 0);\n\n var timeout = setTimeout(() => {\n setPlayerTag(clearUrl, notificationSession, 1);\n }, FIFTEEN_SECONDS);\n\n let i = 2;\n var interval = setInterval(() => {\n if (i === 11) {\n clearInterval(interval);\n }\n\n setPlayerTag(clearUrl, notificationSession, i++);\n\n }, ONE_MINUTE);\n\n function setPlayerTag(pageName, sessionId, increment) {\n var currentPage = Playtech.API.common.getCleanUrl();\n if (currentPage !== pageName) {\n clearInterval(interval);\n clearTimeout(timeout);\n return;\n }\n\n var tagValue = { pageName, notificationSession: sessionId, timestampCount: increment };\n\n Playtech.API.user.setPlayerTags([\n {\n name: 'Portal/SafeBet/ResponsibleGamingPage',\n value: JSON.stringify(tagValue),\n type: 'text'\n }\n ]);\n }\n})();"},"conditionIds":["10c6a1bf-bd4b-4c65-9256-45b166858b9d"]},{"tagId":"2f9347a2-7cc0-4494-b31b-a07c5ea3b13b","tagTypeId":"custom_tag_type","name":"Sportsbook Styles","description":"HC-11970 Sportsbook max page width","config":{"beforeEndHead":"<style>\n /* HC-11970 */\n :root {\n --layout-max-width: 1440px;\n }\n</style>","beforeEndBody":""},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"a5557c0e-b2f1-466e-b8e3-d171b0254ac3","tagTypeId":"custom_js","name":"<3> Push User Data to DataLayer","description":"HC-11951,HC-11898 ( push userId, email and ageGroup to dataLayer)","config":{"code":" (function () {\r\n const loginEvent = \"login\";\r\n const registrationCompletedEvent = \"Registration:online:first_login\";\r\n\r\n async function sha256Hash(email) {\r\n const encoder = new TextEncoder();\r\n const emailBuffer = encoder.encode(email);\r\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", emailBuffer);\r\n const hashArray = Array.from(new Uint8Array(hashBuffer));\r\n const hashHex = hashArray\r\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\r\n .join(\"\");\r\n return hashHex;\r\n }\r\n\r\n function calculateUserAge(date) {\r\n if (!date) return 0;\r\n\r\n return Math.abs(\r\n new Date(new Date() - new Date(date)).getFullYear() - 1970\r\n );\r\n }\r\n\r\n function getAgeGroup(age) {\r\n const ageGroups = [\r\n { min: 18, max: 23, group: 1 },\r\n { min: 24, max: 29, group: 2 },\r\n { min: 30, max: 34, group: 3 },\r\n { min: 35, max: 39, group: 4 },\r\n { min: 40, max: 44, group: 5 },\r\n { min: 45, max: 49, group: 6 },\r\n { min: 50, max: 54, group: 7 },\r\n { min: 55, max: 60, group: 8 },\r\n { min: 61, max: Infinity, group: 9 },\r\n ];\r\n\r\n for (const ageGroup of ageGroups) {\r\n if (age >= ageGroup.min && age <= ageGroup.max) {\r\n return ageGroup.group;\r\n }\r\n }\r\n\r\n return \"\";\r\n }\r\n\r\n const setUserData = (event) => {\r\n let userDetails = {};\r\n const user = {};\r\n\r\n if (event === registrationCompletedEvent) {\r\n userDetails = JSON.parse(sessionStorage.getItem(\"userModel\"));\r\n }\r\n\r\n const { userId, email, birthDate } =\r\n event === loginEvent\r\n ? Playtech.fetchUserDetails()\r\n : {\r\n ...userDetails,\r\n ...userDetails?.formData,\r\n birthDate: userDetails?.formData?.birthdate,\r\n };\r\n\r\n const userAge = calculateUserAge(birthDate);\r\n const ageGroup = getAgeGroup(userAge);\r\n\r\n user.userId = userId;\r\n if (ageGroup) {\r\n user.ageGroup = ageGroup;\r\n }\r\n\r\n sha256Hash(email)\r\n .then((hash) => {\r\n user.hash = hash;\r\n })\r\n .catch((err) => {\r\n console.error(\"HC-11898 Error hashing email:\", err);\r\n })\r\n .finally((err) => {\r\n window.dataLayer = window.dataLayer || [];\r\n\r\n const dataLayerObject = {\r\n event: event,\r\n user: user,\r\n };\r\n\r\n if (event === registrationCompletedEvent) {\r\n dataLayerObject.new_customer = true;\r\n }\r\n window.dataLayer.push(dataLayerObject);\r\n });\r\n };\r\n\r\n if (Playtech.API.auth.isLoggedIn) {\r\n setUserData(loginEvent);\r\n }\r\n\r\n Playtech.on(Playtech.Events.LOGGED_IN, () => {\r\n setUserData(loginEvent);\r\n });\r\n\r\n Playtech.on(Playtech.Events.REGISTRATION_COMPLETED, () => {\r\n setUserData(registrationCompletedEvent);\r\n });\r\n })();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"32950625-cb76-43b7-b3e7-4c5e24f0ea64","tagTypeId":"custom_js","name":"Game launch","description":"game launch","config":{"code":"(function () {\n if (\n Playtech.API.common.getCleanUrl() !== '/gamelaunch' ||\n Playtech.Variables.isAdminLoggedIn\n ) {\n return;\n }\n\n var searchParams = new URLSearchParams(window.location.search);\n var gameCodeValue = searchParams.get('gameCode');\n\n function waitForGamesConfiguration() {\n var delay = 1000;\n var timeout = -1;\n var times = 0;\n var callback = function (res, rej) {\n if (Playtech.Variables.games) {\n res({ times });\n return;\n }\n\n if (times >= 30) {\n rej({ times });\n return;\n }\n\n times += 1;\n\n timeout = setTimeout(function () {\n callback(res, rej);\n }, delay);\n };\n\n return new Promise(function (resolve, reject) {\n timeout = setTimeout(function () {\n callback(resolve, reject);\n }, delay);\n });\n }\n\n function launchGame(code) {\n if (Playtech.API.auth.isLoggedIn) {\n Playtech.API.popup.showPopup({\n content:\n 'playtech.mobile.system.games.popup-blocker-with-confirm',\n buttons: [\n {\n text: 'playtech.mobile.system.button.realPlay',\n\n onClick() {\n Playtech.API.game.open({ code: code });\n }\n }\n ],\n layer: 'HIGH_PRIORITY'\n // closeAll: true\n });\n } else {\n Playtech.API.game.open({ code: code });\n }\n }\n\n if (gameCodeValue) {\n waitForGamesConfiguration().then(function () {\n Playtech?.API.common.navigate(\n '/',\n { replace: true },\n { removeParams: ['gameCode'] }\n );\n\n launchGame(gameCodeValue);\n });\n } else {\n Playtech.API.common.navigate('/error-page');\n }\n})();\n"},"conditionIds":["f47bb07f-0e1a-4901-b766-673d8728d2dd","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"590a37aa-25d0-42ac-93ec-1f21f5804a7b","tagTypeId":"custom_tag_type","name":"[Regulation] - BlockAccessOnNativeApps","description":"HC-11575 - Block access on Native Apps","config":{"beforeEndHead":"<style>\n #blockAccessOnNativeAppsPopup .hideBtn {\n display: none;\n }\n</style>\n<script>\n (function () {\n const WEB_CONTENT = \"BLOCK_ACCESS_ON_NATIVE_APPS\";\n const POPUP_ID = \"blockAccessOnNativeAppsPopup\";\n const REQUIRE_CONFIRMATION_PLAYER_TAG_NAME =\n \"portal/regulation/requireConfirmation\";\n\n function log() {\n if (localStorage.getItem(\"isLoggerEnabled\") === \"true\") {\n console.log.apply(\n console,\n [\"[Block Access On Native Apps] \"].concat(Array.from(arguments))\n );\n }\n }\n\n function shouldShowBlockingPopup(tags) {\n try {\n return Boolean(\n tags[0]?.name === REQUIRE_CONFIRMATION_PLAYER_TAG_NAME &&\n tags[0]?.value === \"true\"\n );\n } catch (err) {\n throw { error: err, code: 1 };\n }\n }\n\n function showBlockingPopup(tags) {\n try {\n if (shouldShowBlockingPopup(tags)) {\n log(\"show Popup\");\n Playtech.API.popup.showPopup({\n articleId: WEB_CONTENT,\n layer: \"VERY_HIGH_PRIORITY\",\n classNames: { actionButtons: \"hideBtn\" },\n isModal: true,\n id: POPUP_ID,\n });\n }\n } catch (err) {\n log(\"error\", err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user\n .getPlayerTags(REQUIRE_CONFIRMATION_PLAYER_TAG_NAME)\n .then(function (response) {\n return response?.data?.tags || [];\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(showBlockingPopup);\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(showBlockingPopup);\n }\n })();\n</script>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"44fb0671-95f8-4991-b22c-8a14227c68c6","tagTypeId":"custom_js","name":"Hide games for sportsbook native app","description":"Hide games for sportsbook native app","config":{"code":"(function() {\n var params = new URLSearchParams(location.search);\n if (params.has('additionalContext') && params.has('isNative')) {\n var games = document.querySelectorAll('[data-portlet-type=\"responsivegames\"]');\n if (games.length > 0) {\n Array.from(games).forEach(function(el) {\n el.classList.add('hidden');\n })\n }\n }\n\n})();"},"conditionIds":["1a66cab4-39b1-4092-a5cb-81887c12ee83","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"7da1d382-a9c6-4904-a45b-82981b7797a0","tagTypeId":"custom_tag_type","name":"Native disable reg","description":"HC-10828 - Show a popup hiding registration for native users","config":{"beforeEndHead":"<style>\n #disableRegPopup button {\n display: none !important;\n }\n</style>\n<script>\n (function () {\n\n var playerTags = [];\n\n function isRegInProgress() {\n try {\n return playerTags.some(function (tag) {\n return tag.name === 'portal/registration/InProgress' && tag.value === 'true';\n });\n } catch (err) {\n throw {error: err, code: 1};\n }\n }\n\n function main() {\n try {\n if (isRegInProgress()) {\n Playtech.API.popup.showPopup({\n articleId: 'NATIVE_REG_DISABLED',\n layer: 'VERY_HIGH_PRIORITY',\n isModal: true,\n id: 'disableRegPopup'\n });\n }\n } catch (err) {\n console.log('disable reg error >>>', err);\n }\n }\n\n function getPlayerTags() {\n return Playtech.API.user.getPlayerTags().then(function (response) {\n playerTags = response.data.tags;\n });\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, function () {\n getPlayerTags().then(main);\n });\n\n Playtech.on(Playtech.Events.LOGGED_OUT, function () {\n playerTags = [];\n });\n\n if (Playtech.API.auth.isLoggedIn) {\n getPlayerTags().then(main);\n }\n\n })();\n</script>\n","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"8d3e1d2d-058d-4aba-8717-75317d98ac9a","tagTypeId":"hc_ticket_counter","name":"TicketCounterTest","description":"Ticket Counter Test","config":{"playerTagName":"Player Journey/Raffleticketcount","webContentId":"TICKETCOUNTERTEST_BRIAN","vipLevelEqual":"3-20","vipLevelNotEqual":"1, 24"},"conditionIds":["01e72e94-c3b4-4182-ba14-bf084569e3b4","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"11d2bc52-84c6-443e-926f-6a71b3c13c4c","tagTypeId":"custom_js","name":"Add VIP Level as class","description":"Add VIP Level as class","config":{"code":"(() => {\r\n // html tag to attach CSS classes to\r\n // needs to be #applicaion, because otherwise classes will get overwritten by Portal\r\n const root = document.querySelector('#application');\r\n const handler = () => {\r\n if (!Playtech.API.auth.isLoggedIn) {\r\n // if player is not logged in, do nothing\r\n return;\r\n }\r\n\r\n const getPlayersLevel = Playtech.fetchUserDetails();\r\n const vipLevel = getPlayersLevel.vipLevel; //get vip status\r\n // add viplevel1\r\n root.classList.add(`viplevel${vipLevel}`);\r\n };\r\n // subscribe to login event\r\n Playtech.on(Playtech.Events.LOGGED_IN, handler);\r\n // subscribe to logout event\r\n Playtech.on(Playtech.Events.LOGGED_OUT, () => {\r\n Array.from(root.classList)\r\n .filter((name) => name.startsWith('vipl'))\r\n .forEach((name) => root.classList.remove(name));\r\n });\r\n // check on app init\r\n handler();\r\n})();"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"eee46cd0-5594-4ac6-a4bd-72feb3ea09d6","tagTypeId":"custom_tag_type","name":"HideBtnInIDINOption","description":"Hide the \"Verify my account with IDIN\" button in IDINOption registration","config":{"beforeEndHead":"<style>\r\n button[class*=IDINOption__btn] {\r\n display: none !important;\r\n }\r\n a[class*=IDINOption__btn] [class*=PlainText__text] {\r\n font-size: 1.2rem;\r\n }\r\n</style>","beforeEndBody":""},"conditionIds":["109b8f48-da23-4e5d-8f62-b1371cf41a08","ffa107aa-bb77-47e8-86d3-caad97cbbf82"]},{"tagId":"372aa339-83a2-4102-aa11-e4f4e9de8759","tagTypeId":"custom_tag_type","name":"AVENT_CALENDAR_STYLES_DEC23","description":"Advent calendar styles","config":{"beforeEndHead":"<style>\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 63.875rem;\r\n margin: 0 auto;\r\n background-size: contain;\r\n width: 100%;\r\n background-repeat: no-repeat;\r\n aspect-ratio: 2.2 / 1;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n width: 100% !important;\r\n min-width: auto !important;\r\n padding: 0;\r\n display: grid;\r\n grid-template: repeat(5, 1fr) / repeat(7, 1fr);\r\n grid-gap: 0.5rem;\r\n margin: 5% 9.5%;\r\n }\r\n\r\n [class*=\"AdventItem__adventItemWrapper\"] {\r\n width: 100% !important;\r\n display: block;\r\n }\r\n\r\n [class*=\"AdventItem__adventItemWrapper\"] [class*=\"Overlay__overlay\"] {\r\n height: 200vh;\r\n top: -50vh;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n margin: 0;\r\n width: 100%;\r\n height: 100%;\r\n text-shadow: none;\r\n box-shadow: none;\r\n border: 0 !important;\r\n transform: none !important;\r\n font-size: 3rem;\r\n font-weight: 800;\r\n line-height: 0.2rem;\r\n background-color: #18042c !important;\r\n color: #524361;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__future\"] {\r\n background-color: var(--hc-white) !important;\r\n color: #fb258d;\r\n }\r\n\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__active\"] {\r\n background-color: #fb258d !important;\r\n color: var(--hc-white);\r\n background-image: none;\r\n }\r\n\r\n .mobile-layout .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n width: 74vw;\r\n }\r\n\r\n .mobile-layout\r\n [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n grid-gap: 0.188rem;\r\n margin: 0;\r\n }\r\n\r\n .mobile-layout\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n font-size: 1.7rem;\r\n line-height: 0.2rem;\r\n }\r\n\r\n @media (min-width: 1183px) {\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n height: 51vh;\r\n background-position: center;\r\n max-height: 462px;\r\n width: auto;\r\n }\r\n }\r\n\r\n @media (max-width: 1182px) and (min-width: 1000px) {\r\n .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 100%;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"col-mob-4 col-dsk-10 AdventCalendar__adventCalendar\"] {\r\n margin: 8% 16%;\r\n }\r\n }\r\n\r\n @media (max-width: 500px) {\r\n .mobile-layout\r\n [class*=\"Button__success\"][class*=\"Button__dark\"][class*=\"AdventItem__adventItem\"] {\r\n font-size: 1.2rem;\r\n }\r\n }\r\n\r\n @media screen and (orientation: landscape) {\r\n .mobile-layout .bannerAdventCalendar [class*=\"AdventCalendar__adventCalendarWrapper\"] {\r\n max-width: 65vh;\r\n }\r\n }\r\n\r\n /* hero banner */\r\n .bannerAdventCalendar [class*=\"withHollandLayouts__wrapper\"] {\r\n --content-height: 60vh;\r\n }\r\n .bannerAdventCalendar [class*=\"Banner__sliderContainer\"],\r\n .bannerAdventCalendar [class*=\"Banner__slider\"] {\r\n flex: 1 0 100%;\r\n }\r\n\r\n .bannerAdventCalendar [class*=\"Slide__wc\"][class*=\"withHollandLayouts__wc\"] {\r\n top: 50%;\r\n transform: translateY(-50%);\r\n height: auto;\r\n display: block;\r\n }\r\n\r\n /* popup */\r\n .application-root [class*=\"AdventItemPopup__popup\"] {\r\n overflow: hidden;\r\n }\r\n\r\n [class*=\"AdventItemPopup__popup\"] .popup-modal__inner-content {\r\n overflow-y: auto;\r\n height: 100%;\r\n padding: 0 1rem;\r\n white-space: initial;\r\n }\r\n\r\n .mobile-layout .bannerAdventCalendar [class*=\"Popup__close\"] {\r\n top: 1.5rem !important;\r\n right: 1rem !important;\r\n }\r\n\r\n @media (max-width: 1000px) {\r\n .bannerAdventCalendar [class*=\"Popup__container\"] {\r\n top: -20vh;\r\n }\r\n\r\n .mobile.landscape\r\n .application-root\r\n .bannerAdventCalendar\r\n [class*=\"AdventItemPopup__popup\"] {\r\n height: calc(71vh - 2rem);\r\n }\r\n\r\n [class*=\"AdventItemPopup__popup\"] .popup-modal__inner-content {\r\n padding: 0 1rem 3rem;\r\n }\r\n }\r\n</style>\r\n","beforeEndBody":""},"conditionIds":["2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"217da009-6c1b-467b-9ed0-2b3c716a4eaa","tagTypeId":"custom_tag_type","name":"Promotions Main Page - Remove Shadow Gradient on image","description":"Promotions Main Page - Remove Shadow Gradient on image","config":{"beforeEndHead":"<style>\n [class*=Promo__mediaWrapper--]:after {\n content: none !important;\n }\n</style>\n<style>\n [class*=Promo__mediaWrapper--]:before {\n content: none !important;\n }\n</style>","beforeEndBody":""},"conditionIds":["4c81598f-2592-452e-b680-3c1eed17cba1","345f5466-1ecb-41f0-a758-0aa6b96e7697","2069bef2-303b-40f0-82c4-5b0178ce78ea"]},{"tagId":"3579f170-18b0-4c6b-8c79-73371d5d1041","tagTypeId":"custom_js","name":"Refresh page by player tag","description":"Refresh page by player tag","config":{"code":"(function () {\n function removePlayerTags(tags) {\n Playtech.API.server.send({\n ID: 35553,\n tags: [...tags],\n responses: [35554, 35555],\n description: 'Remove Player Tags Request'\n })\n }\n\n function playerTagChangeListener(e) {\n const { tag, removed } = e.detail;\n\n if (tag === 'CRM/refresh' && !removed) {\n removePlayerTags([{name: tag}])\n window.location.reload();\n }\n }\n\n function subscribeOnTagChange() {\n Playtech.API.events.addEventListener(\n 'player-tag-change',\n playerTagChangeListener\n );\n }\n\n function unsubscribeOnTagChange() {\n Playtech.API.events.removeEventListener(\n 'player-tag-change',\n playerTagChangeListener\n );\n }\n\n Playtech.on(Playtech.Events.LOGGED_IN, subscribeOnTagChange);\n\n Playtech.on(Playtech.Events.LOGGED_OUT, unsubscribeOnTagChange);\n\n if (Playtech.API.auth.isLoggedIn) {\n subscribeOnTagChange();\n }\n})();\n"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"5df800d8-4757-4c99-8f7e-4fc034847b88","tagTypeId":"vip_icons","name":"VIP Icons","description":"Configuration of avatar images by vip levels","config":{"vipIconsConfig":[{"vipLevel":"30","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"29","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"28","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"27","icon":"/library/VIP/icons/vip-gold-icon.png"},{"vipLevel":"26","icon":"/library/VIP/icons/vip-silver-icon.png"},{"vipLevel":"20","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"19","icon":"/library/VIP/icons/vip-premium-icon.png"},{"vipLevel":"18","icon":"/library/VIP/icons/vip-platinum-icon.png"},{"vipLevel":"17","icon":"/library/VIP/icons/vip-gold-icon.png"},{"vipLevel":"16","icon":"/library/VIP/icons/vip-silver-icon.png"}]},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]},{"tagId":"974b3a3f-5b73-4edc-b702-ab6ddaa1df0a","tagTypeId":"custom_js","name":"PJ Initial Offer Tag Setter","description":"Impl for tag setter","config":{"code":"document.body.addEventListener('click', (event) => {\n if (event.target.id === 'sports-offer') {\n Playtech.API.user.setPlayerTags([{ name: 'sports-tag' }]);\n } else if (event.target.id === 'casino-offer') {\n Playtech.API.user.setPlayerTags([{ name: 'casino-tag' }]);\n }\n});"},"conditionIds":["bc0b6529-9f7a-4f6b-8c4d-15194d057ee8"]}],"conditions":[{"conditionId":"b8cd6255-5275-430e-b4b3-34917ce3e157","conditionTypeId":"page_condition","name":"Premium pages","description":"list of premium pages","config":{"onPageLaunch":"/test/test-premium-components, /test-premium-components2, /test-premium-components/test-home, /premium-lounge, /premium-lounge/home, /premium-lounge/promoties, /premium-lounge/events, /test-premium-components-code","onPageNotLaunch":""}},{"conditionId":"9772dc61-ab34-460f-9759-be2edb11cd51","conditionTypeId":"page_condition","name":"aws page ","description":"run aws tag","config":{"onPageLaunch":"/online/casino/slotmachines,/casino","onPageNotLaunch":""}},{"conditionId":"dfe6bbcd-e4c0-4a93-bf8e-b3ad13646c71","conditionTypeId":"page_condition","name":"/awsmessagetest2","description":"/awsmessagetest2","config":{"onPageLaunch":"/awsmessagetest2","onPageNotLaunch":""}},{"conditionId":"20d65c93-a18d-40f0-bb20-6c2053c29822","conditionTypeId":"page_condition","name":"Leaderboard-page","description":"Leaderboard-pages","config":{"onPageLaunch":"/leaderboard-page","onPageNotLaunch":""}},{"conditionId":"60352a4d-5190-4f6f-8ddd-22780680eed3","conditionTypeId":"page_condition","name":"/live-casino","description":"live-casino","config":{"onPageLaunch":"/live-casino","onPageNotLaunch":""}},{"conditionId":"5dfa5ec7-2f60-4ec3-a4b2-2a26294bd859","conditionTypeId":"page_condition","name":"afmelden-advertenties/formulier","description":"afmelden-advertenties/formulier","config":{"onPageLaunch":"/afmelden-advertenties/formulier","onPageNotLaunch":""}},{"conditionId":"3a3b7ebd-924c-4201-9b64-c60367a4f411","conditionTypeId":"page_condition","name":"on poker page","description":"on poker page","config":{"onPageLaunch":"/poker","onPageNotLaunch":""}},{"conditionId":"9f733509-bbb6-4048-8901-85533034314c","conditionTypeId":"page_condition","name":"structured-data-test","description":"structured-data-test","config":{"onPageLaunch":"/structured-data-test","onPageNotLaunch":""}},{"conditionId":"2e8f68c0-2d83-4009-bf0e-9507529535dc","conditionTypeId":"native_app_condition","name":"excludeFromNative","description":"will not run in native apps","config":{"nativeAppRule":"0"}},{"conditionId":"01e72e94-c3b4-4182-ba14-bf084569e3b4","conditionTypeId":"page_condition","name":"WhiteBlackListTCount","description":"WhiteBlackListTCount","config":{"onPageLaunch":"","onPageNotLaunch":"/sportsbook"}},{"conditionId":"4c81598f-2592-452e-b680-3c1eed17cba1","conditionTypeId":"page_condition","name":"General pages","description":"Main URLs for use with custom CSS changes","config":{"onPageLaunch":"/home , /casino , /live-casino , /promoties ,/bingo , /sportsbook , /poker , /online/casino/premium , /online/casino/exclusief , /online/casino/tablegames , /online/casino/slotmachines , /online/casino/jackpots , /en/online/casino/all-games-casino , /online/veilig-en-verantwoord-spelen , /promoties/poker-welcome-2022 , /promoties/poker-welcome-offer , /live/exclusive , /live/tafelspelen , /live/roulette , /live/gameshows , /live/highroller , /live/ander, /promoties/casino/niet-normaal-novemberprijs, /promoties/poker-mcop-2022, /promoties/sports/HCSPBGSRV-nov22, /promoties/sports/HCSPBGSR-nov22, /promoties/sports/HCSPXmasSpecial-dec22, /TEst-Xenia-Engagement_NORMAL, /promoties/poker-irish-open, /promoties/sports/football-combo-boost, /promoties/sports/tennis-combo-boost, /promoties/sports/basketball-combi-boost, /promoties/sports/darts-combo-boost, /promoties/sports/bet-watch, /promoties/sports/cash-out, /promoties/sports/Chineesnieuwjaar, /promoties/sports/ChineesnieuwjaarV, /promoties/wpt-prime-qualifiers, /promoties/poker-leaderboard, /promoties/sports/FEBRUARIFREEBET, /promoties/sports/FebruariCombi, /promoties/sports/FebruariCombiV, /leaderboards, /inloggen, /registreren, /promoties/vip, /promoties/, /promoties/casino, /promoties/sportsbook, /promoties/poker, /promoties/bingo","onPageNotLaunch":""}},{"conditionId":"345f5466-1ecb-41f0-a758-0aa6b96e7697","conditionTypeId":"page_condition","name":"Main promo page only","description":"Main promo page only","config":{"onPageLaunch":"/promoties,/Promogrid-test-final,/promoties/casino,/promoties/sportsbook,/promoties/poker,/promoties/bingo,/promoties/vip,/prev.hollandcasino.nl/en/promoties, /prev.hollandcasino.nl/promoties","onPageNotLaunch":""}},{"conditionId":"109b8f48-da23-4e5d-8f62-b1371cf41a08","conditionTypeId":"native_app_condition","name":"inNative","description":"the tag will run only if url has param ?isNative=1","config":{"nativeAppRule":"1"}},{"conditionId":"eff80154-dd28-44c2-8dcd-9d0bc83ef6b3","conditionTypeId":"page_condition","name":"/cookie-settings","description":"/cookie-settings","config":{"onPageLaunch":"/cookie-settings","onPageNotLaunch":""}},{"conditionId":"ffa107aa-bb77-47e8-86d3-caad97cbbf82","conditionTypeId":"basic_condition","name":"OnPreloader","description":"OnPreloader","config":{"launch":"onPreloader"}},{"conditionId":"8059f1cb-fd6e-4142-8071-26a5376abe4c","conditionTypeId":"page_condition","name":"PenaltyShootout page","description":"/promoties/sports/PenaltySpel","config":{"onPageLaunch":"/promoties/sports/PenaltySpel","onPageNotLaunch":""}},{"conditionId":"00496ce8-f9cc-44f7-95cc-11d9faef1d0c","conditionTypeId":"page_condition","name":"TN docs upload page","description":"TN docs upload page","config":{"onPageLaunch":"/mijnhc/account-verificatie","onPageNotLaunch":""}},{"conditionId":"f47bb07f-0e1a-4901-b766-673d8728d2dd","conditionTypeId":"page_condition","name":"/gamelaunch","description":"/gamelaunch","config":{"onPageLaunch":"/gamelaunch","onPageNotLaunch":""}},{"conditionId":"5a613a7e-8cb1-4ad7-b227-581f8b0a392d","conditionTypeId":"page_condition","name":"Test - Brian test","description":"test page ","config":{"onPageLaunch":"/briantest","onPageNotLaunch":""}},{"conditionId":"bc0b6529-9f7a-4f6b-8c4d-15194d057ee8","conditionTypeId":"basic_condition","name":"onAppInit","description":"Application initialisation","config":{"launch":"onAppInit"}},{"conditionId":"5d6c9f1d-245e-415b-a164-2a5752005ef1","conditionTypeId":"page_condition","name":"/ada","description":"/ada","config":{"onPageLaunch":"/ada","onPageNotLaunch":""}},{"conditionId":"a7c25c7b-c02c-4d63-bd9a-4cb9c6993006","conditionTypeId":"page_condition","name":"/bingo","description":"/bingo","config":{"onPageLaunch":"/bingo","onPageNotLaunch":""}},{"conditionId":"54ecef8c-410a-4aae-935a-ae7b66a2be91","conditionTypeId":"page_condition","name":"/home_page_trigger","description":"when user visits the /home page","config":{"onPageLaunch":"/home","onPageNotLaunch":""}},{"conditionId":"3b190ea9-16dc-4436-aa2e-4e2ba3cbb820","conditionTypeId":"page_condition","name":"/casino","description":"/casino","config":{"onPageLaunch":"/casino","onPageNotLaunch":""}},{"conditionId":"1a66cab4-39b1-4092-a5cb-81887c12ee83","conditionTypeId":"page_condition","name":"/sportsbook","description":"/sportsbook","config":{"onPageLaunch":"/sportsbook","onPageNotLaunch":""}},{"conditionId":"f74d4594-d23a-483d-8da4-916549a7fe7f","conditionTypeId":"page_condition","name":"/inloggen","description":"/inloggen","config":{"onPageLaunch":"/inloggen","onPageNotLaunch":""}},{"conditionId":"2069bef2-303b-40f0-82c4-5b0178ce78ea","conditionTypeId":"basic_condition","name":"Before page rendered","description":"Before page rendered","config":{"launch":"beforePageRendered"}},{"conditionId":"d37e588d-0329-4469-8cfa-4159ff363d48","conditionTypeId":"page_condition","name":"Game results","description":"Game results","config":{"onPageLaunch":"/mijnhc/game-resultaten-hidden","onPageNotLaunch":""}},{"conditionId":"07120f96-4ad3-430d-a64c-231bd2dda580","conditionTypeId":"page_condition","name":"/registreren","description":"/registreren","config":{"onPageLaunch":"/registreren","onPageNotLaunch":""}},{"conditionId":"10c6a1bf-bd4b-4c65-9256-45b166858b9d","conditionTypeId":"basic_condition","name":"afterPageRendered","description":"afterPageRendered","config":{"launch":"afterPageRendered"}}]}