{"id":2074,"date":"2026-03-14T13:19:01","date_gmt":"2026-03-14T06:19:01","guid":{"rendered":"https:\/\/wucode.net\/?page_id=2074"},"modified":"2026-04-15T13:34:05","modified_gmt":"2026-04-15T06:34:05","slug":"chinh-sach-bao-mat","status":"publish","type":"page","link":"https:\/\/www.wucode.net\/en\/chinh-sach-bao-mat\/","title":{"rendered":"Ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"2074\" class=\"elementor elementor-2074\" data-elementor-post-type=\"page\">\n\t\t\t\t<div role=\"main\" class=\"elementor-element elementor-element-71be3ba e-con-full e-flex e-con e-parent\" data-id=\"71be3ba\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70fd246 elementor-widget elementor-widget-particle_hero_section\" data-id=\"70fd246\" data-element_type=\"widget\" data-widget_type=\"particle_hero_section.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<style>\n\t\t\t#container-ph_canvas_70fd246 {\n\t\t\t\tposition: relative;\n\t\t\t\toverflow: hidden;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t\t#canvas-ph_canvas_70fd246 {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0; left: 0; right: 0; bottom: 0;\n\t\t\t\tz-index: 0;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t\t#container-ph_canvas_70fd246 .ph-overlay {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0; left: 0; right: 0; bottom: 0;\n\t\t\t\tz-index: 5;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t\t#container-ph_canvas_70fd246 .ph-content-wrapper {\n\t\t\t\tposition: relative;\n\t\t\t\tz-index: 10;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\ttext-align: center;\n\t\t\t\tpointer-events: none; \n\t\t\t}\n\t\t\t#container-ph_canvas_70fd246 .ph-button {\n\t\t\t\tpointer-events: auto;\n\t\t\t\ttext-decoration: none;\n\t\t\t\tdisplay: inline-block;\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t<\/style>\n\n\t\t<div id=\"container-ph_canvas_70fd246\" class=\"ph-container\">\n\t\t\t<canvas id=\"canvas-ph_canvas_70fd246\"><\/canvas>\n\t\t\t<div class=\"ph-overlay\"><\/div> <!-- Th\u00eam Background Overlay -->\n\t\t\t\n\t\t\t<div class=\"ph-content-wrapper\" id=\"content-ph_canvas_70fd246\">\n\t\t\t\t<div class=\"ph-heading-1\"><\/div>\n\t\t\t\t<div class=\"ph-heading-2\"><\/div>\n\t\t\t\t\n\t\t\t\t<a class=\"ph-button\">\n\t\t\t\t\t\t\t\t\t<\/a>\n\t\t\t<\/div>\n\t\t<\/div>\n\n\t\t<script>\n\t\t(function() {\n\t\t\tconst initCanvasWidget = () => {\n\t\t\t\tconst instanceId = 'ph_canvas_70fd246';\n\t\t\t\tconst config = {\"shapeType\":\"complex-svg\",\"shapeText\":null,\"shapeFontSize\":1200,\"iconPath\":null,\"iconViewBox\":null,\"svgSource\":\"media\",\"svgUrl\":\"https:\\\/\\\/www.wucode.net\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/Privacy-Banner-1.png\",\"svgInline\":null,\"shapeThickness\":15,\"particleShape\":\"diamond\",\"colors\":{\"base\":\"#000000\",\"accent1\":\"#000000\",\"accent2\":\"#000000\",\"shape\":null},\"triggerMode\":{\"desktop\":\"scroll\",\"tablet\":\"\",\"mobile\":\"\"},\"shapeSize\":{\"desktop\":70,\"tablet\":40,\"mobile\":50},\"totalParticles\":{\"desktop\":3500,\"tablet\":2500,\"mobile\":1500},\"particleSize\":{\"desktop\":2,\"tablet\":1.2,\"mobile\":1},\"animationSpeed\":{\"desktop\":0.1,\"tablet\":\"\",\"mobile\":0.15},\"shapePositionX\":{\"desktop\":0.7,\"tablet\":\"\",\"mobile\":0.7},\"shapePositionY\":{\"desktop\":0.5,\"tablet\":\"\",\"mobile\":0.8}};\n\t\t\t\tconst canvas = document.getElementById('canvas-' + instanceId);\n\t\t\t\tconst container = document.getElementById('container-' + instanceId);\n\t\t\t\t\n\t\t\t\tif (!canvas || !container || container.clientWidth === 0 || container.clientHeight === 0) {\n\t\t\t\t\tsetTimeout(initCanvasWidget, 100);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\t\t\t\n\t\t\t\tlet isHovered = false;\n\t\t\t\tlet animationFrameId;\n\t\t\t\tlet particles = [];\n\t\t\t\tlet targetPoints = [];\n\t\t\t\tlet shapeParticleCount = 0;\n\t\t\t\tlet width = 0;\n\t\t\t\tlet height = 0;\n\t\t\t\tlet hoverTime = 0;\n\t\t\t\tlet isIntersecting = false;\n\t\t\t\tlet isVisible = true; \n\n\t\t\t\tconst getResVal = (valObj, w) => {\n\t\t\t\t\tif (w <= 767 && valObj.mobile !== '') return parseFloat(valObj.mobile);\n\t\t\t\t\tif (w <= 1024 && valObj.tablet !== '') return parseFloat(valObj.tablet);\n\t\t\t\t\treturn parseFloat(valObj.desktop);\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tconst getResString = (valObj, w) => {\n\t\t\t\t\tif (w <= 767 && valObj.mobile !== '') return valObj.mobile;\n\t\t\t\t\tif (w <= 1024 && valObj.tablet !== '') return valObj.tablet;\n\t\t\t\t\treturn valObj.desktop;\n\t\t\t\t};\n\n\t\t\t\tconst handleHoverIn = () => {\n\t\t\t\t\tif (getResString(config.triggerMode, window.innerWidth) === 'hover') isHovered = true;\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tconst handleHoverOut = () => {\n\t\t\t\t\tif (getResString(config.triggerMode, window.innerWidth) === 'hover') isHovered = false;\n\t\t\t\t};\n\n\t\t\t\tcontainer.addEventListener('mouseenter', handleHoverIn);\n\t\t\t\tcontainer.addEventListener('mouseleave', handleHoverOut);\n\t\t\t\tcontainer.addEventListener('touchstart', handleHoverIn, { passive: true });\n\t\t\t\tcontainer.addEventListener('touchend', handleHoverOut);\n\t\t\t\tcontainer.addEventListener('touchcancel', handleHoverOut);\n\n\t\t\t\tconst observer = new IntersectionObserver((entries) => {\n\t\t\t\t\tentries.forEach(entry => {\n\t\t\t\t\t\tisVisible = entry.isIntersecting; \n\t\t\t\t\t\t\n\t\t\t\t\t\tif (entry.intersectionRatio >= 0.4) {\n\t\t\t\t\t\t\tisIntersecting = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tisIntersecting = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (getResString(config.triggerMode, window.innerWidth) === 'scroll') {\n\t\t\t\t\t\t\tisHovered = isIntersecting;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, { threshold: [0, 0.4] });\n\t\t\t\tobserver.observe(container);\n\n\t\t\t\tconst dpr = window.devicePixelRatio || 1;\n\n\t\t\t\tconst initParticles = async () => {\n\t\t\t\t\twidth = container.clientWidth;\n\t\t\t\t\theight = container.clientHeight;\n\n\t\t\t\t\tif (width <= 0 || height <= 0) return false;\n\n\t\t\t\t\tconst currentTrigger = getResString(config.triggerMode, window.innerWidth);\n\t\t\t\t\tif (currentTrigger === 'scroll') {\n\t\t\t\t\t\tisHovered = isIntersecting;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tisHovered = false; \n\t\t\t\t\t}\n\n\t\t\t\t\tconst currentParticlesCount = getResVal(config.totalParticles, window.innerWidth);\n\t\t\t\t\tconst currentPSize = getResVal(config.particleSize, window.innerWidth);\n\t\t\t\t\tconst currentSpeed = getResVal(config.animationSpeed, window.innerWidth);\n\t\t\t\t\tconst currentPosX = getResVal(config.shapePositionX, window.innerWidth);\n\t\t\t\t\tconst currentPosY = getResVal(config.shapePositionY, window.innerWidth);\n\t\t\t\t\tconst currentShapeSize = getResVal(config.shapeSize, window.innerWidth);\n\n\t\t\t\t\tcanvas.width = width * dpr;\n\t\t\t\t\tcanvas.height = height * dpr;\n\t\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\t\tcanvas.style.height = height + 'px';\n\t\t\t\t\t\n\t\t\t\t\tctx.setTransform(1, 0, 0, 1, 0, 0);\n\t\t\t\t\tctx.scale(dpr, dpr);\n\n\t\t\t\t\tconst offCanvas = document.createElement('canvas');\n\t\t\t\t\tconst offCtx = offCanvas.getContext('2d', { willReadFrequently: true });\n\t\t\t\t\toffCanvas.width = width;\n\t\t\t\t\toffCanvas.height = height;\n\t\t\t\t\t\n\t\t\t\t\tconst maxAllowedWidth = width * (currentShapeSize \/ 100);\n\t\t\t\t\t\n\t\t\t\t\tif (config.shapeType === 'complex-svg') {\n\t\t\t\t\t\tawait new Promise((resolve) => {\n\t\t\t\t\t\t\tconst img = new Image();\n\t\t\t\t\t\t\timg.crossOrigin = \"Anonymous\"; \n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\timg.onload = () => {\n\t\t\t\t\t\t\t\tconst imgAspect = img.width \/ (img.height || 1);\n\t\t\t\t\t\t\t\tlet drawWidth = maxAllowedWidth;\n\t\t\t\t\t\t\t\tlet drawHeight = drawWidth \/ imgAspect;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tif (drawHeight > height * (currentShapeSize \/ 100)) {\n\t\t\t\t\t\t\t\t\tdrawHeight = height * (currentShapeSize \/ 100);\n\t\t\t\t\t\t\t\t\tdrawWidth = drawHeight * imgAspect;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\toffCtx.drawImage(\n\t\t\t\t\t\t\t\t\timg, \n\t\t\t\t\t\t\t\t\twidth * currentPosX - drawWidth \/ 2, \n\t\t\t\t\t\t\t\t\theight * currentPosY - drawHeight \/ 2, \n\t\t\t\t\t\t\t\t\tdrawWidth, \n\t\t\t\t\t\t\t\t\tdrawHeight\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\timg.onerror = resolve; \n\n\t\t\t\t\t\t\tif (config.svgSource === 'media' && config.svgUrl) {\n\t\t\t\t\t\t\t\timg.src = config.svgUrl;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\timg.src = 'data:image\/svg+xml;charset=utf-8,' + encodeURIComponent(config.svgInline);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t} else if (config.shapeType === 'icon') {\n\t\t\t\t\t\tconst path = new Path2D(config.iconPath);\n\t\t\t\t\t\tconst scale = maxAllowedWidth \/ config.iconViewBox;\n\t\t\t\t\t\t\n\t\t\t\t\t\toffCtx.translate(width * currentPosX, height * currentPosY);\n\t\t\t\t\t\toffCtx.scale(scale, scale);\n\t\t\t\t\t\toffCtx.translate(-config.iconViewBox \/ 2, -config.iconViewBox \/ 2);\n\t\t\t\t\t\t\n\t\t\t\t\t\toffCtx.lineWidth = config.shapeThickness \/ scale; \n\t\t\t\t\t\toffCtx.strokeStyle = 'black';\n\t\t\t\t\t\toffCtx.lineCap = 'round';\n\t\t\t\t\t\toffCtx.lineJoin = 'round';\n\t\t\t\t\t\toffCtx.stroke(path);\n\t\t\t\t\t\t\n\t\t\t\t\t\toffCtx.setTransform(1, 0, 0, 1, 0, 0); \n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet fontSize = config.shapeFontSize;\n\t\t\t\t\t\toffCtx.font = \"bold \" + fontSize + \"px sans-serif\";\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet textWidth = offCtx.measureText(config.shapeText).width;\n\t\t\t\t\t\tif (textWidth > maxAllowedWidth && textWidth > 0) {\n\t\t\t\t\t\t\tfontSize = Math.floor(fontSize * (maxAllowedWidth \/ textWidth));\n\t\t\t\t\t\t\toffCtx.font = \"bold \" + fontSize + \"px sans-serif\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toffCtx.textAlign = 'center';\n\t\t\t\t\t\toffCtx.textBaseline = 'middle';\n\t\t\t\t\t\toffCtx.lineWidth = config.shapeThickness;\n\t\t\t\t\t\toffCtx.strokeStyle = 'black';\n\t\t\t\t\t\toffCtx.lineCap = 'round';\n\t\t\t\t\t\toffCtx.lineJoin = 'round';\n\t\t\t\t\t\toffCtx.strokeText(config.shapeText, width * currentPosX, height * currentPosY);\n\t\t\t\t\t}\n\n\t\t\t\t\tconst imgData = offCtx.getImageData(0, 0, width, height).data;\n\t\t\t\t\ttargetPoints = [];\n\t\t\t\t\tconst gap = Math.max(Math.floor(width \/ 250), 4); \n\n\t\t\t\t\tfor (let y = 0; y < height; y += gap) {\n\t\t\t\t\t\tfor (let x = 0; x < width; x += gap) {\n\t\t\t\t\t\t\tconst index = (y * width + x) * 4;\n\t\t\t\t\t\t\tconst r = imgData[index];\n\t\t\t\t\t\t\tconst g = imgData[index + 1];\n\t\t\t\t\t\t\tconst b = imgData[index + 2];\n\t\t\t\t\t\t\tconst alpha = imgData[index + 3];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (alpha > 50) {\n\t\t\t\t\t\t\t\tconst originalColor = config.shapeType === 'complex-svg' \n\t\t\t\t\t\t\t\t\t? \"rgba(\" + r + \",\" + g + \",\" + b + \",\" + (alpha \/ 255) + \")\" \n\t\t\t\t\t\t\t\t\t: config.colors.shape;\n\t\t\t\t\t\t\t\ttargetPoints.push({ x: x, y: y, color: originalColor });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (targetPoints.length > currentParticlesCount * 0.85) {\n\t\t\t\t\t\ttargetPoints.sort(() => Math.random() - 0.5);\n\t\t\t\t\t\ttargetPoints = targetPoints.slice(0, Math.floor(currentParticlesCount * 0.85));\n\t\t\t\t\t}\n\n\t\t\t\t\tparticles = [];\n\t\t\t\t\tshapeParticleCount = targetPoints.length;\n\n\t\t\t\t\tfor (let i = 0; i < currentParticlesCount; i++) {\n\t\t\t\t\t\tconst isShapeParticle = i < shapeParticleCount;\n\t\t\t\t\t\tconst target = isShapeParticle ? targetPoints[i] : null;\n\n\t\t\t\t\t\tlet particleType = 'bg-float';\n\t\t\t\t\t\tif (isShapeParticle) {\n\t\t\t\t\t\t\tparticleType = 'shape';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparticleType = Math.random() < 0.25 ? 'bg-suck' : 'bg-float';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst randomShapeTarget = shapeParticleCount > 0 \n\t\t\t\t\t\t\t? targetPoints[Math.floor(Math.random() * shapeParticleCount)] \n\t\t\t\t\t\t\t: { x: width * currentPosX, y: height * currentPosY };\n\n\t\t\t\t\t\tlet hoverColor = config.colors.base;\n\t\t\t\t\t\tif (isShapeParticle) {\n\t\t\t\t\t\t\thoverColor = target.color; \n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst rand = Math.random();\n\t\t\t\t\t\t\tif (rand > 0.98) hoverColor = config.colors.accent1;\n\t\t\t\t\t\t\telse if (rand > 0.8) hoverColor = config.colors.accent2;\n\t\t\t\t\t\t\telse hoverColor = config.colors.base;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparticles.push({\n\t\t\t\t\t\t\tx: Math.random() * width,\n\t\t\t\t\t\t\ty: Math.random() * height,\n\t\t\t\t\t\t\toriginX: Math.random() * width,\n\t\t\t\t\t\t\toriginY: Math.random() * height,\n\t\t\t\t\t\t\ttargetX: target ? target.x : Math.random() * width,\n\t\t\t\t\t\t\ttargetY: target ? target.y : Math.random() * height,\n\t\t\t\t\t\t\tmagnetX: randomShapeTarget.x,\n\t\t\t\t\t\t\tmagnetY: randomShapeTarget.y,\n\t\t\t\t\t\t\ttype: particleType,\n\t\t\t\t\t\t\tsize: Math.random() * (currentPSize * 0.8) + (currentPSize * 0.4),\n\t\t\t\t\t\t\tcolorHover: hoverColor,\n\t\t\t\t\t\t\tvx: (Math.random() - 0.5) * 0.3,\n\t\t\t\t\t\t\tvy: (Math.random() - 0.5) * 0.3,\n\t\t\t\t\t\t\tconfigSpeed: currentSpeed\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tparticles.sort((a, b) => a.colorHover.localeCompare(b.colorHover));\n\t\t\t\t\t\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\n\t\t\t\tconst draw = () => {\n\t\t\t\t\tif (!document.body.contains(canvas)) {\n\t\t\t\t\t\tif (animationFrameId) cancelAnimationFrame(animationFrameId);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationFrameId = requestAnimationFrame(draw);\n\n\t\t\t\t\tif (!isVisible) return; \n\n\t\t\t\t\tif (width > 0 && height > 0) {\n\t\t\t\t\t\tctx.clearRect(0, 0, width, height);\n\n\t\t\t\t\t\tif (isHovered) hoverTime++; else hoverTime = 0;\n\n\t\t\t\t\t\tlet lastColor = null;\n\t\t\t\t\t\tctx.beginPath(); \n\n\t\t\t\t\t\tparticles.forEach(p => {\n\t\t\t\t\t\t\tlet tx, ty;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (isHovered) {\n\t\t\t\t\t\t\t\tif (p.type === 'shape') {\n\t\t\t\t\t\t\t\t\ttx = p.targetX; ty = p.targetY;\n\t\t\t\t\t\t\t\t\tp.x += (tx - p.x) * p.configSpeed;\n\t\t\t\t\t\t\t\t\tp.y += (ty - p.y) * p.configSpeed;\n\t\t\t\t\t\t\t\t} else if (p.type === 'bg-suck' && hoverTime > 40) {\n\t\t\t\t\t\t\t\t\tconst dx = p.magnetX - p.originX;\n\t\t\t\t\t\t\t\t\tconst dy = p.magnetY - p.originY;\n\t\t\t\t\t\t\t\t\tconst dist = Math.sqrt(dx * dx + dy * dy);\n\n\t\t\t\t\t\t\t\t\tif (dist < 20) {\n\t\t\t\t\t\t\t\t\t\tconst angle = Math.random() * Math.PI * 2;\n\t\t\t\t\t\t\t\t\t\tconst radius = Math.max(width, height) * 0.6; \n\t\t\t\t\t\t\t\t\t\tp.originX = width \/ 2 + Math.cos(angle) * radius;\n\t\t\t\t\t\t\t\t\t\tp.originY = height \/ 2 + Math.sin(angle) * radius;\n\t\t\t\t\t\t\t\t\t\tp.x = p.originX; p.y = p.originY;\n\t\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t\tconst newTarget = shapeParticleCount > 0 \n\t\t\t\t\t\t\t\t\t\t\t? targetPoints[Math.floor(Math.random() * shapeParticleCount)] \n\t\t\t\t\t\t\t\t\t\t\t: { x: width \/ 2, y: height \/ 2 };\n\t\t\t\t\t\t\t\t\t\tp.magnetX = newTarget.x;\n\t\t\t\t\t\t\t\t\t\tp.magnetY = newTarget.y;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tp.originX += dx * 0.01; \n\t\t\t\t\t\t\t\t\t\tp.originY += dy * 0.01;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\ttx = p.originX; ty = p.originY;\n\t\t\t\t\t\t\t\t\tp.x += (tx - p.x) * p.configSpeed;\n\t\t\t\t\t\t\t\t\tp.y += (ty - p.y) * p.configSpeed;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tp.originX += p.vx; p.originY += p.vy;\n\t\t\t\t\t\t\t\t\tif (p.originX < 0 || p.originX > width) p.vx *= -1;\n\t\t\t\t\t\t\t\t\tif (p.originY < 0 || p.originY > height) p.vy *= -1;\n\t\t\t\t\t\t\t\t\ttx = p.originX; ty = p.originY;\n\t\t\t\t\t\t\t\t\tp.x += (tx - p.x) * p.configSpeed;\n\t\t\t\t\t\t\t\t\tp.y += (ty - p.y) * p.configSpeed;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tp.originX += p.vx; p.originY += p.vy;\n\t\t\t\t\t\t\t\tif (p.originX < 0 || p.originX > width) p.vx *= -1;\n\t\t\t\t\t\t\t\tif (p.originY < 0 || p.originY > height) p.vy *= -1;\n\t\t\t\t\t\t\t\ttx = p.originX; ty = p.originY;\n\t\t\t\t\t\t\t\tp.x += (tx - p.x) * p.configSpeed;\n\t\t\t\t\t\t\t\tp.y += (ty - p.y) * p.configSpeed;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlet currentColor = isHovered ? p.colorHover : config.colors.base;\n\n\t\t\t\t\t\t\tif (currentColor !== lastColor) {\n\t\t\t\t\t\t\t\tif (lastColor !== null) ctx.fill(); \n\t\t\t\t\t\t\t\tctx.fillStyle = currentColor;\n\t\t\t\t\t\t\t\tctx.beginPath();\n\t\t\t\t\t\t\t\tlastColor = currentColor;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\/\/ Thu\u1eadt to\u00e1n v\u1ebd h\u00ecnh d\u1ea1ng (Shape Generator)\n\t\t\t\t\t\t\tif (config.particleShape === 'square') {\n\t\t\t\t\t\t\t\tctx.rect(p.x - p.size, p.y - p.size, p.size * 2, p.size * 2);\n\t\t\t\t\t\t\t} else if (config.particleShape === 'triangle') {\n\t\t\t\t\t\t\t\tctx.moveTo(p.x, p.y - p.size);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x + p.size, p.y + p.size);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x - p.size, p.y + p.size);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x, p.y - p.size);\n\t\t\t\t\t\t\t} else if (config.particleShape === 'diamond') {\n\t\t\t\t\t\t\t\tctx.moveTo(p.x, p.y - p.size);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x + p.size, p.y);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x, p.y + p.size);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x - p.size, p.y);\n\t\t\t\t\t\t\t\tctx.lineTo(p.x, p.y - p.size);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\/\/ Default l\u00e0 Circle (H\u00ecnh tr\u00f2n)\n\t\t\t\t\t\t\t\tctx.moveTo(p.x + p.size, p.y);\n\t\t\t\t\t\t\t\tctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (lastColor !== null) ctx.fill(); \n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst run = async () => {\n\t\t\t\t\tif (document.fonts) {\n\t\t\t\t\t\tawait document.fonts.ready;\n\t\t\t\t\t}\n\t\t\t\t\tawait initParticles();\n\t\t\t\t\tdraw();\n\t\t\t\t};\n\n\t\t\t\trun();\n\n\t\t\t\tlet resizeTimeout;\n\t\t\t\tconst resizeObserver = new ResizeObserver((entries) => {\n\t\t\t\t\tfor (let entry of entries) {\n\t\t\t\t\t\tclearTimeout(resizeTimeout);\n\t\t\t\t\t\tresizeTimeout = setTimeout(async () => {\n\t\t\t\t\t\t\tawait initParticles();\n\t\t\t\t\t\t}, 150);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresizeObserver.observe(container);\n\t\t\t};\n\n\t\t\tif (document.readyState === 'loading') {\n\t\t\t\tdocument.addEventListener('DOMContentLoaded', initCanvasWidget);\n\t\t\t} else {\n\t\t\t\tsetTimeout(initCanvasWidget, 50);\n\t\t\t}\n\t\t})();\n\t\t<\/script>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div role=\"main\" class=\"elementor-element elementor-element-9803ba8 e-flex e-con-boxed e-con e-child\" data-id=\"9803ba8\" data-element_type=\"container\" data-settings=\"{&quot;position&quot;:&quot;absolute&quot;,&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2a2d39f elementor-widget elementor-widget-heading\" data-id=\"2a2d39f\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b3ba9a4 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-widget elementor-widget-heading\" data-id=\"b3ba9a4\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">At Wucode Tech Services, we are committed to protecting the privacy and security of our clients' information. This Privacy Policy outlines how we collect, use, and safeguard your data when you engage with our Website Design, Mobile App Development, and IT Solution services.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div role=\"main\" class=\"elementor-element elementor-element-191716f e-flex e-con-boxed e-con e-parent\" data-id=\"191716f\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6392fdf elementor-widget elementor-widget-text-editor\" data-id=\"6392fdf\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h3 data-path-to-node=\"4\">Article 1. INTRODUCTION<\/h3><p data-path-to-node=\"5\" class=\"translation-block\">Welcome to the services operated by <a href=\"https:\/\/www.wucode.net\/en\/\" target=\"_self\"><b data-path-to-node=\"5\" data-index-in-node=\"52\">Wucode Tech Services Co., Ltd.<\/b><\/a> (hereinafter referred to as \u201cWucode\u201d, \u201cWe\u201d, or \u201cUs\u201d). We are committed to respecting your privacy and protecting your personal data with the utmost seriousness. This policy is designed to help you understand how we collect, process, and safeguard your information when you utilize our Website design and Mobile App development services or access our website.<\/p><h3 data-path-to-node=\"6\">Article 2. WHEN DO WE COLLECT DATA?<\/h3><p data-path-to-node=\"7\">Wucode collects your personal data in the following cases:<\/p><ul data-path-to-node=\"8\"><li><p data-path-to-node=\"8,0,0\">When you register for service consultations or fill out information in the Contact Form.<\/p><\/li><li><p data-path-to-node=\"8,1,0\">When you use our electronic services or interact via the Website (through Cookies).<\/p><\/li><li><p data-path-to-node=\"8,2,0\">When you submit feedback, complaints, or requests for technical support.<\/p><\/li><li><p data-path-to-node=\"8,3,0\">When you enter into a service agreement for design and software development with us.<\/p><\/li><\/ul><h3 data-path-to-node=\"9\">Article 3. WHAT DATA DO WE COLLECT?<\/h3><p data-path-to-node=\"10\">Basic personal data includes, but is not limited to:<\/p><ul data-path-to-node=\"11\"><li><p data-path-to-node=\"11,0,0\">Full name, phone number, and email address.<\/p><\/li><li><p data-path-to-node=\"11,1,0\">Business information (Company name, tax identification number).<\/p><\/li><li><p data-path-to-node=\"11,2,0\">Contact address and payment information.<\/p><\/li><li><p data-path-to-node=\"11,3,0\">Technical data: IP address, browser type, operating system, and user behavior on the website via analytical tools.<\/p><\/li><\/ul><h3 data-path-to-node=\"12\">Article 4. DATA PROCESSING PURPOSES<\/h3><p data-path-to-node=\"13\">We process your data for the following purposes:<\/p><ul data-path-to-node=\"14\"><li><p data-path-to-node=\"14,0,0\">Providing, operating, and optimizing Web\/App design services as requested.<\/p><\/li><li><p data-path-to-node=\"14,1,0\">Responding to consultation requests, technical support, and quotations.<\/p><\/li><li><p data-path-to-node=\"14,2,0\">Sending notifications regarding system updates, upgrades, or new offers.<\/p><\/li><li><p data-path-to-node=\"14,3,0\">Preventing fraudulent activities, cyber-attacks, or legal violations.<\/p><\/li><\/ul><h3 data-path-to-node=\"15\">Article 5. COOKIES AND THIRD-PARTY TECHNOLOGIES<\/h3><p data-path-to-node=\"16\">We use \"Cookies\" to identify your device and remember your preferences. Additionally, we may use analytical tools (such as Google Analytics) to evaluate website performance. You have the right to refuse Cookies through your browser settings; however, this may limit your experience with certain features on the website.<\/p><h3 data-path-to-node=\"17\">Article 6. SECURITY COMMITMENT<\/h3><p data-path-to-node=\"18\">Wucode implements appropriate administrative and technical measures (such as SSL encryption and firewalls) to protect personal data. However, in the internet environment, no method of transmission is 100% secure. We will make our best efforts to protect your information but cannot guarantee absolute security against force majeure events.<\/p><h3 data-path-to-node=\"19\">Article 7. USER RIGHTS<\/h3><p data-path-to-node=\"20\">You have full rights regarding your personal data, including:<\/p><ul data-path-to-node=\"21\"><li><p data-path-to-node=\"21,0,0\">The right to know and access the information being stored.<\/p><\/li><li><p data-path-to-node=\"21,1,0\">The right to request the correction of inaccurate information.<\/p><\/li><li><p data-path-to-node=\"21,2,0\">The right to withdraw consent or request data deletion (provided that this does not affect ongoing contractual obligations).<\/p><\/li><\/ul><h3 data-path-to-node=\"22\">Article 8. CONTACT INFORMATION<\/h3><p data-path-to-node=\"23\">If you have any questions regarding this Privacy Policy, please contact us:<\/p><ul data-path-to-node=\"24\"><li><p data-path-to-node=\"24,0,0\"><b data-path-to-node=\"24,0,0\" data-index-in-node=\"0\">Wucode Tech Services Co., Ltd.<\/b><\/p><\/li><li><p data-path-to-node=\"24,1,0\"><b data-path-to-node=\"24,1,0\" data-index-in-node=\"0\">Website:<\/b> <a href=\"https:\/\/www.wucode.net\/en\/\">wucode.net<\/a><\/p><\/li><li><p data-path-to-node=\"24,2,0\"><b data-path-to-node=\"24,2,0\" data-index-in-node=\"0\">Email:<\/b> <a href=\"mailto:chris@wucode.net\">chris@wucode.net<\/a><\/p><\/li><li><p data-path-to-node=\"24,3,0\" class=\"translation-block\"><b data-path-to-node=\"24,3,0\" data-index-in-node=\"0\">Address:<\/b> 78\/1 Dinh Nghi Xuan, Quarter 14, Binh Tri Dong Ward, Ho Chi Minh City<\/p><\/li><li><strong>Contact Us<\/strong>: <a href=\"tel: 84908083563\">0908083563<\/a><\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt Ch\u00ednh s\u00e1ch b\u1ea3o m\u1eadt c\u1ee7a Wucode Tech Services v\u1ec1 vi\u1ec7c thu th\u1eadp v\u00e0 b\u1ea3o v\u1ec7 th\u00f4ng tin kh\u00e1ch h\u00e0ng khi s\u1eed d\u1ee5ng d\u1ecbch v\u1ee5 thi\u1ebft k\u1ebf Website, App Mobile v\u00e0 gi\u1ea3i ph\u00e1p IT. \u0110i\u1ec1u 1. GI\u1edaI THI\u1ec6U Ch\u00e0o m\u1eebng b\u1ea1n \u0111\u1ebfn v\u1edbi c\u00e1c d\u1ecbch v\u1ee5 \u0111\u01b0\u1ee3c v\u1eadn h\u00e0nh b\u1edfi C\u00f4ng Ty [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2074","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/pages\/2074","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/comments?post=2074"}],"version-history":[{"count":41,"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/pages\/2074\/revisions"}],"predecessor-version":[{"id":4199,"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/pages\/2074\/revisions\/4199"}],"wp:attachment":[{"href":"https:\/\/www.wucode.net\/en\/wp-json\/wp\/v2\/media?parent=2074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}