91³Ô¹ÏÍø

Watch CBS News

To Do List: Ringing in the new year with winter and art events

BOSTON - We made it to 2024! How about ringing in the new year with a celebratory bonfire at a local farm, an open art studio and a farmers market?

NEW YEAR'S BONFIRE AT WEIR RIVER FARM

Warm up with some hot drinks and food by the fire at Weir River Farm in Hingham on Saturday. Enjoy a night under the stars to celebrate the new year and even bring your Christmas tree to toss into the bonfire. Just make sure to pre-register first online! The fun starts at 5 p.m.

When: Saturday Jan. 6 from 5 to 8 p.m.
Where: Weir River Farm, 140 Turkey Hill Lane, Hingham
Cost: Member adult $9, member child $6, non-member adult $15, non-member child $10. Children under 2 free

JANUARY OPEN ART STUDIOS

If art is part of your New Year's Resolution, an open art studio in Lowell might just be for you. With live artists, hands-on workshops, drinks and a food truck, it's the perfect way to embrace your creative side for 2024. Don't miss it on Saturday from 12 to 5 p.m.!

When: Saturday Jan. 6 from 12 to 5 p.m.
Where: Western Avenue Studios and Lofts, 150 Western Avenue, Lowell
Cost: Free

MAXWELL'S WINTER FARMERS MARKET

It's first Maxwell's Winter Farmers Market of 2024 on Saturday. Enjoy the day in Chelmsford before the snow arrives, shopping dozens of vendors in a heated greenhouse with fresh produce, pastries, winter wear, wine and more. If you can't make it this Saturday, stop by every Saturday through the end of February.

When: Saturdays in 2024 starting Jan. 6 through Feb. 24 from 10 a.m. to 1 p.m.
Where: 24 Maple Road, Chelmsford
Cost: Free

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });