@pictx/gemini-veo-watermark-remover 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/blendModes.js", "../src/core/veoConfig.js", "../src/core/calibratedAlphaData.js", "../src/core/embeddedAlphaMaps.js", "../src/core/frameProcessor.js", "../src/video/videoDecoder.base.js", "../src/video/videoDecoder.webcodecs.js", "../src/video/videoEncoder.base.js", "../src/video/videoEncoder.webcodecs.js", "../src/video/pipeline.browser.js", "../src/core/gemini/geminiConfig.js", "../src/core/gemini/geminiAlphaMaps.js", "../src/core/gemini/restorationMetrics.js", "../src/core/gemini/imageProcessor.js", "../src/sdk/browser.js"],
4
+ "sourcesContent": ["/**\n * Core reverse alpha blending algorithm.\n * Formula: original = (watermarked - \u03B1 \u00D7 255) / (1 - \u03B1)\n */\n\nconst ALPHA_NOISE_FLOOR = 3 / 255;\nconst ALPHA_THRESHOLD = 0.002;\nconst MAX_ALPHA = 0.99;\n\n/**\n * Remove watermark from an ImageData region using a pre-calibrated alpha map.\n *\n * @param {ImageData} imageData - The watermarked image data\n * @param {Float32Array} alphaMap - Alpha map (width \u00D7 height float values 0-1)\n * @param {{ x: number, y: number, width: number, height: number }} position - Watermark region\n * @param {{ clampOutput?: boolean }} options\n * @returns {ImageData} Modified imageData (mutated in place and returned)\n */\nexport function removeWatermark(imageData, alphaMap, position, options = {}) {\n const { clampOutput = true } = options;\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n for (let my = 0; my < mh; my++) {\n for (let mx = 0; mx < mw; mx++) {\n const alpha = alphaMap[my * mw + mx];\n\n // Skip pixels below noise floor\n if (alpha < ALPHA_THRESHOLD) continue;\n\n const effectiveAlpha = Math.min(alpha, MAX_ALPHA);\n const px = ox + mx;\n const py = oy + my;\n\n if (px < 0 || px >= width || py < 0 || py >= imageData.height) continue;\n\n const idx = (py * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n const watermarked = data[idx + c];\n // Reverse alpha blend: original = (watermarked - alpha * 255) / (1 - alpha)\n let original = (watermarked - effectiveAlpha * 255) / (1 - effectiveAlpha);\n\n if (clampOutput) {\n original = Math.max(0, Math.min(255, Math.round(original)));\n }\n data[idx + c] = original;\n }\n // Alpha channel unchanged\n }\n }\n\n return imageData;\n}\n\n/**\n * Apply a synthetic watermark to imageData (for testing/demo).\n */\nexport function applySyntheticWatermark(imageData, alphaMap, position) {\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n for (let my = 0; my < mh; my++) {\n for (let mx = 0; mx < mw; mx++) {\n const alpha = alphaMap[my * mw + mx];\n if (alpha < ALPHA_NOISE_FLOOR) continue;\n\n const px = ox + mx;\n const py = oy + my;\n if (px < 0 || px >= width || py < 0 || py >= imageData.height) continue;\n\n const idx = (py * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n // Forward alpha blend: result = original * (1 - alpha) + watermarkColor * alpha\n // Watermark color is white (255)\n data[idx + c] = Math.round(data[idx + c] * (1 - alpha) + 255 * alpha);\n }\n }\n }\n\n return imageData;\n}\n\n/**\n * Compute spatial correlation of a region to validate it contains a watermark.\n */\nexport function computeRegionSpatialCorrelation(imageData, position) {\n const { data, width } = imageData;\n const { x: ox, y: oy, width: mw, height: mh } = position;\n\n let sumDiff = 0;\n let count = 0;\n\n for (let my = 1; my < mh - 1; my++) {\n for (let mx = 1; mx < mw - 1; mx++) {\n const px = ox + mx;\n const py = oy + my;\n const idx = (py * width + px) * 4;\n const idxRight = (py * width + px + 1) * 4;\n const idxBelow = ((py + 1) * width + px) * 4;\n\n for (let c = 0; c < 3; c++) {\n sumDiff += Math.abs(data[idx + c] - data[idxRight + c]);\n sumDiff += Math.abs(data[idx + c] - data[idxBelow + c]);\n }\n count += 6;\n }\n }\n\n return count > 0 ? sumDiff / count : 0;\n}\n", "/**\n * Veo/Gemini video watermark position/size detection for known resolutions.\n */\n\n/** @typedef {'diamond'|'legacy'} VideoWatermarkProfile */\n\n/**\n * Legacy pre-Gemini-3.5 videos carry the \"Veo\" text watermark.\n * The short keys are kept for backwards compatibility with existing alpha maps.\n */\nconst LEGACY_VEO_TEXT_CATALOG = {\n '1280x720': {\n key: '720p-landscape',\n profile: 'legacy',\n watermark: { width: 80, height: 28 },\n position: { x: 1180, y: 684 },\n },\n '720x1280': {\n key: '720p-portrait',\n profile: 'legacy',\n watermark: { width: 80, height: 28 },\n position: { x: 620, y: 1244 },\n },\n '1920x1080': {\n key: '1080p-landscape',\n profile: 'legacy',\n watermark: { width: 120, height: 42 },\n position: { x: 1772, y: 1028 },\n },\n '1080x1920': {\n key: '1080p-portrait',\n profile: 'legacy',\n watermark: { width: 120, height: 42 },\n position: { x: 932, y: 1868 },\n },\n};\n\n/**\n * Gemini 3.5+ videos carry the Gemini diamond logo. Upstream v0.5.0-demo\n * currently validates only 1080p landscape and portrait.\n */\nconst GEMINI_DIAMOND_VIDEO_CATALOG = {\n '1920x1080': {\n key: 'veo-diamond-1080p-landscape',\n profile: 'diamond',\n watermark: { width: 96, height: 96 },\n position: { x: 1632, y: 792 },\n },\n '1080x1920': {\n key: 'veo-diamond-1080p-portrait',\n profile: 'diamond',\n watermark: { width: 96, height: 96 },\n position: { x: 792, y: 1632 },\n },\n};\n\nconst VIDEO_WATERMARK_PROFILES = {\n diamond: GEMINI_DIAMOND_VIDEO_CATALOG,\n legacy: LEGACY_VEO_TEXT_CATALOG,\n};\n\n/**\n * Normalize profile aliases used by CLI and SDK options.\n * @param {string|{ videoProfile?: string, profile?: string }|undefined} profile\n * @returns {VideoWatermarkProfile|null}\n */\nexport function normalizeVideoWatermarkProfile(profile) {\n const value = typeof profile === 'object' && profile\n ? profile.videoProfile ?? profile.profile\n : profile;\n\n if (!value || value === 'diamond' || value === 'current' || value === 'v2' || value === 'gemini') {\n return 'diamond';\n }\n if (value === 'legacy' || value === 'veo' || value === 'text' || value === 'v1') {\n return 'legacy';\n }\n return null;\n}\n\n/**\n * Detect watermark config for a given video resolution and profile.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n * @returns {object|null} Config or null if resolution unknown\n */\nexport function detectVeoWatermarkConfig(width, height, profile = 'diamond') {\n const normalizedProfile = normalizeVideoWatermarkProfile(profile);\n if (!normalizedProfile) return null;\n\n const key = `${width}x${height}`;\n return VIDEO_WATERMARK_PROFILES[normalizedProfile][key] || null;\n}\n\n/**\n * Calculate watermark bounding box for a given resolution.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n * @returns {{ x: number, y: number, width: number, height: number }|null}\n */\nexport function calculateWatermarkPosition(width, height, profile = 'diamond') {\n const config = detectVeoWatermarkConfig(width, height, profile);\n if (!config) return null;\n\n return {\n x: config.position.x,\n y: config.position.y,\n width: config.watermark.width,\n height: config.watermark.height,\n };\n}\n\n/**\n * Get full watermark info including alpha map key.\n * @param {number} width\n * @param {number} height\n * @param {string|{ videoProfile?: string, profile?: string }} [profile='diamond']\n */\nexport function getVeoWatermarkInfo(width, height, profile = 'diamond') {\n const normalizedProfile = normalizeVideoWatermarkProfile(profile);\n if (!normalizedProfile) return null;\n\n const config = detectVeoWatermarkConfig(width, height, normalizedProfile);\n if (!config) return null;\n\n return {\n profile: normalizedProfile,\n alphaMapKey: config.key,\n position: {\n x: config.position.x,\n y: config.position.y,\n width: config.watermark.width,\n height: config.watermark.height,\n },\n };\n}\n\nconst VEO_WATERMARK_CATALOG = LEGACY_VEO_TEXT_CATALOG;\n\nexport {\n GEMINI_DIAMOND_VIDEO_CATALOG,\n LEGACY_VEO_TEXT_CATALOG,\n VIDEO_WATERMARK_PROFILES,\n VEO_WATERMARK_CATALOG,\n};\n", "/**\n * Auto-generated by scripts/embed-alpha-maps.mjs \u2014 do not edit manually.\n * Sources: GeminiWatermarkTool v0.3.1 embedded_assets.hpp +\n * VeoWatermarkRemover v0.5.0-demo binary (legacy Veo text captures).\n */\n\n/** @typedef {{ width: number, height: number, source: string, dataBase64: string }} CalibratedAlphaEntry */\n\n/** @type {Record<string, CalibratedAlphaEntry>} */\nexport const CALIBRATED_ALPHA_ENTRIES = {\n 'gemini-v2-36': { width: 36, height: 36, source: 'GeminiWatermarkTool/bg_b_36', dataBase64: 'AgICAgICAgICAgICAgICAwI0OAICAwICAgICAgIDAgICAgICAgICAgICAgICAgMCAgIDAAtMTAsBAwIDAgIDAgICAgICAgICAgICAgICAgICAgICAgMDABxSURwAAwICAgICAgICAgICAgECAgICAgICAgICAgICAgICAjVSUjUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMBD0pSUUwWAAICAQECAgICAQECAgECAgICAgICAgMCAgICAgMBLVJPTlM1AgICAgMCAgIBAgICAgIBAgICAgICAwMDAgICAwERS1JOTlFNFgADAgICAgICAgIBAQECAgICAgICAgICAgIDAQI7VE5OTk5TNwECAQICAQICAQEBAgECAgICAgICAgICAgMDACRQUE1OTk1QUCYAAwMCAQICAgICAgEBAgICAgICAgICAgMAGk5QTU5OT09NUU4bAAICAgECAgIDAgICAgICAgICAgMDAwAUR1NPTk5OTk9OTVJHEwACAgICAgECAgICAgICAwMCAwMDABNGU05NTk5OTk5NTk5SRRMAAgIBAgICAgICAgICAgICAwIBG0dTTk5OTk5OTk5OTk5OU0caAQEDAgICAgICAgICAgIDAAIoTlJOTk5OTk5OTk5OTU9OTlJOJAIAAgMCAQICAgMCAgABFjhPUU5NTk5OTk9OTk5NTk9OTk5RUDsRAQECAwQCAgAAARU1TFNPTU5OTk5OTk5OTk5NTk5OTk5NUFRLLQ8CAAACAgscNExTUU5OTk1OTk1OTk1OTk5OTk1NTk5OTU1SUUo0GwoBN0xRUlFOTU5NTk5NTk5NTk5NTU5NTk5NTk5NTk9NTlFRUUwzNExSUlJPTU5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTlBSUUw3AQocNEpSUk5NTk5OTk5OTk5OTk1OTk5OTk5OTU5RUkw0HAoCAgAAAg8tS1RQTU5OTk5NTk5OTk5NTk5OTU5NUFNMNRYCAAACAgMDAgABETtQUU5OTk5OTk5OTk1OTk5OTk1RUDgVAQACAgICAgICAwMDAAMkTVNOTk5OTk1OTk1OTk5OTlFOJwIBAQICAgIBAgICAgIBAwEBG0hTTk1OTk5OTk5NTk5OU0gaAAICAgICAgICAwICAgICAgMDABRHU05OTk5OTk5OTk1TRhMAAgICAgICAgICAgICAgICAgICAgATSFJOTk5OT05OTVJHEwADAgECAwICAgIDAgICAgICAgIBAgMAGk5RTU5NTk5NUE4aAAMCAgIBAgMDAwMDAgICAgICAgICAgMDASdQT05OTk1QUSUAAwMDAgICAgICAgICAgICAgICAQEBAgIDAQI5Uk5OTk1TOwICAgICAgIDAgIDAgIDAgICAgICAgIBAgICAgAVTVJNTlJLEQACAgIBAgICAgICAgMCAgICAgICAgICAgICAgIBNVNOT1EtAQICAgICAgICAgICAgICAgICAgICAgICAgICAgMBFk1RUUoPAAMDAgICAgIDAgIDAgICAgICAgICAgICAgICAgICAjVSUjUCAwMCAgIDAwMDAgICAgIDAgICAgICAgICAgICAgICABxSUhwAAwMCAgMCAgICAgMCAgIDAgIDAgMCAgICAgICAgIDAQtMTAoBAgICAgICAQECAQEDAgICAgICAgICAgICAgICAgICAgI2MwEBAgICAgICAgICAgICAgIB' },\n 'gemini-v2-96': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n 'gemini-48': { width: 48, height: 48, source: 'GeminiWatermarkTool/bg_48', dataBase64: 'AgEBAAAAAAEAAAAAAQEAAAEBAQAAAQBxcAEBAQEBAgEBAgEBAgMBAQEBAgEDAgEBAAAAAAAAAQEAAAAAAAEBAQAAAAEAASGAgCAAAgABAQEBAQECAgIBAQEBAQICAwEBAQAAAAAAAAEAAQICAQAAAgEAAAEAAUiAgEgAAQABAQECAgACAwMBAQICAgMBAQEBAQIAAAEAAAEAAQEBAQEBAQECAQEAAXCAgHgAAQEBAgECAwEBAgIBAQICAgEBAQICAAAAAAAAAAEAAAEBAAABAAAAAAEAIICAgIAgAAABAgACAgEBAQADAwICAQEBAQEBAAIAAAEAAQEBAQAAAQAAAAABAAABUICAgIBgAAABAAECAgABAQECAwMDAQEAAAEBAQAAAAEAAwEBAQAAAQEBAgIAAAIRgICAgICAEAABAAAAAQICAQEBAQEBAQEBAQEBAAAAAAIAAQIBAQAAAQMBAQEAAQFQgICAgICAUQECAAEBAQMCAQECAgEBAQEBAQEBAgAAAQIBAgEBAgIBAQECAQICARGAgICBgICAgCACAQIAAQIBAwICAwMDAgIBAQICAQAAAQEBAAIBAAEBAAEAAQABAXCAgICAgICAgGABAQEBAQEBAQEDAwMCAwIBAQICAgEAAAECAAEBAAAAAgEBAgABQICAgICAgICAgIA4AAACAgMBAgIBAgICAQECAgEBAAABAAABAQMAAQIAAgACAQAQgICAgICAgICAgIB4GAECAwICAgIAAQEBAQICAgEBAQABAQAAAAEAAQEBAAMCARBwgICAgICAgICAgICAcAgBAQABAQECAgEBAgICAgECAQABAAABAAEAAQABAQEBAWmAgICAgICAgICAgICAgGACAQEBAQECAgEBAgICAgECAQEBAAABAAAAAAEAAgEBUYCAgICAgICAgICAgICAgIBQAQABAQEDAQEBAQICAgEBAAAAAQEAAAEAAQAAAQFQgICAgICAgICAgICAgICAgICAUAABAQEDAQEBAQECAgEBAAIAAQEAAAEAAAABCGCAgICAgYCAgICAgICAgICAgICAgGgQAgIBAQEBAwQDAgABAQABAQABAQEBAAAYcICAgICAgYCAgICAgICAgICAgICAgIBwEQQCAQEBAgECAgEBAQAAAQEAAAEAADh4gICAgICAgICAgICAgICAgICAgICAgICAgEIBAQIDAgMDAQEAAgEAAQAAAgEgYICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwEAIDAgICAgEBAAEAAAAAEFGAgICAgICAgICAgICAgICAgICAgICAgYCAgICAgICAgFAQAgECAgEBAAEAASFggICAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAUCABAgEBACBIeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwSCAEcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBxcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIBwASBIcICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIB4SCABAQMAASBQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAYCACAgEBAAEBAAACEFGAgICAgYCAgICAgICAgICAgIGAgICAgICAgICAgICAgFERAQECAgEBAQIBAQAAAQIQcICAgICAgICAgICAgICAgICAgICAgICAgICAgIBgIAEBAQEBAQEBAQEBAQAAAAEAAUCAgICAgICAgICAgICAgICAgICAgICAgICAeTkBAQEBAQEBAQEBAQEAAQABAAAAAgAQcYCAgICAgICBgICAgICAgICAgICAgIBwGAEBAQICAQECAgEBAQEAAQABAAEAAAAAEGiAgICAgICAgICAgICAgICAgICAgGAIAQEBAQICAQECAgEBAQEBAQIBAQEAAAAAAQFQgICAgICAgYCAgICAgIGBgICAUAMDAgECAgEBAwMCAgEAAQEAAQEBAQAAAAABAQIBUICAgYCAgYCAgICAgIGBgIBQAQQEAgICAgEBAwMBAgEBAQECAgECAwMCAgICAQEBAWGAgICAgICAgICAgICAgGgCAgMDAQABAgICAwMBAQMDAQECAgEBBAMCAwIDAQEBAQpxgICAgICAgYCAgICAcBACAwMDAQEBAgICBAMAAQMDAgICAQICAAACAwIDAgIAAQIZeICAgICAgICAgICAEAACAgAAAQECAwIBAAABAQEBAgICAgMCAQECAgICAgIBAQICOICAgICAgICAgIBAAQEDAgEAAQEDAwECAQAAAAEBAgEBAQEBAQEBAQEBAAECAgICAGCAgICAgICAgHABAQECAgACAQECAQEAAQAAAQEBAgIBAQEBAQEBAQEBAQECAgMCASCAgICAgICAgBABAQACAgECAQEBAQECAQEBAQEBAQEBAQEBAQECAgAAAQACAgIBAQBQgICAgICAUAEBAQECAwABAQEBAQEBAgIBAQEBAQEBAQEBAQECAgABAQICAgEBAAEQgICAgICAEAEBAQECAgIBAQEBAQEBAgIBAQEBAgICAgICAQEBAgEBAQICAQEBAQEAYYGBgIBQAQICAgEBAQEBAgIBAQEBAQECAgEBAgICAgICAQEBAQEAAgIBAAEBAgMBIIGAgIAgAQICAAEBAQEBAgIBAQEBAQECAgEBAgICAgEBAgEBAQEBAgICAgAAAgIBAXmAgHABAQIDAQECAgAAAQEBAQEBAQECAgEBAgICAgEAAgIBAQEBAgICAgEBAgIBAUmAgEkBAQICAQEBAgEBAQEBAQEBAQECAgEBAQEBAQICAQECAQIBAAEDAwEAAQECAiCAgCEBAQICAgIAAQABAgIBAQICAQECAgEBAQEBAQICAQEBAAEBAQEBAgEBAQADAgFwcAEBAQICAgIBAAEAAgIBAQICAQECAgEB' },\n 'gemini-96': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_96', dataBase64: 'BAMEAwMDAwQAAwMEAwIFAgICAAIBAQEBAwIDBAIDAwMDAwMCAwIAAQEBAQECAjl5cTsBAwACAQIEBAIEAwMEAwMDAgQEBAIDAQMCAgECAwMCAwMEAwMEBAMDAwMEBQQEAwQCAwEDAwQCAgMDAQIEAwICAQEAAQAAAgIDAwEDAwIDBQMDAQAAAAEAAAACEICAgYEJAgABAgICAwMCAgIDBAMDAQECAgIBAgACAAEBBAQDAwMDAgMEAwMDBgUEBQQFAQACAQIEAwIAAQEDAQEBAQICAQABAQABAQEAAQICAgMDBAMDAAEAAQAAAQICKYCAgYAxAAABAgEAAAEBAgUEAwQEAgABAgIDBAQCAwUDAgIEBAMDAwQEBAMCBAMEBAMDAAEBAgIFAgMAAQICAAAAAgIBAAEAAQEAAQIBAQABBAMCBAECAAEAAAABAgIDUoCAgYFQAQEBAQEAAAECBAQDAgMEBAICAwIDBAQEBAMEAgMEBQQCAQMDBQQDBAMFBAMDAAABAwUEBAMBAgEBAAADAQMDAAIBAQACAAEAAAACBAMCAgMCAgEEAwABAAEDcoCAgIB5AgMBAgMBAgMDBAQEAwQEAwIBAQMEBQQEBAQEBAMDAwEAAwIDBAMDAgUEBQQDAQADAwMEBAQDAgQEAAEBAQIDAgEAAgIBAQEBAAECBAQEBAEEBQIEAAIEAgIhgYCAgICAIgICAgMDAgECAwQDAwMEAwICAQMDAwQEBAUDAgMEBAIBAwQDAwMDBAQDBAMDAQIBAQQEAwMEAwABAAICAQEDAQECAwMDAwIAAQIDAgICAwIBBAIBAgECAgJSgYCAgIGASQICAgIEAwIBAgIDAwUDBAICAwIDAwMDBAMCAgMDAwIDAgMGBQQEAwMDBAMDAQMCAgMDAgQEAgIBAgMEAQEAAgMDAwECAwACAgICAQEDAQEBAAEBAQECAgFxgYCAgYCAeQICAgIEAwMEAwIDAgMDAQICAgIBAwQDAwQCAQMDAgMEAwQDBQUEBAQDBAMDAwICAgECBAMBAwIDAgIEAQECAwQBAgICAgACAgIDAgMEAwIBAQECAQQDAyqAgYCAgYGAgCEDAgEDAwIDAwMDAwIDAgEBAQEDAwIEAgEAAQEEAwMEAwIEBQQCAgQEBQQEAQMBAQABAwIBAwECAgMCAgECAwQCAwABAAICAgICAgIDAwEBAAEBAQIDA1mBgICAgYGAgGECAAEDBAQDAwMCAgMCAQEAAgIDAgMCBAABAgIDBAQEBAQFBAIEAwMDBgQEAwIEAwEBAQEDAwICAQEBAgMDAgQBAQEBAQMCBAICAQQDAwEBAAEAAQIEEYCAgICAgIGAgIARAQICAgMBAgICAQEBAQMBAQECAgECAgIEBAMDAwMCBAQDAgMDAwQCAwIDAwIDAwEBAQECAwECAgEBAgMDAgIBAwEAAgQDAwICAwMCAwECAQEBAQIDUICAgICBgIGAgIBCAgIBAAIEAwQCAgICAQIBAQMCAgMAAgEEBAQDAwICAwQBAwEDAgMDAwQFAQEBAgABAgICAAABAgMAAgECAQADAwMAAAEDAgMDAwIAAQIBAgAAAgARgYGAgICAgIGAgIB5CAEBAgICAgICAQADAgECAQQDAwIBAgEEAwICAgMDAgQEBAMEBAYDAwMDAQIAAgEAAgMCAQACAwMCAgICAQICAwAAAQIDAgMCAwMCAQEBAAIBAgNBgIGAgICAgYGBgICAQQICAgEEBAQCAQECAwEBAgQDBAMCAQEBAgIDAwMDAgMDAwIEBAUEAwMDAgEBAQMEAQEBAgECAwQCAQICAgEDBAAAAQIDAwMEAwMAAQABAAAEBBJxgYGAgICBgYGCgYGAeQkCBQQEAwIEBAIDAgQBAwQEBAICAgIDAwMEBAMDBAQFBAUGBAIEBAMDAgMCAgMFAwECAQEAAgECAQMDAgIDAgIBAgIDAQIEBAMCAQECAgIDBFKBgYGAgIGBgYKAgYGBgUIDAQMEAgMGAwIBAQIDBAMEBAICAQMDAwQDBAMEBQYDBAIFAwQDBQMDAwMCAwMDBQMCAgABAgEEBAMDAgMBAgEDAwIDAgEDBAUCAwIDAQIDEoGBgYGBgYCAgICAgYGBgHkRAwMCAwMDBAMCAQQCAwMDAgIBAgIDBAIBAwMDAwMDBAMDAwMCAwMBAgMDAwUEAwQCAgEBAgEEBAQEAAIDAwIDAQIBAQIDAQACBAQDAwMCUoGAgYCAgYGAgICBgYCBgIBZBAICAgMDAgICAQMEAQADAQECAwMEBAMCAwIDBAMEBQMDAwIDBAMEAgMEAwICAwMEAgEBAAIDBQQDAQMBAQIDBAIEBAMCBAQDBAUEBAMpgIGAgICAgIOBgICAgYGBgICBIgEBAgQCAQICAAICAgICAwIDAwMDBAMDAwQEAwICAgQDAgMCAwQCAgQEAgQDAgMFBQQCAQADBAQDAQICAQIDAgIBBAICAAIDAwIDAwNxgYCBgICAgIGAgICBgoCBgICBcQkDAwMCAgEBAQIDAwICAwIDAwIDAwMDAwMDBAICAwIDBQMDAwICAwQDAgEDAQICAgMBAgICAwMCAgMAAgMEAwMEAwICAQEBAQEDBEKAgYCAgICAgICAgIGBgYCBgYGBgEkCAwMCBAEBAQEDAwIDAgMCAwMDAQQEBAIEBQQCAwECAgICBQICBAQCAwIDAQIBAgICAgICAgMBAgEBAgMDAgQDAgICAQECAAMEG4GBgYGAgICAgICBgYGBgYGAgICCgYAhAwMEBAIBAwMDBAMEBAMCBAMDAwMFBAMDAwMDAgICAgQEBAQCAwMBAQEBAQECAgEAAAAFBAICAgEDAwMCBAMBAQIDBQMAAQIRcoGAgYGBgICAgICBgYGCgYGAgYGBgYBxCwQFBQMCAAIDAwMDBAQDAwMEAwMDBQIDAgMDBAMDAwQCAwIBAwMAAAABAAAAAQAAAAEDBAIBAgICAwIDBAMDAgIDAgMCAgJRgICAgYGAgIGAgIGBgIGAgIGAgIGBgYGBWQMDBAMDAgIDBAIEAwUEAwQFBQMCBAMDAgMCAgQEAwIBAgMCAwMAAAABAwMBAgEBAAABAgACAwICAQIDAwMBAgICAwEEA0KBgICAgYGBgIGCgYGBgYCBgICBgICBgYGBgDkCAQQEAQMEAgMBBAQEAwMDAwMDAwMFAgMDAgMDAwQCAwIAAgEBAAABAgIDAQAAAQEAAQEAAwMCAgIDBAQBAQEBAQECI4GAgICAgIGBgYKBgYGBgICAgYCAgICAgYKBgIAgAQQEAgIEAQIFAwQEAQQEBAQCBQQDBAUDBAQEAwMBAwECAQIBAQICAgMEAwEAAQECAQIDAQEBAQECAwIDAgEAAwIReYGAgICAgIGBgICBgYGBgIGAgIGBgICBgIGAgIB4EgIEAgICAgECBAQCAgQEAwMDAwMDAgIDAQMDAgQDAwUDAgIAAQICAwMCAgECAgEBAQIDAgIBAgEDAwMAAQEBARBwgICAgICAgICBgICBgYGAgYGAgYGBgICAgYCBgICAcREDAQEEAwICAQMBAgMEBQMDBAIEAwMDBAMCAwMDAwQCAwIBAQIEAgMCBAICAQEBAgQDAwIAAQMBAwEAAQIDEnGAgICAgICAgIGBgYCBgYGBgYCAgIGAgICAgYCBgICAgXEQAQEFAwICAgMCAgMFBAMDAwMEAwICAwQFAwMDAwICAwICAgMFAwMDAwEBAQICAgICAwMAAgICAQIBAgILcYGAgYCAgICAgIGBgYGBgYCCgICBgICBgIGAgYCAgICBgYFpCAMCBAEAAQMCAgIEAwMDAgMDAwICAwQEAwMDAwICAwEBAgMCBAMCAQMAAQICAgMDAwICAQACAQECAhNqgICAgYCAgIGBgYGBgYCAgYGAgYGAgYGBgICBgoCAgICBgoGBcRQEBgICAQIDBAMBBAQCAgIDAwQDBAQFBQMDBAECAwMCAQMDAgEBAwICAgMCAQMDAQMBAwIDAgIBEnKBgYCAgYCAgYCBgYGBgYCBgYCBgIGBgYKCgIGBgYCAgICAgYKAgHERAgAAAwIDAwMDAwMCAgICAwQEBAMEBAQDAwIDBAMAAgMDAQEBAwIBAgQDAgEBAQIDBAICAgIScoGBgoCAgYCBgYGBgYGBgICBgYGBgYGBgYGBgYGAgYCAgICBgYGAgIBxEAEBAQIDBQMDAwUCAgMCAwQCAwQEAwQEBAICBAQBAAMDAQEBBAMCAwMEAwEBAAICBQMBASJ5gIGBgoCAgICAgICAgICAgICAgICBgICAgYGBgIGAgICAgICAgYGBgYCAeCEBAQECAwMDAwMBAgIDBAQCAwMEAwMDAgIDBgUAAgMDAQECAgICAwMDAwEBAQIEAwMBOYGBgICAgICAgICAgICAgICAgICAgICAgYCAgICAgIGBgYCAgIGAgICBgYCAgIBAAgIDAwEEAwICBAQEBAQEBAQEAwMCAwYFBAMAAQQEAgIBBAIBAwMCAwIBAQICAwhYgICAgICAgICBgICAgICAgICAgIGAgICAgICAgIGAgYGCgYCAgIGBgICAgICBgICAURIDAwMDBAQEBAQEBAQDAwQFAwMDBAQFAgMBAQECAgMBAQMCAgMDAwMCAAIDInCAgIGAgICAgICBgYCAgICAgICAgICAgICBgIGAgYGBgIGBgYCAgICAgYCAgIGAgICAgHEaAwEEAgIEAwMDAgIDAwQEAwMDBAICAQIBAQACAwMBAgQFBAMDBAICAghJgICAgICAgICAgICAgYCAgICBgIGBgICAgYGCgICAgYGBgICAgYGBgIGBgICAgICBgYCAgICAQgMCAQIEAwMDAgIEAwQDAwMDAwIBBAUDAQADAgMCAwMEAwQDBAQDInGAgICAgYGAgIGBgIGBgICBgIGBgIGBgICAgIGBgYGAgICAgICAgYGBgYGBgYCAgICBgICAgICAgHIqAgMDAwMDAwMEAwQDAwQCAgICAwQCAgECAQMDAwMFAgIEAxFZgIGBgICAgYGAgYCBgICAgYCBgYGBgYGBgICAgoGCgoGAgICBgICBgYGBgIGAgYGAgICAgYCBgYGAgIGBUhEDAwQDBAQDAwQDAwMCAwIDBgQDBAECAgMCAwMDAwMIQXmBgICAgICAgYGAgYCAgYCBgICBgYGAgICAgICAgYGBgICAgICAgICBgYGAgICAgIGAgICBgYCAgYGBgIKBgYFSEgIFBAMEAwMDAwMDAwQEAwQDBAICBAMCAwICCUJ5gIGAgICAgICAgYGAgIGAgICBgICBgYCAgICAgICBgICBgYCAgICAgICBgYGAgICAgIGBgICAgICAgYGAgIGCgYGBcUITBAUDAwMDBAMDAwQFAwMBAAIDAgIBAhBCeYCAgICAgICAgICAgIGAgIGAgICAgICAgYGAgICAgICAgYCBgYGBgYCAgICAgYGBgICAgICAgICAgICAgIGAgIGBgYGBgYCBURECBAIEAgICAgIDAgIBAwMEAgIhYYCAgIGBgICAgICAgIGBgYGAgICBgICAgICAgYGAgICAgICAgICBgYOAgoGAgYGBgYGAgICAgICAgICAgICAgICBgYCAgYGBgYGBgYFYKQMDAQQCAwMDAgMCAgEgSHmAgICAgYCBgICAgICAgICBgICAgICAgIGAgICAgYGBgYCBgICBgYGBgYGBgYGAgYGBgICAgICAgICBgICAgICBgYGAgYCBgYGAgYGAgICAgnFRJAQEAwMEAwoxUXmAgICAgICAgIGBgIGBgYGAgIKBgYGAgYCAgIGBgYCAgYGBgoKBgICBgoKBgICAgICBgYGBgICAgICAgIGBgICAgICBgYCAgIGBgIGBgYGBgICBgYGCgXJSKxICOoGBgYCBgYGBgYCBgoGBgYCBgYGBgYGCgYGAgICBgYGBgYCAgYCAgYGBgIGAgIGBgICAgICAgIGAgICBgYGAgIGAgICAgICBgYCAgICBgYGBgICAgIGBgYGBgYGAgYA6cYGBgYKBgYGBgYGBgYKBgYCBgoCBgYGBgYGBgYCAgYGCgICAgYGBgIGBgIGBgYGAgICBgICAgIGBgICAgICAgIGBgICAgIGCgYGAgICBgYGBgYGAgYCAgYGAgYGAgIF5eYGBgYGBgICAgYCAgICAgICAgICBgYCAgYCAgICBgYGAgICAgYGAgIGAgICBgYGBgYGAgYGBgICBgYCAgICAgIGAgIGAgYGAgYGBgICAgICBgYGBgYGAgIGBgIGBgYFyOoCAgICAgICAgYCBgIGAgICAgICBgYCAgICAgICBgYCAgICAgoGBgYCAgICAgYCAgYGBgYGAgICAgYGAgICAgICAgICBgoGAgICBgYCAgICBgYGBgYCAgYGAgYGBgYE7AxUoUnGAgICAgIGAgICAgYCAgICAgICAgICAgICAgICAgICAgICAgIGBgICAgICAgYCBgYCAgICAgICBgYGAgIGAgICAgIGBgYGBgYCAgYGBgYGAgICBgYCBgXpRMQkCAwQDAwIhUHGAgICAgICBgICBgICAgICAgICAgICAgICAgIGAgYGAgIGBgICAgICAgIGAgYCAgICAgYGBgYCAgIGAgICBgYGBgYGBgYCAgYGBgIGAgIGBgXlKIgQDAgECAwQCAQIBAgIpWoCAgYCBgICAgICAgYCAgIGBgICAgYCBgIGBgYGBgYCCgICAgYCAgICAgIGAgICAgYGBgYGBgYGBgICAgIGBgYGBgYGBgYGBgYCAgYFhIgQFAwMBAgIBBAQDAwICAgIEAxBRgICAgoKAgIGBgYCBgICBgIGAgIGBgIKBgYGBgoKBgICAgYCAgYCAgIGBgICAgIGBgYGBgYGAgICAgIGBgYGBgIGBgYGAgYB5QhMDAwYGAwMCBAICBAMDAwUEBAMEBAICEkJxgYGBgIGCgYCAgYGBgYGBgYGBgICBgIGBgoGBgYCAgICAgIGBgIGAgICAgYCBgYGBgYGBgICAgYGBgYGAgYGBgYGBeUEJAgICBAQFAwIEAwECBAIDBAUEAgMFBQIDAgQQUYGAgIGCgoGBgYKBgYGBgYGBgICBgICBgYGBgYCAgICAgYGBgYGAgICBgYCBgYGAgYGBgICBgYCBgYGAgYGBgXpCCgQCAgICAgQFBAMEAwICAwMDBAMCBAQDBQQCAgIAAhFTgIGCgYCBgICBgIKBgYGBgYCAgYCAgICAgYGAgICAgYGBgYGBgYGBgICAgICAgICAgIGBgYGBgYGBgYGBWRIEAwMCBAQEAwQEBAMDAgMEAwMCAwICAwQDBAEBAQIAAQMDKHCAgYCAgYCAgIGCgYGCgYCAgYCAgICAgYCAgICAgIGBgYCAgIGBgYCAgIGAgICAgICBgYGBgIGBgXIiBAMDAwQDAwIDAwQEAwMBAgMDAwIDAgMDAwQDBAUEAwIBAgICAAJBgICAgYGAgICAgIGBgYGAgICAgICBgICAgYCAgYGAgIGAgIGCgYCAgICAgYCAgICBgYGBgYGBSgsDAwMDAwMDAwMDAwUDAQMBAgECBAQDBAMEAwMDAwMEAwQAAgACAQEAGHGBgYGAgICAgIGBgYCBgYGAgYCBgICBgYCBgoGAgICAgICBgYCAgICBgYCAgICBgYGBgXEiAwMDAwMDAwMDAwMDBAUEAwMBAQEBAwMEAwMDAwMDBAICAwIAAQMCAAADARFRgYCAgIGBgIGBgYGAgICAgYCBgICAgYCCgYGAgICAgYCBgYCAgICBgYCAgICBgYGBWQoDAwMDAwMDAwMDAwMDAwUEAwMCAwICAwQEBAMDBAMDAwMEAwMBAQEBAgEEAgEEQoGBgYGCgYGBgYGAgICAgYKBgYCAgYGBgYGAgICBgYGAgYGBgIGBgYCAgICBgYE5AwMDAwQDAwMDAwIDAwMDAwQFAwIBAgECAwMDAgMDBQQDBAQDAgMCAgQDAgMBAwECAiJ5gYCBgYKBgICAgICAgYGBgIGAgYCAgIGBgYCBgYGAgICAgYCAgICBgICAeCIDAgMDAwQDBAMDAwIDAwMDAwUEBAMDAwMDAwQCAwMDBAQDBQQEBAQDAwMDAgIBAwIDBAMTcYCBgYCBgIGBgICAgYGBgYCBgYCAgIGBgYCAgYGAgICAgICAgYGBgIBxEQMDAwMDAwMDAwMDBQMEAwMDAwQEBQMDAwQDBAQDAwMDAwMEBAMEAwMDAQMDAwQDAwMDBAQEEnGBgICBgYGBgIGAgYGAgYGAgYGBgYGBgYCBgIGAgIGBgICBgYGBgHESAgIDAgIDAwMEBQMEBQQEBQMDAwQEAwIEAgIBBAQCAwMEAwQFBQMEAwIDAgEEBAQEAwQEAgMDAxJxgYGBgYGBgoCAgIGBgYKBgYKBgoKBgYCBgICAgYGBgICBgYGBaRIDAwMEAwMDAwMEBAMEBAQEBAMDAgQEAgICAgICBAQDAwMEAwQEBQMEAwECAgMEBAMDAwMDBAMEBAIKaYGBgYGBgYGAgICBgYKBgYGBgYGBgICAgICBgYGBgICBgIFxCwQBAwMCAgMAAgQDAwMDAwQEAwIDAwQFAgMCAgICBAQEAwMDAwMDBAMEAgQCAgMDAwMDAwMEAwECAwMDE3KBgYGBgYGAgIGBgYGBgYGBgIGAgICBgIGCgoCAgIGBgHESBAIDBAMEAwMDAwIDBAMCBAQDAwMDBAQEAwIDAgICAwQDAwIDAgMDAwICAgICAQMDAwMCAgMDAwQBAwMDAxJxgoGBgYGAgIGBgYCAgICBgICAgIGAgYGCgYGBgICCcRICAgQDBAMDAwQCAwIFBAMEAwIDAwMDAwQEAwMEAwICAwQEBAMDAwMCBAIBAQECAgIDAgMDAwMDBQQDAwMDBAMReYGBgYGCgYGBgYCAgICBgYCAgICAgYGBgYKBgYF6EgQDAwMCAwIEAwQDBAMEAgMCAwMDBAUFBQMEAwQDAwICAwQDBAIEAwICAgMCAgIBAQIDAwMDBAQFAwMDAwMDAgMBIYGAgICBgYCBgICAgICAgYGAgICBgYGCgYGBgIEjBQUDAwMDAQQCAwUCAwQEAwMDAwMDAwMCAwMDBAMDAwICAwMDAwMDAwICAgMBAgECAgIDAgMDAwQFBQMEBAQCAwICAjmAgICBgICBgYCAgIGAgYGBgYGAgYGBgYGBgUEEBQQDAwMDBAICBAMDAwMEAwMDBAMDAwMCAwMDBAMDBAICAgUEAwMDAwYCAwIDAgICAgMCAwMFBQUEBAIDAwMCAAICAQNZgICAgICAgYGAgYCAgIGBgoGBgYGAgICAUAECAQQDAwMCAQICBAMDAwICBAMDBAMCBAICBAQEAwIDAwEFAwMDAwMEAwMDBAICAgMAAwMCBAQFBQUEAwQEAwMEAgMBAgMIcICAgICBgoGBgYCAgYGBgYGBgICAgIBxEgIBAwMEBQMBAwQDAgQDAwMDAwMDAgMEAwQCAwMEAwEDAgIDAQIBBAMEAgMDAwMBAwMCAwMDBAMEBAIDBAQDAwMCBAQDAwMCIICAgIGBgIGBgYCAgYGAgYGAgYCAgYEaBAQDBAQDAwQDAwMDAgQFBAIDAgMDAwMDAwQCBAMCAgMCAwQCAQECAQIDAwQDAwICAgICAgQDAwMCAgQEAwMDAwMCAwMDAwMDAkmAgIGCgIGBgYCAgYGBgYCAgICAgUICBAQDAgMEAwQEBAQEAgQBBAQDAwMDAwMDAwQEAgIDAwIDAgECAgMBAwIDAwMCAwIEAgMCAgQCAwMEBAMCBQIBAwMDAgMDAwMEAQlxgIKBgYKBgYCBgYGBgYGAgICBcgQDBQQDAwMFBAIDBQMDAwMCAwMDAgQEAwMDAwMCAgIDAwQFAwMEAgQCBQIDAwMCAwMEAwQDAgQDAwMEBAQDBAQCAgIEAwMDAwQDAgIigYGCgYKBgoCBgYGBgYGBgIGBKgICAgIEBAIEAQMCAwICBAIBAgIEAwMDAwMDAgMCAwICAgMEAwQBAwUDAwMDAwMEBAEDAgEDBAUEBAMDBAMDAwIDAwMEAgIDAwACAQIBWYCAgICBgoCBgYGBgYGBgIFSBAMDAwUEBAMDBAMDBAMDAgMDAwMDAwQEBAICAgEDBAMDBAQDAgICAwUDAwICAwQEBAICAQIEAwQFBAIDBAMEAwIDBQQEAgIDAwQDAgICEXiAgICAgYGBgoKBgYGBgYERAwMDAQQCAwMFAwMCBAMFAwIDAwMEAwMEBAQCAQEDAwMDAwMDAwICAgQEBAIDBAQDBQMDBAQDAgMCAgQCAwICAQMDAwIDAwMEAwMEAwMDA0GAgICAgIGCgYGBgYKBgVIEBAQDAwUDAwIDAgMCAwECAgIDAwIDBQMDAwMDAwMDAwMDAwMEAwQEAwMDAwMDBAMEBAIEAwQCBAICAAICAwIEAgIDAwIEAwMDAwUEAwQEBAl5gICCgYCBgoGBgYGBcRMDAwUEBAMDAwIDAwQCAgUDBAUDAwMDAwIDAwMDBAMDAwMDAwMCAwQEAwMDBAIDAwQDAgMDAgMBAgICAAMDAwACAgICAgECAgMDBAQEBAQDAwJBgYGBgYCBgYGAgYGBQQMFBQQDBAMCAgMDAgUDAwMCAwMDBAMDAwMEBAMDBAMDAwQEAwMEAwECAwMDBAMDAwMDBQICAgEBAQMBAQICAwMBAwMEAgECAgMDBAQEBQQDBAIKeYGBgYCBgYGAgIGBEwIEBQQDAwMDAgIDBAQDBQEDBAMEAwMDAwQEBAQDBAIDAwMEAgMDBAICAwMDAgQDAwMEAgIBAgICAgIEAgEBAwMCAgMDBAICAgIDAwQEBAQDAwICQoGAgYCBgYCBgIFSBAQDBAMDBAQEAwIDAgEBAwECBAICBAMEAwQEAwQEAwMDAwMFAwMDAwECBAMDAwIDAwQGAwMDAAIDAAIEAgEDBQQCAwIAAgMCAQIDAwQEBAQDAgICEoGBgYGBgYGBgYESAwQEBAUDAwUDAwMBAQIEAgIBAQQCBAQDAwMEAwQEBAMEAwMEAwMDAwICAwMCAwMCAQMDAwMDAQEDAgICAQIDAwICAwMBAQMCAAICAwMDAwMDAwMDAmGAgIGBgYGAgVkEAwQEBAQEBQUEBAEDAgMCAgEDAgMDAgMDBAQCAwQDAwMDAwMEAwMDAwECAwMEAwMDAwMDAwQEAgICAwECAgMEAwMDAwMCAgECAQIDAgIDAwMDAwQEAiCAgIGBgYKAgSkDAwICBAUBAwMDAwUEAQIAAQIDAgQAAgMEAwMDAgMDAwMDAwMDAwMDAwMDAwMCAgIEBQMCAgMDAgECAwECAgICAgIDAgMCAgICAgIEAwQEBAQDAwIFAwN5gYGBgYKBcQQDAwMDBAMDAwMDAwUEAQECAgECAQIDAwICAwIDBAMDAwICAwICAgEDAgICAwUCBAQFBQQDBAMDAgICAwADAwEBAgQCAwIBAgMBAQEDAwMEBAQDBQMDAwJKgYGBgYGBUgQEAwMFBAQDAwMDAgQEAgICBAIDAgEDBQQEAgIDBAQDBAQCBQIDAwMCAgICBAQDBAMDBAQEBAMDAgMBAgECAgIDAgIEAwIAAgICAgIBAwQEAgIDAgMDAwMigYGBgIGAIgIEAgMEAwQEBAQDAgIDAQEBAgICAgMCAwICAQIFAQEAAQEBAgACAQEDBAICAwMDAwIEBAQEBAMFAwQCAwMCAAEEAwACAwECAgIDAgICAQIEAQMCAwMCAwMCeYCBgYFxAgMDAwMEBAUEBAQBAQMCAgIBAgEAAAMCAgECAgICAwEBAgMAAgEBAgMDAgMCBAQDAwMDAwMCAwMDBAMDAwMCAgUCAwICAgMCAgIBAwQDAgACAgMDAwMEAwMCUoGBgYFQAgMFBAIEBAMEBQICAgMDBQQBBAICAwQFAwIFAgIBAgICAgICAgIDAgMCAgIDAwQCAwIDAgIDAgMEAgQEAwMAAQMCAQACAgICAgEDAwMDAgIBAwMDAgMEAwMDMYGBgYEqAwQEAwIDBAQEAwMEBAICBAMBAwICAwIDAwECAQICAgECAgECAgICAQECAgECAgMDAgIEAwMDAwQDBAMDAwQDAwIDAQIDAgIDAwMDAwMDBAMDAwMEBAMDAwICCYCBgYERBAQEAwQCBAMCAwMDAwICAgIBAgMBAQEAAQICAwICAQIDAwMDAwIBAgQBAgACAwMDAwIDAwQCAwQDAwUCAwIDAAIBAgMCAgICAwIDBAIBAwQEAgMEBAMEAwMCAzlweToDBAQDAgEDAwIEAwIEAwMCAgICAgEDAwECAgECAwQBAQIDAwMDAwEBBAMBAgIC' },\n '720p-landscape': { width: 80, height: 28, source: 'VeoWatermarkRemover/720p-text', dataBase64: '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' },\n '720p-portrait': { width: 80, height: 28, source: 'VeoWatermarkRemover/720p-text', dataBase64: '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' },\n '1080p-landscape': { width: 120, height: 42, source: 'VeoWatermarkRemover/1080p-text', dataBase64: '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' },\n '1080p-portrait': { width: 120, height: 42, source: 'VeoWatermarkRemover/1080p-text', dataBase64: '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' },\n 'veo-diamond-1080p-landscape': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n 'veo-diamond-1080p-portrait': { width: 96, height: 96, source: 'GeminiWatermarkTool/bg_b_96', dataBase64: 'AgMCAgICAgMCAwICAgICAgIDAgICAgICAgMCAgMCAgICAwICAQICAgIEAwIBDis+QjIQAQICAgICAwICAwICAwMDAwICAgICAgQBAgMDAwMDAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgMCAgICAgICAwICAgECAgIDAgICAwICAQMBAgMDAgIEFTFFRzcXBQMEAwMDAgMCAgMCAwICAgMCAwIDAgIBAQIDAgMDAgEBAwQCAgICAgICAwICAgICAgICAwICAgECAgECAgICAgMCAgICAgICAgICAgICAgICAgICAgICAQMJHDlPUDweCQICAgICAwIDAwICAgICAgICAwICAwICAgEBAgICAQICAgIAAgMBAgIDAgICAwICAgICAwICAgICAgMCAgMCAQICAgICAgICAgMCAgICAwIDAgICAgIDAgIPKURZWUYqEAMDAgIDAgICAgMCAwICAgIDAgIBAgICAwEBAwIBAQICAgIBAgMCAQIDAgICAgICAgIDAgICAgICAgQCAwICAgICAwICAgICAwMDAgICAgICAgMCAgICAgIZNE1dXkwzGQMEAQMCAwIDAwMDAgMCAgICAwIDAgIDAgICAgICAgIDAwMCAgICAgICAwICAgICAgIDAgICAwIDAgMCAgIDAgICAwICAgMCAgQDAgIDAwIDAgMCAgICAgUeN01cXE02HgUCAgMCAwIBAQMCAgIDAQECAwIDAwICAgIDAgICAwICAgMCAgIDAgICAwICAgICAgICAgMCAgICAwMDAwMDAgICAQICAgMCAgMCAwICAgIDAgIDAwIBBA8oO0tZWUo8KA4FAQMCAwMDAgMDAgICAgMCAgICAgIBAgICAgICAgECAgMBAQICAQECAgICAgIDAgICAgICAgICAwICAwICAwMCAgICAwMDAgIDAgIDAgIDAgMCAwIBCBg1Q0xWVkxCNhgHAQMCAgIDAgICAwICAgICAwICAgMCAwICAgICAgICAgIBAQICAQECAgICAQICAgMCAwMCAwICAgICAwEDAwIDAgICAgMCAgICAwICAwMCAgICAgICBh49SE1VVU5HPh0HAQIBBAMCAgICAgIDAgICAgICAgMCAwICAgIDAwICAgICAgIEAgMCAgICAgICAgIDAgIDAwICAwMDAgICAwICAgICAgICAgIDAgICAgICAgMCAwICDSlIT09SUk1OSCkPAgIDAgICAgMCAgICAgICAwIDAgICAgIDAgICAgICAgMCAgIBAgICAwIDAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgMCAgIDAgICAgICAgIEGDRRU05QUE5SUTYaBQICAgEDAgICAgICAAECAgICAgICAgMDAgICAgABAgICAgICAAECAwECAQICAgICAgICAgICAwICAgICAgICAgIBAgICAgICAgICAgEDAQMCAgIJJD1VVU9PT05UUz8pEAICAgICAgICAgICAAECAgICAgICAgICAgICAgABAgICAwICAAECAwECAgICAgEEAQICAgECAgMCAgICAgICAwICAgICAgIDAgICAgICAgMCAgMYMEZWVk9OTk9UVUg5IwsDAgIBAgMCAgICAgICAwEBAgICAgEDAgICAgICAgMCAgICAQICAwICAgMCAwIDAgICAwIDAgQCAgIDAgICAwICAgICAgIDAgICAwICAgQCAwkkOEhVVE9OTk9SVEtCLxEDAwECAgMCAgIDAgICAwEBAgMCAgIDAgICAwICAgMCAgIEAgICAwICAgMCAgICAgIDAgICAwICAwIDAgMDAwICAgMCAgMCAgICAgICAwMDBRMyQktTUk5OTk9RUkxJPBgGAgMCAgICAgIDAgIDAwICAwMBAgICAQECAgICAgMBAQICAgICAgEBAgICAgICAgIDAwICAgMCAwMDAgICAwIDAgICAgMCAgIDAgMDAgMCDCREUE1QUE9OTk5PT09TSigQAgIDAgICAgMCAwMCAgICAwICAgICAAECAgIDAwIAAAICAgICAgABAgMCAgICAgMCAwICAgIDAgIEAwMDAwMDAgQCAgIEAgIDAwMCAwICEi9MVlBQUE5PTk9OTk9VTzQbBQIDAgICAgICAgIDAgEBAgMCAgICAgICAwICAgIBAQECAQECAgICAgICAgIDAgICAgICAwMCAgMCAwMCAwMCAgICAgIDAgICAgICAQMLJj5TV1FOT09OTk9OTlBXU0AuFAUCAgMCAgICAgICAwEBAwIDAgIDAgMCAgICAgMBAQEBAgEBAgMBAwICAgIDAgICAgECAgMCAgICAgIDAgICAgICAgICAgIBAwACAQgfOEhVVFBPT05OTk9OTlBUUkc8JAkBAgICAQICAQACAgICAgIAAQMCAgICAgABAgIBAgICAAECAgACAgICAgIDAgICAgEDAgIDAgICAgIDAgICAgIBAgICAgIBAgEBAg8wSExQUU5OTk9OTk5OTk9RUEtGLwwAAgICAQICAAECAgICAgIAAQICAgICAgABAgICAgICAQECAgECAgIDAgIDAgICAwICAgMCAwMCAgIDBAICAgICAgIDAgICAgICCSFFWFNOUE5OT05OTk5PTk5QT1BSQB0IAgMCAgEBAgECAgICAgICAgECAgICAgICAQIBAQICAQECAwIBAgMDAgIDAgMCAwMDAgQCAgIDAgICAwICAgMCAgICAgICAwIDFzFKWVNPTk1OT05PTk9OT05PTlFVSC8ZBAICAgECAgIDAwICAgMCAgECAgICAwICAQIBAQIDAQECAwECAgICAgMCAgIDAgICAgICAgICAgICAgICAgMCAgMCAgICAQUSLz9MVVFPTk5OTk5OTk9NTk5OTlBTTEEyFgYBAgMCAgMDAgICAQECAgICAgICAgECAgICAgICAQECAgEBAwICAgMCAgIDAgICAgIBAgMDAgIDAgIDAwICAgMCAgICBRQsREtOUU9OTk5OTk5OTk9NTU9PTk9RUE1HMBUDAwMDAwICAgICAQECAgICAgICAgICAgIBAgICAQECAgEBAgICAgMCAwICAwICAgMCAgIDAgICAgMCAwMCAwICAgICDSQ5TlFNTlBPTU1OTk5PTk9OT05OTk9PUFJPOyYMAQMDAAECAgECAgMBAQEBAgMCAwIDAgIDAwEDAQECAwICAgICAgIDAgICAgICAgMCAgICAgIBAwICAgIDAgIDAgQLIjhIVlRNTU5OTU1PT05OT05PT05PTk5OT1RVRzkiCwQCAQACAwEBAwIAAQECAgMCAwICAgQDAwIDAQECBAMDAgMCAgICAgICAgICAgICAgICAgICAgIDAgIBAgICAgsdNUdPVlNPTU5OTU5OTk5OT05OT05PTk9NT1JVT0c2HAsCAQICAgACAgIBAQICAgMCAgABAgICAgICAQICAgECAgMCAgICAwICAgICAgICAgICAgIDAwIEAgICAgICBBgtRU9OUVBPT05PTk5OTk5OTk5OT09PTk5OTlBRTk9ELBgEAgICAgIBAgMBAQMCAgIBAQABAgMDAgMCAAECAgABAgMDAgIDAgICAgICAgQDAgICAwMCBAMCAwICAgMJGDFCUlVQT09OTk9OTk5OTk1OTk9OTk5PTU1OTk5OUFZRQDAXBwICAwEAAQECAgIEAQEDAwMCAgMBAQECAQECAwIDAwICAgIEAgICBAMDAgMDAgIDAwMCAgMCAgQCAggZLUJLUlNQTk9OTk9PTk5OT05OTk9OTk5PTU1OT05OUFRRSkItGAcCAwEBAQICAgIDAQECAwMCAgMBAQIDAQECAwECAgICAgIDAgICAgICAgMCAgICAgIDAwMDAwEBAxktQVBPT1BOTk5NTU5OTU1OTk5PTk5OTk5OTU1OT01OTlBOT1BBLBgDAQABAwICAwEBAgACAgEBAgICAgICAAECAgECAgICAgICAgIDAwIDAwICAgMDAgICAgIDAgQLGTBCUVdTTk5OTk5NTU5OTk5OTk1OTk5OTk5NTU5OTk5OTk5OUldQQjAXCwMBAgICAgIBAAEDAgIBAgICAgICAQECAwECAgMCAgICAgMCAwICAgMCAgMEAgECAgICAg0cLUJMUFRRT05OTk5OTk5PTk5OTk5OTk9OTk5OTk5OT05OTk9OUVNQS0IsHgsCAgMCAgIBAgICAwICAgICAgIDAgMDAwICAgICAgIDAgICAgMDAgMCAgICAgMCAwEFDCI2RlFTT1BPTk5OTk9OTk5OTk5OT05OT09OTk5PTk5OTk5OTk5OTk9PUlJENyIMBQECAgIDAgICAQICAgQBAgECAgICAwICAgICAgICAQICAgEBAwICAwICAQIDAQYXJDhGT1VTT05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU1NTU1NTk9NTk5QUlRPRzgkFQUBAQICAgICAgICAgIAAQICAAECAgICAgICAwICAgICAgEBAgIDAwMDAQIBBRYwO0hOTVBQTk5OTk5PTk5PTk5OTk5OT05OTk5OTk5OTU1NTU1NTk5OTk5OUFBOT0g5LRMDAQICAgECAgICAgIAAQICAAECAgICAwICAgIDAgIBAgICAgMCAgICAgIJGjRIUFZUUE5PTk5PTk5OTk9OTk5PTk5OT05OTk5OTk5PTk5OTk5PTk9OTk5OT05RVVRORDAXCQIDAAICAgEBAgQBAQIDAgICAwICAgMCAgIDAgICAwICAgMCAgIFCg4eMUJPUlVSUE5PTk5OT09PTk9PTk5PTk9OT05PTk9OTk5PTk5OT05PTk9OT05PTk9QVFVSTEAxIBAJAAICAwEBAwMCAQMDAgIDBAICAgMCAwICAQECAgECAgIBAQQWJC8/R0pPT09PT05OTU1OTk5OTk5NTU5OTk5PT01OTk5OTk5OTU1OT05PT05NTU5PTk5OT09PT0xLRjIgCwICAgIDAgMBAgMDAgMDAgEBAgICAgICAAECAgICBAMFDhstPEdSVVJPUE9NT05NTU1OTk5OTk5NTU9OTk5PTk1NT05PTk5PTU1OTk9PT09NTU5OT05PTU1OT1RYWEg6JRMLBAQCAwQBAQQCAgMDAwABAgMCAgICAwECAwICCxIYKDRAR0tQUVBPT09OTk5OTk5OT05OTk9PTk5PTk5OT05OTk9OTk5OTU1OTk5OTk5OT05PT05OTk5PT1JTU0xIPS4kFAoDAgIDAwECAgICAgICAwIBAgICAQEBAgYQIy88Sk5RUlBQT05OTk5OTk5OTk5OTk5OTk9OTk5OTk5OT05OTk9OTk5OTU1OTk5OTk9OTk5OTk5OT05OT09NTlBVUkxFMiMYCAUCAQAAAQIDAwICAgMAAQICBAYHDRgoOEFJU1RWU1FPTk5OTk5NTU5OTU5OTk1NTk5OTk5OTU1OTU5OTk5NTU5OTU5OTk1NTU1NTU5OTU1OTk5OTk5NTVFUV1NPQjcwIxcOBwYEAAECAgICAwIAAQIGDhkdKTQ+SEtMT05QT09OTk5OTk5NTU5OTk5OTk1NTk5OTk5OTU1NTU5OTk5NTU5PTk5OTk1NTU1NTU5OTU1OTk5NTk5NTU5PUE5OSkdFPDQpHRgOBAECAgICAgMIDxkfKDU8SFFTVVRST05OT09OT05PTk5OTk5PTk5OTk1NTk9OTk5OTU1OTk5OTk5NTU5PTk5OTk1NTU1NTU1OTk5OT05OTk9NTU9PTk9QUlRVVVJIPDUoHhkQCQMBDxceKjM3O0JHT1JUVVNRT05PTk9PT05OTk9OTk5PTk5OT01NTk9OTk5PTU1OT05OTk9NTU5PTk5OTk1NTU1NTU1OTk9OT05OTk9NTU5PT09QU1JUVVROR0M8NzQqHBMMMDY9RkxMSktNTk5PT1BNTU5PTk5PTk1NTk5OTk5OTU1OT05OTk5NTU5OTU5OTk1NTU1OTk5OTU1OTk5OTk9NTU5PTk9NTk1NTk5OT05PTU1PTk5OT05NTEtMTExEOTApQEdQWV1cWFVVUlBPTk9NTU5OT05OTk1NTk5OTk5OTU1OTk5OTk5NTU5OTk5OTk1NTU1OTk5OTU1OTk5OTk5NTU9PT05NTk1NT05PTk9OTU1OTk1NT1BRU1VYXFxZTkQ9PkZNWV1cWVdUU09PTk9PTk1PTk5OT05OTk9OTk5PTk5OT05OT01OTk5PTk5PTk5OTk9NTU5OTU1OT05OTU5OTk9PTU5OTk9OTk9OTk9PTk5OT01NT1FSVFZZXF1ZUEhAKjE5RE1OS0xNTk5PUFBOT05OTk5OT05OTk5OTk5PTk5OTk5OTk5OTk5NTk5OT05OT05NTU9PTU1OTk5OTU5PTk9OTU5OT05OT09OTk5PTk5PTU5OT09OTUxLTE1FPTYxDBMbKTQ2O0RHTlJUVVNSUU9OTk5OTk5OTk5OTk1OTU9OTk5OT05NTk9OTU5OTk5OTk9NTU5OTk5OTk1NTk5NTk5OTU5OTk5OTk1NTk5OTU1PUVJUVFNOR0I8NTMqHhYPAwQHDxkeKDU8SFBUVlVSUE9OTk5OTk5OTk5OTk5PTk5OTk5OTk9OTk9PTU1OTk5PTk5NTU5OTk5OTk1OTk5OTk5OTU1OT05OTk1NTU9OTk1PUlNVU1FIPjUoHRgQCAQCAgIAAQIGDxgdKTM8RklJT09RUE9OT05OTk5OTk5PTk5OTk5PTk9OT09OTU1OT09OTk1OTk5PTk5OTk9OTk9OTk5OTk5OT05OT05NT09RUE9OTEtIPzYoHBgOBgIBAgMCAgMBAQICBAYHEBciMThCT1RYVVFOT05OTk9OTk5OT05OT05OTk9OTk9PTU1OT05OTU5OTk5PTk5NT05OTk5OTk5PTk5OT05OTk9OT1NVVlZUSkI4KRsNBwcFAgMBAQICAgMCAgIBAAABAgQIGCMyREpUVFBOTk5OTk5OTk5PTk5OTk5PTk5NTU9OTk5OTk9OTk5OTk5OTU1OT05PTk9OTU1NTk5OTk1NTk5OT1BSUE1KOy4jDwgDAQACAQICAwICAgMDAgICAAEDAwICAwsSIi49R0xTU1FPT05OTk5OTk5OTk5OTk5NTU5OTk9OTk5OTk5OTk5OTU1OTk9OTk5NTU1NTk5OTk1OUFFSUUtIPzMoFxELAgMCAgICAQICAgICAwMBAgICAwMCBAECAgMFDBMnOUlYWVVQT09NTk5OTk5OT01NTk5OTk5PTk5OTk5OTk5OTk1NTk5PT01NT05OTk5PTU5OTU5QUFRVU0c8LBkQBgMDAgIBAQIDAQECAgIDAgIDAgIDAgICAgICAgMCAgILIDJGTExOT09QTk5OTk5OTk1NTk9OTk5OTU5OT05OT05OTk1OTk5PTk1PTk9OTk5OTk5OUE9PT0tIQC8kEwMCAgICAgMAAQICAQECAwICAgICAgICAgICAgICAgIDAgEBCA8hMj9LUVRTUU5OTk5OTk5PT05NTk5OTU1OTk1OTk5NTU5OTk5OTk1NTk5NTk5OTU1PUVRSTkEvHg4KBQICAgABAgICAgICAgICAgEBAgIBAgICAQMCAwICAwMCAgMCAgIJGC9DTVVVUU9OT05PT01PT05OTk5OTU1OTk5OTk5NTU5OTk5OTk1NT05OTk9OTU1PU1VPSDMYCAICAgICAgABAgICAgICAgMCAgEBAgICAgIDAgIDAwMCAgMCAgICAwMDBhIsOUdPT1BRTk5OTk5OTk9NTk5OTU1OT05OTk5OTk5PTU1OTk5OTU5OTk5OUFBOUEY7MBYFAQIDAgIBAQICAgMCAgMCAgICAwICAgMCAgICAwICBAIDAgMCAgIDAgICAwUUJDlIUFZVT05PT05OTk9NTU5PTU1OTk5OTk5OT05OTU5OT05OTU5OTk9QU1ZQSDckFQcBAgIDAgIBAgICAgMCAwIDAgICAwICAgICAgICAgECAwICAgIBAQIDAQICAwIFCyM2RlNUT09OTk1NTk5NTU5OTU1OT01NTU5OTk5OTU1OT05OTk5NTU9PUlJGNiELBAECAgICAQECAwIDAgIBAQEDAgICAgICAgICAwMDAAECAgICAgICAAIDAQECAgICAgseLkJLUFRRTk1NTk5NTU5OTU1OTk1NTk5OT05OTU1OTk9OTk5OUVNQS0ItHQkBAQECAgEBAAECAgMDAgIAAgICAgICAgEDAgMDAwICAgICAwIDAgICAgIDAgICAgICAgQLGTFDUldTT05OTk1OTk5PTk5OTk5OTU5OTk9PTk5OT05NTk9OU1dSQjAZCwQCAgMCAgICAgICAwICAgICAgIDAgICAgICAgIDAgIDAgIDAgICAgQCAgMCAgICAwECAgEBAxkuQlJQT1BPT09OTk5PTk5OT05OTU1OTk5PT05PT05NTlBPUFFCLBgEAgEDAgICAgIDAwICAgIDAgMCAgICAgMCAwICAwMCAgIDAgICAgIDAgICAwEDAwMCAgICAgIBAQgYLUNNU1NRT09NTk5OTU1PTk5OT09OTk5PTk5OTk1NUFNTSkMtGAgCAgICAgIAAQICAgICBAIBAwIBAAICAQECAgICAwMCAgICAgICAwICAgICAgIDAgICAgICAQIBAQMIGDFDU1VQTk9OT05OTU1OTk5OT09OTU5OTU5OTk5OUFVUQzEYCAMDAgMCAwIBAQICAwEDAwABAgIBAgMCAAECAwMCAgICAgICAwICAQICAwICAwMCAQICAgABAQECAgICAhgtRk9OUVBOT05OTk5OT05OTk5NTk5OTk9OTlBRT1BELBgCAgICAwMCAwICAgEBAgICAwIDAgICAgICAgMBAwICAgMCAgICAgICAgICAgICAgICAgICAgABAQECAgICAQkdN0dPVVRPTU5OTk1OT05OTk5OTk5OTk5NT1NWT0g1GwsCAgICAgICAgICAgEAAgIDAwICBAMCAgMDAwMDAwMDAgIDAgICAgICAgICAgECAgICAQICAgAAAQIBAQIBAQMLIjdGVVROTU5OTU5OTk1NTk5OTk5OTU1OTlNVSDgiCgQCAgIDAgIBAwMBAgMCAQEBAwIDAwMDAgMDAgMCAwMDAgICAgICAgICAgICAgICAgICAgICAgACAgIBAQICAAACCyM6UFJOTk9OTk5OTk1NTk5OTk5OTU5PT1FOOSQLAgICAgMDAgABAwMCAwICAAABAgIDAwMCAwMDAgIDAwICAgMCAgICAgICAwICAgMCAgIDAgICAgICAgMDAgICAgICBRUwSE9PUU9PTk9OTk5PTk5OTk5PTk9QUExELRUEAgIDAgIDAgMDAgMCAgIDAgIBAwECBAMBAgMDAgEEAwMCAgICAgIDAgICAwICAgMCAgICAgICAwICAgIDAgMEAgICAQYVNENMU1FOTk5OT05OTk5PTk5PT1FVTEAwEwYBAgIDAwIDBAICAgICAgIDAgMCAgEBAwQBAQICAQECAwICAgICAgICAgICAgICAgICAgICAAECAgABAgICAgICAgICAwEEGjFIVlFOTU1PTk5OTk5NTU5OTVNZSzAYBAICAgIDAAECAwICAgMBAQICAgICAwICAwICAgIDAAECAgIBAgICAgICAgICAgICAgICAgECAAECAgEBAgICAgMEAgICAgICCR5BU1BPTk1OT05PTk5NTU5OTlJYRiAIAwICAgICAAEDAwICAgMBAQICAwMDAwEDAgIDAgIDAQEDAgMDAgICAgIDAgICAgICAgICAgICAgICAwICAgEBAQIDAgIBAgICAQ8wR0tQUFBOT05PTk5NTU9RUExJMQ4DAgMCAQICAgECAwICAgIEAwIDAgMDAgICAgMDAgMDAgIDBAMCAgMCAgIDAgICAwICAgMCAgIDAgICAwICAgMBAAICAgIBAwIBAgwkO0hTVFBOT05OT09NTVFVVEc5IAgBAwMCAQEDAgICAgEBAwMCAgIDAwICAwICAgMCAwIDAgMDAwMDAgMCAgICAgICAwICAgMCAgICAQICAgEBAgICAgIDAQECAgABAQUTLD9TVlFOTk1NTk5OTlFXUjwlDAIBAgIBAQMDAwICAgEBAgICAwICAgEDAwIDAgIBAQIDAgMDAgMCAgICAgICAgICAwICAwMCAgMCAgICAgABAgICAgICAAECAgIBAQECGTNOVlBOTU1OT05PUE9USy0UBAMCAgIAAQIDAgICAwABAgICAgECAQEDAgMCAgMAAQICBAICAgECAgQCAwMCAwICAwIDAgMDAgIDAgIBAgICAgMCAgIDAgICAwICAgIBEChMU09PT09OTk9PT01QRCMMAwEBAgICAgIDAgICAgMCAgMCAgICAgIDAwEBAgICAgMDAgICAwEBAgICAgMDAwMDAgICAwMCAgICAgMDAwICAgICAgIDAgICAgICAgMCBhg8SUxRUk5OTk9RUkpDMhMFAgEBAQQCAgMCAgIDAwICAgMCAgIEAgIDAgECAgMDAwICAgMDAwEBAgICAgICAQICAgICAwICAgMCAgICAgICAgICAgICAgIDAgIDAgICAxEwQEtTUk5OT05SVUk5IwoDAgICAgMCAgMCAAECAwABAgIBAQMDAgECAwICAgICAgMDAgICAgECAgICAgICAQICAwIDAgICAgICAgICAgICAgICAgICAwICAgIDAgMDBAojOEhWVE9OTlBVVkcwGAMCAgIDAwMDAwICAQECAwECAwICAgMDAgECAgICAgMCAwIBAAEBAgEBAgICAgIDAgICAgICAgMCAwIDAgMCAwICAgICAgIDAgICAgICAgQCAwMPKT9UVU5PTk1VVD0lCAECAgMDAgQCAwICAwICAwIDAwMCAgIDAwMDAQICAgQCAgICAgMDBAICAgMDAgICAgICAwMCAgICAgIDAgICAwICAgMCAgIDAgMCAwMCAgMCAgIGGjVRU05RT05TUTUYAwICAwICAwMCAwIEAgMDAwMDAgQDAwIDAwICAgIDAwMDAgIEAgMDAwMDAgICAgICAgIDAgECAgMDAQICAgICAgICAgMCAwICAwICAwICAgICAgICDipIT01SUk5OSCoOAwMDAgIDAwIDAgICAgIDAwMDAwMCAgIDBAIDBAECAwIBAQICAgICBAICAgICAgICAQMCAgICAgICAgMCAgICAgICAgICAgICAgICAgIDAgICAgIBBx08R0xVVU5HPh4IAQMDAgMCAgMBAwMCAgICAwIDAgIDAwMCAgMCAgECAgIBAQICAgMCAgICAgMCAgICAgICAwICAgICAgMDAgECAgICAgMCAgIDAgICAwICAgICAgICBxg1Q0xWVUxDNRgHAgMDAwMCAwICAwICAgMCAwICAwMDAgMDAwICAwIDAwMDAwEDAQIDAgMDAgICAgMDAgMCAgICAgIDAgMCAgICAwICAgICAgIDAgICAgIDAgICAgIBBA4oPUxZWUw7KQ4EAQICAgIDAgQDAwIDAwIEAgICAwICAwIDAgICAgMCAwQCAgEBAQICAwIDAgMBAgICAgMDAgMDAgICAgICAgICAgICAgIBAgICAQICAgICAgICAgIBAgYeNkxdXU01HgUCAQICAgEDAgICAwIDAQEDAgEBAgIAAQICAgIDAwEBAwMDAwIDAAEDAgICAgIBAQMEAgMCAgIDAgMCAgMCAgMCAgICAgIBAgICAgICAgICAgICAgMCAgMaM0tdXk0zGAICAgICAQABAgMCAwMDAgECAgEBAgIAAQICAgICAgABAgICAwIDAAICAgICAgMCAgMDAwMCAwIDAgMCAwECAgEDBAICAgICAgIDAgICAwICAgMCAgICAwMQK0VZWUQpDwIDAgICAwICAgMCAgMCAgICAgICAgICAgEDAgICAgEBAgMCAgMCAgICAwICAwMCAgIDAgIDAwICAwIDAgMDAgMCBAICAgMCAgIDAgICAwICAgMCAgIDAgMIHzxPTjocCAICAgICAgICAgMCAQMDAgICAgICAgICAgIDAgICAgAAAgICAgIDAgICAwICAQICAgMCAgICAgICAgICAgIDAgICAgMCAgICAgICAgICAgIDAgMCAgIDAgIEFTZHRTETBAECAQECAgICAwICAgICAgICAgEBAgMAAQIDAgICAgICAgIBAQIDAgICAgEBAgICAgICAgMCAgICAgICAgICAQMCAwICAgICAgICAQIDAgICAgICAgICAgMBDzBAPioNAgICAAEDAgICAgMCAgICAgICAgEBAwIBAQIBAgICAgICAgMBAQICAgICAgAB' },\n}\n\n\n/** Decode a packed alpha entry into Float32Array (0\u20131). */\nexport function decodeCalibratedAlpha(entry) {\n const binary = typeof atob === 'function'\n ? atob(entry.dataBase64)\n : Buffer.from(entry.dataBase64, 'base64').toString('binary')\n\n const map = new Float32Array(entry.width * entry.height)\n for (let i = 0; i < map.length; i++) {\n map[i] = binary.charCodeAt(i) / 255\n }\n return map\n}\n\n/** @returns {{ data: Float32Array, width: number, height: number, source: string }|null} */\nexport function loadCalibratedAlphaMap(key) {\n const entry = CALIBRATED_ALPHA_ENTRIES[key]\n if (!entry) return null\n return {\n data: decodeCalibratedAlpha(entry),\n width: entry.width,\n height: entry.height,\n source: entry.source,\n }\n}\n", "/**\n * Embedded alpha maps for video watermark removal.\n * Calibrated from GeminiWatermarkTool + VeoWatermarkRemover upstream captures.\n */\n\nimport { loadCalibratedAlphaMap } from './calibratedAlphaData.js'\n\nconst alphaMapRegistry = new Map()\n\nconst VIDEO_ALPHA_KEYS = [\n '720p-landscape',\n '720p-portrait',\n '1080p-landscape',\n '1080p-portrait',\n 'veo-diamond-1080p-landscape',\n 'veo-diamond-1080p-portrait',\n]\n\nfor (const key of VIDEO_ALPHA_KEYS) {\n const loaded = loadCalibratedAlphaMap(key)\n if (loaded) {\n alphaMapRegistry.set(key, loaded)\n }\n}\n\n/**\n * Bilinear resize helper (used when registering custom maps).\n */\nexport function resizeAlphaMap(source, sourceWidth, sourceHeight, targetWidth, targetHeight) {\n if (sourceWidth === targetWidth && sourceHeight === targetHeight) {\n return new Float32Array(source)\n }\n\n const result = new Float32Array(targetWidth * targetHeight)\n const xScale = sourceWidth / targetWidth\n const yScale = sourceHeight / targetHeight\n\n for (let y = 0; y < targetHeight; y++) {\n const sourceY = (y + 0.5) * yScale - 0.5\n const sourceY0 = Math.floor(sourceY)\n const y0 = Math.max(0, sourceY0)\n const y1 = Math.min(sourceHeight - 1, y0 + 1)\n const yWeight = Math.max(0, Math.min(1, sourceY - sourceY0))\n\n for (let x = 0; x < targetWidth; x++) {\n const sourceX = (x + 0.5) * xScale - 0.5\n const sourceX0 = Math.floor(sourceX)\n const x0 = Math.max(0, sourceX0)\n const x1 = Math.min(sourceWidth - 1, x0 + 1)\n const xWeight = Math.max(0, Math.min(1, sourceX - sourceX0))\n\n const top =\n source[y0 * sourceWidth + x0] * (1 - xWeight) +\n source[y0 * sourceWidth + x1] * xWeight\n const bottom =\n source[y1 * sourceWidth + x0] * (1 - xWeight) +\n source[y1 * sourceWidth + x1] * xWeight\n\n result[y * targetWidth + x] = top * (1 - yWeight) + bottom * yWeight\n }\n }\n\n return result\n}\n\n/**\n * @param {string} key\n * @returns {{ data: Float32Array, width: number, height: number, source?: string } | null}\n */\nexport function getEmbeddedAlphaMap(key) {\n return alphaMapRegistry.get(key) || loadCalibratedAlphaMap(key)\n}\n\nexport function registerAlphaMap(key, data, width, height, source = 'custom') {\n alphaMapRegistry.set(key, { data, width, height, source })\n}\n\nexport function listAlphaMapKeys() {\n return Array.from(alphaMapRegistry.keys())\n}\n", "/**\n * Per-frame watermark processing orchestrator.\n * Combines veoConfig + alphaMap + blendModes to process a single frame.\n */\n\nimport { removeWatermark } from './blendModes.js';\nimport { getVeoWatermarkInfo, normalizeVideoWatermarkProfile } from './veoConfig.js';\nimport { getEmbeddedAlphaMap } from './embeddedAlphaMaps.js';\n\n/**\n * Process a single video frame to remove the configured video watermark.\n *\n * @param {ImageData} frameData - Frame pixel data\n * @param {{ width?: number, height?: number, videoProfile?: 'diamond'|'legacy' }} options\n * @returns {{ imageData: ImageData, processed: boolean, reason?: string, profile?: string|null, position?: object|null }}\n */\nexport function processFrame(frameData, options = {}) {\n const width = options.width || frameData.width;\n const height = options.height || frameData.height;\n const profile = normalizeVideoWatermarkProfile(options.videoProfile ?? options.profile);\n\n if (!profile) {\n return { imageData: frameData, processed: false, reason: 'unsupported_profile', profile: null };\n }\n\n const info = getVeoWatermarkInfo(width, height, profile);\n if (!info) {\n return { imageData: frameData, processed: false, reason: 'unsupported_resolution', profile };\n }\n\n const alphaMap = getEmbeddedAlphaMap(info.alphaMapKey);\n if (!alphaMap) {\n return { imageData: frameData, processed: false, reason: 'missing_alpha_map', profile };\n }\n\n removeWatermark(frameData, alphaMap.data, info.position);\n return { imageData: frameData, processed: true, profile, position: info.position };\n}\n\n/**\n * Create a reusable frame processor for a specific video (caches config lookup).\n *\n * @param {number} frameWidth\n * @param {number} frameHeight\n * @param {{ videoProfile?: 'diamond'|'legacy' }} options\n * @returns {{ profile: string|null, position: object|null, process(frameData: ImageData): { imageData: ImageData, processed: boolean, reason?: string, profile?: string|null, position?: object|null } }}\n */\nexport function createFrameProcessor(frameWidth, frameHeight, options = {}) {\n const profile = normalizeVideoWatermarkProfile(options.videoProfile ?? options.profile);\n\n if (!profile) {\n return {\n profile: null,\n position: null,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'unsupported_profile', profile: null };\n },\n };\n }\n\n const info = getVeoWatermarkInfo(frameWidth, frameHeight, profile);\n if (!info) {\n return {\n profile,\n position: null,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'unsupported_resolution', profile };\n },\n };\n }\n\n const alphaMap = getEmbeddedAlphaMap(info.alphaMapKey);\n if (!alphaMap) {\n return {\n profile,\n position: info.position,\n process(frameData) {\n return { imageData: frameData, processed: false, reason: 'missing_alpha_map', profile };\n },\n };\n }\n\n const position = info.position;\n const mapData = alphaMap.data;\n\n return {\n profile,\n position,\n process(frameData) {\n removeWatermark(frameData, mapData, position);\n return { imageData: frameData, processed: true, profile, position };\n },\n };\n}\n", "/**\n * Shared video decoder types and base class.\n */\n\n/**\n * @typedef {Object} VideoInfo\n * @property {number} width\n * @property {number} height\n * @property {number} frameCount\n * @property {number} duration\n * @property {number} fps\n * @property {string} codec\n */\n\n/**\n * @typedef {Object} DecodedFrame\n * @property {ImageData} imageData\n * @property {number} timestamp\n * @property {number} frameIndex\n */\n\nexport class VideoDecoderBase {\n async open(/* source */) {\n throw new Error('Not implemented');\n }\n\n async *decodeFrames() {\n throw new Error('Not implemented');\n }\n\n async extractAudio() {\n return null;\n }\n\n async close() {}\n}\n", "/**\n * WebCodecs-based video decoder (browser only).\n */\n\nimport { VideoDecoderBase } from './videoDecoder.base.js';\n\nexport class WebCodecsDecoder extends VideoDecoderBase {\n #videoInfo = null;\n #videoMp4 = null;\n #sourceBuffer = null;\n #frameIndex = 0;\n #audioData = null;\n\n async open(source) {\n if (typeof VideoDecoder === 'undefined') {\n throw new Error('WebCodecs API not available. Use Chrome 94+ or a fallback decoder.');\n }\n\n this.#sourceBuffer = await source.arrayBuffer();\n const { createFile } = await import('mp4box');\n\n const probeFile = createFile();\n const info = await new Promise((resolve, reject) => {\n probeFile.onReady = resolve;\n probeFile.onError = reject;\n this.#sourceBuffer.fileStart = 0;\n probeFile.appendBuffer(this.#sourceBuffer);\n probeFile.flush();\n });\n\n const videoTrack = info.videoTracks[0];\n if (!videoTrack) {\n throw new Error('No video track found');\n }\n\n this.#videoInfo = {\n width: videoTrack.video.width,\n height: videoTrack.video.height,\n frameCount: videoTrack.nb_samples,\n duration: videoTrack.duration / videoTrack.timescale,\n fps: videoTrack.nb_samples / (videoTrack.duration / videoTrack.timescale),\n codec: videoTrack.codec,\n videoTrackId: videoTrack.id,\n };\n\n const audioTrack = info.audioTracks?.[0] ?? null;\n if (audioTrack) {\n this.#audioData = await this.#readTrackSamples(createFile, audioTrack);\n }\n\n this.#videoMp4 = createFile();\n await new Promise((resolve, reject) => {\n this.#videoMp4.onReady = resolve;\n this.#videoMp4.onError = reject;\n const buffer = this.#sourceBuffer.slice(0);\n buffer.fileStart = 0;\n this.#videoMp4.appendBuffer(buffer);\n this.#videoMp4.flush();\n });\n\n return this.#videoInfo;\n }\n\n /**\n * @param {typeof import('mp4box').createFile} createFile\n * @param {object} track\n */\n async #readTrackSamples(createFile, track) {\n const mp4 = createFile();\n const samples = [];\n\n await new Promise((resolve, reject) => {\n mp4.onReady = () => {\n mp4.onSamples = (_trackId, _user, trackSamples) => {\n for (const sample of trackSamples) {\n samples.push({\n data: sample.data,\n timestamp: Math.round((sample.cts * 1_000_000) / sample.timescale),\n duration: Math.round((sample.duration * 1_000_000) / sample.timescale),\n type: sample.is_sync ? 'key' : 'delta',\n });\n }\n };\n mp4.setExtractionOptions(track.id);\n mp4.start();\n mp4.flush();\n queueMicrotask(resolve);\n };\n mp4.onError = reject;\n const buffer = this.#sourceBuffer.slice(0);\n buffer.fileStart = 0;\n mp4.appendBuffer(buffer);\n mp4.flush();\n });\n\n return {\n codec: 'aac',\n sampleRate: track.audio?.sample_rate ?? 48000,\n numberOfChannels: track.audio?.channel_count ?? 2,\n samples,\n };\n }\n\n async extractAudio() {\n return this.#audioData;\n }\n\n async *decodeFrames() {\n if (!this.#videoMp4 || !this.#videoInfo) {\n throw new Error('Call open() first');\n }\n\n const { width, height, videoTrackId } = this.#videoInfo;\n const pendingFrames = [];\n let resolveNext = null;\n let done = false;\n\n const decoder = new VideoDecoder({\n output: (frame) => {\n const canvas = new OffscreenCanvas(width, height);\n const ctx = canvas.getContext('2d');\n ctx.drawImage(frame, 0, 0);\n const imageData = ctx.getImageData(0, 0, width, height);\n\n const decoded = {\n imageData,\n timestamp: frame.timestamp,\n frameIndex: this.#frameIndex++,\n };\n\n frame.close();\n\n if (resolveNext) {\n const r = resolveNext;\n resolveNext = null;\n r(decoded);\n } else {\n pendingFrames.push(decoded);\n }\n },\n error: (e) => {\n console.error('Decoder error:', e);\n done = true;\n },\n });\n\n decoder.configure({\n codec: this.#videoInfo.codec,\n codedWidth: width,\n codedHeight: height,\n });\n\n this.#videoMp4.onSamples = (_trackId, _user, trackSamples) => {\n for (const sample of trackSamples) {\n const chunk = new EncodedVideoChunk({\n type: sample.is_sync ? 'key' : 'delta',\n timestamp: (sample.cts * 1_000_000) / sample.timescale,\n duration: (sample.duration * 1_000_000) / sample.timescale,\n data: sample.data,\n });\n decoder.decode(chunk);\n }\n };\n\n this.#videoMp4.setExtractionOptions(videoTrackId);\n this.#videoMp4.start();\n\n while (!done) {\n if (pendingFrames.length > 0) {\n yield pendingFrames.shift();\n } else {\n const frame = await new Promise((resolve) => {\n resolveNext = resolve;\n if (decoder.decodeQueueSize === 0) {\n decoder.flush().then(() => {\n done = true;\n resolve(null);\n });\n }\n });\n if (frame) yield frame;\n else break;\n }\n }\n\n decoder.close();\n }\n\n async close() {\n this.#videoMp4 = null;\n this.#videoInfo = null;\n this.#audioData = null;\n this.#sourceBuffer = null;\n this.#frameIndex = 0;\n }\n}\n", "/**\n * Shared video encoder types and base class.\n */\n\n/**\n * @typedef {Object} EncoderConfig\n * @property {number} width\n * @property {number} height\n * @property {number} fps\n * @property {number} [bitrate]\n * @property {string} [codec]\n */\n\nexport class VideoEncoderBase {\n async init(/* config */) {\n throw new Error('Not implemented');\n }\n\n async encodeFrame(/* imageData, timestamp */) {\n throw new Error('Not implemented');\n }\n\n async setAudioTrack(/* audioData */) {\n throw new Error('Not implemented');\n }\n\n async finalize() {\n throw new Error('Not implemented');\n }\n}\n", "/**\n * WebCodecs + mp4-muxer encoder (browser).\n */\n\nimport { VideoEncoderBase } from './videoEncoder.base.js';\n\nexport class WebCodecsEncoder extends VideoEncoderBase {\n #muxer = null;\n #encoder = null;\n #frameCount = 0;\n #audioSamples = null;\n _target = null;\n\n async init(config) {\n if (typeof VideoEncoder === 'undefined') {\n throw new Error('WebCodecs API not available');\n }\n\n const { Muxer, ArrayBufferTarget } = await import('mp4-muxer');\n\n const target = new ArrayBufferTarget();\n\n const muxerConfig = {\n target,\n video: {\n codec: 'avc',\n width: config.width,\n height: config.height,\n },\n fastStart: 'in-memory',\n };\n\n if (config.audio) {\n muxerConfig.audio = {\n codec: config.audio.codec || 'aac',\n numberOfChannels: config.audio.numberOfChannels || 2,\n sampleRate: config.audio.sampleRate || 48000,\n };\n }\n\n this.#muxer = new Muxer(muxerConfig);\n\n this.#encoder = new VideoEncoder({\n output: (chunk, meta) => {\n this.#muxer.addVideoChunk(chunk, meta);\n },\n error: (e) => {\n console.error('Encoder error:', e);\n },\n });\n\n this.#encoder.configure({\n codec: config.codec || 'avc1.42001f',\n width: config.width,\n height: config.height,\n bitrate: config.bitrate || 5_000_000,\n framerate: config.fps,\n });\n\n this._target = target;\n }\n\n async encodeFrame(imageData, timestamp) {\n const frame = new VideoFrame(imageData.data.buffer, {\n format: 'RGBA',\n codedWidth: imageData.width,\n codedHeight: imageData.height,\n timestamp,\n });\n\n const isKey = this.#frameCount % 30 === 0;\n this.#encoder.encode(frame, { keyFrame: isKey });\n frame.close();\n this.#frameCount++;\n }\n\n /**\n * Queue encoded audio samples for passthrough muxing after video finalize.\n * @param {{ codec?: string, sampleRate: number, numberOfChannels: number, samples: Array<{ data: Uint8Array, timestamp: number, duration: number, type: 'key'|'delta' }> }} audioData\n */\n async setAudioTrack(audioData) {\n this.#audioSamples = audioData;\n }\n\n async finalize() {\n await this.#encoder.flush();\n this.#encoder.close();\n\n if (this.#audioSamples?.samples?.length) {\n for (const sample of this.#audioSamples.samples) {\n this.#muxer.addAudioChunkRaw(\n sample.data,\n sample.type,\n sample.timestamp,\n sample.duration,\n );\n }\n }\n\n this.#muxer.finalize();\n return new Blob([this._target.buffer], { type: 'video/mp4' });\n }\n}\n", "/**\n * Browser-only video pipeline (WebCodecs \u2014 no ffmpeg.wasm).\n */\n\nimport { WebCodecsDecoder } from './videoDecoder.webcodecs.js';\nimport { WebCodecsEncoder } from './videoEncoder.webcodecs.js';\nimport { createFrameProcessor } from '../core/frameProcessor.js';\n\n/**\n * @typedef {Object} ProcessOptions\n * @property {(current: number, total: number) => void} [onProgress]\n * @property {number} [bitrate]\n * @property {'diamond'|'legacy'} [videoProfile]\n */\n\n/**\n * Process a video file to remove Veo watermarks in the browser.\n *\n * @param {File|Blob} input\n * @param {ProcessOptions} options\n * @returns {Promise<Blob>}\n */\nexport async function processVideo(input, options = {}) {\n const { bitrate, onProgress, videoProfile = 'diamond' } = options;\n\n const decoder = new WebCodecsDecoder();\n const videoInfo = await decoder.open(input);\n\n const processor = createFrameProcessor(videoInfo.width, videoInfo.height, { videoProfile });\n\n const audioData = await decoder.extractAudio();\n\n const encoder = new WebCodecsEncoder();\n await encoder.init({\n width: videoInfo.width,\n height: videoInfo.height,\n fps: videoInfo.fps,\n bitrate: bitrate || 5_000_000,\n audio: audioData\n ? {\n codec: audioData.codec,\n sampleRate: audioData.sampleRate,\n numberOfChannels: audioData.numberOfChannels,\n }\n : undefined,\n });\n\n if (audioData) {\n await encoder.setAudioTrack(audioData);\n }\n\n let frameIndex = 0;\n let processedFrames = 0;\n let skippedFrames = 0;\n let skipReason = null;\n const totalFrames = videoInfo.frameCount || 0;\n\n for await (const frame of decoder.decodeFrames()) {\n const frameResult = processor.process(frame.imageData);\n if (frameResult.processed) {\n processedFrames++;\n } else {\n skippedFrames++;\n skipReason = skipReason || frameResult.reason || 'not_processed';\n }\n await encoder.encodeFrame(frame.imageData, frame.timestamp);\n\n frameIndex++;\n if (onProgress && totalFrames > 0) {\n onProgress(frameIndex, totalFrames);\n }\n }\n\n await decoder.close();\n const output = await encoder.finalize();\n output.videoProfile = processor.profile;\n output.processedFrames = processedFrames;\n output.skippedFrames = skippedFrames;\n output.skipped = processedFrames === 0;\n output.reason = processedFrames === 0 ? skipReason : null;\n return output;\n}\n", "/**\n * Gemini watermark position/size detection for different image dimensions.\n *\n * Gemini currently has two visible watermark profiles:\n * - V2/current (Gemini 3.5+): 36\u00D736 small, 96\u00D796 large\n * - V1/legacy (pre-Gemini 3.5): 48\u00D748 small, 96\u00D796 large\n *\n * The watermark is always placed in the bottom-right corner as a white overlay.\n */\n\n/** Dimension threshold \u2014 large only when both dimensions exceed this value. */\nconst LARGE_IMAGE_THRESHOLD = 1024\n\n/** @typedef {'current'|'legacy'} GeminiWatermarkProfile */\n\n/** @type {Record<GeminiWatermarkProfile, Record<'small'|'large', { size: number, alphaMapKey: string, margin?: number }>>} */\nconst GEMINI_WATERMARK_PROFILES = {\n current: {\n small: { size: 36, alphaMapKey: 'gemini-v2-36' },\n large: { size: 96, margin: 192, alphaMapKey: 'gemini-v2-96' },\n },\n legacy: {\n small: { size: 48, margin: 32, alphaMapKey: 'gemini-48' },\n large: { size: 96, margin: 64, alphaMapKey: 'gemini-96' },\n },\n}\n\n/** Backwards-compatible alias for the legacy profile table. */\nconst GEMINI_WATERMARK_SIZES = GEMINI_WATERMARK_PROFILES.legacy\n\n/**\n * Normalize profile aliases used by the CLI and SDK.\n * @param {string|{ profile?: string }|undefined} profile\n * @returns {GeminiWatermarkProfile}\n */\nfunction normalizeGeminiProfile(profile) {\n const value = typeof profile === 'object' && profile\n ? profile.profile\n : profile\n\n if (value === 'legacy' || value === 'v1' || value === 'V1') return 'legacy'\n return 'current'\n}\n\n/**\n * Determine which watermark tier applies for a given image dimension.\n * @param {number} width\n * @param {number} height\n * @returns {'small'|'large'}\n */\nfunction getWatermarkTier(width, height) {\n return (width > LARGE_IMAGE_THRESHOLD && height > LARGE_IMAGE_THRESHOLD)\n ? 'large'\n : 'small'\n}\n\n/**\n * Resolve V2 small margin by inferring the canonical large source size.\n * @param {number} width\n * @param {number} height\n * @returns {number}\n */\nfunction calculateCurrentSmallMargin(width, height) {\n const longSide = Math.max(width, height)\n const shortSide = Math.min(width, height)\n\n let sourceLongDim\n if (shortSide >= 566) {\n sourceLongDim = 2752\n } else if (shortSide >= 550) {\n sourceLongDim = 2816\n } else {\n sourceLongDim = 2848\n }\n\n return Math.round(192 * (longSide / sourceLongDim))\n}\n\n/**\n * Detect Gemini watermark configuration for given image dimensions.\n * Returns null if the image is too small to contain the watermark region.\n *\n * @param {number} width - Image width in pixels\n * @param {number} height - Image height in pixels\n * @param {string|{ profile?: string }} [profile='current'] - current/V2 or legacy/V1\n * @returns {{ tier: string, profile: GeminiWatermarkProfile, size: number, margin: number, alphaMapKey: string }|null}\n */\nexport function detectGeminiWatermarkConfig(width, height, profile = 'current') {\n const normalizedProfile = normalizeGeminiProfile(profile)\n const tier = getWatermarkTier(width, height)\n const config = GEMINI_WATERMARK_PROFILES[normalizedProfile][tier]\n const margin = config.margin ?? calculateCurrentSmallMargin(width, height)\n\n // Image must be large enough to contain the watermark + margins\n const minDim = config.size + margin\n if (width < minDim || height < minDim) return null\n\n return { tier, profile: normalizedProfile, ...config, margin }\n}\n\n/**\n * Calculate the expected watermark bounding box position.\n *\n * @param {number} width - Image width in pixels\n * @param {number} height - Image height in pixels\n * @param {string|{ profile?: string }} [profile='current'] - current/V2 or legacy/V1\n * @returns {{ x: number, y: number, width: number, height: number }|null}\n */\nexport function calculateGeminiWatermarkPosition(width, height, profile = 'current') {\n const config = detectGeminiWatermarkConfig(width, height, profile)\n if (!config) return null\n\n return {\n x: width - config.margin - config.size,\n y: height - config.margin - config.size,\n width: config.size,\n height: config.size,\n }\n}\n\n/**\n * Get full watermark info including alpha map key for a given image.\n *\n * @param {number} width - Image width in pixels\n * @param {number} height - Image height in pixels\n * @param {string|{ profile?: string }} [profile='current'] - current/V2 or legacy/V1\n * @returns {{ profile: GeminiWatermarkProfile, tier: string, alphaMapKey: string, size: number, margin: number, position: { x: number, y: number, width: number, height: number } }|null}\n */\nexport function getGeminiWatermarkInfo(width, height, profile = 'current') {\n const config = detectGeminiWatermarkConfig(width, height, profile)\n if (!config) return null\n\n return {\n profile: config.profile,\n tier: config.tier,\n alphaMapKey: config.alphaMapKey,\n size: config.size,\n margin: config.margin,\n position: {\n x: width - config.margin - config.size,\n y: height - config.margin - config.size,\n width: config.size,\n height: config.size,\n },\n }\n}\n\nexport {\n GEMINI_WATERMARK_PROFILES,\n GEMINI_WATERMARK_SIZES,\n LARGE_IMAGE_THRESHOLD,\n calculateCurrentSmallMargin,\n getWatermarkTier,\n normalizeGeminiProfile,\n}\n", "/**\n * Alpha map management for Gemini watermarks.\n *\n * Calibrated maps are embedded from GeminiWatermarkTool v0.3.1 captures\n * (see scripts/embed-alpha-maps.mjs and assets/masks/).\n */\n\nimport {\n CALIBRATED_ALPHA_ENTRIES,\n decodeCalibratedAlpha,\n loadCalibratedAlphaMap,\n} from '../calibratedAlphaData.js'\n\nconst geminiAlphaMapRegistry = new Map()\n\nconst GEMINI_ALPHA_MAP_KEYS = [\n 'gemini-v2-36',\n 'gemini-v2-96',\n 'gemini-48',\n 'gemini-96',\n]\n\nfor (const key of GEMINI_ALPHA_MAP_KEYS) {\n const loaded = loadCalibratedAlphaMap(key)\n if (loaded) {\n geminiAlphaMapRegistry.set(key, loaded)\n }\n}\n\n/**\n * Decode a Base64-encoded alpha map (from PNG brightness data).\n * @param {string} base64Data\n * @param {number} size\n * @returns {Float32Array}\n */\nexport function decodeAlphaMapFromBase64(base64Data, size) {\n return decodeCalibratedAlpha({ width: size, height: size, dataBase64: base64Data })\n}\n\n/**\n * Load an alpha map from a URL (browser) or file path (Node.js).\n * @param {string} source\n * @param {number} size\n * @returns {Promise<Float32Array>}\n */\nexport async function loadAlphaMapFromPNG(source, size) {\n if (typeof document !== 'undefined' && typeof createImageBitmap === 'function') {\n const response = await fetch(source)\n const blob = await response.blob()\n const bitmap = await createImageBitmap(blob)\n\n const canvas = new OffscreenCanvas(size, size)\n const ctx = canvas.getContext('2d')\n ctx.drawImage(bitmap, 0, 0, size, size)\n\n const imageData = ctx.getImageData(0, 0, size, size)\n const map = new Float32Array(size * size)\n\n for (let i = 0; i < size * size; i++) {\n const idx = i * 4\n map[i] = Math.max(imageData.data[idx], imageData.data[idx + 1], imageData.data[idx + 2]) / 255\n }\n return map\n }\n\n const { readFile } = await import('node:fs/promises')\n const fileData = await readFile(source)\n\n if (fileData[0] === 0x89 && fileData[1] === 0x50) {\n const sharp = (await import('sharp')).default\n const { data, info } = await sharp(fileData).ensureAlpha().raw().toBuffer({ resolveWithObject: true })\n const map = new Float32Array(info.width * info.height)\n for (let i = 0; i < map.length; i++) {\n const base = i * info.channels\n map[i] = Math.max(data[base], data[base + 1], data[base + 2]) / 255\n }\n return map\n }\n\n const map = new Float32Array(size * size)\n for (let i = 0; i < Math.min(fileData.length, size * size); i++) {\n map[i] = fileData[i] / 255\n }\n return map\n}\n\n/**\n * @param {string} key\n * @returns {{ data: Float32Array, width: number, height: number, source: string }|null}\n */\nexport function getGeminiAlphaMap(key) {\n return geminiAlphaMapRegistry.get(key) || loadCalibratedAlphaMap(key)\n}\n\nexport function registerGeminiAlphaMap(key, data, size, source = 'custom') {\n geminiAlphaMapRegistry.set(key, { data, width: size, height: size, source })\n}\n\nexport async function loadAndRegisterAlphaMap(key, pngSource, size) {\n const data = await loadAlphaMapFromPNG(pngSource, size)\n registerGeminiAlphaMap(key, data, size, pngSource)\n}\n\nexport function listGeminiAlphaMapKeys() {\n return Array.from(new Set([...geminiAlphaMapRegistry.keys(), ...Object.keys(CALIBRATED_ALPHA_ENTRIES)]))\n}\n\nexport { geminiAlphaMapRegistry, CALIBRATED_ALPHA_ENTRIES, loadCalibratedAlphaMap }\n", "/**\n * Post-removal validation metrics for Gemini image watermark removal.\n * Rejects false-positive detections before committing pixel changes.\n */\n\nconst HALO_MIN_ALPHA = 0.12\nconst HALO_MAX_ALPHA = 0.35\nconst HALO_OUTSIDE_ALPHA_MAX = 0.01\nconst HALO_OUTER_MARGIN = 3\nconst MIN_HALO_VISIBILITY = 0.35\nconst MAX_RESIDUAL_NCC_RATIO = 0.55\nconst NEAR_BLACK_THRESHOLD = 5\n\n/**\n * Deep-clone ImageData-like object.\n * @param {{ width: number, height: number, data: Uint8ClampedArray }} imageData\n */\nexport function cloneImageData(imageData) {\n return {\n width: imageData.width,\n height: imageData.height,\n data: new Uint8ClampedArray(imageData.data),\n }\n}\n\n/**\n * Measure how much brighter the watermark band is vs surrounding pixels on the original.\n * Real Gemini overlays produce a visible halo before removal.\n */\nexport function assessAlphaBandHalo(imageData, position, alphaMap) {\n let bandSum = 0\n let bandSq = 0\n let bandCount = 0\n let outerSum = 0\n let outerSq = 0\n let outerCount = 0\n\n for (let row = -HALO_OUTER_MARGIN; row < position.height + HALO_OUTER_MARGIN; row++) {\n for (let col = -HALO_OUTER_MARGIN; col < position.width + HALO_OUTER_MARGIN; col++) {\n const pixelX = position.x + col\n const pixelY = position.y + row\n if (pixelX < 0 || pixelY < 0 || pixelX >= imageData.width || pixelY >= imageData.height) {\n continue\n }\n\n const idx = (pixelY * imageData.width + pixelX) * 4\n const lum = 0.2126 * imageData.data[idx]\n + 0.7152 * imageData.data[idx + 1]\n + 0.0722 * imageData.data[idx + 2]\n\n const inside = row >= 0 && col >= 0 && row < position.height && col < position.width\n const alpha = inside ? alphaMap[row * position.width + col] : 0\n\n if (inside && alpha >= HALO_MIN_ALPHA && alpha <= HALO_MAX_ALPHA) {\n bandSum += lum\n bandSq += lum * lum\n bandCount++\n continue\n }\n\n if (!inside || alpha <= HALO_OUTSIDE_ALPHA_MAX) {\n outerSum += lum\n outerSq += lum * lum\n outerCount++\n }\n }\n }\n\n const bandMean = bandCount > 0 ? bandSum / bandCount : 0\n const outerMean = outerCount > 0 ? outerSum / outerCount : 0\n const outerStd = outerCount > 0\n ? Math.sqrt(Math.max(0, outerSq / outerCount - outerMean * outerMean))\n : 1\n\n const deltaLum = bandMean - outerMean\n const visibility = deltaLum / Math.max(1, outerStd)\n\n return { bandCount, outerCount, deltaLum, visibility }\n}\n\n/** Ratio of near-black pixels inside the watermark region after restoration. */\nexport function calculateNearBlackRatio(imageData, position) {\n let nearBlack = 0\n let total = 0\n\n for (let row = 0; row < position.height; row++) {\n for (let col = 0; col < position.width; col++) {\n const idx = ((position.y + row) * imageData.width + (position.x + col)) * 4\n const r = imageData.data[idx]\n const g = imageData.data[idx + 1]\n const b = imageData.data[idx + 2]\n if (r <= NEAR_BLACK_THRESHOLD && g <= NEAR_BLACK_THRESHOLD && b <= NEAR_BLACK_THRESHOLD) {\n nearBlack++\n }\n total++\n }\n }\n\n return total > 0 ? nearBlack / total : 0\n}\n\n/**\n * Lightweight NCC on restored region \u2014 residual should drop after valid removal.\n */\nfunction computeRegionNCC(imgData, imgW, position, alphaMap, step = 2) {\n let sumImg = 0\n let sumMask = 0\n let sumImgSq = 0\n let sumMaskSq = 0\n let sumProduct = 0\n let count = 0\n const { x, y, width: maskW, height: maskH } = position\n\n for (let my = 0; my < maskH; my += step) {\n for (let mx = 0; mx < maskW; mx += step) {\n const alpha = alphaMap[my * maskW + mx]\n if (alpha < 0.01) continue\n\n const idx = ((y + my) * imgW + (x + mx)) * 4\n const brightness = (imgData[idx] + imgData[idx + 1] + imgData[idx + 2]) / 3\n sumImg += brightness\n sumMask += alpha\n sumImgSq += brightness * brightness\n sumMaskSq += alpha * alpha\n sumProduct += brightness * alpha\n count++\n }\n }\n\n if (count < 10) return 0\n\n const meanImg = sumImg / count\n const meanMask = sumMask / count\n const numerator = (sumProduct / count) - (meanImg * meanMask)\n const denomImg = Math.sqrt(Math.max(0, (sumImgSq / count) - meanImg * meanImg))\n const denomMask = Math.sqrt(Math.max(0, (sumMaskSq / count) - meanMask * meanMask))\n\n if (denomImg < 1e-6 || denomMask < 1e-6) return 0\n return Math.max(0, numerator / (denomImg * denomMask))\n}\n\n/**\n * Validate that reverse alpha removal improved the watermark region without artifacts.\n *\n * @returns {{ valid: boolean, decisionTier: string, haloVisibility: number, residualNccRatio: number, nearBlackRatio: number }}\n */\nexport function validateRestoration(originalImageData, restoredImageData, position, alphaMap, preRemovalNcc) {\n const halo = assessAlphaBandHalo(originalImageData, position, alphaMap)\n const nearBlackRatio = calculateNearBlackRatio(restoredImageData, position)\n const postNcc = computeRegionNCC(restoredImageData.data, restoredImageData.width, position, alphaMap)\n const residualNccRatio = preRemovalNcc > 0 ? postNcc / preRemovalNcc : postNcc\n\n // Original must show watermark-like halo; restored region must not collapse to black.\n const haloOk = halo.bandCount >= 8 && halo.visibility >= MIN_HALO_VISIBILITY\n const residualOk = postNcc < 0.35 || residualNccRatio <= MAX_RESIDUAL_NCC_RATIO\n const noDarkHole = nearBlackRatio < 0.35\n\n const valid = haloOk && residualOk && noDarkHole\n\n return {\n valid,\n decisionTier: valid ? 'validated' : 'rejected',\n haloVisibility: halo.visibility,\n residualNccRatio,\n nearBlackRatio,\n }\n}\n", "/**\n * Gemini image watermark removal processor.\n *\n * Pipeline:\n * 1. Detect watermark tier (48 or 96) based on image dimensions\n * 2. Load corresponding alpha map\n * 3. NCC template matching to find exact watermark position in bottom-right region\n * 4. Apply reverse alpha blending to restore original pixels\n *\n * Works with raw ImageData \u2014 environment-agnostic (browser + Node.js).\n */\n\nimport { removeWatermark } from '../blendModes.js'\nimport { getGeminiWatermarkInfo, normalizeGeminiProfile } from './geminiConfig.js'\nimport { getGeminiAlphaMap } from './geminiAlphaMaps.js'\nimport { cloneImageData, validateRestoration } from './restorationMetrics.js'\n\nconst PROFILE_ORDER = ['current', 'legacy']\nconst DEFAULT_MAX_PASSES = 4\n\n/**\n * Compute Normalized Cross-Correlation between an image region and the alpha map.\n * Measures how well the brightness pattern matches the expected watermark shape.\n *\n * @param {Uint8ClampedArray} imgData - Image pixel data (RGBA)\n * @param {number} imgW - Image width\n * @param {number} x - Region top-left X\n * @param {number} y - Region top-left Y\n * @param {Float32Array} maskAlpha - Alpha map values\n * @param {number} maskW - Mask width\n * @param {number} maskH - Mask height\n * @param {number} step - Sampling step (1 = full, 2 = half resolution)\n * @returns {number} NCC score (0\u20131, higher = better match)\n */\nfunction computeNCC(imgData, imgW, x, y, maskAlpha, maskW, maskH, step) {\n let sumImg = 0, sumMask = 0\n let sumImgSq = 0, sumMaskSq = 0\n let sumProduct = 0\n let count = 0\n\n for (let my = 0; my < maskH; my += step) {\n for (let mx = 0; mx < maskW; mx += step) {\n const alpha = maskAlpha[my * maskW + mx]\n if (alpha < 0.01) continue\n\n const px = x + mx\n const py = y + my\n const idx = (py * imgW + px) * 4\n\n // Compute brightness (average of RGB)\n const brightness = (imgData[idx] + imgData[idx + 1] + imgData[idx + 2]) / 3\n\n // The watermark adds white overlay proportional to alpha,\n // so brighter-than-expected pixels correlate with higher alpha\n sumImg += brightness\n sumMask += alpha\n sumImgSq += brightness * brightness\n sumMaskSq += alpha * alpha\n sumProduct += brightness * alpha\n count++\n }\n }\n\n if (count < 10) return 0\n\n // NCC formula\n const meanImg = sumImg / count\n const meanMask = sumMask / count\n const numerator = (sumProduct / count) - (meanImg * meanMask)\n const denomImg = Math.sqrt(Math.max(0, (sumImgSq / count) - meanImg * meanImg))\n const denomMask = Math.sqrt(Math.max(0, (sumMaskSq / count) - meanMask * meanMask))\n\n if (denomImg < 1e-6 || denomMask < 1e-6) return 0\n\n return Math.max(0, numerator / (denomImg * denomMask))\n}\n\n/**\n * Find the exact watermark position using NCC template matching.\n * Searches in a constrained region around the expected bottom-right location.\n *\n * @param {ImageData} imageData - Full image data\n * @param {{ width: number, height: number, alpha: Float32Array }} mask - Alpha mask info\n * @param {{ x: number, y: number, width: number, height: number }} expectedPosition - Expected region\n * @returns {{ x: number, y: number, confidence: number }|null}\n */\nfunction findWatermarkPosition(imageData, mask, expectedPosition) {\n const { width: imgW, height: imgH, data: imgData } = imageData\n const { width: maskW, height: maskH, alpha: maskAlpha } = mask\n\n let bestX = 0, bestY = 0, bestScore = -1\n\n const expectedX = expectedPosition?.x ?? (imgW - maskW)\n const expectedY = expectedPosition?.y ?? (imgH - maskH)\n const searchRadius = Math.max(16, Math.round(maskW * 0.75))\n const searchStartX = Math.max(0, expectedX - searchRadius)\n const searchStartY = Math.max(0, expectedY - searchRadius)\n const searchMaxX = Math.min(imgW - maskW, expectedX + searchRadius)\n const searchMaxY = Math.min(imgH - maskH, expectedY + searchRadius)\n\n // Coarse search (step=2) to quickly find approximate location\n for (let y = searchStartY; y <= searchMaxY; y += 2) {\n for (let x = searchStartX; x <= searchMaxX; x += 2) {\n const score = computeNCC(imgData, imgW, x, y, maskAlpha, maskW, maskH, 2)\n if (score > bestScore) { bestScore = score; bestX = x; bestY = y }\n }\n }\n\n // Fine search (step=1) around the best coarse match\n const fineStartX = Math.max(0, bestX - 2)\n const fineStartY = Math.max(0, bestY - 2)\n const fineEndX = Math.min(searchMaxX, bestX + 2)\n const fineEndY = Math.min(searchMaxY, bestY + 2)\n\n for (let y = fineStartY; y <= fineEndY; y++) {\n for (let x = fineStartX; x <= fineEndX; x++) {\n const score = computeNCC(imgData, imgW, x, y, maskAlpha, maskW, maskH, 1)\n if (score > bestScore) { bestScore = score; bestX = x; bestY = y }\n }\n }\n\n // Require minimum confidence threshold\n return bestScore >= 0.5 ? { x: bestX, y: bestY, confidence: bestScore } : null\n}\n\nfunction getProfilesToTry(profile) {\n if (!profile || profile === 'auto') return PROFILE_ORDER\n return [normalizeGeminiProfile(profile)]\n}\n\nfunction emptyResult(imageData, reason, attemptedProfiles, profile = null, meta = {}) {\n return {\n imageData,\n processed: false,\n confidence: 0,\n position: null,\n reason,\n profile,\n attemptedProfiles,\n decisionTier: meta.decisionTier ?? null,\n meta: meta.validation ?? null,\n }\n}\n\nfunction normalizeAdaptiveMode(adaptiveMode) {\n if (!adaptiveMode || adaptiveMode === 'auto') return 'auto'\n if (adaptiveMode === 'off') return 'off'\n return 'auto'\n}\n\nfunction copyImageData(target, source) {\n target.data.set(source.data)\n}\n\nfunction processImageWithProfile(imageData, options, profile) {\n const { width, height } = imageData\n const {\n skipDetection = false,\n forcePosition,\n adaptiveMode = 'auto',\n } = options\n const useValidation = normalizeAdaptiveMode(adaptiveMode) === 'auto' && !skipDetection && !forcePosition\n\n const info = getGeminiWatermarkInfo(width, height, profile)\n if (!info) {\n return emptyResult(imageData, 'image_too_small', [profile], profile)\n }\n\n const alphaMapEntry = getGeminiAlphaMap(info.alphaMapKey)\n if (!alphaMapEntry) {\n return emptyResult(imageData, 'missing_alpha_map', [profile], profile)\n }\n\n let position\n let confidence = 1.0\n\n if (forcePosition) {\n // Use explicitly provided position (skip NCC matching)\n position = {\n x: forcePosition.x,\n y: forcePosition.y,\n width: info.size,\n height: info.size,\n }\n } else if (skipDetection) {\n // Use expected position without NCC verification\n position = info.position\n } else {\n // NCC template matching to find exact position\n const mask = {\n width: alphaMapEntry.width,\n height: alphaMapEntry.height,\n alpha: alphaMapEntry.data,\n }\n\n const match = findWatermarkPosition(imageData, mask, info.position)\n if (!match) {\n return emptyResult(imageData, 'watermark_not_detected', [profile], profile)\n }\n\n confidence = match.confidence\n position = {\n x: match.x,\n y: match.y,\n width: alphaMapEntry.width,\n height: alphaMapEntry.height,\n }\n }\n\n const workingCopy = cloneImageData(imageData)\n removeWatermark(workingCopy, alphaMapEntry.data, position)\n\n let decisionTier = skipDetection || forcePosition ? 'ncc_only' : 'ncc_only'\n let validationMeta = null\n\n if (useValidation) {\n const preRemovalNcc = computeNCC(\n imageData.data,\n width,\n position.x,\n position.y,\n alphaMapEntry.data,\n alphaMapEntry.width,\n alphaMapEntry.height,\n 2,\n )\n const validation = validateRestoration(\n imageData,\n workingCopy,\n position,\n alphaMapEntry.data,\n preRemovalNcc,\n )\n validationMeta = validation\n\n if (!validation.valid) {\n return emptyResult(\n imageData,\n 'restoration_rejected',\n [profile],\n profile,\n { decisionTier: validation.decisionTier, validation },\n )\n }\n decisionTier = validation.decisionTier\n }\n\n copyImageData(imageData, workingCopy)\n\n return {\n imageData,\n processed: true,\n confidence,\n position,\n profile,\n attemptedProfiles: [profile],\n decisionTier,\n meta: validationMeta,\n }\n}\n\n/**\n * Process a single image to remove the Gemini watermark.\n *\n * @param {ImageData} imageData - The watermarked image (mutated in place)\n * @param {{ skipDetection?: boolean, forcePosition?: { x: number, y: number }, profile?: 'auto'|'current'|'legacy'|'v1'|'v2' }} options\n * @returns {{ imageData: ImageData, processed: boolean, confidence: number, position: { x: number, y: number, width: number, height: number }|null, profile: string|null, attemptedProfiles: string[], reason?: string }}\n */\nexport function processImage(imageData, options = {}) {\n const profile = options.profile ?? 'auto'\n const profilesToTry = getProfilesToTry(profile)\n const maxPasses = Math.max(1, options.maxPasses ?? DEFAULT_MAX_PASSES)\n const attemptedProfiles = []\n let lastResult = null\n let passCount = 0\n\n for (const activeProfile of profilesToTry) {\n if (passCount >= maxPasses) break\n\n attemptedProfiles.push(activeProfile)\n passCount++\n const result = processImageWithProfile(imageData, options, activeProfile)\n result.attemptedProfiles = [...attemptedProfiles]\n\n if (result.processed) return result\n lastResult = result\n\n if (result.reason !== 'watermark_not_detected' && result.reason !== 'restoration_rejected') break\n }\n\n return {\n ...(lastResult || emptyResult(imageData, 'watermark_not_detected', attemptedProfiles)),\n attemptedProfiles,\n }\n}\n\n/**\n * Create a reusable image processor with cached config for a specific image size.\n * Useful when processing multiple images of the same dimensions.\n *\n * @param {number} [targetWidth] - Optional fixed width (auto-detect if omitted)\n * @param {number} [targetHeight] - Optional fixed height (auto-detect if omitted)\n * @returns {{ process(imageData: ImageData, options?: object): object }}\n */\nexport function createImageProcessor(targetWidth, targetHeight) {\n // If dimensions are pre-specified, cache the lookup\n const cachedByProfile = new Map()\n\n if (targetWidth && targetHeight) {\n for (const profile of PROFILE_ORDER) {\n const info = getGeminiWatermarkInfo(targetWidth, targetHeight, profile)\n if (info) {\n cachedByProfile.set(profile, {\n info,\n alphaMap: getGeminiAlphaMap(info.alphaMapKey),\n })\n }\n }\n }\n\n return {\n /**\n * Process an image to remove the Gemini watermark.\n * @param {ImageData} imageData\n * @param {{ skipDetection?: boolean, forcePosition?: { x: number, y: number }, profile?: 'auto'|'current'|'legacy'|'v1'|'v2' }} options\n */\n process(imageData, options = {}) {\n // Use cached config if dimensions match, otherwise dynamic lookup\n if (cachedByProfile.size > 0 && imageData.width === targetWidth && imageData.height === targetHeight) {\n const profilesToTry = getProfilesToTry(options.profile ?? 'auto')\n const attemptedProfiles = []\n let lastResult = null\n\n for (const profile of profilesToTry) {\n attemptedProfiles.push(profile)\n const cached = cachedByProfile.get(profile)\n\n if (!cached?.info) {\n lastResult = emptyResult(imageData, 'image_too_small', [...attemptedProfiles], profile)\n break\n }\n\n if (!cached.alphaMap) {\n lastResult = emptyResult(imageData, 'missing_alpha_map', [...attemptedProfiles], profile)\n break\n }\n\n const result = processImageWithProfile(imageData, options, profile)\n result.attemptedProfiles = [...attemptedProfiles]\n\n if (result.processed) return result\n lastResult = result\n\n if (result.reason !== 'watermark_not_detected' && result.reason !== 'restoration_rejected') break\n }\n\n return {\n ...(lastResult || emptyResult(imageData, 'watermark_not_detected', attemptedProfiles)),\n attemptedProfiles,\n }\n }\n\n // Fallback to full dynamic processing\n return processImage(imageData, options)\n },\n }\n}\n\nexport { findWatermarkPosition, computeNCC }\n", "/**\n * Browser SDK entry point.\n * Optimized for browser usage with WebCodecs priority.\n */\n\n// Veo video exports\nexport { removeWatermark } from '../core/blendModes.js'\nexport { processFrame, createFrameProcessor } from '../core/frameProcessor.js'\nexport {\n getVeoWatermarkInfo,\n detectVeoWatermarkConfig,\n calculateWatermarkPosition,\n normalizeVideoWatermarkProfile,\n GEMINI_DIAMOND_VIDEO_CATALOG,\n LEGACY_VEO_TEXT_CATALOG,\n VIDEO_WATERMARK_PROFILES,\n VEO_WATERMARK_CATALOG,\n} from '../core/veoConfig.js'\nexport { getEmbeddedAlphaMap, registerAlphaMap } from '../core/embeddedAlphaMaps.js'\nexport { processVideo } from '../video/pipeline.browser.js'\n\n// Gemini image exports\nexport { processImage, createImageProcessor } from '../core/gemini/imageProcessor.js'\nexport { getGeminiWatermarkInfo, GEMINI_WATERMARK_PROFILES } from '../core/gemini/geminiConfig.js'\nexport { getGeminiAlphaMap, registerGeminiAlphaMap } from '../core/gemini/geminiAlphaMaps.js'\n\n/**\n * Browser-specific helper: process a video File and return a downloadable Blob.\n *\n * @param {File} file - Video file from <input> or drag-drop\n * @param {{ onProgress?: (current: number, total: number) => void, videoProfile?: 'diamond'|'legacy' }} options\n * @returns {Promise<Blob>} Processed MP4 blob\n */\nexport async function processVideoFile(file, options = {}) {\n const { processVideo } = await import('../video/pipeline.browser.js')\n return processVideo(file, { environment: 'browser', ...options })\n}\n\n/**\n * Browser-specific helper: process a single image and return cleaned ImageData.\n */\nexport { processFrame as processImageFrame } from '../core/frameProcessor.js'\n\n/**\n * Browser-specific helper: remove Gemini watermark from an image File/Blob.\n * Handles Canvas decoding, processing, and re-encoding automatically.\n *\n * @param {File|Blob} file - Image file (PNG, JPEG, WebP, etc.)\n * @param {{ quality?: number, format?: string, skipDetection?: boolean, profile?: 'auto'|'current'|'legacy'|'v1'|'v2' }} options\n * @returns {Promise<{ blob: Blob, width: number, height: number, detected: boolean, confidence: number, status: string, profile?: string|null, attemptedProfiles?: string[] }>}\n */\nexport async function removeGeminiWatermark(file, options = {}) {\n const { quality = 0.95, format = 'image/png', skipDetection = false, profile = 'auto', adaptiveMode = 'auto', maxPasses = 4 } = options\n\n // Decode image file to ImageData via Canvas\n const bitmap = await createImageBitmap(file)\n const { width, height } = bitmap\n\n const canvas = new OffscreenCanvas(width, height)\n const ctx = canvas.getContext('2d')\n ctx.drawImage(bitmap, 0, 0)\n bitmap.close()\n\n const imageData = ctx.getImageData(0, 0, width, height)\n\n // Process the image\n const { processImage } = await import('../core/gemini/imageProcessor.js')\n const result = processImage(imageData, { skipDetection, profile, adaptiveMode, maxPasses })\n\n if (!result.processed) {\n return {\n blob: file instanceof Blob ? file : new Blob([file]),\n width,\n height,\n detected: false,\n confidence: 0,\n status: result.reason || 'not_processed',\n profile: result.profile,\n attemptedProfiles: result.attemptedProfiles,\n decisionTier: result.decisionTier ?? null,\n }\n }\n\n // Write processed pixels back to canvas and encode\n ctx.putImageData(result.imageData, 0, 0)\n const outputBlob = await canvas.convertToBlob({ type: format, quality })\n\n return {\n blob: outputBlob,\n width,\n height,\n detected: true,\n confidence: result.confidence,\n status: 'success',\n profile: result.profile,\n attemptedProfiles: result.attemptedProfiles,\n decisionTier: result.decisionTier ?? null,\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["processVideo", "processImage"]
7
+ }