1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7736],{40087:function(e,n,t){"use strict";t.d(n,{D:function(){return r},b:function(){return a}});var a=!0,r=function(e){return e}},44679:function(e,n,t){"use strict";t.r(n),t.d(n,{__N_SSP:function(){return h},default:function(){return p}});var a=t(2784),r=t(97729),o=t.n(r),i=t(40087),s=['window.HEROES_PHOTOS = {};\n[1,2,3,4,5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,26,29,31,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,52,53,54,63,66,68,71,72,73,74,75,76,80,84,102,103,150,151,152,153,154,155,159,163,164,165,166,167,168,170,171,173].forEach(function(id){\n window.HEROES_PHOTOS[id] = "/ms/memorial-day-2026/assets/heroes/" + id + ".webp";\n});\nif (window.injectHeroPhotos) window.injectHeroPhotos();\n','// =====================================================================\n// Memorial Wall \u2014 Visual Assets\n// =====================================================================\n// poppy: Buddy Poppy felt flower (pin removed) for honor wall interactions.\n// poppyWatercolor: soft watercolor poppies for share-card decoration.\n// =====================================================================\n\nwindow.MEMORIAL_ASSETS = {\n poppy: "/ms/memorial-day-2026/assets/poppy.webp",\n poppyWatercolor: "/ms/memorial-day-2026/assets/poppy-watercolor.webp",\n ogFallback: "https://staticfiles.particlenews.com/nwb/29120a7f9524.jpg"\n};\n\n','const HEROES = [\n {id:1,name:"Desmond T. Doss",birth:1919,death:2006,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Refused to carry a weapon on religious grounds, yet saved 75 wounded soldiers at Hacksaw Ridge, Okinawa \u2014 lowering them one by one over a cliff under heavy fire while praying \'Lord, help me get one more.\' The first conscientious objector to receive the Medal of Honor."},\n {id:2,name:"Audie Murphy",birth:1925,death:1971,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor + 32 Awards",story:"America\'s most decorated WWII soldier. Near Holtzwihr, France, at age 19 he mounted a burning tank destroyer and single-handedly held off 250 German soldiers and six tanks for an hour, then led a counterattack. Received 33 military decorations."},\n {id:3,name:"John Basilone",birth:1916,death:1945,conflict:"World War II",branch:"Marine Corps",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor + Navy Cross",story:"During the Battle of Guadalcanal, manned his machine gun for 3 days straight against relentless Japanese attacks. Refused a safe post stateside and returned to combat. Killed at Iwo Jima on February 19, 1945, age 28."},\n {id:4,name:"Hershel \'Woody\' Williams",birth:1923,death:2022,conflict:"World War II",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Spent four hours at Iwo Jima singlehandedly destroying seven enemy pillboxes with a flamethrower, covered by only four riflemen. His actions broke open the beachhead. The last living WWII Medal of Honor recipient, passing in 2022 at age 98."},\n {id:5,name:"James H. Doolittle",birth:1896,death:1993,conflict:"World War II",branch:"Army Air Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Led the daring 1942 Doolittle Raid \u2014 16 B-25 bombers launched from USS Hornet to bomb Tokyo just four months after Pearl Harbor, proving Japan was vulnerable and boosting American morale at its lowest point."},\n {id:6,name:"Rodger Young",birth:1918,death:1943,conflict:"World War II",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"On New Georgia Island, though nearly deaf, Young advanced alone against a Japanese machine gun nest to allow his platoon to withdraw. He was killed but saved his entire company. A famous WWII ballad was written in his honor."},\n {id:7,name:"Ira Hayes",birth:1923,death:1955,conflict:"World War II",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Presidential Unit Citation",story:"One of the six Marines who raised the flag on Iwo Jima in the iconic photograph. A Pima Native American who fought bravely through the Pacific campaign. His story inspired the song \'The Ballad of Ira Hayes.\'"},\n {id:8,name:"Daniel K. Inouye",birth:1924,death:2012,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Though shot in the stomach, Inouye attacked three machine gun nests single-handedly, losing his right arm to a grenade but continuing to fight. He later served as U.S. Senator from Hawaii for 50 years."},\n {id:9,name:"Sadao S. Munemori",birth:1922,death:1945,conflict:"World War II",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"A Japanese-American soldier whose family was interned in an internment camp while he died fighting for America. In Italy, Munemori knocked aside a grenade that landed among his squad, sacrificing his life for his comrades."},\n {id:10,name:"Gregory \'Pappy\' Boyington",birth:1912,death:1988,conflict:"World War II",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Commander of the legendary VMF-214 \'Black Sheep\' Squadron with 28 aerial victories \u2014 top Marine ace of WWII. After being shot down over the Pacific, he survived 20 months as a Japanese POW."},\n {id:11,name:"Theodore Roosevelt Jr.",birth:1887,death:1944,conflict:"World War II",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"The oldest man and only general to land in the D-Day first wave. At 56, walking with a cane, he led troops inland under intense fire \u2014 his presence inspiring men at a critical moment. He died of a heart attack a month later, never learning he had been recommended for the Medal of Honor."},\n {id:12,name:"Howard W. Gilmore",birth:1902,death:1943,conflict:"World War II",branch:"Navy",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Commander of USS Growler, badl
1y wounded in a surface fight and knowing he couldn\'t quickly get below deck, Gilmore gave his last order: \'Take her down.\' His sacrifice saved his submarine and crew. The ship submerged \u2014 and Gilmore went with it."},\n {id:13,name:"Maynard H. Smith",birth:1911,death:1984,conflict:"World War II",branch:"Army Air Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"On his first combat mission, Smith\'s B-17 caught fire from flak and fighters. He manned both waist guns, administered first aid to the wounded, and fought the fire alone for 90 minutes before landing safely \u2014 the first airman to receive the Medal of Honor in WWII."},\n {id:14,name:"Vernon J. Baker",birth:1919,death:2010,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"One of seven Black WWII soldiers to receive the Medal of Honor in 1997 after a review found racial discrimination had denied them the award. Baker single-handedly destroyed 12 enemy positions in Italy. He was 98 when he died."},\n {id:15,name:"Matt Urban",birth:1919,death:1995,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Known as \'The Ghost,\' Urban earned the Medal of Honor for actions over 40 consecutive days in battle. Wounded seven times, he repeatedly returned to combat rather than accept evacuation. Time magazine called him the most decorated soldier of WWII."},\n {id:16,name:"Roy P. Benavidez",birth:1935,death:1998,conflict:"Vietnam War",branch:"Army Special Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"On May 2, 1968, off-duty Benavidez jumped on a helicopter to rescue a 12-man patrol surrounded by 1,000 enemy soldiers. Despite being shot, stabbed, and clubbed, he made six trips through enemy fire, saved 8 men, and collected classified documents over 6 hours."},\n {id:17,name:"Roger H.C. Donlon",birth:1934,death:2024,conflict:"Vietnam War",branch:"Army Special Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"The first Medal of Honor recipient of the Vietnam War. Wounded four times during a Viet Cong attack on Camp Nam Dong, Donlon continued to organize the defense, carry wounded men to safety, and personally attack enemy positions throughout the 5-hour battle."},\n {id:18,name:"Lance P. Sijan",birth:1942,death:1968,conflict:"Vietnam War",branch:"Air Force",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Shot down over Laos, Sijan survived 46 days in the jungle before capture, evading search parties and refusing to be improperly rescued. As a severely wounded POW, he attempted multiple escapes. He died in captivity but never provided information to the enemy."},\n {id:19,name:"Leo K. Thorsness",birth:1932,death:2017,conflict:"Vietnam War",branch:"Air Force",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"In a Wild Weasel jet, Thorsness destroyed two SAM missile sites and orbited alone for 20 minutes protecting a downed crew against enemy MiGs. Shot down weeks later, he survived six years as a POW."},\n {id:20,name:"George E. \'Bud\' Day",birth:1925,death:2013,conflict:"Vietnam War",branch:"Air Force",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Shot down over North Vietnam, Day escaped captivity and survived alone in enemy territory for weeks despite serious wounds before recapture. As a POW for 5+ years, he endured torture but never broke. The most decorated American military officer since Douglas MacArthur."},\n {id:21,name:"James Stockdale",birth:1923,death:2005,conflict:"Vietnam War",branch:"Navy",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"The senior American POW in Vietnam, Stockdale secretly led resistance against his captors for 7 years. He deliberately wounded himself to prevent use in propaganda. He inspired his fellow prisoners to resist despite brutal torture."},\n {id:22,name:"Robert L. Howard",birth:1939,death:2009,conflict:"Vietnam War",branch:"Army Special Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Nominated three times for the Medal of Honor, Howard finally received it for actions in Laos. He led secret missions behind enemy lines, earning eight Purple Hearts and becoming one of the most decorated soldiers of the Vietnam War."},\n {id:23,name:"Milton L. Olive III",birth:1946,death:1965,conflict:"Vietnam War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"The first African American to die in Vietnam earning the Medal of Honor. When a grenade landed among his platoon, Olive threw himself on it, giving his life to save four comrades. He was 18 years old. A Chicago park bears his name."},\n {id:24,name:"James Anderson Jr.",birth:1947,death:1967,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"The first Black Marine to receive the Medal of Honor in Vietnam. When a grenade landed among his squad, Anders
1on grabbed it and pulled it to his chest, sacrificing himself to save the Marines around him. He was 20 years old."},\n {id:26,name:"Humbert R. \'Rocky\' Versace",birth:1937,death:1965,conflict:"Vietnam War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Captured by the Viet Cong, Versace refused to cooperate with his captors despite two years of brutal torture. He was executed in 1965. His former fellow POWs described him as the most courageous man they ever knew."},\n {id:27,name:"Thomas W. Bennett",birth:1947,death:1969,conflict:"Vietnam War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"A conscientious objector who served as an unarmed medic. In the Central Highlands, he repeatedly braved enemy fire to treat wounded soldiers over three days of intense combat, giving his life attempting to reach a fallen comrade."},\n {id:29,name:"Joe M. Jackson",birth:1923,death:2019,conflict:"Vietnam War",branch:"Air Force",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Flew a C-123 into the overrun Special Forces camp at Kham Duc under intense enemy fire to rescue three trapped soldiers \u2014 a mission considered suicidal. The runway was blocked, but Jackson landed anyway, retrieved the men, and took off under fire."},\n {id:31,name:"Larry L. Taylor",birth:1942,death:2024,conflict:"Vietnam War",branch:"Army Aviation",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Flying a Cobra gunship with no ammunition left, Taylor flew low over an ambushed LRRP team to bluff the enemy and allow extraction. He made multiple low passes without weapons, drawing enemy fire onto himself. His Medal of Honor was awarded 55 years later."},\n {id:35,name:"Edward Kaneshiro",birth:1929,death:1966,conflict:"Vietnam War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Kaneshiro single-handedly entered an enemy-occupied trench, destroyed three enemy groups with grenades and rifle fire, and cleared the way for his company \u2014 giving his life so his comrades could successfully withdraw."},\n {id:36,name:"Lewis \'Chesty\' Puller",birth:1898,death:1971,conflict:"Korean War",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Navy Cross (5x)",story:"The most decorated Marine in U.S. history, earning 5 Navy Crosses. At Chosin Reservoir, his regiment fought through 10 Chinese divisions in brutal cold, famously declaring: \'We\'re surrounded. Good. Now we can attack in any direction.\'"},\n {id:37,name:"Duane E. Dewey",birth:1931,death:2016,conflict:"Korean War",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"When a grenade landed near a wounded officer, Dewey threw himself on it, absorbing the blast with his body. He survived and was awarded the Medal of Honor. He later said he never considered himself a hero \u2014 just a Marine protecting his comrades."},\n {id:38,name:"William E. Barber",birth:1919,death:2002,conflict:"Korean War",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"For five days and nights at Toktong Pass during the Chosin breakout, Barber\'s Fox Company \u2014 despite his own wound \u2014 held a critical mountain pass against repeated attacks by a Chinese regiment, enabling the 1st Marine Division to escape encirclement."},\n {id:39,name:"William F. Dean",birth:1899,death:1981,conflict:"Korean War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"During the fall of Taejon, General Dean personally led tank-hunting teams on foot with bazooka and grenades. Captured after being separated from his unit, he spent three years as a POW \u2014 the highest-ranking American POW of the Korean War."},\n {id:40,name:"Ola L. Mize",birth:1931,death:2014,conflict:"Korean War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"During a massive Chinese assault, Mize personally repelled seven enemy attacks over 12 hours. When his position was overrun he fought in hand-to-hand combat, killing many assailants. He was finally evacuated only after the position was fully secured."},\n {id:41,name:"Mitchell Red Cloud Jr.",birth:1925,death:1950,conflict:"Korean War",branch:"Marine Corps",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"A Ho-Chunk Nation warrior and WWII veteran, Red Cloud spotted the Chinese attack and shouted a warning before engaging the enemy alone. Mortally wounded, he had himself tied to a tree to continue firing so his comrades could escape. He died at his post."},\n {id:42,name:"Cornelius H. Charlton",birth:1929,death:1951,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"When his platoon leader was wounded, Charlton took command and led two charges up a heavily defended Korean hill, suffering wounds each time but pressing forward. On his third attempt, he killed the crew of the last enemy position before dying from his wounds. He was 21."},\n {id:43,name:"Alvin C. York",birth:1887,death:1964,conflict:"World War I",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"In the Argonne Forest, York killed 28 German soldiers and captured 132 prisoners \u2014 largely alone. A deeply religious man who sought a religious exemption from service, he became America\'s most celebrated WWI hero. Gary Cooper won an Oscar portraying him."},\n {id:44,name:"Frank Luke Jr.",birth:1897,death:1918,conflict:"World War I",branch:"Army Air Service",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Known as the \'Arizona Balloon Buster,\' Luke destroyed 18 enemy balloons and 4 aircraft in just 17 days. Shot down behind enemy lines, he fought off German soldiers with a pistol until he died from his wounds. He was 21 years old."},\n {id:45,name:"Henry Johnson",birth:1887,death:1929,conflict:"World War I",branch:"Army (369th Infantry)",category:"served",tags:["Honored Service"],medal:"Medal of Honor (posthumous 2015)",story:"Fighting with the \'Harlem Hellfighters\' under French command, Johnson single-handedly fought off a 20-man German raiding party to protect a wounded comrade, using only his knife after running out of ammunition. France honored him immediately; America waited 86 years."}
1,\n {id:46,name:"Eddie Rickenbacker",birth:1890,death:1973,conflict:"World War I",branch:"Army Air Service",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"America\'s top WWI flying ace with 26 aerial victories. Later survived 24 days on a raft in the Pacific during WWII. One of the most celebrated American military aviators in history."},\n {id:47,name:"Paul R. Smith",birth:1969,death:2003,conflict:"Iraq",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"On April 4, 2003, when his position was overrun, Smith manned an exposed .50-caliber machine gun until fatally wounded, single-handedly holding off the enemy and saving over 100 soldiers. The first Medal of Honor recipient of Operation Iraqi Freedom."},\n {id:48,name:"Jason L. Dunham",birth:1981,death:2004,conflict:"Iraq",branch:"Marine Corps",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Near Karabilah, Iraq, Dunham saw an insurgent drop a grenade and threw himself on it, using his helmet and body to absorb the blast and save two fellow Marines. He died 8 days later at age 22."},\n {id:49,name:"Ross A. McGinnis",birth:1987,death:2006,conflict:"Iraq",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"At 19, McGinnis used his body to block a grenade thrown into his Humvee gunner\'s hatch, saving four soldiers inside. He could have escaped \u2014 he chose to stay. \'He didn\'t even think twice,\' said a fellow soldier."},\n {id:50,name:"Petty Officer 2nd Class Michael A. Monsoor",birth:1981,death:2006,conflict:"Iraq",branch:"Navy SEAL",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"A grenade was thrown onto the rooftop where Monsoor and two SEALs were positioned. Though he could have escaped, he threw himself on it to shield his teammates. He died 30 minutes later. The USS Michael Monsoor aircraft carrier bears his name."},\n {id:52,name:"Travis W. Atkins",birth:1978,death:2007,conflict:"Iraq",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Near Abu Sarnak, Atkins grappled with a suicide bomber who detonated his vest. By restraining the bomber, he absorbed the blast with his own body, saving the three soldiers in his team. His Medal of Honor was awarded posthumously 12 years later in 2019."},\n {id:53,name:"Alwyn C. Cashe",birth:1971,death:2005,conflict:"Iraq",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"When his vehicle hit an IED and caught fire, Cashe \u2014 soaked in fuel himself \u2014 pulled six soldiers from the burning wreck. He sustained burns over 72% of his body and died 35 days later. His Medal of Honor was awarded posthumously in 2021, 16 years after his death."},\n {id:54,name:"Michael P. Murphy",birth:1976,death:2005,conflict:"Afghanistan",branch:"Navy SEAL",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"During Operation Red Wings, Murphy moved into open terrain under fire to get a signal and call for help for his surrounded team. Shot multiple times, he completed the distress call. The first Navy SEAL to receive the Medal of Honor since Vietnam."},\n {id:61,name:"John A. Chapman",birth:1965,death:2002,conflict:"Afghanistan",branch:"Air Force",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"During the rescue of a downed Navy SEAL on Takur Ghar mountain, Chapman was shot and left for dead. Drone footage later revealed he survived, rose alone, and continued fighting \u2014 killing multiple enemies and drawing fire away from the helicopter \u2014 before dying from wounds."},\n {id:62,name:"Robert J. Miller",birth:1983,death:2008,conflict:"Afghanistan",branch:"Army Special Forces",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Leading a patrol ambushed by 100+ insurgents, Miller charged toward the enemy to draw fire away from his squad. He engaged multiple gunmen before falling. His one-man assault allowed his entire 22-man squad to escape. He was 24."},\n {id:63,name:"Jared C. Monti",birth:1975,death:2006,conflict:"Afghanistan",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Under heavy fire, Monti made three attempts to reach a wounded soldier in open terrain. On the third attempt, he was killed by a rocket-propelled grenade. He sacrificed his life trying to save another."},\n {id:66,name:"Ronald J. Shurer II",birth:1980,death:2020,conflict:"Afghanistan",branch:"Army Special Forces",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"The combat medic of the Battle of Shok Valley, Shurer treated four wounded soldiers under fire, helped organize extraction up a sheer cliff, and continued to serve despite being diagnosed with cancer. He died in 2020."},\n {id:68,name:"Christopher A. Celiz",birth:1987,death:2018,conflict:"Afghanistan",branch:"Army Ranger",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"When a helicopter evacuating a critically wounded Ranger came under fire, Celiz stood on the aircraft\'s skid to return fire protecting the crew and patient. He was hit and fell \u2014 sacrificing his life so his wounded comrade could survive."},\n {id:71,name:"Randall D. Shughart",birth:1958,death:1993,conflict:"Somalia (Mogadishu)",branch:"Army Delta Force",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"During the Battle of Mogadishu, Shughart and Gary Gordon voluntarily inserted into a crash site to protect a downed helicopter pilot. Vastly outnumbered, both were killed but their actions saved Chief Warrant Officer Durant\'s life. Depicted in \'Black Hawk Down.\'"},\n {id:72,name:"Gary I. Gordon",birth:1960,death:1993,conflict:"Somalia (Mogadishu)",branch:"Army Delta Force",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Gordon and Shughart voluntarily requested permission multiple times to protect a downed crew in Mogadishu, knowing they would be vastly outnumbered. Both died protecting the surviving pilot, who lived. Their sacrifice is honored by special operators worldwide."},\n {id:73,name:"Douglas MacArthur",birth:1880,death:1964,conflict:"WWII / Korea",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"One of only a handful to re
1ceive both the Medal of Honor and 5-star rank. Led Allied forces across the Pacific, oversaw Japan\'s occupation, and commanded UN forces at the start of the Korean War. His \'I shall return\' promise was kept at Leyte Gulf."},\n {id:74,name:"Chester W. Nimitz",birth:1885,death:1966,conflict:"World War II",branch:"Navy",category:"served",tags:["Honored Service"],medal:"Navy Distinguished Service Medal x3",story:"Commander in Chief of the Pacific Fleet after Pearl Harbor, Nimitz orchestrated every major naval campaign of the Pacific War, from Midway to the Japanese surrender ceremony. His leadership was central to America\'s ultimate victory."},\n {id:75,name:"Carlton W. Barrett",birth:1919,death:1986,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"On D-Day at Omaha Beach, under heavy fire Barrett made five trips between the beaches and landing crafts, carrying wounded soldiers to safety, and assisted two officers ashore. His extraordinary bravery under the deadliest fire of D-Day earned him the Medal of Honor."},\n {id:76,name:"Roderick W. Edmonds",birth:1919,death:1985,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor (posthumous 2026)",story:"As senior U.S. NCO in a German POW camp, when ordered to i
1dentify Jewish American prisoners, Edmonds ordered all 1,275 American POWs to step forward as Jews. When the German commander threatened to shoot him, Edmonds replied: \'Then you will have to shoot all of us.\'"},\n {id:80,name:"Tibor Rubin",birth:1929,death:2015,conflict:"Korean War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"A Holocaust survivor who volunteered for the U.S. Army to repay America for liberating him. In Korea, he held a hilltop alone for 24 hours to enable his unit to retreat. As a POW, he stole food from enemy warehouses to keep fellow prisoners alive."},\n {id:84,name:"Ernest Evans",birth:1908,death:1944,conflict:"World War II",branch:"Navy",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"At the Battle off Samar, Evans led his destroyer Johnston in a suicidal charge against a Japanese fleet that included battleships and cruisers, buying time for the escort carriers to escape. Johnston was sunk but Evans\' sacrifice helped win the Battle of Leyte Gulf."},\n {id:102,name:"Jose M. Lopez",birth:1929,death:2005,conflict:"Korean War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"During a massive Chinese attack in the Soyang River area, Lopez single-handedly held his position for hours, killing scores of enemy soldiers. When ordered to withdraw, he carried his heavy machine gun with him rather than abandon it to the enemy."},\n {id:103,name:"Emory L. Bennett",birth:1929,death:1951,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"When Chinese forces overran his position and a grenade landed among his men, Bennett threw himself on it, dying instantly but saving his entire squad. He was 22 years old."},\n {id:150,name:"Van T. Barfoot",birth:1919,death:2012,conflict:"World War II",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Near Carano, Italy, Barfoot single-handedly destroyed two German machine gun nests and captured 17 prisoners. Later that day he destroyed a tank with a bazooka and carried two wounded men to safety over 1,700 yards of terrain. A Choctaw citizen."},\n {id:151,name:"Herbert K. Pililaau",birth:1928,death:1951,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"When his platoon was overrun on Heartbreak Ridge, Pililaau, out of ammunition, used his trench knife and bare fists against waves of enemy attackers before being killed. His actions allowed his unit to withdraw. The first native Hawaiian to receive the Medal of Honor."},\n {id:152,name:"Joe R. Hastings",birth:1924,death:1945,conflict:"World War II",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"At Drabenderhoehe, Germany, Hastings advanced alone with a machine gun to destroy multiple enemy positions, killing or capturing all opposition. He was killed in action a month later. Posthumously awarded the Medal of Honor at age 20."},\n {id:153,name:"Joe P. Martinez",birth:1920,death:1943,conflict:"World War II",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"During the Battle of Attu in the Aleutian Islands, Martinez led his platoon up a frozen pass under heavy Japanese fire, destroying multiple enemy positions before being mortally wounded. The first Hispanic American MoH recipient of WWII."},\n {id:154,name:"Jack Lucas",birth:1928,death:2008,conflict:"World War II",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"At Iwo Jima, 17-year-old Lucas threw himself on two grenades to save four fellow Marines - one exploded beneath him. He survived with massive wounds and became the youngest Marine to receive the Medal of Honor."},\n {id:155,name:"David H. Hackworth",birth:1930,death:2005,conflict:"Korea / Vietnam",branch:"Army",category:"served",tags:["Honored Service"],medal:"Distinguished Service Cross (x2)",story:"One of the most decorated American soldiers, Hackworth earned two Distinguished Service Crosses, ten Silver Stars, and eight Purple Hearts across two wars. He later became a prominent critic of military leadership failures."},\n {id:156,name:"Charles Q. Williams",birth:1933,death:1982,conflict:"Vietnam War",branch:"Army Special Forces",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Though wounded four times during a Viet Cong attack on Dong Xoai, Williams organized the defense of his Special Forces camp, destroyed an enemy machine gun with a recoilless rifle, and guided a rescue helicopter in. His actions saved the base."},\n {id:159,name:"Joe R. Baldonado",birth:1930,death:1950,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"On Hill 171 in Korea, Baldonado manned a machine gun in the open against a wave of Chinese attackers, breaking their assault before being killed by a grenade. His MoH was awarded 63 years later, in 2014, after a review for racial discrimination."},\n {id:160,name:"Eduardo C. Gomez",birth:1921,death:1973,conflict:"Korean War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Near Tabu-dong, Gomez crawled across open terrain to an enemy tank, climbed onto it, pried open the hatch and dropped in a grenade, destroying it. He continued fighting despite wounds. MoH awarded posthumously in 2014."},\n {id:163,name:"Stephen Bennett",birth:1946,death:1972,conflict:"Vietnam War",branch:"Air Force",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"As observer in an OV-10, Bennett made low passes through ground fire to protect a South Vietnamese platoon. When his aircraft was hit, he refused to bail out because his pilot could not and died when the plane crashed in the sea."},\n {id:164,name:"John J. McGinty III",birth:1940,death:2014,conflict:"Vietnam War",branch:"Marine Corps",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"With his platoon pinned down by a larger NVA force, McGinty, though shot through both eyes and wounded severely, continued directing his men until reinfor
1cements arrived. He killed 5 NVA soldiers at close range with a pistol."},\n {id:165,name:"Larry E. Smedley",birth:1949,death:1967,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Near Phu Loc, Smedley single-handedly attacked an NVA mortar position, and though wounded severely, continued to advance until killed. His actions saved his squad. He was 18 years old."},\n {id:166,name:"Carlos J. Lozada",birth:1946,death:1967,conflict:"Vietnam War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"In Dak To, Lozada manned a machine gun against massed enemy attacks, firing until fatally wounded. His stand enabled his company to withdraw. He was 21. Born in Puerto Rico."},\n {id:167,name:"Kenneth E. Stumpf",birth:1944,death:2022,conflict:"Vietnam War",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Near Duc Pho, Stumpf repeatedly exposed himself to enemy fire to rescue three wounded soldiers, then single-handedly destroyed three enemy bunkers with grenades. A living MoH recipient."},\n {id:168,name:"William Thompson",birth:1927,death:1950,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Near Haman, Korea, Thompson volunteered to cover his unit withdrawal with his machine gun. Though wounded repeatedly and urged to retreat, he kept firing until killed. The first African American MoH recipient of the Korean War."},\n {id:169,name:"William F. Lyell",birth:1930,death:1951,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Near Chup\'a-ri, Lyell assaulted three enemy positions with a BAR, destroying machine guns and killing many enemies. He was mortally wounded clearing the final position. He was 20 years old."},\n {id:170,name:"William F. Halsey",birth:1882,death:1959,conflict:"World War II",branch:"Navy",category:"served",tags:["Honored Service"],medal:"Navy Cross (3x)",story:"Commander of the Third Fleet in the Pacific War and one of four Fleet Admirals. Halsey led aggressive carrier operations against Japan including the Doolittle Raid escort and the Battle of Leyte Gulf, one of the largest naval battles in history."},\n {id:171,name:"John Cromwell",birth:1901,death:1943,conflict:"World War II",branch:"Navy",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Aboard submarine USS Sculpin, Cromwell possessed top-secret knowledge of the planned Gilbert Islands invasion. When Sculpin was fatally damaged, he chose to go down with the ship rather than risk capture and torture that might compromise the mission."},\n {id:172,name:"Joseph B. Kahoohanohano",birth:1930,death:1951,conflict:"Korean War",branch:"Army",category:"fallen",tags:["Medal of Honor"],medal:"Medal of Honor",story:"Ordering his squad to withdraw, Kahoohanohano stayed behind with his machine gun, fighting hand-to-hand when his ammunition ran out. He killed 11 enemies before being killed. A native Hawaiian. MoH awarded 2011."},\n {id:173,name:"Samuel Woodfill",birth:1883,death:1951,conflict:"World War I",branch:"Army",category:"served",tags:["Honored Service"],medal:"Medal of Honor",story:"Called by General Pershing the most outstanding American soldier of World War I. Near Cunel, France, Woodfill single-handedly silenced multiple machine gun nests, killing their crews with a pistol and pickaxe after running out of ammunition."},\n // \u2500\u2500 Community tributes (approved UGC from the "Remember a hero" form) \u2500\u2500\n // ugc:true + serviceStart/serviceEnd (not birth/death). Photo path falls back to\n // initials avatar until the submitted photo is saved at that assets path.\n {id:1001,name:"Lawrence Fraysher",serviceStart:1943,serviceEnd:1945,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],hook:"He served in the Army infantry in World War II",story:"This is for my dad. He served in the Army infantry in World War II. He developed scarlet fever during his tour of duty. He recovered."},\n {id:1002,name:"Thomas Robert Dosey",conflict:"Vietnam War",branch:"Air Force",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],photo:"/ms/memorial
1-day-2026/assets/heroes/1002.jpg",story:"Vietnam vet."},\n {id:1003,name:"Anthony M Benware",serviceStart:1970,serviceEnd:1974,conflict:"Vietnam War",branch:"Navy",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"Served 4 years he served in the Navy on a destroyer 200 feet off shore. Was fired upon and had to launch boats into the brown rivers into Vietnam."},\n {id:1004,name:"Robert Raymond Baier",serviceStart:1941,serviceEnd:1945,conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1004.jpg",story:"My dad was a very proud Veteran. He loved serving our country."},\n {id:1005,name:"Joel Sanchez",conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"Proud Marine."},\n {id:1006,name:"Arthur Burton Christofferson",serviceStart:1941,serviceEnd:1944,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"He was a Sherman tank operator in WWII."},\n {id:1007,name:"Forrester Lee Durbin",conflict:"Vietnam War",conflicts:["World War II","Korean War","Vietnam War"],branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Purple Heart","Bronze Star"],photo:"/ms/memorial-day-2026/assets/heroes/1007.jpg",story:"He served in WWII, Korean War and the Vietnam War. He received a Purple Heart in Vietnam and a Bronze Star in the Korean War."},\n {id:1008,name:"Phillip W. Badali",serviceStart:1942,serviceEnd:1945,conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"Served at Pearl Harbor during the bombing. He was a medic on the Arizona. He was shot in left shoulder. He was a hero!"},\n {id:1009,name:"Michael Taboni & Anna Taboni",initials:"M&A",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:22,tags:["Honored Service"],story:"Michael Taboni served in World War II and Anna Taboni put together planes in the United States."},\n {id:1010,name:"Tommy Schuyler",conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Purple Heart"],story:"3-time Purple Heart recipient."},\n {id:1011,name:"George Campbell",serviceStart:1941,serviceEnd:1945,conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"Served on the USS Missouri during World War II."},\n {id:1012,name:"SFC (Ret.) Frizell Mechanic Means",initials:"FM",conflict:"Korean War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"He served a tour in the Army during the Korean War. He went on to serve in the Army for 36.5 years."},\n {id:1013,name:"Wilbur C Raymond (Hank)",initials:"WR",serviceStart:1947,serviceEnd:1969,conflict:"Vietnam War",branch:"Air Force",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"My father served in the Army Air Corps and then in the United States Air Force; he was with AFTAC."},\n {id:1014,name:"Glenn Sorensen",conflict:"World War II",branch:"Air Force",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"My uncle, that I love dearly, served in World War II as a fighter pilot; he was shot down twice."},\n {id:1015,name:"George Little",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"My uncle who lived in Seattle, Washington."},\n {id:1016,name:"Richard Alan McCartney",serviceStart:1962,serviceEnd:1986,conflict:"Vietnam War",branch:"Navy",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1016.jpg",story:"CWO3 served in the Navy from 1962 to 1986."},\n {id:1017,name:"Sgt. Robert L. Stein",serviceStart:1950,serviceEnd:1971,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Purple Heart"],story:"Retired, 21 years of service in the Army. 2 Vietnam tours, 1 Purple Heart."},\n {id:1018,name:"William Allen Coles",conflict:"GWOT (Iraq / Afghanistan)",branch:"Air Force",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"He was my father, served 22 and a half years for his country, retired a Technical Sergeant. I\'m very proud of my father and miss him dearly."},\n {id:1019,name:"Victor Manuel Flores",conflict:"Peacetime Service",branch:"Marine Corps",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"A loving son, brother and father."},\n {id:1020,name:"Alvin Bryant Coles",conflict:"GWOT (Iraq / Afghanistan)",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"This is my dedication to my brother who served two tours; he was dedicated until his honorable discharge. I salute my brother for serving his country."},\n {id:1021,name:"Charles Lanham",conflict:"Gulf War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"Marines."},\n {id:1022,name:"Robert Dunn",conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:21,tags:["Honored Service"],story:"Robert was 18 when he joined the Army. He was killed in action shortly after he arrived in Vietnam. He had lost his own family in a hurricane disaster."},\n {id:1023,name:"Al Trachsel",conflict:"Korean War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"Korean War."},\n {id:1024,name:"Elvin V. Potts",serviceStart:1942,serviceEnd:1946,conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:22,tags:["Honored Service"],story:"My father served in the Navy during World War II. He was stationed in Hawaii after the bombing that the Japanese did at Pearl Harbor."},\n {id:1025,name:"Everett Sam Martin",serviceStart:1953,serviceEnd:1970,conflict:"Vietnam War",conflicts:["Korean War","Vietnam War"],branch:"Navy",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"Korea, Vietnam."},\n {id:1026,name:"Rafael Alvarez Jr.",serviceStart:1969,serviceEnd:1972,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Purple Heart"],story:"Rafael served in Vietnam from 1969-1972. Came home with a Purple Heart."},\n {id:1027,name:"David Macklin",conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"He served several tours in the military. He was a victim of Agent Orange and suffered much during his end. He never regretted serving his country."},\n {id:1028,name:"Winfried Bernard Arens",conflict:"World War II",conflicts:["World War I","World War II"],branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"Served in WWI and WWII. Army Artillery. Fort Kamehameha, Hawaii. Head of security at the 1st meeting of the League of Nations in San Francisco. Retired Colonel."},\n {id:1029,name:"Stephan Lee Mace",conflict:"Afghanistan",branch:"Army",category:"fallen",ugc:true,baseTributes:23,tags:["Honored Service"],photo:"/ms/memorial
1-day-2026/assets/heroes/1029.jpg",story:"Stephan Mace, 21, of Lovettsville, Va.; assigned to the 3rd Squadron, 61st Cavalry Regiment. Killed at FOB Bostick, Afghanistan. Rest easy brother."},\n {id:1030,name:"Walter Davis",conflict:"Korean War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"He served during the Korean War and returned home to face the same America he left to serve. He faced racism head on and lived proudly as a Black man."},\n {id:1031,name:"Kenneth Loyal Bartow aka Hook",initials:"KB",conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:22,tags:["Honored Service"],story:"My dad served in Vietnam. He was a great man and father, he was my hero. He sadly took his life Oct 5th, 2000. I will forever miss him."},\n {id:1032,name:"Lynn Rhea",serviceStart:1969,serviceEnd:1971,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"A cousin who fought in Vietnam and suffered with Agent Orange. A great guy, so many memories."},\n {id:1033,name:"Joseph Bailey",serviceStart:1967,serviceEnd:1968,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:21,tags:["Honored Service"],story:"Served in Vietnam and died in 1968."},\n {id:1034,name:"Brian Michael Waugh",serviceStart:2007,serviceEnd:2016,conflict:"Afghanistan",branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"He served two tours in Afghanistan. He was a highly decorated Sniper and a Ranger. He was loved by everyone who knew him and will never be forgotten."},\n {id:1035,name:"George W. Koneman",conflict:"Gulf War",branch:"Navy",category:"served",ugc:true,baseTributes:20,tags:["Honored Service"],story:"He is a father of 2, grandfather of 3 and great-grandfather of 4. He served in Desert Shield/Desert Storm, a veteran who proudly served his country."},\n {id:1036,name:"Jayjuan R.Crowder",initials:"JC",conflict:"Peacetime Service",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"He served and went on to help establish a directory for Veterans in need of help. Sadly he passed on 6-16-23."},\n {id:1037,name:"John Spurlock",conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:20,tags:["Honored Service"],story:"He died in Vietnam."},\n {id:1038,name:"Javier E. Ledesma",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],story:"He served in World War II and fought in the Battle of the Bulge. He was in the 35th Infantry Division."},\n {id:1039,name:"Lt Roger Innes",initials:"RI",serviceStart:1967,serviceEnd:1967,conflict:"Vietnam War",branch:"Navy",category:"fallen",ugc:true,baseTributes:22,tags:["Honored Service"],story:"First assignment and crashed in the sea off Vietnam. Listed as MIA, and twenty years later his plane, copilot and he were found. Laid to rest in the USA."},\n {id:1040,name:"Thomas Riley",serviceStart:1970,serviceEnd:1973,conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:22,tags:["Honored Service"],story:"He served as a helicopter pilot in Vietnam, but Agent Orange got him."},\n {id:1041,name:"Darryl Weakley",conflict:"Gulf War",branch:"Navy",category:"served",ugc:true,baseTributes:22,tags:["Honored Service"],story:"He served 20 years."},\n {id:1042,name:"John H Carson",serviceStart:1966,serviceEnd:1968,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:20,tags:["Honored Service"],story:"He graduated from Jefferson High School in San Antonio, Texas, married his high school sweetheart, then chose to enter the US Marine Corps."},\n {id:1043,name:"Jack R Volk",serviceStart:1956,serviceEnd:1977,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"He served 21 years. He also served in the Vietnam War. He passed away at age 59 due to Agent Orange related illnesses."},\n {id:1044,name:"Louis Geltzer",conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:22,tags:["Honored Service"],story:"He served honorably in the United States Navy on the USS Langley during World War II."},\n {id:1045,name:"Sgt. Onward L. Fluharty",serviceStart:1943,serviceEnd:1946,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:23,tags:["Honored Service"],story:"Fought in WWII at the Battle of the Bulge, served under General Bradley. Passed in 2016."},\n {id:1046,name:\'Francis "Buzz" L. Murray\',serviceEnd:1953,conflict:"Cold War",branch:"Air Force",category:"fallen",ugc:true,baseTributes:21,tags:["Honored Service"],photo:"/ms/memorial
1-day-2026/assets/heroes/1046.jpg",story:"While riding in a B-29, shortly after takeoff from Guam to Idaho on December 17, 1953, the Stratofortress crashed, killing 9 on board, 19 total."},\n {id:1047,name:"Albert D. Cardani",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:20,tags:["Silver Star"],story:"Served in Europe during WWII. Silver Star. 36th Infantry. Will always be my hero. Passed away in 1987."},\n {id:1048,name:"Rickey Lee Jones",serviceStart:1986,serviceEnd:2011,conflict:"GWOT (Iraq / Afghanistan)",branch:"Marine Corps",category:"served",ugc:true,baseTributes:21,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1048.jpg",story:"He served tours in Somalia, Afghanistan and Kuwait. Was exposed to burn pits. Love and miss him dearly."},\n {id:1049,name:"Captain Robert (Bobby) D. Kent",initials:"RK",conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:16,tags:["Honored Service"],story:"Flew F4s for the Marine Corps."},\n {id:1050,name:"Michael D Woods",serviceStart:1989,serviceEnd:1993,conflict:"Gulf War",branch:"Army",category:"fallen",ugc:true,baseTributes:17,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1050.jpg",story:"He served one tour in Desert Storm. Came home sick with pain, foot drop in right leg and rashes. He was married 17 years, and was a father to 4 kids."},\n {id:1051,name:"Robert L. Garcia",serviceStart:1967,serviceEnd:1971,conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"My father served a tour in Vietnam."},\n {id:1052,name:"Robert B. Howe",conflict:"Peacetime Service",branch:"Army",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1052.jpg",story:"101st Airborne."},\n {id:1053,name:"Robert Andrew Jones",serviceStart:1968,serviceEnd:1968,conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"Served a short-lived tour in Vietnam."},\n {id:1054,name:"Ralph Bishop",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"WWII veteran. Found a path the Japanese were using to a river, then went downstream and found where they were getting back on land."},\n {id:1055,name:"Kelley Stephen Prewitt",conflict:"Iraq",branch:"Army",category:"fallen",ugc:true,baseTributes:16,tags:["Honored Service"],story:"KIA, April 6th, 2003 in Iraq. He was 24 years old. Birmingham, AL."},\n {id:1056,name:"Kathleen Trainor Brielmaier",serviceStart:1941,serviceEnd:1946,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"Kathleen served as an Army nurse in WWII under General George Patton. She was from Rosebush, Michigan, and continued nursing in St. Louis after WWII."},\n {id:1057,name:"Larry Allen",conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1057.jpg",story:"Larry was a Spec 4 quartermaster in the United States Army serving in the Vietnam War."},\n {id:1058,name:"Russell Garing",serviceStart:1943,serviceEnd:1945,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],story:"Served in the US Army during World War II."},\n {id:1059,name:"Jason Fingar",conflict:"GWOT (Iraq / Afghanistan)",branch:"Army",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1059.jpg",story:"Jason was a member of the U.S. Army and a great person. He loved Jesus and I bet he loved you too."},\n {id:1060,name:"James L Scully",conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:18,tags:["Honored Service"],story:"Missed by his family so very much."},\n {id:1061,name:"Earnest J Bauer",serviceStart:1942,serviceEnd:1945,conflict:"World War II",branch:"Army",category:"fallen",ugc:true,baseTributes:16,tags:["Honored Service"],story:"He served in World War II and was killed in action after his plane crashed over the Pacific."},\n {id:1062,name:"Alfred Paul Trug",conflict:"Vietnam War",branch:"Navy",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"My husband served in the Navy on the USS Kitty Hawk. He passed away November 28, 2024. RIP."},\n {id:1063,name:"Charles David Darling",conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"My brother was a tunnel rat in Vietnam."},\n {id:1064,name:"Paul Ward",conflict:"Vietnam War",branch:"Air Force",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"He was killed guarding the main gate during service in Vietnam."},\n {id:1065,name:"Russell Hardin",conflict:"World War II",branch:"Army",category:"fallen",ugc:true,baseTributes:17,tags:["Honored Service"],story:"My uncle, whom I never got to meet, was killed in action at the Battle of the Bulge during WWII."},\n {id:1066,name:"Charles Keith Nowell",serviceStart:1968,serviceEnd:1969,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:16,tags:["Honored Service"],story:"Vietnam veteran."},\n {id:1067,name:"Jack C. Rathbun",conflict:"World War II",branch:"Air Force",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"Jack was a tail gunner killed over the Ploesti oil fields in Romania. His pilot, Lieutenant Donald Puckett, a Medal of Honor winner, also died on the mission."},\n {id:1068,name:"Robert V. Garcia",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],story:"He served in WWII and was a member of the Bushmasters."},\n {id:1069,name:"Roy Gene Blackburn",conflict:"Vietnam War",conflicts:["Korean War","Vietnam War"],branch:"Army",category:"served",ugc:true,baseTributes:18,tags:["Honored Service"],story:"He served 25 years in the US Army. He was in Vietnam & Korea. He loved his country. He was dedicated!"},\n {id:1070,name:"Willard C. Kiphorn",conflict:"World War II",branch:"Army",category:"fallen",ugc:true,baseTributes:16,tags:["Honored Service"],photo:"/ms/memorial
1-day-2026/assets/heroes/1070.jpg",story:"Killed in action in Normandy, 1 month after D-Day."},\n {id:1071,name:"Hayward K.H. Peleiholani",conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:18,tags:["Honored Service"],story:"Lance Corporal Hayward K.H. Peleiholani. E.O.T. Aug. 26, 1969."},\n {id:1072,name:"Theodore Arguello",serviceStart:1952,serviceEnd:1955,conflict:"Korean War",branch:"Army",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"Korean War, 1952-1955."},\n {id:1073,name:"Jay C. Marsh",serviceStart:1963,serviceEnd:1967,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"He was a veteran of the Vietnam era."},\n {id:1074,name:"Rex Arthur Greenawalt",conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"K-9 unit."},\n {id:1075,name:"Aaron Warren Eldred",conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:17,tags:["Purple Heart","Distinguished Flying Cross"],story:"WWII Pacific Theater. B-29 crew, flew 33 missions over the Hump before being shot down. POW at Mukden. Purple Heart, Distinguished Flying Cross. American hero!"},\n {id:1076,name:"William Chauncey Adams",conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"He served in the U.S. Navy; he was also a boxer in the Navy."},\n {id:1077,name:"Capt. Harold Kroske Jr.",serviceEnd:1969,conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:17,tags:["Honored Service"],story:"I wear a bracelet of this hero. Missing in action 2/11/69. He\'s my hero, he gives me strength. I remember his story when I think my situation is bad."},\n {id:1078,name:"Rene Hector Tirado",conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],story:"Hector was assigned the M60, first off the chopper, last one off."},\n {id:1079,name:"Rito Acuna Silva",conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"KIA."},\n {id:1080,name:"Glen Richard Leckemby I",conflict:"Vietnam War",branch:"Marine Corps",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],story:"Served for 40 years. Died from effects of Agent Orange and complications of his service."},\n {id:1081,name:"Glen Richard Leckemby II",conflict:"GWOT (Iraq / Afghanistan)",branch:"Marine Corps",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"He served 2 tours, retired at 40. Took his own life on May 1, 2011."},\n {id:1082,name:"Dennis Harper Jr",serviceStart:1958,serviceEnd:1966,conflict:"Vietnam War",branch:"Army",category:"fallen",ugc:true,baseTributes:18,tags:["Honored Service"],photo:"/ms/memorial-day-2026/assets/heroes/1082.jpg",story:"I was three years old when my Dad was killed in action. He served in Vietnam, gave his life for me and others, for the freedom we celebrate today."},\n {id:1083,name:"Roy William Morris",conflict:"World War II",branch:"Air Force",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"My Dad was on a B-17 crew. He flew 52 missions including Monte Cassino, the Normandy invasion and the Ploesti oil fields. He was wounded several times."},\n {id:1084,name:"Etienne Jules Murphy",serviceStart:2013,serviceEnd:2017,conflict:"GWOT (Iraq / Afghanistan)",branch:"Army",category:"fallen",ugc:true,baseTributes:17,tags:["Honored Service"],story:"An Army Ranger. Was KIA 5-26-2017 in Syria while conducting combat operations. He was the best son, brother and father. I miss him so much. RLTW!"},\n {id:1085,name:"Walter Laverte Burke",serviceEnd:1968,conflict:"Vietnam War",branch:"Marine Corps",category:"fallen",ugc:true,baseTributes:15,tags:["Honored Service"],story:"Walter L. Burke was KIA in the Vietnam War on November 22, 1968 at the age of 18. He gave his life saving a soldier he didn\'t even know. A hero."},\n {id:1086,name:"Mark A Miller",conflict:"Gulf War",branch:"Army",category:"fallen",ugc:true,baseTributes:17,tags:["Purple Heart"],story:"KIA during Desert Storm. Purple Heart recipient."},\n {id:1087,name:"George Goodreau",conflict:"World War II",branch:"National Guard",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"He saved his unit by capturing two German tanks with an unloaded bazooka."},\n {id:1088,name:"Paul Delaware Summerford",serviceStart:1943,serviceEnd:1944,conflict:"World War II",branch:"Army",category:"served",ugc:true,baseTributes:15,tags:["Honored Service"],story:"My father served in the infantry in the Japan conflict. He was from Mt. Crogan, SC. He had his marksman qualification."},\n {id:1089,name:"William Bezemek",serviceStart:1967,serviceEnd:1970,conflict:"Vietnam War",branch:"Army",category:"served",ugc:true,baseTributes:18,tags:["Honored Service"],photo:"/ms/memorial
1-day-2026/assets/heroes/1089.png",story:"He survived Vietnam, but passed away from Agent Orange lung cancer. He was a good husband and father. We mourn him every day and miss him a lot."},\n {id:1090,name:"Donald Graham",conflict:"Vietnam War",branch:"Air Force",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"US Air Force, serving in North Africa and completing 2 tours in Vietnam, finishing as a 1st Sergeant with the KCK Army National Guard. 32 years of military service."},\n {id:1091,name:"Roy James McArthur",serviceStart:1941,serviceEnd:1944,conflict:"World War II",branch:"Navy",category:"served",ugc:true,baseTributes:16,tags:["Honored Service"],story:"US Navy, 1941-1944."},\n {id:1092,name:"David W. Coulter",conflict:"World War II",branch:"Marine Corps",category:"served",ugc:true,baseTributes:17,tags:["Honored Service"],story:"This is a tribute to my Dad, David W. Coulter, who served in World War II as a Marine. He did not talk much about his time in the Marines, except, he made a lot of good friends. Never really knew what his job was for every time we would ask questions about his time in the war he would change the subject. He was an honorable man and loved people and life. Very patriotic."}\n];\n\n// v32: Hero photos are stored in a separate file (heroes_photos.js).\n// This keeps the HTML lightweight and lets ops update photos without redeploying.\n// On load, we inject each hero\'s .photo from window.HEROES_PHOTOS (set by heroes_photos.js).\n// Heroes without a registered photo fall back to the initial-letter SVG placeholder\n// (handled by the rendering code that already tolerates an empty .photo).\n// v34: photo injection is async-safe. heroes_photos.js loads with async,\n// so this may be called BEFORE the photo data arrives (HEROES_PHOTOS will be empty)\n// AND AGAIN once async script finishes (via onload="injectHeroPhotos()" on script tag).\n// Either way, hero cards already render with letter placeholders; this just upgrades\n// the .photo field and triggers a re-render of any already-mounted card images.\nwindow.injectHeroPhotos = function injectHeroPhotos(){\n var photoMap = window.HEROES_PHOTOS || {};\n var updated = 0;\n for (var i = 0; i < HEROES.length; i++){\n var h = HEROES[i];\n var url = photoMap[h.id] || photoMap[String(h.id)];\n if (url && h.photo !== url){\n h.photo = url;\n updated++;\n }\n }\n // If any cards are already in the DOM, swap their <img> src to the real photo\n if (updated > 0 && typeof document !== \'undefined\'){\n document.querySelectorAll(\'[data-hero-photo-id]\').forEach(function(el){\n var id = el.getAttribute(\'data-hero-photo-id\');\n var h = HEROES.find(function(x){return String(x.id) === id;});\n if (h && h.photo && el.tagName === \'IMG\'){\n el.src = h.photo;\n }\n });\n }\n console.log(\'[Memorial] photos injected:\', updated);\n};\n// Run immediately in case heroes_photos.js was already loaded synchronously\nwindow.injectHeroPhotos();\n\n\n// Honor Wall shows only fallen heroes (Memorial Day honors those who died)\nconst FALLEN = HEROES.filter(h => h.category === \'fallen\');\nconst SERVED = HEROES.filter(h => h.category === \'served\');\nlet activeLayer = \'fallen\';\n// "lit" starts false on every load; server stat determines truth within ~100ms.\n// localStorage is no longer the source of truth \u2014 keeping it would make the\n// candle stick lit across devices / sessions even after the server forgot.\nlet lit=false,page=1,filtered=[...FALLEN],activeFilter=\'All\';\nlet _userLit=false; // user actively lit the candle this session \u2014 never let the poll auto-extinguish it\n\n// \u2500\u2500\u2500 Live counters (in-house quiz action API, per-user once-per-action) \u2500\u2500\u2500\n// Endpoints (PR ParticleMedia/server#4163):\n// POST /api/quiz/action/act { action } \u2192 { total, my_rank, already_acted }\n// GET /api/quiz/action/stat?action=... \u2192 { total, my_rank, acted, my_payload? }\n// Auth: POST requires SessionAuth; GET allows anonymous (my_rank=null).\n// Only the global candle counter ("X people participated" + rank) uses the\n// new API. Per-hero and per-state candles stay seed+localStorage as before.\nconst COUNTER_API_BASE = \'/api/quiz/action\';\nconst GLOBAL_ACTION = \'candle\';\nlet serverGlobal = 0; // server\'s total for the global candle\nlet serverMyRank = null; // frozen rank once user has acted; null until ack\nlet _initialGlobal = null; // candle total observed at first page open (basis for web users\' local rank)\nconst serverHeroes = Object.create(null); // real per-hero counts {id: n}\n\n// Persist the server-issued rank from a successful /act so returning anonymous\n// users (no SessionAuth \u2192 /stat replies with my_rank:null) still see "their"\n// rank on next visit. Single source of truth: the last /act response.\nconst RANK_LS_KEY = \'memorial-day-2026:rank\';\nfunction _saveCachedRank(myRank){\n try{ localStorage.setItem(RANK_LS_KEY, Str
1ing(myRank)); }catch(e){}\n}\nfunction _readCachedRank(){\n try{\n const v = localStorage.getItem(RANK_LS_KEY);\n if(!v) return null;\n const n = Number(v);\n return Number.isFinite(n) && n > 0 ? n : null;\n }catch(e){ return null; }\n}\nfunction _clearCachedRank(){\n try{ localStorage.removeItem(RANK_LS_KEY); }catch(e){}\n}\n// Anonymous = no authenticated native identity. Covers both web (never has a\n// session) and in-app guests (signed out). The real axis is "can the server\n// identify me", NOT "am I in the app" \u2014 an in-app guest is just as anonymous as\n// a web visitor, so both get the same local-rank treatment.\nfunction _isAnonymous(){ return !_mdNativeUserId; }\n// Anonymous users can\'t get a real server my_rank, so give them a stable local\n// rank = (candle total at first page open) + 1, cached so it stays fixed while\n// the live total keeps climbing on each 10s poll. Authenticated users get a real\n// server rank, so skip them.\nfunction _ensureLocalRank(){\n if(!_isAnonymous()) return;\n if(serverMyRank != null || _readCachedRank() != null) return;\n const base = _initialGlobal != null ? _initialGlobal : serverGlobal;\n _saveCachedRank(base + 1);\n}\n\n// Native userId from the in-app getLoginInfo bridge. The /api/quiz proxy\'s\n// UserAwareMid only sets X-NB-WEB-USERID when BOTH NB_USER_TOKEN and\n// JSESSIONID cookies are present, but the iOS WebView only injects\n// JSESSIONID. We attach the header directly from the bridge to make the\n// upstream session-auth succeed regardless of the cookie gap.\nlet _mdNativeUserId = \'\';\nfunction _mdSetNativeUserId(id){\n _mdNativeUserId = (id != null && String(id).length > 0) ? String(id) : \'\';\n}\n// Backend SessionAuth accepts either header; we send both so a future rename\n// on the server side doesn\'t silently drop the in-app userId.\nfunction _mdAuthHeaders(extra){\n const h = Object.assign({ \'Accept\': \'application/json\' }, extra || {});\n if(_mdNativeUserId){\n h[\'X-NB-WEB-USERID\'] = _mdNativeUserId;\n h[\'X-NB-USER-ID\'] = _mdNativeUserId;\n }\n return h;\n}\n// Optimistic ++ in lightCandle; server reconciles via _applyActResult.\nfunction globalTotal(){ return serverGlobal; }\n// Falls back to the LS-cached rank so returning anonymous visitors don\'t see\n// a dash. Null only for first-time visitors mid-POST \u2014 better than flashing\n// a fake rank that could disappear if /act returns auth-failed.\nfunction userRankNumber(){\n if(serverMyRank != null) return serverMyRank;\n return _readCachedRank();\n}\nfunction syncParticipationUI(bump){\n updCount(bump);\n if(lit) updateUserRank();\n}\nasync function apiActionStat(action){\n try{\n const res = await fetch(COUNTER_API_BASE + \'/stat?action=\' + encodeURIComponent(action), {\n credentials: \'include\',\n headers: _mdAuthHeaders()\n });\n if(!res.ok) return null;\n const json = await res.json();\n // Envelope: { code, message, data }\n if(json && typeof json === \'object\' && \'code\' in json){\n if(json.code !== 0) return null;\n return json.data || null;\n }\n return json;\n }catch(e){ return null; }\n}\n// SessionAuth-required POST. Returns { ok, data, authFailed } so the caller\n// can distinguish "user is logged out, prompt them" from "transient error".\n// Upstream code 33 ("not login or login failed") is the auth-failure signal;\n// HTTP 401/403 also count if the proxy ever surfaces those directly.\nasync function apiActionAct(action, payload){\n try{\n const body = payload ? { action: action, payload: payload } : { action: action };\n const res = await fetch(COUNTER_API_BASE + \'/act\', {\n method: \'POST\',\n credentials: \'include\',\n headers: _mdAuthHeaders({ \'Content-Type\': \'application/json\' }),\n body: JSON.stringify(body)\n });\n if(res.status === 401 || res.status === 403){\n return { ok: false, authFailed: true, data: null };\n }\n if(!res.ok) return { ok: false, authFailed: false, data: null };\n const json = await res.json();\n if(json && typeof json === \'object\' && \'code\' in json){\n if(json.code === 0) return { ok: true, authFailed: false, data: json.data || null };\n // Server-side "not login or login failed" envelope.\n const msg = String(json.message || json.reason || \'\').toLowerCase();\n const authFailed = json.code === 33 || /not login|login failed/.test(msg);\n return { ok: false, authFailed: authFailed, data: null };\n }\n return { ok: true, authFailed: false, data: json };\n }catch(e){ return { ok: false, authFailed: false, data: null }; }\n}\nfunction applyGlobalStat(data){\n if(!data) return false;\n const prevGlobal = serverGlobal;\n serverGlobal = Number(data.total) || 0;\n if(_initialGlobal === null) _initialGlobal = serverGlobal;\n // my_rank is null for callers who haven\'t acted. Clear our local view so\n // a previously-displayed rank doesn\'t linger after a rollback or sign-out.\n // Don\'t clobber a previously-frozen rank when the server transiently omits\n // my_rank (e.g. anonymous /stat firing before the bridge replies with userId).\n if(
1data.my_rank != null) serverMyRank = Number(data.my_rank);\n // Server is the source of truth for "has THIS user lit" ONLY when it can\n // actually identify this user \u2014 authenticated (userId header) or any response\n // that carries a real my_rank. For anonymous callers (web OR in-app guest)\n // /stat always says acted:false, so trusting it would re-extinguish the candle\n // on every poll; keep their lit state sticky instead. Skip reconciliation\n // while a write is in flight so the poll can\'t clobber an optimistic flip.\n const authoritative = !_isAnonymous() || data.my_rank != null;\n const wasLit = lit;\n if(!_actInFlight){\n if(data.acted === true) lit = true;\n // Never auto-extinguish a candle the user lit themselves \u2014 only an explicit\n // /act failure (_rollbackLightCandle) may unlight. The downgrade is just for\n // a stale optimistic flip the user didn\'t initiate.\n else if(authoritative && !_userLit) lit = false;\n } else if(data.acted){\n lit = true;\n }\n const el = document.getElementById(\'cCount\');\n if(el && el.style.visibility !== \'visible\') el.style.visibility = \'visible\';\n // Bump the big number when poll detects others have lit since last tick.\n // Skip on the first response (prevGlobal=0) so the initial paint is calm.\n const shouldBump = prevGlobal > 0 && serverGlobal > prevGlobal;\n syncParticipationUI(shouldBump);\n if(!wasLit && lit) updCandleUI();\n if(wasLit && !lit){\n // Server disagrees with our optimistic state \u2014 visually undo.\n document.getElementById(\'cWrap\').classList.remove(\'lit\',\'igniting\');\n document.body.classList.remove(\'lit\',\'world-lit\');\n const hint = document.getElementById(\'candleAfterHint\');\n if(hint) hint.classList.remove(\'show\');\n }\n return true;\n}\nasync function fetchCounters(){\n // Only the global candle is server-backed; per-hero counts come from the\n // seed in HEROES + the local user\'s own optimistic increments (refreshed\n // by lightCandleForHero / markLitFor, not by the poll).\n applyGlobalStat(await apiActionStat(GLOBAL_ACTION));\n}\n// \u2500\u2500\u2500 Analytics: Amplitude (per "Memorial Day Amplitude Tracking Plan V2") \u2500\u2500\u2500\n// Empty AMPLITUDE_API_KEY => analytics OFF: page behaves exactly as before.\nconst AMPLITUDE_API_KEY = \'946c9f37ae37636fa4587f12dd74a039\'; // project 256543 (newsbreakweb.com), same as Iran War page\nconst AMPLITUDE_SDK_URL = \'https://cdn.amplitude.com/libs/analytics-browser-2.11.1-min.js.gz\';\nconst PAGE_VERSION = \'v40\';\n// Memorial install / deferred-link keys (also on OneLink). Duplicated here so AMP\n// events can attach them before the banner block below defines NB_* helpers.\nconst MEMORIAL_DEEP_LINK_URI = \'memorial-day-2026\';\nconst MEMORIAL_CD_MEDIA_SOURCE_FALLBACK = \'memorial-day-2026\';\n\n/** cd-media_source from query ?s= (e.g. &s=a7 \u2192 a7); fallback when absent. */\nfunction memorialCdMediaSource(q){\n try{\n const params = q || new URLSearchParams(location.search);\n const s = params.get(\'s\');\n if(s) return s;\n }catch(e){}\n return MEMORIAL_CD_MEDIA_SOURCE_FALLBACK;\n}\n\n/** AMP event props. Use media_source (not cd-media_source): attribution:true auto-prefixes cd-. */\nfunction memorialAttrAmpProps(){\n try{\n const q = new URLSearchParams(location.search);\n return {\n deepLinkUri: q.get(\'deepLinkUri\') || MEMORIAL_DEEP_LINK_URI,\n media_source: memorialCdMediaSource(q),\n };\n }catch(e){\n return { deepLinkUri: MEMORIAL_DEEP_LINK_URI, media_source: memorialCdMediaSource() };\n }\n}\n\nlet _amp = null;\nconst _ampQ = [];\nfunction track(name, props){\n try{\n const p = Object.assign(\n { page:\'memorial-day\', app:\'memorial_day_tribute\', page_version:PAGE_VERSION },\n memorialAttrAmpProps(),\n props||{}\n );\n if(_amp){ _amp.track(name, p); }\n else if(AMPLITUDE_API_KEY){ _ampQ.push([name, p]); } // buffer until SDK ready\n }catch(e){ /* analytics must never break the page */ }\n}\nfunction initAnalytics(){\n if(!AMPLITUDE_API_KEY) return;\n try{\n const s = document.createElement(\'script\');\n s.async = true;\n s.src = AMPLITUDE_SDK_URL;
1\n s.onload = function(){\n try{\n window.amplitude.init(AMPLITUDE_API_KEY, undefined, {\n defaultTracking:{ sessions:true, attribution:true, pageViews:false, formInteractions:false, fileDownloads:false }\n });\n _amp = window.amplitude;\n _ampQ.splice(0).forEach(a=>{ try{ _amp.track(a[0], a[1]); }catch(e){} });\n }catch(e){}\n };\n document.head.appendChild(s);\n }catch(e){}\n}\n// page_viewed.source per the tracking plan\'s Source \u53e3\u5f84\nfunction detectSource(){\n try{\n const q = new URLSearchParams(location.search);\n const utm_source = q.get(\'utm_source\');\n const utm_campaign = q.get(\'utm_campaign\');\n const source_param = q.get(\'source\'); // \'push\' | \'tab\' | \'share\' \u2014 set by the caller\n const push_id = q.get(\'push_id\') || q.get(\'push_aid\') || null;\n const entry_hero_id = q.get(\'hero\') || null;\n const share_surface = q.get(\'s\') || q.get(\'utm_content\') || null;\n const ref = document.referrer || \'\';\n let refHost = \'\';\n try{ refHost = ref ? new URL(ref).hostname : \'\'; }catch(e){}\n const sameHost = refHost && refHost === location.hostname;\n let source;\n // Priority: explicit source param > utm > hero/share referrer > referrer domain > direct\n if(source_param === \'push\' || push_id){ source = \'push\'; }\n else if(source_param === \'tab\'){ source = \'tab\'; }\n else if(source_param === \'share\' || entry_hero_id || /\\/share\\//.test(ref)){ source = \'share\'; }\n else if(utm_source || utm_campaign){ source = \'campaign\'; }\n else if(/(^|\\.)(newsbreak|particlenews)\\.com$/.test(refHost)){ source = \'newsbreak\'; }\n else if(refHost && !sameHost){ source = \'external_referral\'; }\n else if(!ref){ source = \'direct\'; }\n else { source = \'unknown\'; }\n return Object.assign(\n { source, referrer_domain:refHost||null, utm_source:utm_source||null,\n utm_campaign:utm_campaign||null, entry_hero_id, share_surface, push_id },\n memorialAttrAmpProps()\n );\n }catch(e){ return Object.assign({ source:\'unknown\' }, memorialAttrAmpProps()); }\n}\nlet PAGE_SOURCE = {};\n// \u2500\u2500 v40: Smart App Banner \u2500\u2500\n// Shows when page is opened outside the NewsBreak app on any device.\n// Hides automatically inside the app (UA detection) or after user dismissal (7-day cooldown).\n// \u2500\u2500 App Banner + share: deep-link + OneLink attribution \u2500\u2500\nconst NB_IOS_STORE = \'https://apps.apple.com/us/app/newsbreak-local-news-alerts/id1330266650\';\nconst NB_AND_STORE = \'https://play.google.com/store/apps/details?id=com.particlenews.newsbreak\';\nconst NB_WEB_DL = \'https://www.newsbreak.com/download\';\n\n// AppsFlyer OneLink \u2014 mirrors common-components/utils/onelink.ts.\nconst NB_ONELINK_HOST = \'https://newsbreakapp.onelink.me\';\nconst NB_ONELINK_ID = \'2115408369\';\nconst NB_ONELINK_PID_IOS = \'i4\'; // TODO: dedicated memorial-day pid when registered\nconst NB_ONELINK_PID_AND = \'a4\';\nconst NB_DEEP_LINK_URI = MEMORIAL_DEEP_LINK_URI;\n\nfunction memorialPid(isIOS){ return isIOS ? NB_ONELINK_PID_IOS : NB_ONELINK_PID_AND; }\n\n// Shared UA + install-destination logic for every install/open CTA on the\n// page (banner display, banner click, candle out-of-app). Desktop has no\n// OneLink (no app to attribute) so it falls through to NB_WEB_DL.\nfunction memorialPlatform(){\n const ua = navigator.userAgent;\n const isIOS = /iphone|ipad|ipod/i.test(ua);\n const isAndroid = /android/i.test(ua);\n const platform = isIOS ? \'ios\' : isAndroid ? \'android\' : \'desktop\';\n const installUrl = (isIOS || isAndroid) ? buildMemorialDayOneLinkUrl(isIOS) : NB_WEB_DL;\n return { platform, installUrl };\n}\n\n/** Native dp: Memorial tab + attribution on scheme query (installed / deferred). */\nfunction buildMemorialNativeDeepLink(){\n return \'newsbreak://home?tab=channel&channel=k122750\' +\n \'&deepLinkUri=\' + encodeURIComponent(NB_DEEP_LINK_URI) +\n \'&media_source=\' + encodeURIComponent(memorialCdMediaSource());\n}\n\nfunction memorialOneLinkOuterParams(pid){\n return \'&pid=\' + encodeURIComponent(pid) +\n \'&deepLinkUri=\' + encodeURIComponent(NB_DEEP_LINK_URI) +\n \'&media_source=\' + encodeURIComponent(memorialCdMediaSource());\n}\n\n/** Banner / Open App \u2014 always OneLink so deepLinkUri + media_source are on every click. */\nfunction buildMemorialDayOneLinkUrl(isIOS){\n const dp = encodeURIComponent(buildMemorialNativeDeepLink());\n const pid = memorialPid(isIOS);\n return NB_ONELINK_HOST + \'/\' + NB_ONELINK_ID +\n \'?af_dp=\' + dp +\n \'&nb_dp=\' + dp +\n memorialOneLinkOuterParams(pid);\n}\n\n/**\n * Outbound share URL \u2014 short H5 link for SMS / iMessage / clipboard.\n * Only ?source=share on https:// \u2014 do NOT put deepLinkUri / media_source here:\n * those keys on a web URL trigger Universal Links / App Links and open the app\n * instead of the browser. Install attribution stays on Banner OneLink + native dp.\n */\nfunction memorialShareWebUrl(extra){\n const q = new URLSearchParams(extra || {});\n if(!q.has(\'source\')) q.set(\'source\', \'share\');\n try{\n const s = new URLSearchParams(location.search).get(\'s\');\n if(s && !q.has(\'s\')) q.set(\'s\', s);\n }catch(e){}\n const qs = q.toString();\n return location.origin + location.pathname + (qs ? \'?\' + qs : \'\');\n}\nfunction memorialHeroShareWebUrl(h){\n return location.origin + \'/ms/memorial
1-day-2026/\' + encodeURIComponent(h.id) + \'?source=share\';\n}\n\nfunction initAppBanner(){\n try{\n if(/newsbreak|particlenews/i.test(navigator.userAgent)) return; // already in app\n const DISMISS_KEY = \'nb_b_ts\';\n const ts = localStorage.getItem(DISMISS_KEY);\n if(ts && Date.now() - parseInt(ts) < 7*24*3600*1000) return; // dismissed recently\n const banner = document.getElementById(\'appBanner\');\n if(!banner) return;\n const { platform, installUrl } = memorialPlatform();\n const cta = document.getElementById(\'nbBannerCta\');\n if(cta) cta.href = installUrl;\n banner.classList.remove(\'nb-hidden\');\n document.body.classList.add(\'nb-has-banner\');\n track(\'ms_banner_view\', { platform });\n }catch(e){}\n}\n\n/** Banner Open App \u2014 always navigate via OneLink (attribution on every path). */\nfunction nbBannerClick(e){\n e.preventDefault();\n try{\n const { platform, installUrl } = memorialPlatform();\n track(\'ms_banner_click\', { platform, onelink: true });\n window.location.href = installUrl;\n }catch(e){}\n}\nfunction nbBannerDismiss(){\n try{\n document.getElementById(\'appBanner\').classList.add(\'nb-hidden\');\n document.body.classList.remove(\'nb-has-banner\');\n localStorage.setItem(\'nb_b_ts\', Date.now().toString());\n track(\'ms_banner_dismiss\', {});\n }catch(e){}\n}\n// emits share_clicked and returns the meta to thread into unifiedShare\u2192share_result\nfunction _shareMeta(surface, context, heroId, files){\n const meta = { surface:surface||\'unknown\', context:context||\'generic\',\n hero_id: heroId!=null ? String(heroId) : null };\n track(\'ms_share_click\', Object.assign({ has_image: !!(files && files.length) }, meta));\n return meta;\n}\nconst PAGE_INIT=5;const PAGE_MAX=10;\n\n\nfunction shuffleHeroes(){\n for(let i=filtered.length-1;i>0;i--){\n const j=Math.floor(Math.random()*(i+1));\n [filtered[i],filtered[j]]=[filtered[j],filtered[i]];\n }\n page=1;renderCards();\n}\n\n// Honor descriptions shown when user clicks a tag\nconst HONOR_INFO = {\n \'Medal of Honor\': {\n title: \'Medal of Honor\',\n text: "The nation\'s highest military decoration, awarded by the President of the United States for gallantry above and beyond the call of duty in actual combat."\n },\n \'Navy Cross\': {\n title: \'Navy Cross\',\n text: "The second-highest military decoration, awarded to members of the Navy, Marine Corps, and Coast Guard for extraordinary heroism in combat."\n },\n \'Distinguished Service Cross\': {\n title: \'Distinguished Service Cross\',\n text: "The Army\'s second-highest military decoration, awarded for extreme gallantry and risk of life in actual combat with an armed enemy force."\n },\n \'Silver Star\': {\n title: \'Silver Star\',\n text: "The third-highest military combat decoration, awarded for gallantry in action against an enemy of the United States."\n },\n \'Bronze Star\': {\n title: \'Bronze Star with Valor\',\n text: "Awarded for heroic or meritorious service in a combat zone. The \'V\' device denotes valor in direct combat with an enemy."\n },\n \'Purple Heart\': {\n title: \'Purple Heart\',\n text: "Awarded in the name of the President to those wounded or killed while serving with the U.S. military."\n },\n \'Intelligence Star\': {\n title: \'Intelligence Star\',\n text: "The CIA\'s second-highest award, recognizing voluntary acts of courage performed under hazardous conditions, or outstanding achievements."\n },\n \'Presidential Unit Citation\': {\n title: \'Presidential Unit Citation\',\n text: "Awarded to units that displayed extraordinary heroism in action against an armed enemy \u2014 the unit equivalent of the Medal of Honor or Distinguished Service Cross."\n },\n \'Distinguished Service Medal\': {\n title: \'Distinguished Service Medal\',\n text: "Awarded for exceptionally meritorious service to the United States in a duty of great responsibility."\n },\n \'Honored Service\': {\n title: \'Honored Service\',\n text: "Recognized for honorable service to the United States. These are veterans who survived their wars and carried the weight of their service home with them."\n },\n \'In Loving Memory\': {\n title: \'In Loving Memory\',\n text: "Remembered by someone who loved them. Their service may not have been officially decorated, but their memory is preserved here by those they left behind."\n }\n};\n\nfunction showHonorInfo(tagText, el){\n // Remove any existing popup\n document.querySelectorAll(\'.honor-popup\').forEach(p=>p.remove());\n \n const info = HONOR_INFO[tagText];\n if(!info){\n // Fallback for unknown tags\n return;\n }\n \n const popup = document.createElement(\'div\');\n popup.className = \'honor-popup\';\n popup.innerHTML = `\n <button class="honor-popup-close" onclick="this.parentNode.remove()">\xd7</button>\n <div class="honor-popup-title">${info.title}</div>\n <div class="honor-popup-text">${info.text}</div>\n `;
1\n document.body.appendChild(popup);\n \n // Position popup below the tag, adjusting to viewport edges\n const rect = el.getBoundingClientRect();\n const popupRect = popup.getBoundingClientRect();\n let left = rect.left + (rect.width/2) - (popupRect.width/2);\n let top = rect.bottom + 10;\n \n // Keep within viewport\n const margin = 12;\n if(left < margin) left = margin;\n if(left + popupRect.width > window.innerWidth - margin){\n left = window.innerWidth - popupRect.width - margin;\n }\n // Flip above if not enough room below\n if(top + popupRect.height > window.innerHeight - margin){\n top = rect.top - popupRect.height - 10;\n popup.style.setProperty(\'--arrow-x\',\'0\');\n popup.querySelector(\'::before\');\n }\n \n // Calculate arrow X position to point at tag center\n const arrowX = Math.min(Math.max(rect.left + rect.width/2 - left - 6, 12), popupRect.width - 24);\n popup.style.setProperty(\'--arrow-x\', arrowX+\'px\');\n \n popup.style.left = left + \'px\';\n popup.style.top = top + \'px\';\n \n requestAnimationFrame(()=>popup.classList.add(\'show\'));\n \n // Dismiss on outside click\n setTimeout(()=>{\n const dismiss = (e)=>{\n if(!popup.contains(e.target)){\n popup.remove();\n document.removeEventListener(\'click\', dismiss);\n }\n };\n document.addEventListener(\'click\', dismiss);\n }, 50);\n}\n\n\n\nfunction switchLayer(layer){\n if(activeLayer === layer) return;\n activeLayer = layer;\n // Update tab visual\n document.getElementById(\'ltabFallen\').classList.toggle(\'active\', layer===\'fallen\');\n document.getElementById(\'ltabServed\').classList.toggle(\'active\', layer===\'served\');\n // Reset state\n activeFilter = \'All\';\n document.getElementById(\'srchIn\').value=\'\';\n document.getElementById(\'sClear\').classList.remove(\'on\');\n page = 1;\n // Rebuild filter tabs (conflict filter options may differ between layers)\n buildTabs();\n applyFilters();\n}\n\n// Store the native userId from a getLoginInfo reply and report whether the\n// account is authenticated (non-guest). Shared by the init probe and the\n// on-return re-probe.\nfunction _captureLoginInfo(info){\n const isGuest = info.isGuest === 1 || info.isGuest === true;\n if(isGuest || !info.userId) return false;\n _mdSetNativeUserId(info.userId);\n return true;\n}\n// In-app, login state is read once at init. If a guest signs in (in native UI)\n// and returns to this still-open webview, nothing here would notice \u2014 the user\n// had to kill the app. Re-probe getLoginInfo whenever the page becomes visible\n// again; on a guest\u2192authenticated transition, attach the userId and, if they\n// already lit anonymously, re-POST /act so the tribute is credited to their\n// account (server returns their real rank), then reconcile. No reload, no\n// native change. Out-of-app there\'s no bridge, so this is a no-op.\nlet _loginReprobing = false;\nfunction _reprobeLoginOnReturn(){\n if(document.visibilityState !== \'visible\') return;\n if(!isMemorialInApp() || _mdNativeUserId || _loginReprobing) return;\n _loginReprobing = true;\n nbGetLoginInfo((info) => {\n _loginReprobing = false;\n if(!_captureLoginInfo(info)) return; // still signed out \u2014 nothing to do\n if(lit){\n _actInFlight = true;\n apiActionAct(GLOBAL_ACTION).then(res => {\n _actInFlight = false;\n if(res && res.ok) _applyActResult(res.data);\n fetchCounters();\n });\n } else {\n fetchCounters();\n }\n });\n}\n\nfunction init(){\n PAGE_SOURCE = detectSource();\n initAnalytics();\n track(\'ms_page_view\', PAGE_SOURCE);\n initAppBanner();\n // Returning anonymous visitor who already lit: restore the sticky lit state\n // from the cached local rank so the candle stays lit across reloads (anonymous\n // /stat can\'t report acted:true). In-app authenticated users have no native\n // userId yet at this point (the bridge probe below is async), but their cache\n // holds a real server rank and the post-probe fetch reconciles the truth.\n if(_isAnonymous() && _readCachedRank() != null) lit = true;\n updCandleUI();\n // Probe native userId BEFORE the first fetch so /stat carries the\n // X-NB-WEB-USERID header and the upstream returns the user\'s real my_rank /\n // acted state on first paint. Out-of-app (or bridge missing) goes straight\n // to fetchCounters; in-app waits for the bridge callback before the first\n // fetch to avoid racing an anonymous response against the authed one. The\n // watchdog ensures we still see a counter if the bridge is silent.\n const inAppWithBridge = isMemorialInApp() && window.NBJ
1S && window.NBJS.callNative;\n if(inAppWithBridge){\n let probed = false;\n const watchdog = setTimeout(() => { if(probed) return; probed = true; fetchCounters(); }, 800);\n nbGetLoginInfo((info) => {\n if(probed) return;\n probed = true;\n clearTimeout(watchdog);\n _captureLoginInfo(info);\n fetchCounters();\n });\n } else {\n fetchCounters();\n }\n buildTabs();renderCards();setLayerCounts();\n // Pause polling while the tab is hidden \u2014 background tabs were burning\n // /stat traffic and re-rendering for no benefit.\n const pollHandle = setInterval(() => { if(document.visibilityState === \'visible\') fetchCounters(); }, 3000);\n document.addEventListener(\'visibilitychange\', _reprobeLoginOnReturn);\n window.addEventListener(\'pageshow\', _reprobeLoginOnReturn);\n // Exposed so the Next.js shell can clear the poll on route-change unmount\n // (otherwise /stat keeps firing forever after the user navigates away).\n window.__mdTeardown = () => {\n clearInterval(pollHandle);\n document.removeEventListener(\'visibilitychange\', _reprobeLoginOnReturn);\n window.removeEventListener(\'pageshow\', _reprobeLoginOnReturn);\n };\n openHeroFromUrl();\n}\nlet _lastRenderedTotal = -1;\nfunction updCount(bump){\n const el = document.getElementById(\'cCount\');\n const total = globalTotal();\n if(total !== _lastRenderedTotal){\n el.innerHTML=\'<span class="big-num">\'+total.toLocaleString()+\'</span> people participated.\';\n _lastRenderedTotal = total;\n }\n if(bump){\n const n = el.querySelector(\'.big-num\');\n if(n){ n.classList.add(\'bump\'); setTimeout(()=>n.classList.remove(\'bump\'), 650); }\n }\n}\n// Layer tab counts are static (derived from HEROES) \u2014 set once at init, NOT\n// coupled to the network counter, so they never flash "0" while it loads.\nfunction setLayerCounts(){\n const fc = document.getElementById(\'fallenCount\');\n const sc = document.getElementById(\'servedCount\');\n if(fc) fc.textContent = FALLEN.length;\n if(sc) sc.textContent = SERVED.length;\n}\nfunction updCandleUI(){\n if(!lit)return;\n document.getElementById(\'cWrap\').classList.add(\'lit\');\n document.body.classList.add(\'lit\',\'world-lit\');\n // v23: returning user who already lit -- show the rank line + share button\n const hint = document.getElementById(\'candleAfterHint\');\n if(hint){ hint.classList.add(\'show\'); }\n updateUserRank();\n}\n// \u2500\u2500\u2500 Auth gate (mirror trivia/quiz: in-app\u2192native login, out-of-app\u2192OneLink) \u2500\u2500\u2500\n// Same UA rules as common-components/hooks/useIsInApp.ts: explicit ?from=app,\n// NBJS bridge present, or "NewsBreak" token in UA. No WebView heuristics \u2014\n// they false-positive Chrome/CriOS/Edge.\nfunction isMemorialInApp(){\n try{\n const params = new URLSearchParams(location.search);\n if(params.get(\'from\') === \'app\') return true;\n if(typeof window.NBJS?.callNative === \'function\') return true;\n if(/NewsBreak|particlenews/i.test(navigator.userAgent)) return true;\n }catch(e){}\n return false;\n}\n// \u2500\u2500\u2500 Native bridge: getLoginInfo (NBJsBridge action "getLoginInfo") \u2500\u2500\u2500\n// Returns { userId, isGuest, ... }. Mounted automatically on any NewsBreak-\n// owned host by Routing.swift (GoH5Page handler attaches JSBridgeHandlerLoginInfo).\n// We call it at init to capture the user id, then attach it as X-NB-WEB-USERID\n// on every /api/quiz/action call so the upstream\'s SessionAuth recognizes the\n// session even when the WebView\'s cookie jar is missing NB_USER_TOKEN.\nlet _mdNBReqCounter = 0;\nfunction _mdInvokeNB(action, fields, callback){\n const requestId = \'mdnb_\' + (++_mdNBReqCounter);\n const callbackKey = action + \'_\' + requestId;\n window.NBCallback = window.NBCallback || {};\n window.NBCallback[callbackKey] = (raw) => {\n delete window.NBCallback[callbackKey];\n callback(raw || {});\n };\n const payload = Object.assign({\n action: action,\n callback: \'window.NBCallback.\' + callbackKey,\n }, fields || {});
1\n if(window.NBJS && window.NBJS.callNative){\n window.NBJS.callNative(JSON.stringify(payload));\n }else{\n setTimeout(() => callback({}), 0);\n }\n}\nfunction nbGetLoginInfo(callback){\n _mdInvokeNB(\'getLoginInfo\', {}, callback);\n}\nfunction handleCtaClick(){\n if(!lit){ lightCandle(); } else { doShare(); }\n}\nfunction _applyActResult(d){\n if(!d) return;\n serverGlobal = Number(d.total) || serverGlobal;\n if(d.my_rank != null){\n serverMyRank = Number(d.my_rank);\n _saveCachedRank(serverMyRank);\n }\n syncParticipationUI();\n}\n// Roll back the optimistic UI when the server write ultimately fails (e.g.\n// user dismissed the login prompt). Lets the candle look unlit again.\nfunction _rollbackLightCandle(){\n if(!lit) return;\n lit = false;\n _userLit = false;\n if(_isAnonymous()) _clearCachedRank();\n serverGlobal = Math.max(0, serverGlobal - 1);\n document.getElementById(\'cWrap\').classList.remove(\'lit\',\'igniting\');\n document.body.classList.remove(\'lit\',\'world-lit\');\n const hint = document.getElementById(\'candleAfterHint\');\n if(hint) hint.classList.remove(\'show\');\n syncParticipationUI();\n}\n// In-flight POST flag \u2014 prevents the /stat poll from clobbering server state\n// mid-roundtrip in applyGlobalStat.\nlet _actInFlight = false;\nfunction lightCandle(){\n if(lit) return;\n // Optimistic flip + POST. /act accepts anonymous; my_rank is cached in LS\n // so returning anonymous visitors (in-app guest or out-of-app browser)\n // still see their rank when /stat is null.\n _ensureLocalRank();\n lit = true;\n _userLit = true;\n serverGlobal++;\n _lightCandleAnimate();\n _actInFlight = true;\n apiActionAct(GLOBAL_ACTION).then(res => {\n _actInFlight = false;\n if(res && res.ok){ _applyActResult(res.data); return; }\n // Failure \u2014 roll back the UI and let the /stat poll reconcile.\n _rollbackLightCandle();\n });\n}\nfunction _lightCandleAnimate(){\n track(\'ms_candle_lit\', {\n rank: serverMyRank,\n in_app: isMemorialInApp(),\n source: PAGE_SOURCE.source || \'unknown\',\n entry_hero_id: PAGE_SOURCE.entry_hero_id || null\n });\n const wrap = document.getElementById(\'cWrap\');\n // Step 1: wick glows red\n wrap.classList.add(\'igniting\');\n // Step 2: flame ignites ~450ms later\n setTimeout(()=>{\n wrap.classList.remove(\'igniting\');\n wrap.classList.add(\'lit\');\n document.body.classList.add(\'lit\');\n }, 450);\n // Step 3: environment warms ~500ms after flame appears\n setTimeout(()=>{\n document.body.classList.add(\'world-lit\');\n }, 950);\n // Count & rank reveal: X participated, you are the (X+1)th\n setTimeout(()=>{\n syncParticipationUI(true);\n const hint = document.getElementById(\'candleAfterHint\');\n if(hint){ hint.classList.add(\'show\'); }\n }, 700);\n}\n\n// v23: rank = participated + 1 once you have lit (you are the next person in line)\nlet _lastRenderedRank = undefined;\nfunction updateUserRank(){\n // First-time visitors with no LS cache get a dash mid-POST so we don\'t\n // flash a fake rank that could disappear if /act returns auth-failed.\n const rank = userRankNumber();\n if(rank === _lastRenderedRank) return;\n _lastRenderedRank = rank;\n const numEl = document.getElementById(\'urankNum\');\n const suffixEl = document.getElementById(\'urankSuffix\');\n if(rank == null){\n if(numEl){ numEl.textContent = \'\u2014\'; }\n if(suffixEl){ suffixEl.textContent = \'\'; }\n return;\n }\n if(numEl){ numEl.textContent = rank.toLocaleString(); }\n if(suffixEl){ suffixEl.textContent = ordinalSuffix(rank); }\n}\n\nfunction ordinalSuffix(n){\n const j = n % 10, k = n % 100;\n if(j === 1 && k !== 11) return \'st\';\n if(j === 2 && k !== 12) return \'nd\';\n if(j === 3 && k !== 13) return \'rd\';\n return \'th\';\n}\n\n// v23: collective share \u2014 the main viral hook\n// v24: works whether or not the user has lit the top candle yet\n// v33: Unified share helper \u2014 handles iOS/Android quirks\n// - Detects navigator.canShare() (iOS 15+, Android Chrome 90+)\n// - Distinguishes user-cancel (AbortError) from real failure\n// - Falls back to clipboard with toast on failure\n// - MUST be called synchronously from a user gesture (onclick) \u2014 never inside await\n// v33: Poppy image helper \u2014 returns <img> with the poppy at given pixel size.\nfunction poppyImg(size, extraStyle){\n size = size || 16;\n extraStyle = extraStyle || \'\';\n var src = window.MEMORIAL_ASSETS.poppy;
1\n return \'<img src="\'+src+\'" alt="" style="width:\'+size+\'px;height:auto;display:inline-block;vertical-align:middle;\'+extraStyle+\'">\';\n}\n\nasync function unifiedShare(payload, fallbackToast){\n fallbackToast = fallbackToast || \'Link copied to clipboard\';\n var url = payload.url || (location.origin + location.pathname);\n var text = payload.text || \'\';\n var title = payload.title || \'\';\n var files = payload.files;\n var shareData = {title: title, text: text, url: url};\n var _sm = { surface: payload.surface||\'unknown\', context: payload.context||\'generic\',\n hero_id: payload.heroId!=null ? String(payload.heroId) : null };\n function _sr(result, method){ track(\'ms_share_send\', Object.assign({ result:result, method:method||null }, _sm)); }\n console.log(\'[Share] called with:\', shareData, files ? \'with \'+files.length+\' file(s)\' : \'\');\n console.log(\'[Share] navigator.share available:\', !!navigator.share, \'| protocol:\', location.protocol);\n\n // Prefer navigator.share when available. Calling NBJS share first makes the\n // native sheet list an extra target labeled "JSBridge" (the WebView bridge).\n\n // Strategy 1a: Web Share Level 2 \u2014 attach the hero card image\n if (navigator.share && files && files.length && navigator.canShare) {\n var withFiles = {title: title, text: text, url: url, files: files};\n if (navigator.canShare(withFiles)) {\n try {\n await navigator.share(withFiles);\n console.log(\'[Share] native share with files succeeded\');\n _sr(\'completed\',\'native_files\');\n return;\n } catch (err) {\n console.log(\'[Share] share-with-files threw:\', err.name, err.message);\n if (err && (err.name === \'AbortError\' || /cancel/i.test(err.message || \'\'))) {\n _sr(\'cancelled\', null);\n return; // user cancelled\n }\n // fall through to URL-only share\n }\n }\n }\n\n // Strategy 1b: Web Share API URL-only (native panel on iOS Safari, Android Chrome)\n // NOTE: Requires HTTPS (or localhost). Fails silently on file:// or http://\n if (navigator.share) {\n try {\n if (navigator.canShare && !navigator.canShare(shareData)) {\n throw new Error(\'canShare returned false\');\n }\n await navigator.share(shareData);\n console.log(\'[Share] native share succeeded\');\n _sr(\'completed\',\'native_url\');\n return;\n } catch (err) {\n console.log(\'[Share] navigator.share threw:\', err.name, err.message);\n if (err && (err.name === \'AbortError\' || /cancel/i.test(err.message || \'\'))) {\n _sr(\'cancelled\', null);\n return; // user cancelled\n }\n // fall through to clipboard\n }\n }\n\n // Strategy 2: NBJS share \u2014 fallback when navigator.share is missing (old Android WV)\n if (window.NBJS && window.NBJS.callNative) {\n var _bridgeImgUrl = payload.imageUrl ||\n (payload.heroId != null ? buildHeroCardUrl({id: payload.heroId}) : \'\') ||\n (window.MEMORIAL_ASSETS && window.MEMORIAL_ASSETS.ogFallback) || \'\';\n var _cbKey = \'nb_share_\' + Date.now();\n window.NBCallback = window.NBCallback || {};\n window.NBCallback[_cbKey] = function(res){\n delete window.NBCallback[_cbKey];\n var ok = res.success === 1 || res.success === \'True\' || res.success === true;\n _sr(ok ? \'completed\' : \'cancelled\', \'bridge_system\');\n };\n window.NBJS.callNative(JSON.stringify({\n action: \'share\',\n callback: \'window.NBCallback.\' + _cbKey,\n title: title,\n content: text,\n url: url,\n imageUrl: _bridgeImgUrl || null,\n target: \'system\',\n }));\n return;\n }\n\n // Strategy 3: Clipboard API (also requires HTTPS in most browsers)\n var shareText = (text ? text + \' \' : \'\') + url;\n if (navigator.clipboard && navigator.clipboard.writeText) {\n try {\n await navigator.clipboard.writeText(shareText);\n console.log(\'[Share] clipboard.writeText succeeded\');\n _sr(\'copied\',\'clipboard\');\n showToast(fallbackToast);\n return;\n } catch (err) {\n console.log(\'[Share] clipboard.writeText threw:\', err.name, err.message);\n }\n }\n\n // Strategy 3: legacy textarea copy (works on more browsers, including older ones)\n try {\n var ta = document.createElement(\'textarea\');\n ta.value = shareText;\n ta.style.position = \'fixed\';\n ta.style.left = \'-9999px\';\n ta.setAttribute(\'readonly\', \'\');\n document.body.appendChild(ta);\n ta.select();\n ta.setSelectionRange(0, ta.value.length);\n var ok = document.execCommand(\'copy\');\n document.body.removeChild(ta);\n if (ok) {\n console.log(\'[Share] execCommand copy succeeded\');\n _sr(\'copied\',\'execCommand\');\n showToast(fallbackToast);\n return;\n } else {\n console.log(\'[Share] execCommand returned false\');\n }\n } catch (e) {\n console.log(\'[Share] execCommand threw:\', e.message);\n }\n\n // Strategy 4: last-resort \u2014 show a clear toast even when nothing else worked\n // (e.g. file:// testing, very old browsers). User can long-press to select+copy.\n
1console.log(\'[Share] ALL methods failed \u2014 showing manual-copy toast\');\n _sr(\'failed\',\'manual\');\n showToast(\'Link ready \u2014 long-press to copy: \' + url.replace(location.origin, \'\'), 8000);\n}\n\n// v35\u2192v36: fallback share image now lives on the staticfiles CDN (was inline base64).\n// Fetched once on first share-eligible interaction; cached as a File so subsequent\n// Web Share Level 2 calls attach it synchronously.\nlet OG_FALLBACK_FILE = null;\nlet _ogFallbackFetch = null;\nfunction prefetchOgFallback(){\n if (OG_FALLBACK_FILE || _ogFallbackFetch) return _ogFallbackFetch;\n var url = (window.MEMORIAL_ASSETS && window.MEMORIAL_ASSETS.ogFallback) || \'\';\n if (!url) return null;\n _ogFallbackFetch = fetch(url, {cache: \'force-cache\', mode: \'cors\'})\n .then(function(res){ return res.ok ? res.blob() : null; })\n .then(function(blob){\n if (blob) OG_FALLBACK_FILE = new File([blob], \'memorial-day-tribute.jpg\', {type: blob.type || \'image/jpeg\'});\n })\n .catch(function(e){ console.log(\'[Share] OG fallback prefetch failed:\', e && e.message); });\n return _ogFallbackFetch;\n}\n// Warm the cache once the page is idle so shares feel instant.\nif (typeof window !== \'undefined\'){\n if (document.readyState === \'complete\') setTimeout(prefetchOgFallback, 600);\n else window.addEventListener(\'load\', function(){ setTimeout(prefetchOgFallback, 600); });\n}\nfunction ogFallbackFiles(){ if (!OG_FALLBACK_FILE) prefetchOgFallback(); return OG_FALLBACK_FILE ? [OG_FALLBACK_FILE] : undefined; }\n\nfunction shareCollective(surface){\n let text, url = memorialShareWebUrl();\n const rank = userRankNumber();\n if(rank != null){\n text = "I\'m the " + rank.toLocaleString() + ordinalSuffix(rank) +\n " to light a candle for America\'s fallen heroes this Memorial Day. \ud83d\udd6f Click here to pay your respects";\n } else {\n text = globalTotal().toLocaleString() + " Americans have lit a candle for our fallen heroes this Memorial Day. \ud83d\udd6f Click here to pay your respects";\n }\n const files = undefined;\n const m = _shareMeta(surface||\'collective\', \'generic\', null, files);\n unifiedShare({title:\'Memorial Day Tribute\', text:text, url:url, files:files,\n surface:m.surface, context:m.context, heroId:m.hero_id}, \'Invitation copied to clipboard\');\n}\n\n// Primary conflicts shown as tabs; rest hidden in "More"\nconst PRIMARY = [\'All\',\'World War I\',\'World War II\',\'Korean War\',\'Vietnam War\',\'Iraq\',\'Afghanistan\'];\nconst TAB_LABELS = {\'All\':\'All\',\'World War I\':\'WWI\',\'World War II\':\'WWII\',\'Korean War\':\'Korea\',\n \'Vietnam War\':\'Vietnam\',\'Iraq\':\'Iraq\',\'Afghanistan\':\'Afghanistan\'};\n// A hero\'s era(s) for filtering/search. Most have one (conflict); a few who\n// served across multiple wars carry a conflicts array so they surface under\n// every era chip. The single conflict value stays the label shown on the card.\nfunction heroConflicts(h){ return h.conflicts || [h.conflict]; }\nfunction buildTabs(){\n const allConflicts = new Set();\n HEROES.forEach(h=>heroConflicts(h).forEach(c=>allConflicts.add(c)));\n const container = document.getElementById(\'filterTabs\');\n container.innerHTML = \'\';\n\n PRIMARY.forEach(f=>{\n if(f!==\'All\' && !allConflicts.has(f)) return; // skip if no heroes\n const d = document.createElement(\'div\');\n d.className = \'ftab\' + (f===activeFilter?\' active\':\'\');\n d.textContent = TAB_LABELS[f]||f;\n d.onclick = ()=>setFilter(f,d);\n container.appendChild(d);\n });\n}\n\nfunction setFilter(f, el){\n activeFilter=f;\n buildTabs(); // rebuild to update active state\n applyFilters();\n}\nfunction onSearch(){\n const q=document.getElementById(\'srchIn\').value.trim();\n document.getElementById(\'sClear\').classList.toggle(\'on\',q.length>0);\n applyFilters();\n}\nfunction clearSrch(){\n document.getElementById(\'srchIn\').value=\'\';\n document.getElementById(\'sClear\').classList.remove(\'on\');\n applyFilters();\n}\nfunction applyFilters(){\n const q=document.getElementById(\'srchIn\').value.trim().toLowerCase();\n // Keyword search: split into tokens and require each to appear somewhere in\n // the card\'s combined text (name + story + era(s) + branch + tags), so any\n // mix of keywords in any order finds the card (e.g. "vietnam pilot").\n const tokens = q ? q.split(/\\s+/) : [];\n const SOURCE = activeLayer === \'fallen\' ? FALLEN : SERVED;\n filtered=SOURCE.filter(h=>{\n const matchConflict = activeFilter===\'All\' || heroConflicts(h).includes(activeFilter);\n if(!matchConflict)return false;\n if(!tokens.length)return true;\n const hay = (h.name+\' \'+h.story+\' \'+heroConflicts(h).join(\' \')+\' \'+(h.branch||\'\')+\' \'+h.tags.join(\' \')).toLowerCase();\n return tokens.every(t=>hay.includes(t));\n });\n page=1;renderCards();\n}\n\nfunction makePhotoEl(h,size,className){\n // v34: always create an <img> tagged with hero id, so async photo injection\n // can swap the src once heroes_photos.js loads. If photo isn\'t ready yet, we\n // render the letter-placeholder SVG inline as the initial src (no broken icon).\n const img=document.createElement(\'img\');\n img.className=className;
1\n img.alt=h.name;\n img.style.width=size+\'px\';img.style.height=size+\'px\';\n img.setAttribute(\'data-hero-photo-id\', String(h.id));\n img.onerror=function(){\n const fallback=makeFallbackPhoto(h,size,className);\n if(this.parentNode)this.parentNode.replaceChild(fallback,this);\n };\n if(h.photo){\n img.src=h.photo;\n } else {\n // Render letter placeholder as inline SVG data URI\n img.src = makeFallbackPhotoDataURI(h, size);\n }\n return img;\n}\n// Monogram letters for the avatar fallback. Honors an explicit initials\n// override (e.g. "M&A" for a couple); otherwise first+last name initial.\nfunction heroInitials(h){\n if(h.initials) return h.initials.toUpperCase();\n const parts = h.name.replace(/^(Pvt\\.|Cpl\\.|Sgt\\.|Lt\\.|Cpt\\.|Capt\\.|Maj\\.|Col\\.|Gen\\.|Adm\\.|Cmdr\\.|MSgt\\.|SSgt\\.|Pfc\\.|SFC|Staff Sgt\\.|1st Lt\\.|2nd Lt\\.|Sgt\\. 1st Class|Sgt\\. Maj\\.|Spc\\.|Spec\\. 5|Brig\\. Gen\\.|Maj\\. Gen\\.|Lt\\. Col\\.|Petty Officer[^\\s]*|SCPO|SGM|LCpl\\.|1st Sgt\\.|Lieutenant|Corporal|Sergeant)\\s+/,\'\').split(/\\s+/).filter(p=>p.length>0 && p!==\'Jr.\' && p!==\'III\' && p!==\'II\');\n const s = parts.length>=2 ? parts[0][0]+parts[parts.length-1][0] : (parts.length===1 ? parts[0].substring(0,2) : \'US\');\n return s.toUpperCase();\n}\nfunction makeFallbackPhotoDataURI(h, size){\n const initials = heroInitials(h);\n // Inline SVG: dark navy background, gold letters, gold border\n const fs = initials.length >= 3 ? 22 : 32; // shrink for multi-person monograms like "M&A"\n const svg = \'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100">\' +\n \'<rect width="100" height="100" rx="8" fill="#1a2138" stroke="#c9a84c" stroke-width="1.5"/>\' +\n \'<text x="50" y="50" text-anchor="middle" dy=".35em" fill="#c9a84c" font-family="Georgia, serif" font-weight="600" font-size="\' + fs + \'">\' + initials + \'</text>\' +\n \'</svg>\';\n return \'data:image/svg+xml;utf8,\' + encodeURIComponent(svg);\n}\nfunction makeFallbackPhoto(h,size,className){\n const initials = heroInitials(h);\n\n // Branch-specific insignia (SVG paths)\n const branch = (h.branch||\'\').toLowerCase();\n let insignia = \'\';\n if(branch.includes(\'marine\')){\n // Marine globe+anchor simplified\n insignia = \'<g opacity=".22" transform="translate(50,50)"><circle r="18" fill="none" stroke="#C9A84C" stroke-width="1.5"/><path d="M-12 -8 Q0 0 12 -8 M-12 8 Q0 0 12 8" stroke="#C9A84C" stroke-width="1" fill="none"/><path d="M-2 -22 L-2 -8 M2 -22 L2 -8" stroke="#C9A84C" stroke-width="2"/></g>\';\n } else if(branch.includes(\'navy\') || branch.includes(\'seal\')){\n // Anchor\n insignia = \'<g opacity=".22" transform="translate(50,50)"><path d="M0 -20 L0 18 M-14 10 Q0 22 14 10 M-5 -20 Q0 -25 5 -20" stroke="#C9A84C" stroke-width="2" fill="none" stroke-linecap="round"/><circle cy="-20" r="3" fill="none" stroke="#C9A84C" stroke-width="1.5"/></g>\';\n } else if(branch.includes(\'air\')){\n // Wings\n insignia = \'<g opacity=".22" transform="translate(50,50)"><path d="M-22 0 Q-15 -3 -8 0 Q0 -2 8 0 Q15 -3 22 0" stroke="#C9A84C" stroke-width="2" fill="none"/><circle r="3" fill="#C9A84C"/><path d="M-22 4 Q-15 2 -8 4 Q0 3 8 4 Q15 2 22 4" stroke="#C9A84C" stroke-width="1" fill="none"/></g>\';\n } else {\n // Army star (default)\n insignia = \'<g opacity=".22" transform="translate(50,50)"><polygon points="0,-22 5,-7 21,-7 8,3 13,18 0,9 -13,18 -8,3 -21,-7 -5,-7" fill="#C9A84C"/></g>\';\n }\n \n const fontSize = Math.max(14, size/(initials.length>=3?4.2:2.8));\n const svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" style="width:${size}px;height:${size}px;border-radius:6px;flex-shrink:0;display:block">\n <defs>\n <radialGradient id="bg${h.id}" cx="35%" cy="25%">\n <stop offset="0%" stop-color="#3a4668"/>\n <stop offset="60%" stop-color="#1a2442"/>\n <stop offset="100%" stop-color="#0a1020"/>\n </radialGradient>\n </defs>\n <rect x="1" y="1" width="98" height="98" rx="8" ry="8" fill="url(#bg${h.id})" stroke="#C9A84C" stroke-width="1.5" stroke-opacity=".7"/>\n ${insignia}\n <text x="50" y="${50 + fontSize/3}" text-anchor="middle" font-family="Cinzel, Georgia, serif" font-weight="700" font-size="${fontSize}" fill="#C9A84C" letter-spacing="1" style="text-shadow:0 1px 3px rgba(0,0,0,.9)">${initials}</text>\n </svg>`;\n \n const wrap = document.createElement(\'span\');\n wrap.style.cssText = `display:inline-flex;width:${size}px;height:${size}px;flex-shrink:0`;\n wrap.innerHTML = svg;\n return wrap;\n}\n\nfunction renderCards(){\n const w=document.getElementById(\'cardsWrap\');
1\n const nr=document.getElementById(\'noR\');\n const lm=document.getElementById(\'loadMore\');\n w.innerHTML=\'\';\n if(!filtered.length){nr.style.display=\'block\';lm.style.display=\'none\';return;}\n nr.style.display=\'none\';\n const limit=page===1?PAGE_INIT:PAGE_MAX;const slice=filtered.slice(0,limit);\n slice.forEach((h,i)=>{\n const d=document.createElement(\'div\');\n d.className=\'card\';\n d.style.cssText=\'opacity:0;transform:translateY(10px);transition:opacity .4s \'+(i*.04)+\'s,transform .4s \'+(i*.04)+\'s\';\n\n const head=document.createElement(\'div\');head.className=\'card-head\';\n const photo=makePhotoEl(h,56,\'card-photo\');\n const info=document.createElement(\'div\');info.className=\'card-info\';\n info.innerHTML=\'<div class="card-name">\'+h.name+\'</div>\'+\n \'<div class="card-sub">\'+h.conflict+(h.branch?\' \xb7 \'+h.branch:\'\')+\'</div>\';\n head.appendChild(photo);head.appendChild(info);\n\n // v23: HOOK story line \u2014 short, emotional 1-liner\n const hook = document.createElement(\'div\');\n hook.className = \'card-hook\';\n hook.textContent = \'"\' + extractHook(h) + \'"\';\n\n const meta=document.createElement(\'div\');meta.className=\'card-meta\';
1\n h.tags.forEach(t=>{\n const s=document.createElement(\'span\');\n s.className=\'tag tag-honor\';\n s.textContent=t;\n s.onclick=(e)=>{e.stopPropagation();showHonorInfo(t,s);};\n meta.appendChild(s);\n });\n if(h.pendingReview){\n const pb=document.createElement(\'span\');\n pb.className=\'pending-badge\';\n pb.textContent=\'Pending review\';\n meta.appendChild(pb);\n }\n\n // v23: softer action row \u2014 "Honored by X" + "Pay Respects"\n const actionRow = document.createElement(\'div\');\n actionRow.className = \'card-action-row\';\n\n const candleCount = document.createElement(\'div\');\n candleCount.className = \'card-candle-count\';\n candleCount.id = \'ccount-\'+h.id;\n const lit = isLitFor(h.id);\n const cnt = getCandleCount(h);\n candleCount.innerHTML = lit\n ? \'<span class="ccount-flame">\'+poppyImg(20)+\'</span> You + <span class="ccount-num">\'+formatNum(cnt-1)+\'</span> others\'\n : \'<span class="ccount-flame">\'+poppyImg(20)+\'</span> Honored by <span class="ccount-num">\'+formatNum(cnt)+\'</span>\';\n\n const btnLight = document.createElement(\'button\');\n btnLight.className = \'btn-card-light\' + (lit ? \' lit\' : \'\');\n btnLight.id = \'cbtn-\'+h.id;\n btnLight.type = \'button\';\n if(lit) prefetchHeroCardFile(h); // already honored: warm card for "Share tribute" tap\n btnLight.innerHTML = lit\n ? SHARE_TRIBUTE_BTN\n : \'Pay Respects\';\n btnLight.onclick = (e) => {\n e.stopPropagation();\n if (lit || isLitFor(h.id)) {\n // already honored \u2014 share instead of nothing\n shareHonoredHero(h);\n } else {\n lightCandleForHero(h, btnLight, d);\n }\n };\n\n actionRow.appendChild(candleCount);\n actionRow.appendChild(btnLight);\n\n const report = document.createElement(\'button\');\n report.className = \'card-report\';\n report.type = \'button\';\n report.setAttribute(\'aria-label\',\'Report this tribute\');\n report.title = \'Report\';\n report.innerHTML = \'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 21V4"/><path d="M4 4h13l-2 4 2 4H4"/></svg>\';\n report.onclick = (e)=>{ e.stopPropagation(); reportHero(h); };\n\n d.appendChild(head);d.appendChild(hook);d.appendChild(meta);d.appendChild(actionRow);d.appendChild(report);\n d.onclick=()=>openCard(h);\n w.appendChild(d);\n requestAnimationFrame(()=>{d.style.opacity=\'1\';d.style.transform=\'translateY(0)\';});\n });\n // Show refresh prompt instead of \'Load more\' when at PAGE_MAX\n if(filtered.length > slice.length && page === 1){\n lm.textContent = \'Load more heroes\';\n lm.onclick = loadMore;\n lm.style.display = \'block\';\n } else if(filtered.length > slice.length && page >= 2){\n lm.innerHTML = \'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:6px"><path d="M23 4v6h-6"/><path d="M1 20v-6h6"/><path d="M3.51 9a9 9 0 0114.85-3.36L23 10"/><path d="M1 14l4.64 4.36A9 9 0 0020.49 15"/></svg>Refresh for more heroes\';\n lm.onclick = function(){ shuffleHeroes(); };\n lm.style.display = \'block\';\n } else {\n lm.style.display = \'none\';\n }\n}\nfunction loadMore(){page=2;renderCards();}\n\nfunction reportHero(h){\n if(!confirm(\'Report this tribute for review?\\n\\nFlagged content is sent to our moderation team for re-review.\')) return;\n showToast(\'Thank you \u2014 this tribute has been flagged for review.\');\n}\n\nlet currentHero = null;\nlet currentThought = \'\';\nconst OFFICIAL_SOURCE = \'Source: U.S. Department of Defense / Congressional Medal of Honor Society / National Archives\';\n// Shared "share" glyph (3 nodes + 2 links). SHARE_ICON_SVG = icon-only; SHARE_TRIBUTE_BTN = icon + label.\nconst SHARE_PATHS = \'<circle cx="14" cy="4" r="2"/><circle cx="4" cy="9" r="2"/><circle cx="14" cy="14" r="2"/><line x1="6" y1="10" x2="12" y2="13"/><line x1="12" y1="5" x2="6" y2="8"/>\';
1\nconst SHARE_ICON_SVG = \'<svg width="16" height="16" viewBox="0 0 18 18" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\'+SHARE_PATHS+\'</svg>\';\nconst SHARE_TRIBUTE_BTN = \'<svg viewBox="0 0 18 18" style="width:13px;height:13px;display:inline;vertical-align:-2px;margin-right:5px;fill:none;stroke:currentColor;stroke-width:2">\'+SHARE_PATHS+\'</svg>Share tribute\';\nfunction openCard(h, surface){\n currentHero = h;\n currentThought = \'\';\n prefetchHeroCardFile(h); // warm the per-hero card jpg so Share carries it\n track(\'ms_hero_view\', {\n hero_id: String(h.id), hero_name: h.name,\n conflict: h.conflict||null, branch: h.branch||null,\n category: h.category||null, surface: surface||\'wall\'\n });\n const pw=document.getElementById(\'dPhotoWrap\');\n pw.innerHTML=\'\';\n if(h.photo){\n const img=document.createElement(\'img\');\n img.className=\'detail-photo\';img.alt=h.name;\n img.onerror=function(){\n const fb=makeFallbackPhoto(h,140,\'detail-photo\');\n fb.style.width=\'140px\';fb.style.height=\'140px\';fb.style.fontSize=\'48px\';\n if(this.parentNode)this.parentNode.replaceChild(fb,this);\n };\n img.src=h.photo;\n pw.appendChild(img);\n } else {\n const fb=makeFallbackPhoto(h,140,\'detail-photo\');\n fb.style.width=\'140px\';fb.style.height=\'140px\';fb.style.fontSize=\'48px\';\n pw.appendChild(fb);\n }\n document.getElementById(\'dName\').textContent=h.name;\n document.getElementById(\'dDates\').textContent=heroDates(h)+\' \xb7 \'+h.conflict+(h.branch?\' \xb7 \'+h.branch:\'\');\n document.getElementById(\'dMedal\').innerHTML=\'\';\n document.getElementById(\'dStory\').textContent=h.story;\n document.getElementById(\'dTags\').innerHTML=\'\';
1h.tags.forEach(t=>{const s=document.createElement(\'span\');s.className=\'tag tag-honor\';s.textContent=t;s.onclick=(e)=>{e.stopPropagation();showHonorInfo(t,s);};document.getElementById(\'dTags\').appendChild(s);});\n // UGC isn\'t from official records \u2014 don\'t claim DoD/NARA provenance.\n document.getElementById(\'dSource\').textContent = h.ugc ? \'Submitted by a loved one\' : OFFICIAL_SOURCE;\n document.getElementById(\'dCandleNum\').textContent = formatNum(getCandleCount(h));\n\n // Update Light a Candle button state based on whether user has already lit\n const btn = document.getElementById(\'btnDetailLight\');\n const btnLabel = document.getElementById(\'btnDetailLightLabel\');\n const btnIcon = document.getElementById(\'btnDetailIcon\');\n if(isLitFor(h.id)){\n btn.classList.add(\'done\');\n btnLabel.textContent = \'Share tribute\';\n if(btnIcon) btnIcon.innerHTML = SHARE_ICON_SVG;\n btn.onclick = () => shareHonoredHero(h); // already honored \u2192 share, not re-light\n } else {\n btn.classList.remove(\'done\');\n btnLabel.textContent = \'Pay Respects\';\n if(btnIcon) btnIcon.innerHTML = poppyImg(24, \'margin-right:2px\');\n btn.onclick = () => lightCandleFromDetail();\n }\n\n open_(\'cardOv\');\n}\nfunction open_(id){document.getElementById(id).classList.add(\'open\');}\nfunction close_(id){document.getElementById(id).classList.remove(\'open\');}\nfunction close_tcard(){document.getElementById(\'tcardOv\').classList.remove(\'open\');}\n\n// \u2500\u2500\u2500 v22: CANDLE LIGHTING SYSTEM \u2500\u2500\u2500\n// Per-hero lit state lives only in localStorage (no server backing). Cached\n// in memory so isLitFor() doesn\'t re-parse on every wall render.\nlet _litMap = null;\nfunction getLitMap(){\n if(_litMap) return _litMap;\n try { _litMap = JSON.parse(localStorage.getItem(\'m_lit_heroes\') || \'{}\'); }\n catch(e){ _litMap = {}; }\n return _litMap;\n}\nfunction saveLitMap(m){\n _litMap = m;\n try { localStorage.setItem(\'m_lit_heroes\', JSON.stringify(m)); } catch(e){}\n}\nfunction isLitFor(heroId){\n return !!getLitMap()[heroId];\n}\nfunction markLitFor(heroId, thought, source){\n const m = getLitMap();\n const isNew = !m[heroId];\n m[heroId] = { ts: Date.now(), thought: thought || \'\' };\n saveLitMap(m);\n if(isNew){\n // Per-hero count is local-only: seed in HEROES + this user\'s own lights.\
1n // The new /quiz/action API is reserved for the global candle counter.\n serverHeroes[heroId] = (serverHeroes[heroId] || 0) + 1;\n track(\'ms_hero_honor\', {\n hero_id: String(heroId), source: source||\'unknown\',\n has_thought: !!(thought && String(thought).trim().length)\n });\n }\n}\n\n// UGC tributes carry service years (not birth/death); label them "Served YYYY\u2013YYYY"\n// (or just "Served" when no years were given) so the card never reads them as a lifespan.\nfunction heroDates(h){\n if(h.ugc){\n return h.serviceStart ? \'Served \' + h.serviceStart + (h.serviceEnd ? \'\u2013\' + h.serviceEnd : \'\') : \'Served\';\n }\n return (h.birth||\'?\') + \' \u2013 \' + (h.death||\'Living\');\n}\n\nfunction getCandleCount(h){\n const real = Math.max(serverHeroes[h.id] || 0, isLitFor(h.id) ? 1 : 0);\n // UGC tributes start at a small per-card baseline, then climb with real honors only.\n if(h.ugc) return (h.baseTributes != null ? h.baseTributes : 7) + real;\n const seed = (h.id * 1373) % 9000;\n let base = 80 + seed; // base seeded count\n if(h.medal && /Medal of Honor/i.test(h.medal)) base += 4000 + (seed % 3000);\n return base + real;\n}\n\nfunction formatNum(n){\n if(n >= 1000) return (n/1000).toFixed(1).replace(/\\.0$/, \'\') + \'k\';\n return n.toString();\n}\n\n// QUICK action: light candle directly from a wall card (no detail open)\nfunction lightCandleForHero(h, btnEl, cardEl){\n if(isLitFor(h.id)) return;\n markLitFor(h.id, \'\', \'wall\'); // no thought from quick action\n prefetchHeroCardFile(h); // wall-honor flow never opens detail \u2014 warm card now\n // visual feedback on button\n btnEl.classList.add(\'lit\');\n btnEl.innerHTML = SHARE_TRIBUTE_BTN;\n // count update \u2014 show "You + X others"\n const ccountEl = document.getElementById(\'ccount-\'+h.id);\n if(ccountEl){\n ccountEl.innerHTML = \'<span class="ccount-flame">\'+poppyImg(20)+\'</span> You + <span class="ccount-num">\'+formatNum(getCandleCount(h)-1)+\'</span> others\';\n }\n // flame burst animation\n if(cardEl){\n const burst = document.createElement(\'span\');\n burst.className = \'flame-burst\';\n burst.innerHTML = poppyImg(48);\n const rect = btnEl.getBoundingClientRect();\n const cardRect = cardEl.getBoundingClientRect();\n burst.style.left = (rect.left - cardRect.left + rect.width/2 - 14) + \'px\';\n burst.style.top = (rect.top - cardRect.top - 12) + \'px\';\n cardEl.style.position = \'relative\';\n cardEl.appendChild(burst);\n setTimeout(()=>burst.remove(), 700);\n }\n // open the share tribute card after a brief moment\n setTimeout(()=>{\n currentHero = h; // ensure share function knows the hero\n showTributeCard(h, \'\');\n }, 450);\n}\n\n// FROM DETAIL: light candle (and optionally include a thought)\nfunction lightCandleFromDetail(){\n const h = currentHero;\n if(!h) return;\n if(isLitFor(h.id)){\n // already lit -- just show tribute card again\n const stored = getLitMap()[h.id];\n showTributeCard(h, (stored && stored.thought) || \'\');\n return;\n }\n // Pay Respects lights immediately and goes straight to the tribute card.\n const btn = document.getElementById(\'btnDetailLight\');\n const btnLabel = document.getElementById(\'btnDetailLightLabel\');\n markLitFor(h.id, \'\', \'detail\');\n btn.classList.add(\'done\');\n btnLabel.textContent = \'Share tribute\';\n // Switch icon + hijack click\n const btnIcon = document.getElementById(\'btnDetailIcon\');\n if(btnIcon){\n btnIcon.innerHTML = SHARE_ICON_SVG;\n }\n btn.onclick = () => shareHonoredHero(h);\n\n // bump count\n document.getElementById(\'dCandleNum\').textContent = formatNum(getCandleCount(h));\n // sync wall card if visible\n const ccountEl = document.getElementById(\'ccount-\'+h.id);\n if(ccountEl){\n ccountEl.innerHTML = \'<span class="ccount-flame">\'+poppyImg(20)+\'</span> You + <span class="ccount-num">\'+formatNum(getCandleCount(h)-1)+\'</span> others\';\n }\n const wallBtn = document.getElementById(\'cbtn-\'+h.id);\n if(wallBtn){\n wallBtn.classList.add(\'lit\');\n wallBtn.innerHTML = SHARE_TRIBUTE_BTN;\n // Replace onclick so subsequent clicks trigger share, not re-honor\n wallBtn.onclick = (e) => { e.stopPropagation(); shareHonoredHero(h); };\n }\n\n // close detail and show tribute card\n setTimeout(()=>{\n close_(\'cardOv\');\n setTimeout(()=>showTributeCard(h, \'\'), 200);\n }, 300);\n}\n\n// SHOW the shareable tribute card with the hero + thought\nfunction showTributeCard(h, thought){\n // photo\n const pf = document.getElementById(\'tcardPhoto\');\n pf.innerHTML = \'\';\n if(h.photo){\n const img = document.createElement(\'img\');\n img.src = h.photo;\n img.alt = h.name;\n img.onerror = function(){\n const fb = makeFallbackPhoto(h, 96, \'fallback-photo\');\n if(this.parentNode) this.parentNode.replaceChild(fb, this);\n };\n pf.appendChild(img);\n } else {\n const fb = makeFallbackPhoto(h, 96, \'fallback-photo\');\n pf.appendChild(fb);\n }\n document.getElementById(\'tcardName\').textContent = h.name;\n let meta = \'\';\n if(h.ugc || h.birth || h.death) meta += heroDates(h);\n if(h.conflict) meta += (meta?\' \xb7 \':\'\') + h.conflict;\n if(h.branch) meta += \' \xb7 \' + h.branch;\n document.getElementById(\'tcardMeta\').textContent = meta;\n document.getElementById(\'tcardThought\').textContent = thought || \'Thank you for your service\';\n\n // v33: set the poppy image at card center\n const poppySrc = window.MEMORIAL_ASSETS.poppy;\n const poppyEl = document.getElementById(\'tcardPoppy\');\n if(poppyEl){\n poppyEl.src = poppySrc;\n poppyEl.style.display = \'block\';\n }\n // v33: watercolor poppies decoration in the corner\n const waterSrc = (window.MEMORIAL_ASSETS && window.MEMORIAL_ASSETS.poppyWatercolor) || \'\';
1\n const waterEl = document.getElementById(\'tcardWatermark\');\n if(waterEl && waterSrc){\n waterEl.src = waterSrc;\n } else if(waterEl){\n waterEl.style.display = \'none\';\n }\n\n document.getElementById(\'tcardOv\').classList.add(\'open\');\n}\n\n// SHARE the tribute card\nfunction shareTributeCard(){\n const h = currentHero;\n if(!h){ shareGeneric(); return; }\n const url = buildHeroShareUrl(h);\n const title = \'In memory of \' + h.name;\n const text = \'I paid my respects to \' + h.name +\n \' on the NewsBreak Memorial Wall, heroes are never forgotten.\';\n const files = heroCardFiles(h);\n const m = _shareMeta(\'hero_card\', \'hero\', h.id, files);\n unifiedShare({title, text, url, files, surface:m.surface, context:m.context, heroId:m.hero_id}, \'Tribute link copied to clipboard\');\n}\nfunction shareGeneric(){\n const files = undefined;\n const m = _shareMeta(\'collective\', \'generic\', null, files);\n unifiedShare({title:\'Memorial Day Tribute\', text:\'Honoring fallen heroes this Memorial Day.\',\n url: memorialShareWebUrl(),\n files:files, surface:m.surface, context:m.context, heroId:m.hero_id}, \'Link copied to clipboard\');\n}\n\nfunction scrollToWall(){\n const wall = document.querySelector(\'.wall\');\n if(wall){ wall.scrollIntoView({behavior:\'smooth\', block:\'start\'}); }\n}\n\ndocument.querySelectorAll(\'.overlay\').forEach(el=>{\n el.addEventListener(\'click\',function(e){if(e.target===this)this.classList.remove(\'open\');});\n});\nfunction openForm(source){ track(\'ms_nominate_open\', { source: source||\'unknown\' }); open_(\'formOv\'); }\nfunction updChar(){document.getElementById(\'charLeft\').textContent=150-document.getElementById(\'fStory\').value.length;}\n// Photo crop state\nlet cropImg = null; // the loaded Image\nlet cropState = { offsetX: 0, offsetY: 0, scale: 1, minScale: 1 };\nlet cropDrag = null; // {startX, startY, origX, origY}\n\nfunction prevPhoto(e){\n const f=e.target.files[0];\n if(!f)return;\n if(f.size > 5*1024*1024){alert(\'Photo must be under 5MB\');return;}\n const r = new FileReader();\n r.onload = ev => {\n const img = new Image();\n img.onload = () => {\n cropImg = img;\n // Initial fit: scale so smaller dimension fills 240\n const s = 240 / Math.min(img.width, img.height);\n cropState.minScale = s;\n cropState.scale = s;\n // Center the image\n cropState.offsetX = (240 - img.width * s) / 2;\n cropState.offsetY = (240 - img.height * s) / 2;\n // Reset zoom slider\n document.getElementById(\'photoZoom\').min = s.toFixed(3);\n document.getElementById(\'photoZoom\').max = (s * 3).toFixed(3);\n document.getElementById(\'photoZoom\').step = 0.001;\n document.getElementById(\'photoZoom\').value = s.toFixed(3);\n // Show crop UI, hide drop\n document.getElementById(\'photoDropWrap\').style.display = \'none\';\n const cw = document.getElementById(\'photoCropWrap\');\n cw.style.display = \'flex\';\n redrawCrop();\n attachCropDrag();\n };\n img.src = ev.target.result;\n };
1\n r.readAsDataURL(f);\n}\n\nfunction redrawCrop(){\n if(!cropImg)return;\n const canvas = document.getElementById(\'photoCropCanvas\');\n const ctx = canvas.getContext(\'2d\');\n // Update scale from slider\n const zoomSlider = document.getElementById(\'photoZoom\');\n const newScale = parseFloat(zoomSlider.value);\n if(Math.abs(newScale - cropState.scale) > 0.001){\n // Zoom around center\n const cx = 120, cy = 120;\n const ratio = newScale / cropState.scale;\n cropState.offsetX = cx - (cx - cropState.offsetX) * ratio;\n cropState.offsetY = cy - (cy - cropState.offsetY) * ratio;\n cropState.scale = newScale;\n }\n clampOffsets();\n ctx.fillStyle = \'#0a0f1a\';\n ctx.fillRect(0, 0, 240, 240);\n ctx.drawImage(\n cropImg,\n cropState.offsetX,\n cropState.offsetY,\n cropImg.width * cropState.scale,\n cropImg.height * cropState.scale\n );\n}\n\nfunction clampOffsets(){\n const w = cropImg.width * cropState.scale;\n const h = cropImg.height * cropState.scale;\n // Image must cover canvas \u2014 offsets constrained so image edges don\'t show inside canvas\n if(cropState.offsetX > 0) cropState.offsetX = 0;\n if(cropState.offsetY > 0) cropState.offsetY = 0;\n if(cropState.offsetX + w < 240) cropState.offsetX = 240 - w;\n if(cropState.offsetY + h < 240) cropState.offsetY = 240 - h;\n}\n\nfunction attachCropDrag(){\n const wrap = document.querySelector(\'.crop-canvas-wrap\');\n if(wrap._dragAttached) return;\n wrap._dragAttached = true;\n const onStart = (e) => {\n e.preventDefault();\n const p = getPoint(e);\n cropDrag = { startX: p.x, startY: p.y, origX: cropState.offsetX, origY: cropState.offsetY };\n };\n const onMove = (e) => {\n if(!cropDrag) return;\n e.preventDefault();\n const p = getPoint(e);\n cropState.offsetX = cropDrag.origX + (p.x - cropDrag.startX);\n cropState.offsetY = cropDrag.origY + (p.y - cropDrag.startY);\n redrawCrop();\n };\n const onEnd = () => { cropDrag = null; };\n const getPoint = (e) => {\n if(e.touches && e.touches[0]) return { x: e.touches[0].clientX, y: e.touches[0].clientY };\n return { x: e.clientX, y: e.clientY };\n };\n wrap.addEventListener(\'mousedown\', onStart);\n window.addEventListener(\'mousemove\', onMove);\n window.addEventListener(\'mouseup\', onEnd);\n wrap.addEventListener(\'touchstart\', onStart, {passive:false});\n window.addEventListener(\'touchmove\', onMove, {passive:false});\n window.addEventListener(\'touchend\', onEnd);\n}\n\nfunction retakePhoto(){\n cropImg = null;\n document.getElementById(\'fPhoto\').value = \'\';\n document.getElementById(\'photoCropWrap\').style.display = \'none\';\n document.getElementById(\'photoDropWrap\').style.display = \'block\';\n}\n\n// Returns a data URL of the cropped photo, or \'\' if no photo\nfunction getCroppedPhotoData(){\n if(!cropImg) return \'\';\n const canvas = document.getElementById(\'photoCropCanvas\');\n return canvas.toDataURL(\'image/jpeg\', 0.85);\n}\n// Staged submission: validates form first, then opens Terms sheet for consent\n\n// Preview terms (opened from the form banner, not during submit)\nfunction openTermsPreview(){\n document.getElementById(\'termsOv\').classList.add(\'preview-mode\');\n setTimeout(()=>{\n const body = document.querySelector(\'.terms-body\');\n if(body) body.scrollTop = 0;\n }, 50);\n open_(\'termsOv\');\n}\n\n// Strip preview-mode when closing so normal submit flow still works\nfunction closeTermsSheet(){\n document.getElementById(\'termsOv\').classList.remove(\'preview-mode\');\n close_(\'termsOv\');\n}\n\nfunction submitHero(){\n const name = document.getElementById(\'fName\').value.trim();\n const story = document.getElementById(\'fStory\').value.trim();\n const honorType = document.querySelector(\'input[name="fHonorType"]:checked\');\n const branch = document.getElementById(\'fBranch\').value;\n const era = document.getElementById(\'fEra\').value;\n if(!honorType){alert(\'Please choose who you are honoring.\');return;}\n if(!name){alert(\'Please enter a name.\');return;}\n if(!story){alert(\'Please share their story.\');return;}\n if(!branch){alert(\'Please select a branch of service.\');return;}
1\n if(!era){alert(\'Please select an era or conflict.\');return;}\n // Form is valid \u2014 open the Terms & Consent sheet in full (agreement) mode\n document.getElementById(\'termsOv\').classList.remove(\'preview-mode\');\n document.getElementById(\'fAgree\').checked = false;\n document.getElementById(\'btnAgreeSubmit\').disabled = true;\n // Scroll terms body to top\n setTimeout(()=>{\n const body = document.querySelector(\'.terms-body\');\n if(body) body.scrollTop = 0;\n }, 50);\n open_(\'termsOv\');\n}\n\n// Toggle the Agree & Submit button based on checkbox\nfunction updateAgreeState(){\n const agreed = document.getElementById(\'fAgree\').checked;\n document.getElementById(\'btnAgreeSubmit\').disabled = !agreed;\n}\n\n// v35: Google Form ingest endpoint \u2014 submissions go straight into the linked Sheet\n// for admin (2x daily) review. Approved rows are later ingested back into HEROES.\nconst GFORM_URL = \'https://docs.google.com/forms/d/e/1FAIpQLSe_TT8_jQN9hDDGbMQxU_IIjgmPiUugOJK8lBnUonPsEulDoQ/formResponse\';\nconst GFORM_E = {\n honorType: \'entry.1267983550\', // Fallen / Served\n name: \'entry.1797411936\',\n story: \'entry.2056882716\',\n branch: \'entry.1305080617\',\n era: \'entry.2137895802\',\n rank: \'entry.1451296687\',\n birth: \'entry.901299906\',\n death: \'entry.1568594332\',\n photo: \'entry.1681127655\', // JPEG base64 (~30KB, fits Sheet cell limit)\n email: \'entry.1897003466\',\n meta: \'entry.460531343\', // submittedAt + ua for fraud / debugging\n};\n\nfunction getCroppedPhotoDataForUpload(){\n if(!cropImg) return \'\';\n const canvas = document.getElementById(\'photoCropCanvas\');\n return canvas.toDataURL(\'image/jpeg\', 0.65); // lower quality keeps cell < 50K chars\n}\n\nasync function postToGoogleForm(payload){\n const fd = new FormData();\n for (const [k, v] of Object.entries(payload)) {\n if (v !== null && v !== undefined && v !== \'\') fd.append(k, v);\n }\n // no-cors: Google Form accepts the POST but response is opaque.\n // Network failures still throw, so try/catch around the call still works.\n return fetch(GFORM_URL, { method: \'POST\', mode: \'no-cors\', body: fd });\n}\n\n// User agreed to terms \u2014 submit the nomination to Google Form (\u2192 Sheet \u2192 admin review)\nasync function confirmSubmit(){\n if(!document.getElementById(\'fAgree\').checked) return;\n const name = document.getElementById(\'fName\').value.trim();\n const story = document.getElementById(\'fStory\').value.trim();\n const birth = document.getElementById(\'fBirth\').value;\n const death = document.getElementById(\'fDeath\').value;\n const honorTypeEl = document.querySelector(\'input[name="fHonorType"]:checked\');\n const category = honorTypeEl ? honorTypeEl.value : \'served\';\n const branch = document.getElementById(\'fBranch\').value;\n const era = document.getElementById(\'fEra\').value;\n const rank = document.getElementById(\'fRank\').value.trim();\n const email = document.getElementById(\'fEmail\').value.trim();\n const photoSrc = getCroppedPhotoDataForUpload();\n\n const submitBtn = document.getElementById(\'btnAgreeSubmit\');\n const origLabel = submitBtn.textContent;\n submitBtn.disabled = true;\n submitBtn.textContent = \'Submitting\u2026\';\n\n const payload = {\n [GFORM_E.honorType]: category === \'fallen\' ? \'Fallen\' : \'Served\',\n [GFORM_E.name]: name,\n [GFORM_E.story]: story,\n [GFORM_E.branch]: branch,\n [GFORM_E.era]: era,\n [GFORM_E.rank]: rank,\n [GFORM_E.birth]: birth,\n [GFORM_E.death]: death,\n [GFORM_E.photo]: photoSrc,\n [GFORM_E.email]: email,\n [GFORM_E.meta]: JSON.stringify({\n submittedAt: new Date().toISOString(),\n ua: navigator.userAgent,\n ref: document.referrer || null,\n }),\n };\n\n try {\n await postToGoogleForm(payload);\n } catch(e) {\n submitBtn.disabled = false;\n submitBtn.textContent = origLabel;\n showToast(\'Submission failed \u2014 check your connection and try again.\');\n return;\n }\n\n track(\'ms_nominate_submit\',{ honor_type: category===\'fallen\'?\'Fallen\':\'Served\', has_email:!!email, has_photo:!!photoSrc, branch:branch||null, era:era||null });\n close_(\'termsOv\');\n close_(\'formOv\');\n openSuccessModal(name, !!email);\n // reset form\n document.getElementById(\'fName\').value = \'\';\n document.getElementById(\'fStory\').value = \'\';\n document.getElementById(\'fBirth\').value = \'\';\n document.getElementById(\'fDeath\').value = \'\';\n document.getElementById(\'fBranch\').value = \'\';\n document.getElementById(\'fEra\').value = \'\';\n document.getElementById(\'fRank\').value = \'\';\n document.getElementById(\'fEmail\').value = \'\';
1\n const hf = document.getElementById(\'fHonorFallen\'); if(hf) hf.checked = false;\n const hs = document.getElementById(\'fHonorServed\'); if(hs) hs.checked = false;\n document.getElementById(\'fAgree\').checked = false;\n submitBtn.textContent = origLabel;\n retakePhoto();\n}\n\n// v29: success modal with two variants (email vs no email)\nfunction openSuccessModal(heroName, hasEmail){\n document.getElementById(\'successHeroName\').textContent = heroName;\n const subtext = document.getElementById(\'successSubtext\');\n if(hasEmail){\n subtext.innerHTML = "We\'ll notify you when " + escapeHtml(heroName) + " is reviewed (usually within 1 business day).";\n } else {\n subtext.innerHTML = "Check back in 1 business day to see " + escapeHtml(heroName) + " on the Wall.";\n }\n open_(\'successOv\');\n}\nfunction escapeHtml(s){\n return String(s).replace(/[&<>"\']/g, c => ({\'&\':\'&\',\'<\':\'<\',\'>\':\'>\',\'"\':\'"\',"\'":\''\'}[c]));\n}\nfunction doShare(){\n // No file attachment for collective shares: the link unfurls to the page\'s\n // og:image on every channel, so attaching the banner too would double it up.\n // (Hero/state shares still attach their card image \u2014 that\'s content-specific.)\n const files = undefined;\n const m = _shareMeta(\'bottom_cta\', \'generic\', null, files);\n unifiedShare({title:\'Memorial Day Tribute\', text:\'Honoring fallen heroes this Memorial Day.\',\n url: memorialShareWebUrl(),\n files:files, surface:m.surface, context:m.context, heroId:m.hero_id}, \'Link copied to clipboard\');\n}\n// Per-hero share URL: stub H5 for OG unfurl + attribution query params.\n// card jpg, so Facebook / Messenger / WhatsApp / Twitter / WeChat unfurl the\n// hero card instead of the generic Memorial Day banner. The stub auto-redirects\n// to the canonical page via JS-only redirect (no meta refresh, so social\n// scrapers don\'t follow it and overwrite the og:image).\n// The 82 stubs are pre-rendered from pages/ms/memorial-day-2026/[hero].tsx\n// (getStaticPaths + getStaticProps), so the source of truth is one TS file.\nfunction buildHeroShareUrl(h){\n return memorialHeroShareWebUrl(h);\n}\n// Per-hero card jpg lives on the staticfiles CDN (1200\xd7630 hero card art,\n// pre-rendered alongside the page design). Attached to the iOS/Android native\n// share sheet via Web Share Level 2 so iMessage / WhatsApp / etc. show the\n// real hero card image instead of the generic Memorial Day banner.\nconst CARDS_CDN = \'https://staticfiles.particlenews.com/nwb/memorial-day-full-6eddfc/assets/cards/\';\nfunction buildHeroCardUrl(h){ return CARDS_CDN + encodeURIComponent(h.id) + \'.jpg\'; }\nconst tcardFiles = {};\nasync function prefetchHeroCardFile(h){\n if(!h || tcardFiles[h.id]) return;\n try {\n const res = await fetch(buildHeroCardUrl(h), {cache: \'force-cache\', mode: \'cors\'});\n if(!res.ok) return;\n const blob = await res.blob();\n const slug = (h.name||\'hero\').replace(/[^a-z0-9]+/gi,\'-\').toLowerCase().replace(/^-|-$/g,\'\');\n tcardFiles[h.id] = new File([blob], \'tribute-\'+slug+\'.jpg\', {type: blob.type || \'image/jpeg\'});\n } catch(e){ /* network/CORS \u2014 falls back to OG banner */ }\n}\nfunction heroCardFiles(h){\n return (h && tcardFiles[h.id]) ? [tcardFiles[h.id]] : ogFallbackFiles();\n}\nfunction shareHero(){\n const h = currentHero;\n if(!h) return;\n const url = buildHeroShareUrl(h);\n const dates = heroDates(h);\n const title = \'In memory of \' + h.name;\n const text = \'Honoring \' + h.name + \' (\' + dates + \')\'\n + (h.conflict ? \' \xb7 \' + h.conflict : \'\')\n + (h.branch ? \' \xb7 \' + h.branch : \'\')\n + \' \u2014 read their story this Memorial Day.\';\n const files = ogFallbackFiles();\n const m = _shareMeta(\'hero_detail\', \'hero\', h.id, files);\n unifiedShare({title:title, text:text, url:url, files:files,\n surface:m.surface, context:m.context, heroId:m.hero_id}, \'Tribute link copied to clipboard\');\n}\n\n// v33: Share a hero you already honored ("You honored them" \u2192 "Share tribute")\nfunction shareHonoredHero(h){\n if(!h) return;\n const url = buildHeroShareUrl(h);\n const title = \'In memory of \' + h.name;\n const text = \'I paid my respects to \' + h.name +\n \' on the NewsBreak Memorial Wall, heroes are never forgotten.\';\n const files = heroCardFiles(h);\n const m = _shareMeta(\'after_honor\', \'hero\', h.id, files);\n unifiedShare({title, text, url, files:files,\n surface:m.surface, context:m.context, heroId:m.hero_id}, \'Tribute link copied to clipboard\');\n}\nfunction openHeroFromUrl(){\n const params = new URLSearchParams(location.search);\n const hid = params.get(\'hero\');\n if(!hid) return;\n const idNum = Number(hid);\n const match = HEROES.find(h => String(h.id) === hid || h.id === idNum);\n if(!match) return;\n if(match.category === \'fallen\' || match.category === \'served\'){\n switchLayer(match.category);\n }\n setTimeout(()=>
1openCard(match, \'deep_link\'), 60);\n}\nfunction showToast(m, duration){const t=document.getElementById(\'toast\');t.textContent=m;t.classList.add(\'on\');setTimeout(()=>t.classList.remove(\'on\'),duration||2600);}\n\n// v23: hand-crafted emotional hooks for famous heroes (8-15 words)\nconst HERO_HOOKS = {\n 1: "Saved 75 men at Hacksaw Ridge \u2014 without ever carrying a weapon.",\n 2: "Held off 250 German soldiers alone, at age 19.",\n 3: "Charged a machine gun nest, killed two by hand, captured one.",\n 4: "Held Iwo Jima for four hours with a flamethrower, alone.",\n 5: "Bombed Tokyo four months after Pearl Harbor.",\n 6: "Charged enemy tanks to save his platoon.",\n 7: "Disarmed a grenade with his own body to save his men.",\n 8: "Took out a German pillbox single-handed at Anzio.",\n 9: "Fought a tank with a Browning rifle \u2014 and won.",\n 10: "Fired 12,000 rounds defending Guadalcanal, refused to retreat.",\n 22: "Earned Medal of Honor after being nominated three separate times.",\n};\n\nfunction extractHook(h){\n // 1) Use hand-crafted hook if available\n if(HERO_HOOKS[h.id]) return HERO_HOOKS[h.id];\n // 2) Use explicit hook field if set on the hero object\n if(h.hook) return h.hook;\n // 3) Auto-extract first sentence from story\n if(!h.story) return \'A life given in service.\';\n let s = h.story.trim();\n // Find first sentence boundary\n const m = s.match(/^[^.!?]+[.!?]/);\n let firstSentence = m ? m[0].trim() : s;\n // Trim to ~14 words if too long\n const words = firstSentence.split(/\\s+/);\n if(words.length > 16){\n firstSentence = words.slice(0, 16).join(\' \') + \'\u2026\';\n }\n // Remove trailing period for visual cleanliness\n firstSentence = firstSentence.replace(/[.!?]+$/, \'\');\n return firstSentence;\n}\n\nfunction toggleSearch(){\n const exp=document.getElementById(\'srchExpand\');\n const btn=document.getElementById(\'searchToggle\');\n const open=exp.classList.toggle(\'open\');\n btn.classList.toggle(\'active\',open);\n if(open){\n setTimeout(()=>document.getElementById(\'srchIn\').focus(),300);\n }else{\n document.getElementById(\'srchIn\').value=\'\';\n document.getElementById(\'sClear\').classList.remove(\'on\');\n applyFilters();\n }\n}\ninit();\n',"// === State-wise honor overlay ===\n// Data source: NARA + DoD per-state fatal-casualty rollups (WWII Army & Navy/USMC/USCG,\n// Korea, Vietnam, Persian Gulf). See state-stats.json for per-war methodology notes.\n(function(){\n var STATE_STATS = null; // loaded lazily from /ms/memorial-day-2026/assets/state-stats.json\n var _statsFetch = null; // in-flight fetch promise (memoized; mirrors _ogFallbackFetch above)\n var STORAGE_STATE = 'm_state_code';\n var STORAGE_COUNTS = 'm_state_lit';\n\n function readCounts(){ try { return JSON.parse(localStorage.getItem(STORAGE_COUNTS) || '{}'); } catch(e){ return {}; } }\n function writeCounts(m){ try { localStorage.setItem(STORAGE_COUNTS, JSON.stringify(m)); } catch(e){} }\n // Fuzz the headline count: 24,084 -> \"20K+\", 1,019 -> \"1K+\", 723 -> \"700+\".\n // Page-wide poppy via poppyImg() (defined in main script) keeps the flower\n // styling identical to \"Pay Respects\" / \"Honored by\" rows on hero cards.\n function fuzzy(n){\n if (n >= 10000) return (Math.floor(n / 10000) * 10) + 'K+';\n if (n >= 1000) return Math.floor(n / 1000) + 'K+';\n if (n >= 100) return (Math.floor(n / 100) * 100) + '+';\n return String(n);\n }\n\n function loadStateStats(){\n if (STATE_STATS) return Promise.resolve(STATE_STATS);\n if (_statsFetch) return _statsFetch;\n // v3: bumped after schema change to {total_fallen, by_war} for 5-war coverage\n _statsFetch = fetch('/ms/memorial-day-2026/assets/state-stats.json?v=3', {cache: 'force-cache'})\n .then(function(r){ return r.ok ? r.json() : null; })\n .then(function(data){\n if (!data || !data.states) return null;\n STATE_STATS = data;\n populateStatePicker();\n var saved = localStorage.getItem(STORAGE_STATE);\n if (saved && data.states[saved]) renderStateCard(saved);\n return data;\n })\n .catch(function(){ _statsFetch = null; /* allow retry on next overlay open */ });\n return _statsFetch;\n }\n\n function populateStatePicker(){\n var sel = document.getElementById('stateSelect');\n if (!sel || !STATE_STATS) return;\n if (sel.options.length > 1) return; // already populated\n var codes = Object.keys(STATE_STATS.states).sort(function(a,b){\n return STATE_STATS.states[a].name.localeCompare(STATE_STATS.states[b].name);\n });
1\n codes.forEach(function(code){\n var opt = document.createElement('option');\n opt.value = code;\n opt.textContent = STATE_STATS.states[code].name;\n sel.appendChild(opt);\n });\n var saved = localStorage.getItem(STORAGE_STATE);\n if (saved && STATE_STATS.states[saved]) sel.value = saved;\n }\n\n function renderStateCard(code){\n if (!STATE_STATS || !STATE_STATS.states[code]) return;\n var personal = (readCounts()[code] || 0);\n var s = STATE_STATS.states[code];\n var card = document.getElementById('stateCard');\n if (!card) return;\n card.classList.remove('empty');\n var lit = personal >= 1;\n var byWar = s.by_war || {};\n // Compact breakdown line; merge WWII Army + Navy into one WWII entry\n var wwiiSum = (byWar.wwii_army||0) + (byWar.wwii_navy||0);\n var pieces = [];\n if (wwiiSum) pieces.push('<span class=\"bw\">WWII <span class=\"bn\">' + wwiiSum.toLocaleString() + '</span></span>');\n if (byWar.korea) pieces.push('<span class=\"bw\">Korea <span class=\"bn\">' + byWar.korea.toLocaleString() + '</span></span>');\n if (byWar.vietnam) pieces.push('<span class=\"bw\">Vietnam <span class=\"bn\">' + byWar.vietnam.toLocaleString() + '</span></span>');\n if (byWar.gulf) pieces.push('<span class=\"bw\">Gulf <span class=\"bn\">' + byWar.gulf.toLocaleString() + '</span></span>');\n var breakdown = pieces.join('<span class=\"bsep\">\xb7</span>');\n card.innerHTML =\n '<div class=\"state-flag\">In memory of the heroes from <span class=\"state-name\">' + escapeHtml(s.name) + '</span></div>' +\n (lit\n ? '<div class=\"state-candle-personal lit\">
1' + poppyImg(16) + ' You honored the fallen heroes from ' + escapeHtml(s.name) + '</div>'\n : '<div class=\"state-candle-personal\">Honor the heroes from your state.</div>') +\n '<div class=\"state-stat\">\u2605 <span class=\"state-num\">' + fuzzy(s.total_fallen) + '</span> service members from ' + escapeHtml(s.name) + ' gave their lives defending America</div>' +\n '<div class=\"state-breakdown\">' + breakdown + '</div>' +\n (lit\n ? ''\n : '<button class=\"btn-state-light\" onclick=\"window.lightStateCandle(\\'' + code + '\\')\">' +\n poppyImg(18) +\n 'Pay Respects</button>') +\n '<div class=\"state-source\">Sources: <a href=\"https://www.archives.gov/research/military/ww2/army-casualties\" target=\"_blank\" rel=\"noopener\">NARA</a> & <a href=\"https://www.congress.gov/crs_external_products/RL/PDF/RL32492/RL32492.29.pdf\" target=\"_blank\" rel=\"noopener\">DoD</a> \xb7 WWII\u2013Persian Gulf (1941\u20131991)</div>' +\n '<div class=\"state-actions\">' +\n '<button class=\"btn-state-action\" onclick=\"window.shareStateCard(\\'' + code + '\\')\">' +\n '<svg viewBox=\"0 0 18 18\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">'+SHARE_PATHS+'</svg>' +\n (lit ? 'Share this tribute' : 'Share') + '</button>' +\n '<button class=\"btn-state-action secondary\" onclick=\"window.changeState()\">Change state</button>' +\n '</div>';\n }\n\n window.openStateOverlay = function(){\n track('ms_state_overlay_open', {});\n open_('stateOv');\n loadStateStats();\n };\n // Share the state tribute. URL deep-links back to the page with ?state=<code>\n // so the receiver lands directly in the same overlay. og:image is the page's\n // generic Memorial Day banner (no per-state image exists \u2014 uses fallback by design).\n window.shareStateCard = function(code){\n if (!STATE_STATS || !STATE_STATS.states[code]) return;\n var s = STATE_STATS.states[code];\n var url = memorialShareWebUrl({ state: code });\n var title = 'In memory of the heroes from ' + s.name;\n var text = 'I paid my respects to the heroes from ' + s.name +\n ' on the NewsBreak Memorial Wall. Heroes are never forgotten.';\n var files = ogFallbackFiles();\n var meta = _shareMeta('state_card', 'state', code, files);\n unifiedShare({title:title, text:text, url:url, files:files,\n surface:meta.surface, context:meta.context, heroId:meta.hero_id},\n 'Tribute link copied to clipboard');\n track('ms_state_share', { state: code });\n };\n // Deep-link: ?state=KS auto-opens the overlay pre-selected to that state.\n // Runs once on script load \u2014 the page-level init() block lives in an earlier\n // <script> so we can't rely on it to call us; we self-trigger at the bottom.\n window.openStateFromUrl = function(){\n try {\n var params = new URLSearchParams(location.search);\n var code = (params.get('state') || '').toUpperCase();\n if (!code) return;\n loadStateStats().then(function(){\n if (!STATE_STATS || !STATE_STATS.states[code]) return;\n localStorage.setItem(STORAGE_STATE, code);\n open_('stateOv');\n renderStateCard(code);\n track('ms_state_deeplink', { state: code });\n });\n } catch(e){}\n };\n window.onStateSelected = function(code){\n if (!code) return;\n localStorage.setItem(STORAGE_STATE, code);\n renderStateCard(code);\n track('ms_state_select', { state: code });\n };\n window.changeState = function(){\n var card = document.getElementById('stateCard');\n if (!card) return;\n card.classList.add('empty');\n card.innerHTML =\n '<div class=\"state-picker-prompt\">Choose a different state</div>' +\n '<select class=\"state-select\" id=\"stateSelect\" aria-label=\"Choose your state\" onchange=\"onStateSelected(this.value)\"><option value=\"\">\u2014 Select your state \u2014</option></select>';\n populateStatePicker();\n };\n window.lightStateCandle = function(code){\n if (!STATE_STATS || !STATE_STATS.states[code]) return;\n var m = readCounts();\n if (m[code] && m[code] >= 1) return; // light-once: silently ignore repeat clicks for the same state\n m[code] = 1;\n writeCounts(m);\n renderStateCard(code);\n track('ms_state_candle_lit', { state: code });\n };\n\n // Self-trigger the deep-link handler once the script has registered its helpers.\n // Defer until document is interactive so init()'s analytics get to fire first.\n if (document.readyState === 'loading'){\n document.addEventListener('DOMContentLoaded', window.openStateFromUrl);\n } else {\n window.openStateFromUrl();\n }\n})();\n"],l=t(52322),c="https://fonts.googleapis.com/css2?family=Cinzel:wght@700;900&family=Cormorant+Garamond:wght@400;500&family=Inter:wght@400;500;600&display=swap";function d(){return(0,a.useEffect)((function(){var e=s.map((function(e){var n=document.createElement("script");return n.text=e,document.body.appendChild(n),n}));return function(){var n,t;null===(n=(t=window).__mdTeardown)||void 0===n||n.call(t),e.forEach((function(e){e.parentNode&&e.parentNode.removeChild(e)}))}}),[]),(0,l.jsxs)(l.Fragment,{children:[(0,l.jsxs)(o(),{children:[(0,l.jsx)("link",{rel:"prec
1onnect",href:"https://fonts.googleapis.com"}),(0,l.jsx)("link",{rel:"preconnect",href:"https://fonts.gstatic.com",crossOrigin:""}),(0,l.jsx)("link",{rel:"preconnect",href:"https://staticfiles.particlenews.com",crossOrigin:""}),(0,l.jsx)("link",{rel:"dns-prefetch",href:"https://fonts.googleapis.com"}),(0,l.jsx)("link",{rel:"stylesheet",href:c,media:"print",onLoad:function(e){e.currentTarget.media="all"}}),(0,l.jsx)("noscript",{children:(0,l.jsx)("link",{rel:"stylesheet",href:c})}),(0,l.jsx)("style",{dangerouslySetInnerHTML:{__html:"*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}\n:root{--gold:#C9A84C;--gold-h:#E8C46A;--gold-dark:#7a5a10;--sub:#B0B8C8;--body:#E0E4EC;--card:rgba(255,255,255,0.05);--card-b:rgba(255,255,255,0.1)}\nhtml,body{background:#000;color:#fff;font-family:'Inter',-apple-system,sans-serif;overflow-x:hidden}\n\n/* \u2500\u2500 HERO SECTION: full background image \u2500\u2500 */\n.hero{position:relative;overflow:hidden;text-align:center}\n\n/* v25: INTRO SCREEN \u2014 forces first viewport to show ONLY hero+candle+nominate,\n keeping Honor Wall below the fold to avoid visual competition with the candle action */\n.intro-screen{\n min-height:100vh;\n min-height:100dvh; /* dynamic viewport \u2014 accounts for mobile browser chrome */\n display:flex;\n flex-direction:column;\n background:#000;\n}\n.intro-screen .hero{\n flex:0 0 44vh;\n flex:0 0 44dvh;\n min-height:280px;\n max-height:480px;\n}\n/* candle/count area takes remaining space and centers vertically,\n so on larger screens the candle sits naturally in the middle of the available space rather than glued to the top */\n.intro-screen .black-section{\n flex:1 1 auto;\n display:flex;\n flex-direction:column;\n justify-content:center;\n align-items:center;\n}\n.intro-screen .divider{flex:0 0 auto}\n.intro-screen .nominate-section-v23{flex:0 0 auto}\n\n/* v25: gentle \"scroll for more\" cue between intro and wall */\n.intro-scroll-hint{\n text-align:center;\n background:#000;\n padding:6px 0 18px;\n animation:scrollHintBreathe 2.6s ease-in-out infinite;\n}\n.ish-text{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:12.5px;\n color:rgba(255,255,255,.4);\n letter-spacing:.04em;\n}\n@keyframes scrollHintBreathe{\n 0%,100%{opacity:.6}\n 50%{opacity:1}\n}\n\n/* Background image fills completely, no cropping */\n.flag-bg{\n /* Flag art inlined as a CSS custom property so the LCP element paints during\n style parse, not after the main script executes. */\n --BG:url(\"data:image/jpeg;base64,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\");\n position:absolute;inset:0;\n background-image:var(--BG);\n background-size:cover;\n background-position:center top;\n background-repeat:no-repeat;\n opacity:.52;\n filter:saturate(.78) contrast(1.08) brightness(.92);\n pointer-events:none;\n}\n/* Cinematic gradient + vignette \u2014 transparent top \u2192 deep dark bottom */\n.flag-grad{\n position:absolute;inset:0;\n background:\n radial-gradient(ellipse 80% 60% at 50% 40%, rgba(0,0,0,0) 0%, rgba(0,0,0,.35) 70%, rgba(0,0,0,.75) 100%),\n linear-gradient(180deg,\n rgba(0,0,0,.3) 0%,\n rgba(0,0,0,.15) 28%,\n rgba(0,0,0,.4) 55%,\n rgba(0,0,0,.85) 80%,\n #000 100%);\n pointer-events:none;\n}\n/* Subtle grave-row silhouette anchor at bottom of hero */\n.hero-silhouette{\n position:absolute;\n left:0;right:0;bottom:-1px;\n height:48px;\n pointer-events:none;\n z-index:3;\n opacity:.75;\n}\n.hero-silhouette svg{width:100%;height:100%;display:block}\n/* Subtle film grain \u2014 ambient, cinematic */\n.hero::after{\n content:'';\n position:absolute;inset:0;\n background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .35 0'/></filter><rect width='120' height='120' filter='url(%23n)' opacity='.45'/></svg>\");\n opacity:.25;\n mix-blend-mode:overlay;\n pointer-events:none;\n z-index:4;
1\n}\n\n/* share button \u2014 v24: fixed floating, always visible */\n.topbar{position:fixed;top:14px;right:14px;z-index:90}\n.share-btn{\n background:rgba(0,0,0,.65);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);\n border:1px solid rgba(201,168,76,.45);border-radius:22px;\n color:var(--gold);font-size:12px;font-family:'Inter',sans-serif;font-weight:600;\n padding:8px 16px;cursor:pointer;\n display:flex;align-items:center;gap:6px;letter-spacing:.05em;\n transition:border-color .2s,background .2s,transform .12s;\n box-shadow:0 4px 18px rgba(0,0,0,.55),0 0 0 1px rgba(0,0,0,.2);\n}\n.share-btn:hover{border-color:var(--gold);background:rgba(20,15,5,.75)}\n.share-btn:active{transform:scale(.96)}\n.share-btn svg{width:13px;height:13px;fill:none;stroke:var(--gold);stroke-width:2}\n\n/* \u2500\u2500 v40: Smart App Banner \u2500\u2500 */\n#appBanner{\n position:fixed;top:0;left:0;right:0;z-index:200;\n height:56px;display:flex;align-items:center;padding:0 12px;gap:10px;\n background:linear-gradient(135deg,#160f08 0%,#0d0b09 100%);\n border-bottom:1px solid rgba(201,168,76,.22);\n box-shadow:0 2px 14px rgba(0,0,0,.65);\n transition:transform .3s ease;\n}\n#appBanner.nb-hidden{transform:translateY(-100%);pointer-events:none}\nbody.nb-has-banner{padding-top:56px}\nbody.nb-has-banner .topbar{top:70px}\n.nb-logo-wrap{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:3px}\n.nb-banner-logo{display:block;flex-shrink:0;height:20px;width:auto;max-width:100%}\n.nb-desc{font-family:'Inter',sans-serif;font-size:11px;color:rgba(176,184,200,.75);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.nb-open{\n background:var(--gold);color:#000;font-family:'Inter',sans-serif;\n font-weight:700;font-size:12px;letter-spacing:.04em;\n border:none;border-radius:14px;padding:7px 16px;cursor:pointer;\n text-decoration:none;white-space:nowrap;flex-shrink:0;\n transition:background .15s,transform .1s;\n}\n.nb-open:hover{background:var(--gold-h)}\n.nb-open:active{transform:scale(.96)}\n.nb-close{\n background:none;border:none;color:rgba(176,184,200,.55);\n font-size:20px;line-height:1;cursor:pointer;padding:2px 6px;flex-shrink:0;\n}\n.nb-close:hover{color:rgba(176,184,200,1)}\n\n/* hero content positions\n v32: more aggressive scaling \u2014 title block sits in the lower portion of\n the hero on every screen size, matching iPhone SE proportions.\n The hero is set up with justify-content:flex-end, so growing min-height\n pushes the title down toward the hero's bottom edge. */\n.hero-inner{\n position:relative;z-index:5;\n padding-top:clamp(40px, 14dvh, 140px);\n padding-left:20px;\n padding-right:20px;\n padding-bottom:clamp(18px, 3dvh, 36px);\n min-height:clamp(220px, 38dvh, 380px);\n display:flex;flex-direction:column;align-items:center;justify-content:flex-end;\n}\n\n/* MEMORIAL DAY */\n.main-title{\n display:inline-block;\n font-family:'Cinzel',serif;font-weight:900;\n font-size:clamp(18px, 6.8vw, 36px);\n letter-spacing:.12em;line-height:1.08;\n color:var(--gold);\n text-align:center;white-space:nowrap;\n width:100%;max-width:100%;\n transform:scaleY(.92);\n transform-origin:center bottom;\n text-shadow:\n 0 1px 0 rgba(0,0,0,.75),\n 0 2px 0 var(--gold-dark),\n 0 3px 0 rgba(0,0,0,.7),\n 0 6px 14px rgba(0,0,0,1),\n 0 0 28px rgba(201,168,76,.55),\n 0 0 70px rgba(201,168,76,.28);\n margin-bottom:10px;\n opacity:0;\n animation: titleReveal 1.6s cubic-bezier(.22,.8,.26,1) .1s forwards;\n}\n@keyframes titleReveal{\n 0%{opacity:0;transform:scaleY(.88) translateY(6px);letter-spacing:.18em;filter:blur(2px)}\n 60%{opacity:1;filter:blur(0)}\n 100%{opacity:1;transform:scaleY(.92) translateY(0);letter-spacing:.12em}\n}\n.star{display:inline-block;color:var(--gold-h);font-size:clamp(16px, 5.6vw, 26px);vertical-align:middle;margin:0 .18em;text-shadow:0 0 20px rgba(232,196,106,.9),0 2px 6px rgba(0,0,0,.9)}\n.sub-title{\n font-family:'Cormorant Garamond',serif;font-weight:500;\n font-size:clamp(12px, 3.6vw, 15px);\n color:#EDE0C4;\n margin-bottom:0;\n text-align:center;\n display:flex;flex-direction:column;align-items:center;gap:2px;\n}\n.sub-line{\n display:block;\n letter-spacing:.34em;\n text-shadow:0 1px 6px rgba(0,0,0,1),0 2px 14px rgba(0,0,0,.95);\n opacity:0;\n transform:translateY(4px);\n animation: subLineIn 1.1s cubic-bezier(.22,.8,.26,1) forwards;\n}\n.sub-line-1{animation-delay:.9s}\n.sub-line-2{animation-delay:1.2s}\n.sub-line-3{animation-delay:1.5s}\n@keyframes subLineIn{\n from{opacity:0;transform:translateY(6px);letter-spacing:.22em}\n to{opacity:1;transform:translateY(0);letter-spacing:.34em}\n}\n\n/* black section */\n.black-section{background:#000;padding:18px 20px 18px;text-align:center;position:relative;z-index:2}\n\n/* candle */\n.candle-wrap{display:inline-flex;flex-direction:column;align-items:center;cursor:pointer;margin-bottom:10px;position:relative}\n/* v30: candle height adapts to viewport.\n Aspect ratio preserved (~9:16 like the SVG viewB
1ox).\n clamp() gives min/max safety: tiny screens won't shrink to nothing,\n huge screens won't blow out the layout. */\n.candle-box{\n position:relative;\n height:clamp(140px, 22dvh, 240px);\n aspect-ratio: 88 / 156;\n width:auto;\n margin:0 auto;\n}\n.candle-svg{position:absolute;bottom:0;left:0;width:100%;height:100%;transition:opacity .85s ease;overflow:visible}\n.c-unlit{opacity:1}.c-lit{opacity:0}\n.candle-wrap.lit .c-unlit{opacity:0}\n.candle-wrap.lit .c-lit{opacity:1}\n\n/* Wick red ember \u2014 step 1 of lighting */\n.wick-ember{\n position:absolute;\n bottom:83%; left:50%;\n width:6px;height:6px;\n border-radius:50%;\n background:radial-gradient(circle,#ff4810 0%,#b01800 45%,transparent 75%);\n transform:translateX(-50%) scale(0);\n opacity:0;\n pointer-events:none;\n filter:blur(1.5px);\n z-index:3;\n}\n.candle-wrap.igniting .wick-ember{\n animation: wickEmber .55s ease-out forwards;\n}\n@keyframes wickEmber{\n 0%{opacity:0;transform:translateX(-50%) scale(.4)}\n 50%{opacity:1;transform:translateX(-50%) scale(2.4)}\n 100%{opacity:.6;transform:translateX(-50%) scale(1.6)}\n}\n\n/* Flame layers animate in with scale 0 \u2192 1.2 \u2192 1 (ignition feel) */\n.candle-wrap.lit .c-lit{ opacity:1 }\n.candle-wrap.lit .c-lit .flame-layer{\n transform-box:fill-box;\n transform-origin:center bottom;\n animation: flameIgnite .85s cubic-bezier(.34,1.56,.64,1);\n}\n.candle-wrap.lit .c-lit .flame-layer.l-outer{ animation-delay:.
108s }\n.candle-wrap.lit .c-lit .flame-layer.l-mid{ animation-delay:.14s }\n.candle-wrap.lit .c-lit .flame-layer.l-core{ animation-delay:.22s }\n@keyframes flameIgnite{\n 0%{opacity:0;transform:scaleY(.05) scaleX(.3)}\n 55%{opacity:1;transform:scaleY(1.18) scaleX(1.1)}\n 100%{opacity:1;transform:scaleY(1) scaleX(1)}\n}\n\n.flame-glow{\n position:absolute;bottom:80%;left:50%;transform:translateX(-50%) scale(.4);\n width:90%;height:28%;\n background:radial-gradient(ellipse,rgba(255,180,60,.75) 0%,rgba(220,110,25,.4) 40%,transparent 78%);\n opacity:0;pointer-events:none;filter:blur(7px);\n transition:opacity 1.2s ease .35s, transform 1.2s ease .35s;\n}\n.candle-wrap.lit .flame-glow{\n opacity:1;\n transform:translateX(-50%) scale(1);\n animation:flicker 2.1s ease-in-out infinite .9s;\n}\n@keyframes flicker{\n 0%,100%{transform:translateX(calc(-50% + 0px)) scaleX(1) scaleY(1);opacity:.95}\n 18%{transform:translateX(calc(-50% + .7px)) scaleX(1.12) scaleY(1.05);opacity:.88}\n 37%{transform:translateX(calc(-50% - .9px)) scaleX(.89) scaleY(.96);opacity:1}\n 58%{transform:translateX(calc(-50% + .5px)) scaleX(1.05) scaleY(1.02);opacity:.82}\n 74%{transform:translateX(calc(-50% - .4px)) scaleX(.96) scaleY(1.08);opacity:.92}\n 88%{transform:translateX(calc(-50% + .3px)) scaleX(1.03) scaleY(.98);opacity:.9}\n}\n.tap-hint{font-size:13.5px;color:#F0CE7A;letter-spacing:.16em;margin-top:8px;transition:opacity .5s;font-family:'Inter',sans-serif;font-weight:600;text-transform:uppercase;text-shadow:0 0 8px rgba(240,206,122,.7),0 0 18px rgba(240,206,122,.55),0 0 34px rgba(245,200,110,.4);animation: hintBreathe 2.4s ease-in-out infinite}\n/* Upward chevron above the text, pointing at the candle, to flag the tap target */\n.tap-hint::before{content:\"\";display:block;width:11px;height:11px;margin:0 auto 6px;border-top:2.5px solid #F0CE7A;border-right:2.5px solid #F0CE7A;transform:rotate(-45deg);animation:hintArrow 1.6s ease-in-out infinite}\n@keyframes hintBreathe{\n 0%,100%{opacity:.6;transform:translateY(0) scale(1)}\n 50%{opacity:1;transform:translateY(-2px) scale(1.05)}\n}\n@keyframes hintArrow{\n 0%,100%{opacity:.4}\n 50%{opacity:1}\n}\n.candle-wrap.lit .tap-hint{opacity:0;pointer-events:none;animation:none}\n.candle-wrap.lit .tap-hint::before{animation:none}\n.candle-wrap.igniting{pointer-events:none}\n\n/* Environmental feedback \u2014 subtle warm tint after lighting */\n.hero-warm{\n position:absolute;inset:0;\n background:radial-gradient(ellipse at 50% 75%, rgba(255,170,60,.10) 0%, rgba(255,140,40,.04) 45%, transparent 70%);\n opacity:0;pointer-events:none;z-index:3;\n transition:opacity 1.4s ease;\n}\nbody.world-lit .hero-warm{opacity:1}\nbody.world-lit .flag-bg{filter:saturate(.88) contrast(1.05) brightness(1.02)}\n.flag-bg{transition: filter 1.6s ease, opacity 1.6s ease}\nbody.world-lit .flag-bg{opacity:.6}\n.candle-count{font-size:13px;color:rgba(255,255,255,.8);min-height:20px;margin-bottom:22px}\n.participated{\n text-align:center;\n font-family:'Inter',sans-serif;\n font-size:13px;\n letter-spacing:.04em;\n color:rgba(255,255,255,.55);\n margin-bottom:12px;\n white-space:nowrap;\n line-height:1.2;\n}\n.participated .big-num{\n display:inline-block;\n font-family:'Cinzel',serif;\n font-weight:900;\n font-size:26px;\n letter-spacing:.02em;\n color:var(--gold);\n vertical-align:baseline;\n margin-right:7px;\n text-shadow:0 0 16px rgba(201,168,76,.35);\n animation: numPulse 4.6s ease-in-out infinite;\n transform-origin:center;\n will-change:transform;\n}\n@keyframes numPulse{\n 0%,100%{transform:scale(1);text-shadow:0 0 16px rgba(201,168,76,.35)}\n 50%{transform:scale(1.05);text-shadow:0 0 22px rgba(201,168,76,.55)}\n}\n.big-num.bump{animation: numBump .6s ease-out}\n@keyframes numBump{\n 0%{transform:scale(1)}\n 40%{transform:scale(1.14);text-shadow:0 0 28px rgba(232,196,106,.75)}\n 100%{transform:scale(1)}\n}\n\n.candle-count strong{color:var(--gold)}\n\n/* CTA \u2014 de-emphasized; only appears after lighting */\n.btn-light{\n -webkit-appearance:none;appearance:none;\n display:inline-block;\n padding:11px 28px;\n background:transparent;color:var(--gold);\n font-family:'Inter',sans-serif;font-weight:600;font-size:13px;\n border:1px solid rgba(201,168,76,.45);border-radius:22px;
1cursor:pointer;letter-spacing:.12em;\n text-transform:uppercase;\n transition:background .2s,color .2s,transform .12s,opacity .6s ease,border-color .2s;\n margin-bottom:6px;\n}\n.candle-after-hint .btn-light{opacity:1}\n\n\n@media (hover: hover){.btn-light:hover{background:rgba(201,168,76,.12)}}\n.btn-light:active{transform:scale(.97)}\n.btn-light.fade-out{opacity:0;max-height:0;padding-top:0;padding-bottom:0;margin-bottom:0;pointer-events:none}\n.btn-lit{\n display:none;\n opacity:0;\n background:transparent;\n border:1.5px solid var(--gold);\n color:var(--gold);\n font-family:'Inter',sans-serif;font-weight:700;font-size:15px;\n letter-spacing:.05em;\n padding:14px 38px;\n border-radius:14px;\n cursor:pointer;\n transition:opacity .5s ease, background .2s, color .2s;\n margin-top:0;\n}\n.btn-lit.show{display:inline-flex;opacity:1;align-items:center;justify-content:center}\n.btn-lit:hover{background:rgba(201,168,76,.12)}\n.btn-lit:active{transform:scale(.97)}\n.btn-lit.show{opacity:1;max-height:60px;padding:13px 32px;margin-bottom:10px}\n.cta-sub{font-family:'Cormorant Garamond',serif;font-size:14px;color:rgba(255,255,255,.52);letter-spacing:.06em;margin-top:2px}\n\n.invite-link{\n display:inline-block;\n margin-top:14px;\n font-family:'Inter',sans-serif;\n font-size:13px;\n letter-spacing:.04em;\n color:var(--gold);\n text-decoration:underline;\n text-decoration-color:rgba(201,168,76,.4);\n text-underline-offset:4px;\n cursor:pointer;\n opacity:0;\n transform:translateY(6px);\n pointer-events:none;\n transition:opacity .6s ease .3s, transform .6s ease .3s, text-decoration-color .2s;\n}\n.invite-link.show{\n opacity:1;\n transform:translateY(0);\n pointer-events:auto;\n}\n.invite-link:hover{\n text-decoration-color:var(--gold);\n}\n.invite-arrow{\n display:inline-block;\n margin-left:4px;\n transition:transform .2s;\n}\n.invite-link:hover .invite-arrow{\n transform:translateX(3px);\n}\n\n/* v22: post-candle inviting hint */\n.candle-after-hint{\n display:none;\n flex-direction:column;align-items:center;\n margin-top:4px;\n opacity:0;\n animation:cafIn .8s ease-out forwards;\n}\n.candle-after-hint.show{display:flex}\n@keyframes cafIn{\n from{opacity:0;transform:translateY(8px)}\n to{opacity:1;transform:translateY(0)}\n}\n.caf-line1{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:14px;\n color:rgba(255,255,255,.7);\n letter-spacing:.04em;\n margin-bottom:14px;text-align:center;\n}\n\n/* v23: rank line + primary share + secondary wall link */\n.user-rank-line{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:15px;\n color:#EDE0C4;\n letter-spacing:.03em;\n margin-bottom:16px;text-align:center;\n line-height:1.4;\n}\n.urank-num{\n font-family:'Cinzel',serif;font-style:normal;font-weight:900;\n font-size:22px;color:var(--gold);\n letter-spacing:.02em;\n margin:0 2px;\n text-shadow:0 0 14px rgba(201,168,76,.45);\n}\n.urank-suffix{\n font-family:'Cinzel',serif;font-style:normal;font-weight:700;\n font-size:13px;color:var(--gold);\n vertical-align:super;\n margin-right:2px;\n}\n.btn-share-primary{\n -webkit-appearance:none;appearance:none;\n display:inline-flex;align-items:center;justify-content:center;gap:9px;\n padding:13px 30px;\n background:var(--gold);color:#000;\n font-family:'Inter',sans-serif;font-weight:700;font-size:14px;\n border:none;border-radius:24px;\n cursor:pointer;letter-spacing:.05em;\n box-shadow:0 0 28px rgba(201,168,76,.45),0 4px 14px rgba(0,0,0,.4);\n transition:background .2s,transform .12s;\n margin-bottom:12px;\n}\n.btn-share-primary:hover{background:var(--gold-h)}\n.btn-share-primary:active{transform:scale(.97)}\n.btn-wall-link{\n -webkit-appearance:none;appearance:none;\n background:transparent;border:none;\n color:rgba(255,255,255,.55);\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:13.5px;\n letter-spacing:.03em;cursor:pointer;\n padding:6px 10px;\n transition:color .2s;\n}\n.btn-wall-link:hover{color:#EDE0C4}\n\n/* v23: drastically de-emphasized Nominate entry */\n.nominate-section-v23{\n padding:10px 20px 14px;\n text-align:center;\n background:#000;\n}\n.nominate-link-v23{\n display:inline-block;\n font-family:'Inter',sans-serif;\n font-size:12px;letter-spacing:.04em;\n color:rgba(255,255,255,.45);\n cursor:pointer;padding:6px 10px;\n transition:color .2s;\n}\n.nominate-link-v23:hover{color:rgba(255,255,255,.75)}\n.nominate-link-action{\n color:var(--gold);\n text-decoration:underline;\n text-decoration-color:rgba(201,168,76,.4);\n text-underline-offset:3px;\n margin-left:4px;\n}\n\n.divider{height:1px;background:rgba(255,255,255,.1);margin:0 20px}\n\n/* \u2500\u2500 HONOR WALL \u2500\u2500 */\n.wall{padding:28px 20px;background:#000}\n.wall-header{text-align:center;padding:16px 20px 12px}\n.wall-title{\n font-family:'Cinzel',serif;\n font-weight:900;\n font-size:clamp(24px, 7vw, 32px);\n letter-spacing:.08em;\n color:var(--gold);\n text-align:center;\n margin-bottom:6px;\n text-shadow:0 2px 10px rgba(0,0,0,.6),0 0 24px rgba(201,168,76,.3);\n}\n.wall-sub{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;\n font-size:14px;\n letter-spacing:.04em;\n color:rgba(255,255,255,.55);\n text-align:center;\n}\n.wall-sub strong{\n font-family:'Inter',sans-serif;\n font-weight:700;font-style:normal;\n color:var(--gold);\n font-size:15px;\n margin-right:2px;\n}\n.wall-title strong{color:#fff}\n\n/* search */\n.srch{position:relative;margin-bottom:14px}\n.srch input{width:100%;background:#111827;border:1px solid rgba(255,255,255,.2);border-radius:10px;padding:12px 36px 12px 42px;color:#fff;font-size:14px;font-family:'Inter',sans-serif;outline:none;transition:border-color .2s}\n.srch input::placeholder{color:#8A94A8}\n.srch input:focus{border-color:rgba(255,255,255,.55)}\n.s-ico{position:absolute;
1left:14px;top:50%;transform:translateY(-50%);opacity:.4;pointer-events:none}\n.s-clr{position:absolute;right:12px;top:50%;transform:translateY(-50%);background:none;border:none;color:#8A94A8;font-size:18px;cursor:pointer;padding:2px 6px;display:none}\n.s-clr.on{display:block}\n\n/* filter tabs */\n.filter-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px;justify-content:center}\n.ftab{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.14);border-radius:20px;color:var(--sub);font-size:12px;padding:5px 12px;cursor:pointer;font-family:'Inter',sans-serif;transition:all .2s;white-space:nowrap}\n.ftab:hover{border-color:rgba(255,255,255,.35)}\n.ftab.active{background:rgba(201,168,76,.15);border-color:var(--gold);color:var(--gold)}\n\n.btn-honor{width:100%;padding:13px;background:var(--gold);color:#000;font-family:'Inter',sans-serif;font-weight:700;font-size:14px;border:none;border-radius:12px;cursor:pointer;margin-bottom:6px;box-shadow:0 2px 14px rgba(201,168,76,.28);transition:background .2s}\n@media (hover: hover){.btn-honor:hover{background:var(--gold-h)}}\n.honor-sub{text-align:center;font-size:12px;color:#8A94A8;margin-bottom:20px}\n\n/* cards */\n.cards{display:flex;flex-direction:column;gap:14px}\n.card{background:var(--card);border:1px solid var(--card-b);border-radius:12px;padding:16px 16px 14px;cursor:pointer;transition:border-color .2s,background .2s;position:relative}\n.card:hover{border-color:rgba(201,168,76,.3);background:rgba(255,255,255,.07)}\n.card-head{display:flex;gap:13px;align-items:flex-start;margin-bottom:8px}\n.card-photo{width:56px;height:56px;border-radius:6px;flex-shrink:0;object-fit:cover;object-position:center top;background:#1a2a3a;border:1px solid rgba(201,168,76,.3);filter:saturate(.72) contrast(1.06) brightness(.94)}\n.card-photo-err{width:56px;height:56px;border-radius:6px;flex-shrink:0;background:linear-gradient(135deg,#1a2a3a,#0d1a26);border:1px solid rgba(201,168,76,.3);display:flex;align-items:center;justify-content:center;font-size:22px}\n.card-info{flex:1;min-width:0}\n.card-name{\n font-family:'Cinzel','Cormorant Garamond',serif;\n font-weight:700;font-size:17.5px;\n color:#fff;margin-bottom:3px;\n letter-spacing:.02em;line-height:1.2;\n text-shadow:0 1px 6px rgba(0,0,0,.55);\n}\n.card-sub{font-size:11px;color:var(--gold);letter-spacing:.06em;margin-bottom:5px;text-transform:uppercase}\n.card-story{font-size:13px;color:var(--sub);line-height:1.5;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;font-style:italic;font-family:'Cormorant Garamond',serif;font-size:14.5px}\n\n/* v23: short emotional hook quote on each card */\n.card-hook{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;\n font-size:14.5px;\n line-height:1.45;\n color:#EDE0C4;\n margin-top:10px;\n padding:9px 12px;\n background:rgba(201,168,76,.06);\n border-left:2px solid rgba(201,168,76,.45);\n border-radius:2px 6px 6px 2px;\n letter-spacing:.01em;\n}\n.card-memorial{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:12px;\n color:rgba(201,168,76,.55);\n letter-spacing:.06em;\n margin-top:8px;\n padding-top:8px;\n border-top:1px solid rgba(201,168,76,.12);\n}\n.card-meta{display:flex;gap:7px;margin-top:8px;flex-wrap:wrap}\n.tag{font-size:11px;background:rgba(201,168,76,.1);color:var(--gold);border-radius:20px;padding:2px 9px;letter-spacing:.04em}\n.medal-badge{font-size:10px;background:rgba(201,168,76,.18);color:var(--gold-h);border-radius:4px;padding:2px 7px;border:1px solid rgba(201,168,76,.32);letter-spacing:.05em;font-weight:600}\n.no-r{text-align:center;padding:24px 0;color:#8A94A8;font-size:14px;display:none}\n.load-more{width:100%;margin-top:16px;padding:12px;background:none;border:1px solid rgba(255,255,255,.2);border-radius:10px;color:var(--sub);font-family:'Inter',sans-serif;font-size:13px;cursor:pointer;transition:border-color .2s;display:none}\n.load-more:hover{border-color:rgba(255,255,255,.5)}\n\n/* \u2500\u2500 DETAIL SHEET \u2500\u2500 */\n.overlay{position:fixed;inset:0;background:rgba(0,0,0,.85);z-index:100;display:none;align-items:flex-end;justify-content:center}\n.overlay.open{display:flex}\n.sheet{\n background:linear-gradient(180deg,#0C1E3D 0%,#040e20 100%);\n border-radius:20px 20px 0 0;width:100%;max-width:480px;max-height:88vh;\n overflow-y:auto;padding:24px 20px 44px;position:relative;animation:up .35s ease;\n}\n/* In-app the native bottom tab bar overlaps the lower ~90px of the webview and\n hides a sheet's last action (CTA / Submit button). Give the bottom-anchored\n sheets a bottom buffer so the last control scrolls clear of the bar \u2014 the extra\n space is hidden behind it in-app; on web it's just slightly empty padding. */\n.sheet{padding-bottom:calc(env(safe-area-inset-bottom, 0px) + 120px)}\n#stateOv .sheet{min-height:50dvh}\n@keyframes up{from{transform:translateY(100%)}to{transform:translateY(0)}}\n.handle{width:40px;height:4px;background:rgba(255,255,255,.2);border-radius:2px;margin:0 auto 20px}\n.sheet-close{position:absolute;right:18px;top:18px;background:none;border:none;color:#8A94A8;font-size:22px;
1cursor:pointer;padding:4px 8px}\n.detail-photo{width:110px;height:110px;object-fit:cover;object-position:center top;border-radius:10px;background:#1a2a3a;display:block;border:1.5px solid rgba(201,168,76,.35);flex-shrink:0;filter:saturate(.72) contrast(1.06) brightness(.94)}\n.detail-photo-err{width:110px;height:110px;background:linear-gradient(135deg,#1a2a3a,#0d1a26);border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:40px;border:1.5px solid rgba(201,168,76,.35);flex-shrink:0}\n\n\n.detail-medal{display:inline-block;font-size:11px;background:rgba(201,168,76,.18);color:var(--gold-h);border-radius:4px;padding:3px 9px;border:1px solid rgba(201,168,76,.35);margin-bottom:14px;letter-spacing:.05em;font-weight:600}\n.detail-story{font-size:14px;color:var(--body);line-height:1.75;margin-bottom:16px}\n.detail-tags{display:flex;gap:8px;flex-wrap:wrap}\n.detail-src{font-size:11px;color:#8A94A8;margin-top:14px;font-style:italic}\n.btn-share-tribute{\n width:100%;margin-top:20px;padding:13px 16px;\n background:#000;color:var(--gold);\n border:1.5px solid var(--gold);border-radius:12px;\n font-family:'Inter',sans-serif;font-weight:600;font-size:14px;\n letter-spacing:.04em;cursor:pointer;\n display:flex;align-items:center;justify-content:center;gap:8px;\n transition:background .2s,color .2s;\n}\n.btn-share-tribute:hover{background:var(--gold);color:#000}\n.btn-share-tribute svg{flex-shrink:0}\n\n/* form sheet */\n.form-title{font-family:'Cinzel',serif;font-size:20px;font-weight:700;color:#fff;margin-bottom:4px}\n.form-sub{font-size:13px;color:var(--sub);margin-bottom:22px}\n.fgrp{margin-bottom:16px}\n.flbl{font-size:12px;color:var(--sub);letter-spacing:.07em;margin-bottom:6px;display:block}\n.finput,.ftxt,.fsel{width:100%;background:#111827;border:1px solid rgba(255,255,255,.2);border-radius:10px;padding:12px 14px;color:#fff;font-size:14px;font-family:'Inter',sans-serif;outline:none;transition:border-color .2s}\n.finput:focus,.ftxt:focus,.fsel:focus{border-color:rgba(255,255,255,.6)}\n.ftxt{resize:none;height:90px;line-height:1.5}\n.fsel{appearance:none;-webkit-appearance:none;\n background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%238A94A8' stroke-width='1.5' fill='none'/%3E%3C/svg%3E\");\n background-repeat:no-repeat;background-position:right 14px center}\n.fsel option{background:#111827;color:#fff}\n.char-ct{font-size:11px;color:#8A94A8;text-align:right;margin-top:4px}\n\n/* v29: helper text under email field */\n.email-helper{\n font-size:11.5px;\n color:#8A94A8;\n letter-spacing:.01em;\n margin-top:7px;\n line-height:1.5;\n font-family:'Inter',sans-serif;\n font-style:italic;\n}\n.fdates{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n.photo-drop{display:flex;flex-direction:column;align-items:center;justify-content:center;background:#111827;border:1px dashed rgba(255,255,255,.25);border-radius:10px;padding:22px;cursor:pointer;gap:6px;transition:border-color .2s}\n.photo-drop:hover{border-color:rgba(255,255,255,.5)}\n.photo-drop span{font-size:12px;color:#8A94A8}\n.photo-prev{width:100%;height:120px;object-fit:cover;border-radius:8px;display:none}\n.btn-pub{width:100%;padding:14px;background:#000;color:var(--gold);font-weight:700;font-size:15px;border:1.5px solid var(--gold);border-radius:12px;cursor:pointer;margin-top:10px;transition:background .2s}\n.btn-pub:hover{background:var(--gold-h)}\n\n/* Honoring-type radio group (large, top of form) */\n.fradio-group{display:flex;flex-direction:column;gap:10px;margin-top:4px}\n.fradio{\n display:flex;align-items:flex-start;gap:12px;\n background:#111827;border:1.5px solid rgba(255,255,255,.18);\n border-radius:12px;padding:14px 14px;cursor:pointer;\n transition:border-color .2s,background .2s;\n}\n.fradio:hover{border-color:rgba(201,168,76,.45)}\n.fradio input[type=\"radio\"]{position:absolute;opacity:0;pointer-events:none}\n.fradio-dot{\n width:20px;height:20px;border-radius:50%;flex-shrink:0;margin-top:1px;\n border:2px solid rgba(255,255,255,.4);background:transparent;\n display:flex;align-items:center;justify-content:center;\n transition:border-color .2s;\n}\n.fradio-dot::after{\n content:'';width:10px;height:10px;border-radius:50%;\n background:var(--gold);transform:scale(0);transition:transform .15s ease;\n}\n.fradio input[type=\"radio\"]:checked ~ .fradio-dot{border-color:var(--gold)}\n.fradio input[type=\"radio\"]:checked ~ .fradio-dot::after{transform:scale(1)}\n.fradio:has(input:checked){border-color:var(--gold);background:rgba(201,168,76,.07)}\n.fradio-text{font-size:14px;line-height:1.45;color:var(--body);letter-spacing:.01em}\n.fradio-text strong{color:var(--gold);font-weight:700}\n\n/* Report flag on each Honor Wall card */\n.card-report{\n position:absolute;top:10px;right:10px;\n width:28px;height:28px;border-radius:50%;\n background:rgba(0,0,0,.35);border:1px solid rgba(255,255,255,.15);\n display:flex;align-items:center;justify-content:center;
1\n cursor:pointer;color:#8A94A8;\n transition:color .2s,border-color .2s,background .2s;\n z-index:2;\n}\n.card-report:hover{color:var(--gold);border-color:rgba(201,168,76,.5);background:rgba(0,0,0,.55)}\n.card-report svg{width:14px;height:14px;display:block}\n\n/* \u2500\u2500\u2500 Card-level Light a Candle action (NEW in v22) \u2500\u2500\u2500 */\n.card-action-row{\n display:flex;align-items:center;justify-content:space-between;gap:10px;\n margin-top:10px;padding-top:10px;\n border-top:1px solid rgba(201,168,76,.12);\n}\n.card-candle-count{\n display:flex;align-items:center;gap:6px;\n font-family:'Inter',sans-serif;font-size:12px;\n color:rgba(255,255,255,.55);letter-spacing:.01em;\n line-height:1.35;\n flex:1;min-width:0;\n}\n.card-candle-count .ccount-flame{\n display:inline-block;font-size:13px;\n filter:saturate(.9);flex-shrink:0;\n}\n.card-candle-count .ccount-num{\n color:var(--gold);font-weight:600;\n}\n.btn-card-light{\n -webkit-appearance:none;appearance:none;\n display:inline-flex;align-items:center;gap:6px;\n padding:7px 14px;\n background:transparent;color:var(--gold);\n font-family:'Inter',sans-serif;font-weight:600;font-size:12px;\n border:1px solid var(--gold);border-radius:18px;\n cursor:pointer;letter-spacing:.06em;\n transition:background .2s,color .2s,transform .12s;\n}\n.btn-card-light:hover{background:rgba(201,168,76,.14)}\n.btn-card-light:active{transform:scale(.96)}\n.btn-card-light svg{width:11px;height:11px}\n.btn-card-light.lit{\n background:rgba(201,168,76,.18);\n color:var(--gold-h);\n border-color:var(--gold-h);\n padding:7px 12px;\n /* v33: was pointer-events:none \u2014 now clickable for share */\n}\n.btn-card-light.lit:hover{\n background:rgba(201,168,76,.28);\n}\n.btn-card-light.lit:active{\n transform:scale(.94);\n background:rgba(201,168,76,.38);\n}\n.btn-card-light.lit::before{\n content:'';\n display:none;\n}\n\n/* \u2500\u2500\u2500 In-card flame burst animation when lit \u2500\u2500\u2500 */\n@keyframes flameBurst{\n 0%{transform:scale(.3) translateY(8px);opacity:0}\n 35%{transform:scale(1.25) translateY(-2px);opacity:1}\n 100%{transform:scale(1) translateY(-4px);opacity:1}\n}\n.flame-burst{\n position:absolute;\n pointer-events:none;\n font-size:28px;\n opacity:0;\n z-index:4;\n filter:drop-shadow(0 0 12px rgba(255,170,60,.7));\n animation:flameBurst .55s cubic-bezier(.34,1.56,.64,1) forwards;\n}\n\n/* \u2500\u2500\u2500 Detail sheet primary CTA: Light a Candle (replaces share-only) \u2500\u2500\u2500 */\n.detail-actions{\n display:flex;flex-direction:column;gap:10px;\n margin-top:18px;\n}\n.btn-light-primary{\n width:100%;padding:14px 16px;\n background:var(--gold);color:#000;\n border:none;border-radius:12px;\n font-family:'Inter',sans-serif;font-weight:700;font-size:15px;\n letter-spacing:.04em;cursor:pointer;\n display:flex;align-items:center;justify-content:center;gap:8px;\n box-shadow:0 2px 14px rgba(201,168,76,.32);\n transition:background .2s,transform .12s;\n}\n.btn-light-primary:hover{background:var(--gold-h)}\n.btn-light-primary:active{transform:scale(.98)}\n.btn-light-primary.done{\n background:transparent;color:var(--gold);\n border:1.5px solid var(--gold);\n box-shadow:none;\n /* v33: was pointer-events:none \u2014 now clickable for share */\n}\n.btn-light-primary.done:hover{\n background:rgba(201,168,76,.08);\n}\n\n\n/* \u2500\u2500\u2500 Tribute Card (shareable visual after lighting candle) \u2500\u2500\u2500 */\n.tcard-ov{position:fixed;inset:0;background:rgba(0,0,0,.92);z-index:400;display:none;align-items:flex-start;justify-content:center;padding:24px 16px;overflow-y:auto}\n.tcard-ov.open{display:flex}\n.tcard-modal{\n width:100%;max-width:380px;\n display:flex;flex-direction:column;align-items:center;\n animation:pop .35s ease;\n}\n.tcard-title{\n font-family:'Cinzel',serif;font-weight:700;font-size:18px;\n color:var(--gold);letter-spacing:.08em;\n margin-bottom:4px;text-align:center;\n}\n.tcard-sub{\n font-family:'Cormorant Garamond',serif;font-style:italic;\n font-size:13px;color:rgba(255,255,255,.55);\n margin-bottom:18px;text-align:center;\n}\n/* The actual shareable card image */\n.tcard{\n width:100%;\n background:\n radial-gradient(ellipse 90% 70% at 50% 30%, rgba(120,60,20,.35) 0%, transparent 65%),\n radial-gradient(ellipse 60% 50% at 50% 100%, rgba(80,30,10,.45) 0%, transparent 70%),\n linear-gradient(165deg, #2d1810 0%, #1a0d07 55%, #100806 100%);\n border:1px solid rgba(201,168,76,.45);\n border-radius:16px;\n padding:32px 24px 20px;\n position:relative;\n overflow:hidden;\n box-shadow:\n 0 8px 40px rgba(0,0,0,.7),\n 0 0 80px rgba(201,168,76,.12),\n inset 0 0 60px rgba(0,0,0,.4);\n}\n.tcard > *:not(.tcard-watermark){ position:relative; z-index:2; }\n.tcard::before{\n content:'';position:absolute;inset:0;\n background-image:url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='120' height='120'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .35 0'/></filter><rect width='120' height='120' filter='url(%23n)' opacity='.35'/></svg>\");\n opacity:.32;mix-blend-mode:overlay;pointer-events:none;\n}\n.tcard::after{\n content:'';position:absolute;inset:0;\n background:radial-gradient(ellipse 100% 80% at 50% 50%, transparent 50%, rgba(0,0,0,.55) 100%);\n pointer-events:none;z-index:1;\n}\n.tcard-watermark{display:none}\n.tcard-header{\n text-align:center;margin-bottom:18px;\n position:relative;z-index:1;\n}\n.tcard-eyebrow{\n font-family:'Cinzel',serif;font-weight:700;\n font-size:11px;letter-spacing:.36em;\n color:#D4B45A;\n margin-bottom:0;\n}\n.tcard-stars{\n color:var(--gold-h);font-size:11px;\n letter-spacing:.5em;margin-left:.5em;\n}\n.tcard-photo-frame{\n width:112px;height:112px;\n border-radius:50%;\n overflow:hidden;\n margin:14px auto 14px;\n border:3px solid #C9A84C;\n box-shadow:\n 0 0 0 2px #1a0d07,\n 0 0 0 4px rgba(201,168,76,.6),\n 0 0 28px rgba(232,196,106,.35),\n inset 0 0 12px rgba(0,0,0,.5);\n position:relative;z-index:1;\n}\n.tcard-photo-frame img{\n width:100%;height:100%;\n object-fit:cover;object-position:center top;\n filter:saturate(.7) contrast(1.1) brightness(.95) sepia(.08);\n}\n.tcard-photo-frame .fallback-photo{\n width:100%;height:100%;font-size:42px;\n}\n.tcard-hero-name{\n font-family:'Cinzel',serif;font-weight:900;\n font-size:26px;color:#F4E8C8;\n letter-spacing:.06em;\n margin-bottom:6px;text-align:center;\n text-shadow:0 2px 12px rgba(0,0,0,.9), 0 0 24px rgba(201,168,76,.15);\n position:relative;z-index:1;\n}\n.tcard-hero-meta{\n font-family:'Cormorant Garamond',serif;font-style:italic;\n font-size:13.5px;color:rgba(244,232,200,.7);\n letter-spacing:.05em;text-align:center;\n margin-bottom:14px;\n position:relative;z-index:1;\n}\n.tcard-divider{\n width:55%;margin:4px auto 12px;\n height:1px;\n background:linear-gradient(90deg, transparent 0%, rgba(201,168,76,.55) 35%, transparent 48%, transparent 52%, rgba(201,168,76,.55) 65%, transparent 100%);\n position:relative;z-index:2;\n}\n.tcard-divider::after{\n content:'\\2605';position:absolute;\n left:50%;
1top:50%;transform:translate(-50%,-52%);\n color:#C9A84C;font-size:10px;\n background:linear-gradient(165deg,#2d1810 0%,#1a0d07 100%);padding:0 6px;\n}\n.tcard-flame{\n text-align:center;\n margin:6px auto 10px;\n filter:drop-shadow(0 6px 20px rgba(220,40,30,.55)) drop-shadow(0 0 40px rgba(220,40,30,.25));\n position:relative;z-index:2;\n}\n.tcard-thought{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:17px;\n line-height:1.5;color:#F0E2C0;\n text-align:center;\n margin:0 16px 14px;\n position:relative;z-index:3;\n min-height:1.5em;\n}\n.tcard-thought::before{content:'\"';opacity:.45;margin-right:2px}\n.tcard-thought::after{content:'\"';opacity:.45;margin-left:2px}\n.tcard-signature{display:none}\n.tcard-footer{\n display:flex;align-items:center;justify-content:center;gap:8px;\n padding-top:14px;\n border-top:1px solid rgba(201,168,76,.25);\n position:relative;z-index:3;\n}\n.tcard-footer-logo{\n font-family:'Inter',sans-serif;font-weight:700;\n font-size:10px;color:#D4B45A;\n letter-spacing:.18em;\n}\n.tcard-footer-dot{color:rgba(255,255,255,.3);font-size:8px}\n.tcard-footer-tag{\n font-family:'Cormorant Garamond',serif;font-style:italic;\n font-size:11px;color:rgba(244,232,200,.55);\n}\n\n/* Tribute card action buttons */\n.tcard-actions{\n width:100%;margin-top:20px;\n display:flex;flex-direction:column;gap:10px;\n}\n.tcard-share-btn{\n width:100%;padding:14px;\n background:var(--gold);color:#000;\n border:none;border-radius:12px;\n font-family:'Inter',sans-serif;font-weight:700;font-size:15px;\n letter-spacing:.04em;cursor:pointer;\n display:flex;align-items:center;justify-content:center;gap:8px;\n box-shadow:0 2px 14px rgba(201,168,76,.32);\n transition:background .2s;\n}\n.tcard-share-btn:hover{background:var(--gold-h)}\n.tcard-secondary-btn{\n width:100%;padding:12px;\n background:transparent;color:rgba(255,255,255,.65);\n border:1px solid rgba(255,255,255,.18);\n border-radius:12px;\n font-family:'Inter',sans-serif;font-weight:500;font-size:13px;\n cursor:pointer;letter-spacing:.04em;\n transition:border-color .2s,color .2s;\n}\n.tcard-secondary-btn:hover{border-color:rgba(255,255,255,.4);color:#fff}\n.tcard-close{\n position:absolute;right:14px;top:14px;\n background:rgba(0,0,0,.5);border:1px solid rgba(255,255,255,.2);\n width:32px;height:32px;border-radius:50%;\n color:#fff;font-size:18px;cursor:pointer;\n display:flex;align-items:center;justify-content:center;\n z-index:5;\n}\n\n/* Soft App prompt that appears UNDER the tribute card (not blocking) */\n.app-soft-prompt{\n width:100%;margin-top:18px;\n padding:14px 16px;\n background:rgba(255,255,255,.04);\n border:1px solid rgba(201,168,76,.2);\n border-radius:12px;\n display:flex;align-items:center;gap:12px;\n}\n.app-soft-prompt-icon{\n font-size:24px;flex-shrink:0;\n}\n.app-soft-prompt-text{\n flex:1;min-width:0;\n font-family:'Inter',sans-serif;font-size:12px;\n color:rgba(255,255,255,.7);\n line-height:1.4;\n}\n.app-soft-prompt-text strong{\n color:var(--gold);font-weight:600;\n display:block;font-size:13px;margin-bottom:2px;\n}\n.app-soft-prompt-link{\n background:transparent;color:var(--gold);\n border:1px solid var(--gold);border-radius:18px;\n padding:6px 14px;\n font-family:'Inter',sans-serif;font-weight:600;font-size:11px;\n letter-spacing:.06em;text-transform:uppercase;\n cursor:pointer;flex-shrink:0;text-decoration:none;\n display:inline-block;\n transition:background .2s;\n}\n.app-soft-prompt-link:hover{background:rgba(201,168,76,.14)}\n\n/* app modal */\n.app-ov{position:fixed;inset:0;background:rgba(0,0,0,.9);z-index:300;display:none;align-items:center;justify-content:center;padding:20px}\n.app-ov.open{display:flex}\n.app-box{background:linear-gradient(150deg,#0C1E3D,#040e20);border:1px solid rgba(201,168,76,.3);border-radius:20px;padding:34px 26px;max-width:340px;width:100%;text-align:center;animation:pop .3s ease}\n@keyframes pop{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}\n.app-icon{font-size:44px;margin-bottom:14px}\n.app-title{font-family:'Cinzel',serif;font-size:18px;font-weight:700;color:#fff;margin-bottom:8px}\n.app-desc{font-size:13px;color:var(--sub);line-height:1.65;margin-bottom:22px}
1\n.app-btns{display:flex;flex-direction:column;gap:10px}\n.abtn{padding:13px;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;border:none;text-decoration:none;display:block;transition:opacity .2s}\n.abtn:hover{opacity:.85}\n.abtn.ios{background:#fff;color:#000}\n.abtn.and{background:#000;color:var(--gold);border:1.5px solid var(--gold)}\n.abtn.skip{background:none;color:#8A94A8;font-size:13px;font-weight:400;padding:8px;cursor:pointer;border:none}\n\n/* v29: Success modal styles */\n.success-box{\n max-width:380px;\n padding:32px 26px 26px;\n}\n.success-icon{\n width:56px;height:56px;\n margin:0 auto 18px;\n border-radius:50%;\n background:rgba(82,201,138,.12);\n border:1.5px solid rgba(82,201,138,.7);\n color:#52C98A;\n display:flex;align-items:center;justify-content:center;\n animation:successPop .55s cubic-bezier(.34,1.56,.64,1);\n}\n.success-icon svg{width:28px;height:28px}\n@keyframes successPop{\n 0%{transform:scale(.3);opacity:0}\n 60%{transform:scale(1.08);opacity:1}\n 100%{transform:scale(1);opacity:1}\n}\n.success-title{\n font-family:'Cinzel',serif;\n font-size:17px;font-weight:700;color:#fff;\n line-height:1.4;letter-spacing:.02em;\n margin-bottom:10px;\n}\n.success-hero-name{\n font-family:'Cormorant Garamond',serif;\n font-style:italic;font-size:21px;\n color:var(--gold);font-weight:700;\n letter-spacing:.01em;\n}\n.success-desc{\n font-size:13px;color:var(--body);\n line-height:1.6;margin-bottom:8px;\n}\n.success-subtext{\n margin-top:10px;\n font-size:13px;\n color:var(--gold);\n font-family:'Inter',sans-serif;\n font-style:italic;\n letter-spacing:.01em;\n line-height:1.55;\n}\n.success-divider{\n height:1px;\n background:linear-gradient(90deg, transparent, rgba(201,168,76,.32), transparent);\n margin:18px 0 16px;\n}\n.success-app-soft{\n display:flex;align-items:flex-start;gap:11px;\n background:rgba(255,255,255,.04);\n border:1px solid rgba(201,168,76,.18);\n border-radius:10px;\n padding:11px 13px;\n margin-bottom:18px;\n text-align:left;\n}\n.success-app-icon{\n font-size:22px;flex-shrink:0;line-height:1.2;\n}\n.success-app-text{\n font-family:'Inter',sans-serif;font-size:11.5px;\n color:rgba(255,255,255,.66);\n line-height:1.5;\n}\n.success-app-text strong{\n display:block;\n color:var(--gold);font-weight:600;\n font-size:12.5px;margin-bottom:3px;\n letter-spacing:.02em;\n}\n\n.toast{position:fixed;bottom:28px;left:50%;transform:translateX(-50%);background:#1a1a1a;border:1px solid rgba(255,255,255,.15);color:#fff;font-size:13px;padding:11px 22px;border-radius:22px;opacity:0;transition:opacity .3s;pointer-events:none;z-index:999;max-width:calc(100% - 32px);text-align:center;word-break:break-all;line-height:1.4}\n.toast.on{opacity:1}\n\n.nominate-section{\n padding:24px 20px 20px;\n text-align:center;\n background:#000;\n}\n.nominate-section .btn-honor{margin:0 auto;display:block}\n\n.filter-row{\n display:flex;\n align-items:center;\n gap:8px;\n margin:14px 0 10px;\n padding:0 20px;\n}\n.filter-row .filter-tabs{\n flex:1;\n margin:0;\n padding:0;\n overflow-x:auto;\n scrollbar-width:none;\n}\n.filter-row .filter-tabs::-webkit-scrollbar{display:none}\n.search-toggle{\n flex-shrink:0;\n width:36px;height:36px;\n border-radius:50%;\n background:rgba(201,168,76,.1);\n border:1px solid rgba(201,168,76,.3);\n cursor:pointer;\n display:flex;align-items:center;justify-content:center;\n padding:0;\n transition:background .2s, border-color .2s, transform .15s;\n}\n.search-toggle:hover{\n background:rgba(201,168,76,.22);\n border-color:var(--gold);\n}\n.search-toggle.active{\n background:var(--gold);\n border-color:var(--gold);\n}\n.search-toggle.active svg{stroke:#000}\n.srch-expand{\n max-height:0;\n overflow:hidden;\n opacity:0;\n margin:0 20px;\n transition:max-height .3s ease, opacity .3s ease, margin-bottom .3s ease;\n}\n.srch-expand.open{\n max-height:60px;\n opacity:1;\n margin-bottom:14px;\n}\n.srch-expand{\n display:flex;align-items:center;\n background:rgba(255,255,255,.06);\n border:1px solid rgba(255,255,255,.1);\n border-radius:10px;\n padding:0 10px;\n}\n.srch-expand .s-ico{margin-right:8px;flex-shrink:0}\n.srch-expand input{\n flex:1;\n background:transparent;border:none;outline:none;\n color:#EDE0C4;font-family:'Inter',sans-serif;font-size:14px;\n padding:10px 0;\n}\n.srch-expand input::placeholder{color:#6B7080;font-size:13px}\n.srch-expand .s-clr{\n background:none;border:none;color:#8A94A8;cursor:pointer;\n font-size:18px;padding:0 4px;display:none;\n}\n.srch-expand .s-clr.on{display:block}\n\n@media (max-width: 380px){\n .hero-inner{\n padding-left:12px;\n padding-right:12px;\n /* keep padding-top/bottom from v32 clamp() */\n }\n .main-title{letter-spacing:.04em}\n .black-section{padding:14px 16px 14px}\n .participated .big-num{font-size:24px}\n}\n\n/* v32: short-screen tweaks so the post-lit primary CTA stays in the first viewport\n (iPhone SE: 375x667, iPhone 8: 375x667, older Androids ~640) */\n@media (max-height: 720px){\n .intro-screen .hero{\n flex:0 0 32dvh;\n min-height:220px;\n max-height:280px;\n }\n .hero-inner{\n padding-top:clamp(24px, 5dvh, 50px);\n padding-bottom:clamp(14px, 2dvh, 24px);\n min-height:clamp(180px, 28dvh, 240px);\n }\n .candle-box{\n height:clamp(120px, 18dvh, 160px);\n }\n .black-section{padding-top:10px;padding-bottom:10px}\n .participated{margin-bottom:6px}\n .candle-after-hint{margin-top:0}\n .caf-line1{margin-bottom:8px;font-size:13px}\n .btn-light-primary{padding:12px 14px;font-size:14px}\n}\n\n/* Honor tag \u2014 clickable with underline cue */\n.tag.tag-honor{\n cursor:pointer;\n border-color:rgba(201,168,76,.45);\n color:var(--gold);\n position:relative;\n transition:background .15s,border-color .15s;\n}\n.tag.tag-honor:hover{\n background:rgba(201,168,76,.15);\n border-color:var(--gold);\n}\n\n/* Honor info popup */\n.honor-popup{\n position:fixed;\n z-index:9999;\n background:linear-gradient(180deg,#1a1e2e 0%,#0d1220 100%);\n border:1.5px solid var(--gold);\n border-radius:12px;\n padding:14px 16px;\n max-width:280px;\n box-shadow:0 8px 32px rgba(0,0,0,.6),0 0 24px rgba(201,168,76,.25);\n font-family:'Inter',sans-serif;\n opacity:0;\n transform:translateY(6px);\n transition:opacity .2s ease,transform .2s ease;\n pointer-events:none;\n}\n.honor-popup.show{opacity:1;transform:translateY(0);pointer-events:auto}\n.honor-popup-title{\n font-family:'Cinzel',serif;\n font-weight:700;\n font-size:14px;\n color:var(--gold);\n margin-bottom:6px;\n letter-spacing:.04em;\n}\n.honor-popup-text{\n font-size:13px;\n line-height:1.5;\n color:#D8DCE8;\n}\n.honor-popup-close{\n position:absolute;\n top:6px;right:10px;\n background:none;border:none;\n color:#8A94A8;\n font-size:16px;\n cursor:pointer;\n padding:2px 6px;\n}\n.honor-popup-close:hover{color:var(--gold)}\n/* Tiny arrow pointing to tag */\n.honor-popup::before{\n content:'';\n position:absolute;\n top:-7px;left:var(--arrow-x,20px);\n width:12px;height:12px;\n background:linear-gradient(135deg,#1a1e2e 50%,transparent 50%);\n border-top:1.5px solid var(--gold);\n border-left:1.5px solid var(--gold);\n transform:rotate(45deg);\n}\n\n.detail-top{\n display:flex;\n gap:16px;\n align-items:flex-start;\n margin-bottom:20px;\n}\n.detail-top-info{\n flex:1;\n min-width:0;\n padding-top:4px;\n}\n.detail-top .detail-name{\n font-family:'Cinzel',serif;\n font-weight:700;\n font-size:20px;\n color:#fff;\n line-height:1.2;\n margin-bottom:8px;\n letter-spacing:.02em;\n}\n.detail-top .detail-dates{\n font-size:13px;\n color:var(--gold);\n letter-spacing:.04em;\n line-height:1.4;\n}\n\n/* Photo crop UI */\n#photoCropWrap{\n display:none;\n flex-direction:column;\n align-items:center;\n gap:10px;\n padding:14px;\n background:#111827;\n border:1px solid rgba(201,168,76,.25);\n border-radius:10px;\n}\n.crop-label{\n font-size:11px;color:#8A94A8;letter-spacing:.04em;\n text-align:center;\n}\n.crop-canvas-wrap{\n position:relative;\n width:240px;height:240px;\n border-radius:8px;\n overflow:hidden;\n background:#0a0f1a;\n border:1.5px solid rgba(201,168,76,.35);\n touch-action:none;\n cursor:grab;\n}\n.crop-canvas-wrap:active{cursor:grabbing}\n#photoCropCanvas{\n display:block;\n width:240px;height:240px;\n}\n.crop-actions{\n display:flex;\n align-items:center;\n gap:12px;\n width:100%;\n}\n.crop-btn{\n -webkit-appearance:none;appearance:none;\n background:transparent;\n border:1px solid rgba(201,168,76,.4);\n color:var(--gold);\n font-family:'Inter',sans-serif;\n font-size:12px;font-weight:600;\n padding:6px 14px;\n border-radius:8px;\n cursor:pointer;\n letter-spacing:.04em;\n flex-shrink:0;\n}\n.crop-btn:hover{background:rgba(201,168,76,.12)}\n.crop-zoom{\n flex:1;\n -webkit-appearance:none;appearance:none;\n height:4px;\n background:rgba(201,168,76,.2);\n border-radius:2px;\n outline:none;\n}\n.crop-zoom::-webkit-slider-thumb{\n -webkit-appearance:none;appearance:none;\n width:16px;height:16px;\n border-radius:50%;\n background:var(--gold);\n cursor:pointer;\n border:2px solid #000;\n box-shadow:0 0 6px rgba(201,168,76,.5);\n}\n.crop-zoom::-moz-range-thumb{\n width:16px;height:16px;border-radius:50%;\n background:var(--gold);
1cursor:pointer;\n border:2px solid #000;\n}\n\n/* Wall tagline */\n.wall-tagline{\n font-family:'Cormorant Garamond','Georgia',serif;\n font-style:italic;\n font-size:16px;\n color:#EDE0C4;\n line-height:1.6;\n letter-spacing:.04em;\n text-align:center;\n margin:18px 20px 6px;\n opacity:0;\n animation:taglineReveal .6s ease-out .3s forwards;\n}\n.wall-tagline .wt-accent{\n color:var(--gold);\n display:block;\n font-size:14px;\n letter-spacing:.08em;\n margin-top:4px;\n opacity:.85;\n}\n.wall-intro-divider{\n width:42px;height:1px;\n background:linear-gradient(90deg,transparent,rgba(201,168,76,.55),transparent);\n margin:12px auto 20px;\n}\n@media(max-width:380px){\n .wall-tagline{font-size:14.5px;margin:14px 14px 4px}\n .wall-tagline .wt-accent{font-size:12.5px}\n}\n\n/* Layer tabs \u2014 Fallen vs Served */\n.layer-tabs{\n display:flex;\n gap:8px;\n justify-content:center;\n margin:0 16px 14px;\n padding:4px;\n background:transparent;\n border:none;\n border-radius:14px;\n}\n.layer-tab{\n -webkit-appearance:none;appearance:none;\n flex:1;\n display:flex;\n align-items:center;\n justify-content:center;\n gap:6px;\n padding:11px 10px;\n background:transparent;\n border:none;\n border-radius:10px;\n color:#8A94A8;\n font-family:'Inter',sans-serif;\n font-weight:600;\n font-size:13px;\n letter-spacing:.02em;\n cursor:pointer;\n transition:background .2s,color .2s;\n}\n.layer-tab.active{\n background:linear-gradient(135deg,rgba(201,168,76,.22),rgba(201,168,76,.12));\n color:var(--gold);\n box-shadow:0 0 0 1px rgba(201,168,76,.3),0 2px 12px rgba(201,168,76,.15);\n}\n.layer-tab:not(.active):hover{color:#B0B8C8}\n.ltab-label{white-space:nowrap}\n.ltab-count{\n font-size:11px;\n font-weight:700;\n padding:2px 7px;\n border-radius:20px;\n background:rgba(0,0,0,.35);\n color:inherit;\n min-width:20px;\n text-align:center;\n}\n.layer-tab.active .ltab-count{\n background:rgba(201,168,76,.25);\n color:var(--gold);\n}\n@media(max-width:380px){\n .layer-tab{font-size:12px;padding:10px 6px;gap:4px}\n .ltab-label{white-space:normal;line-height:1.2}\n .layer-tabs{gap:4px;padding:3px}\n}\n\n/* Terms & consent sheet */\n.terms-sheet{\n max-height:88vh;\n display:flex;\n flex-direction:column;\n padding-bottom:0;\n}\n.terms-title{\n font-family:'Cinzel',serif;\n font-weight:700;\n font-size:20px;\n color:var(--gold);\n letter-spacing:.04em;\n margin-bottom:4px;\n padding:0 20px;\n}\n.terms-sub{\n font-family:'Cormorant Garamond','Georgia',serif;\n font-style:italic;\n font-size:14px;\n color:#B0B8C8;\n margin-bottom:16px;\n padding:0 20px;\n}\n.terms-body{\n flex:1;\n overflow-y:auto;\n -webkit-overflow-scrolling:touch;\n padding:0 20px 16px;\n border-top:1px solid rgba(201,168,76,.15);\n border-bottom:1px solid rgba(201,168,76,.15);\n}\n.terms-intro{\n font-size:13.5px;\n line-height:1.6;\n color:#D8DCE8;\n padding:14px 0 10px;\n}\n.terms-intro em{color:var(--gold);font-style:normal;font-weight:600}\n.terms-section{margin-top:14px}\n.terms-num{\n font-family:'Cinzel',serif;\n font-weight:700;\n font-size:13px;\n color:var(--gold);\n letter-spacing:.04em;\n margin-bottom:6px;\n}\n.terms-section p{\n font-size:13px;\n line-height:1.55;\n color:#C8CED8;\n margin-bottom:4px;\n}\n.terms-section ul{\n padding-left:18px;\n margin-top:6px;\n}\n.terms-section li{\n font-size:12.5px;\n line-height:1.55;\n color:#B8BFCC;\n margin-bottom:4px;\n}\n.terms-section strong{color:var(--gold)}\n.terms-link{\n color:var(--gold);\n text-decoration:underline;\n text-decoration-color:rgba(201,168,76,.4);\n}\n\n.terms-footer{\n padding:16px 20px 20px;\n background:#0a0f1a;\n position:sticky;\n bottom:0;\n}\n.terms-agree{margin-bottom:14px}\n.terms-agree .fchk-label{font-size:12px;line-height:1.5}\n.terms-actions{\n display:flex;\n gap:10px;\n}\n.terms-btn-cancel,\n.terms-btn-agree{\n -webkit-appearance:none;appearance:none;\n flex:1;\n padding:13px;\n font-family:'Inter',sans-serif;\n font-weight:700;\n font-size:14px;\n letter-spacing:.04em;\n border-radius:12px;\n cursor:pointer;\n transition:background .2s,opacity .2s;\n}\n.terms-btn-cancel{\n background:transparent;\n color:#B0B8C8;\n border:1px solid rgba(255,255,255,.2);\n}\n.terms-btn-cancel:hover{background:rgba(255,255,255,.05)}\n.terms-btn-agree{\n background:var(--gold);\n color:#000;\n border:none;\n box-shadow:0 4px 20px rgba(201,168,76,.35);\n}\n.terms-btn-agree:disabled{\n opacity:.35;\n cursor:not-allowed;\n box-shadow:none;\n}\n.terms-btn-agree:not(:disabled):hover{background:var(--gold-h)}\n\n/* Pending review badge on user-submitted cards */\n.pending-badge{\n display:inline-flex;\n align-items:center;\n gap:4px;\n background:rgba(201,168,76,.15);\n color:var(--gold);\n border:1px solid rgba(201,168,76,.4);\n font-size:10px;\n font-weight:600;\n padding:3px 8px;\n border-radius:20px;\n letter-spacing:.04em;\n text-transform:uppercase;\n margin-top:6px;\n}\n.pending-badge::before{\n content:'';\n width:6px;height:6px;\n border-radius:50%;\n background:var(--gold);\n animation:pulse 1.8s ease-in-out infinite;\n}
1\n@keyframes pulse{\n 0%,100%{opacity:.4}\n 50%{opacity:1}\n}\n\n.fchk-sub{\n display:block;\n margin-top:6px;\n font-size:11.5px;\n line-height:1.5;\n color:#8A94A8;\n letter-spacing:0;\n font-weight:400;\n}\n.fchk-sub em{color:var(--gold);font-style:normal;font-weight:600}\n\n.terms-preview{\n margin:-4px 0 14px;\n padding:10px 12px;\n background:rgba(201,168,76,.06);\n border:1px solid rgba(201,168,76,.18);\n border-radius:10px;\n font-size:12px;\n line-height:1.5;\n color:#B0B8C8;\n letter-spacing:0;\n}\n.terms-preview-link{\n -webkit-appearance:none;appearance:none;\n background:none;\n border:none;\n padding:0;\n color:var(--gold);\n font-family:inherit;\n font-size:inherit;\n font-weight:600;\n text-decoration:underline;\n text-decoration-color:rgba(201,168,76,.45);\n text-underline-offset:2px;\n cursor:pointer;\n}\n.terms-preview-link:hover{color:var(--gold-h)}\n\n/* When terms opened from Preview link (not Publish), hide the agreement footer */\n.terms-sheet.preview-mode .terms-footer,\n#termsOv.preview-mode .terms-footer{\n display:none;\n}\n.terms-sheet.preview-mode .terms-body,\n#termsOv.preview-mode .terms-body{\n border-bottom:none;\n padding-bottom:28px;\n}\n\n/* Tagline reveal \u2014 0.3s after title */\n@keyframes taglineReveal{\n from{opacity:0;transform:translateY(6px)}\n to{opacity:.95;transform:translateY(0)}\n}\n/* ===== State-wise (overlay sheet) ===== */\n.wall-state-cta{padding:18px 20px 6px;text-align:center}\n.wall-state-cta-btn{display:inline-flex;align-items:center;gap:8px;background:rgba(201,168,76,.08);border:1.5px solid var(--gold);border-radius:14px;padding:12px 22px;color:var(--gold);font-family:'Inter',sans-serif;font-size:14px;font-weight:600;letter-spacing:.03em;cursor:pointer;text-decoration:none;transition:background .2s,transform .12s;box-shadow:0 0 18px rgba(201,168,76,.18)}\n.wall-state-cta-btn:hover{background:rgba(201,168,76,.18)}\n.wall-state-cta-btn:active{transform:scale(.97)}\n.wall-state-cta-poppy{width:20px;height:auto;display:inline-block;vertical-align:middle}\n.state-card{margin:0 auto;padding:18px 4px 6px;text-align:center}\n.state-card.empty{padding:14px 4px 6px}\n.state-flag{font-family:'Cinzel',serif;font-size:18px;color:#EDE0C4;letter-spacing:.06em;margin-bottom:14px}\n.state-flag .state-name{color:var(--gold)}\n.state-candle-personal{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:15px;color:var(--sub);margin-bottom:6px}\n.state-candle-personal.lit{color:#EDE0C4}\n.state-candle-personal strong{color:#EDE0C4;font-weight:500}\n.state-stat{font-size:14px;color:var(--body);margin:14px 0 8px;line-height:1.55}\n.state-stat .state-num{color:var(--gold);font-weight:600;font-family:'Inter',sans-serif;font-size:18px}\n.state-breakdown{font-family:'Inter',sans-serif;font-size:12px;color:#8A94A8;letter-spacing:.02em;margin:0 0 16px;line-height:1.7}\n.state-breakdown .bw{color:#B0B8C8;white-space:nowrap}\n.state-breakdown .bn{color:#EDE0C4;font-weight:500}\n.state-breakdown .bsep{color:#444;margin:0 4px}\n.btn-state-light{background:#000;color:var(--gold);font-family:'Inter',sans-serif;font-weight:600;font-size:14px;border:1.5px solid var(--gold);border-radius:12px;cursor:pointer;padding:12px 32px;letter-spacing:.04em;display:inline-flex;align-items:center;gap:8px;transition:background .2s,transform .12s;box-shadow:0 0 18px rgba(201,168,76,.22)}\n.btn-state-light:hover{background:rgba(201,168,76,.12)}\n.btn-state-light:active{transform:scale(.97)}\n.btn-state-light svg{width:14px;height:14px}\n.state-source{margin-top:16px;font-size:11px;color:#6c7383;letter-spacing:.03em;font-family:'Inter',sans-serif}\n.state-source a{color:#8A94A8;text-decoration:underline}\n.state-source a:hover{color:var(--gold)}\n.state-actions{margin-top:14px;display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}\n.state-actions-sep{display:none}\n.btn-state-action{font-size:13px;color:var(--gold);background:rgba(201,168,76,.08);border:1px solid rgba(201,168,76,.45);border-radius:999px;cursor:pointer;font-family:'Inter',sans-serif;font-weight:600;padding:9px 18px;display:inline-flex;align-items:center;gap:6px;transition:background .2s,border-color .2s,transform .12s;letter-spacing:.02em}
1\n.btn-state-action:hover{background:rgba(201,168,76,.18);border-color:var(--gold)}\n.btn-state-action:active{transform:scale(.97)}\n.btn-state-action.secondary{color:#B0B8C8;border-color:rgba(176,184,200,.35);background:transparent}\n.btn-state-action.secondary:hover{color:#EDE0C4;border-color:rgba(237,224,196,.6);background:rgba(255,255,255,.04)}\n.btn-state-action svg{width:13px;height:13px}\n.state-picker-prompt{font-family:'Cormorant Garamond',serif;font-style:italic;font-size:15px;color:var(--sub);margin-bottom:14px}\n.state-select{appearance:none;-webkit-appearance:none;background:#0d0604;color:#EDE0C4;font-family:'Inter',sans-serif;font-size:15px;border:1.5px solid var(--card-b);border-radius:10px;padding:11px 36px 11px 16px;cursor:pointer;min-width:220px;text-align:center;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%23C9A84C' stroke-width='1.5' fill='none'/%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 14px center}\n.state-select:focus{outline:none;border-color:var(--gold)}\n"}})]}),(0,l.jsx)("div",{id:"memorial-day-2026-legacy-root",style:{height:"100vh",overflowY:"auto"},dangerouslySetInnerHTML:{__html:'\n\x3c!-- v40: Smart App Banner \u2014 shown when page is opened outside the NewsBreak app.\n Tracks banner_view / banner_click / banner_dismiss via Amplitude. --\x3e\n<div id="appBanner" class="nb-hidden" role="banner" aria-label="Get the NewsBreak app">\n <div class="nb-logo-wrap">\n <img src="data:image/png;base64,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" class="nb-banner-logo" alt="NewsBreak">\n <div class="nb-desc">Local news & breaking alerts</div>\n </div>\n <a id="nbBannerCta" class="nb-open" href="https://www.newsbreak.com/download" onclick="nbBannerClick(event)">Open App</a>\n <button class="nb-close" onclick="nbBannerDismiss()" aria-label="Close app banner">\u2715</button>\n</div>\n\n\x3c!-- Floating share pill \u2014 always visible top-right --\x3e\n<div class="topbar">\n <button class="share-btn" onclick="shareCollective(\'top_pill\')">\n <svg viewBox="0 0 18 18"><circle cx="14" cy="4" r="2"/><circle cx="4" cy="9" r="2"/><circle cx="14" cy="14" r="2"/><line x1="6" y1="10" x2="12" y2="13"/><line x1="12" y1="5" x2="6" y2="8"/></svg>\n Share\n </button>\n</div>\n\n\x3c!-- v25: INTRO SCREEN \u2014 forces hero+candle+nominate to fill exactly one viewport, hiding Honor Wall from first view --\x3e\n<div class="intro-screen">\n\n\x3c!-- HERO --\x3e\n<div class="hero">\n <div class="flag-bg" id="flagBg"></div>\n <div class="flag-grad"></div>\n <div class="hero-warm"></div>\n <div class="hero-inner">\n <div class="main-title"><span class="star">\u2605</span> MEMORIAL DAY <span class="star">\u2605</span></div>\n <div class="sub-title">
1\n <span class="sub-line sub-line-1">REMEMBER.</span>\n <span class="sub-line sub-line-2">HONOR.</span>\n <span class="sub-line sub-line-3">PAY RESPECTS.</span>\n </div>\n </div>\n \x3c!-- Grave-row silhouette \u2014 subtle focal anchor at horizon line --\x3e\n <div class="hero-silhouette" aria-hidden="true">\n <svg viewBox="0 0 400 48" preserveAspectRatio="none" xmlns="http://www.w3.org/2000/svg">\n <defs>\n <linearGradient id="sHaze" x1="0" y1="0" x2="0" y2="1">\n <stop offset="0%" stop-color="#000" stop-opacity="0"/>\n <stop offset="100%" stop-color="#000" stop-opacity="1"/>\n </linearGradient>\n </defs>\n \x3c!-- faint back row of headstones --\x3e\n <g fill="#000" opacity=".55">\n <rect x="6" y="30" width="6" height="14" rx="2"/>\n <rect x="22" y="32" width="5" height="12" rx="1.8"/>\n <rect x="36" y="29" width="6" height="15" rx="2"/>\n <rect x="52" y="31" width="5" height="13" rx="1.8"/>\n <rect x="66" y="28" width="6" height="16" rx="2"/>\n <rect x="82" y="30" width="5" height="14" rx="1.8"/>\n <rect x="96" y="32" width="6" height="12" rx="2"/>\n <rect x="112" y="29" width="5" height="15" rx="1.8"/>\n <rect x="126" y="31" width="6" height="13" rx="2"/>\n <rect x="142" y="28" width="5" height="16" rx="1.8"/>\n <rect x="156" y="30" width="6" height="14" rx="2"/>\n <rect x="172" y="32" width="5" height="12" rx="1.8"/>\n <rect x="186" y="29" width="6" height="15" rx="2"/>\n <rect x="202" y="31" width="5" height="13" rx="1.8"/>\n <rect x="216" y="28" width="6" height="16" rx="2"/>\n <rect x="232" y="30" width="5" height="14" rx="1.8"/>\n <rect x="246" y="32" width="6" height="12" rx="2"/>\n <rect x="262" y="29" width="5" height="15" rx="1.8"/>\n <rect x="276" y="31" width="6" height="13" rx="2"/>\n <rect x="292" y="28" width="5" height="16" rx="1.8"/>\n <rect x="306" y="30" width="6" height="14" rx="2"/>\n <rect x="322" y="32" width="5" height="12" rx="1.8"/>\n <rect x="336" y="29" width="6" height="15" rx="2"/>\n <rect x="352" y="31" width="5" height="13" rx="1.8"/>\n <rect x="366" y="28" width="6" height="16" rx="2"/>\n <rect x="382" y="30" width="5" height="14" rx="1.8"/>\n </g>\n \x3c!-- soft haze / ground blend --\x3e\n <rect x="0" y="0" width="400" height="48" fill="url(#sHaze)"/>\n </svg>\n </div>\n</div>\n\n\x3c!-- CANDLE + CTA --\x3e\n<div class="black-section">\n <div class="participated" id="cCount" style="visibility:hidden"></div>\n <div class="candle-wrap" id="cWrap" onclick="lightCandle()">\n <div class="candle-box">\n \x3c!-- UNLIT --\x3e\n <svg class="candle-svg c-unlit" viewBox="0 0 90 160" xmlns="http://www.w3.org/2000/svg">\n <defs>\n <linearGradient id="wU" x1="0%" y1="0%" x2="100%" y2="0%">\n <stop offset="0%" stop-color="#c0b7a8"/><stop offset="22%" stop-color="#eae4d8"/>\n <stop offset="52%" stop-color="#f6f1e9"/><stop offset="78%" stop-color="#e6dece"/>\n <stop offset="100%" stop-color="#bdb4a4"/>\n </linearGradient>\n <linearGradient id="tU" x1="0%" y1="0%" x2="100%" y2="0%">\n <stop offset="0%" stop-color="#b0a898"/><stop offset="50%" stop-color="#d8d0c0"/><stop offset="100%" stop-color="#a8a090"/>\n </linearGradient>\n </defs>\n <line x1="45" y1="14" x2="45" y2="27" stroke="#5a4030" stroke-width="1.5" stroke-linecap="round"/>\n <ellipse cx="45" cy="28" rx="20" ry="4.5" fill="url(#tU)"/>\n <rect x="25" y="28" width="40" height="117" rx="2" fill="url(#wU)"/>\n <ellipse cx="45" cy="145" rx="20" ry="4.5" fill="#aaa098"/>\n <rect x="32" y="33" width="6" height="107" rx="2.5" fill="rgba(255,255,255,0.24)"/>\n <rect x="57" y="33" width="4" height="107" rx="2" fill="rgba(0,0,0,0.07)"/>\n <path d="M25 68 C23 74 23 80 25 82 C27 84 25 88 25 90" stroke="rgba(215,205,190,0.55)" stroke-width="2.5" fill="none" stroke-linecap="round"/>\n </svg>\n \x3c!-- LIT --\x3e\n <svg class="candle-svg c-lit" viewBox="0 0 90 160" xmlns="http://www.w3.org/2000/svg">\n <defs>\n <linearGradient id="wL" x1="0%" y1="0%" x2="100%" y2="0%">\n <stop offset="0%" stop-color="#c0b7a8"/><stop offset="22%" stop-color="#eae4d8"/>
1\n <stop offset="52%" stop-color="#f6f1e9"/><stop offset="78%" stop-color="#e6dece"/>\n <stop offset="100%" stop-color="#bdb4a4"/>\n </linearGradient>\n <linearGradient id="tL" x1="0%" y1="0%" x2="100%" y2="0%">\n <stop offset="0%" stop-color="#b08040"/><stop offset="45%" stop-color="#d8a860"/><stop offset="100%" stop-color="#986030"/>\n </linearGradient>\n \x3c!-- Outer flame: orange \u2192 red, translucent --\x3e\n <radialGradient id="fOuter" cx="50%" cy="82%" r="58%">\n <stop offset="0%" stop-color="#ffb040" stop-opacity=".9"/>\n <stop offset="35%" stop-color="#ff7020" stop-opacity=".55"/>\n <stop offset="75%" stop-color="#c42000" stop-opacity=".18"/>\n <stop offset="100%" stop-color="#7a1000" stop-opacity="0"/>\n </radialGradient>\n \x3c!-- Mid flame: yellow body --\x3e\n <radialGradient id="fMid" cx="50%" cy="78%" r="50%">\n <stop offset="0%" stop-color="#fff8d0"/>\n <stop offset="30%" stop-color="#ffe070"/>\n <stop offset="60%" stop-color="#ffb418"/>\n <stop offset="92%" stop-color="#ff5800" stop-opacity=".25"/>\n <stop offset="100%" stop-color="#ff3000" stop-opacity="0"/>\n </radialGradient>\n \x3c!-- Inner core: white-hot --\x3e\n <radialGradient id="fCore" cx="50%" cy="72%" r="70%">\n <stop offset="0%" stop-color="#ffffff"/>\n <stop offset="45%" stop-color="#fffbe0" stop-opacity=".95"/>\n <stop offset="100%" stop-color="#fff080" stop-opacity="0"/>\n </radialGradient>\n </defs>\n\n \x3c!-- Wax body (drawn first so flame sits on top) --\x3e\n <ellipse cx="45" cy="33" rx="20" ry="4.5" fill="url(#tL)"/>\n <rect x="25" y="33" width="40" height="112" rx="2" fill="url(#wL)"/>\n <ellipse cx="45" cy="145" rx="20" ry="4.5" fill="#aaa098"/>\n <rect x="32" y="38" width="6" height="102" rx="2.5" fill="rgba(255,255,255,0.24)"/>\n <rect x="57" y="38" width="4" height="102" rx="2" fill="rgba(0,0,0,0.07)"/>\n <path d="M25 70 C23 76 23 82 25 84 C27 86 25 90 25 92" stroke="rgba(215,205,190,0.55)" stroke-width="2.5" fill="none" stroke-linecap="round"/>\n\n \x3c!-- Wick --\x3e\n <line x1="45" y1="27" x2="45" y2="33" stroke="#2a1508" stroke-width="1.5" stroke-linecap="round"/>\n \x3c!-- Blue-hot base at wick --\x3e\n <ellipse cx="45" cy="27" rx="3.2" ry="2.4" fill="#90c0ff" opacity=".7">\n <animate attributeName="opacity" values=".55;.85;.6;.8;.55" dur="1.7s" repeatCount="indefinite"/>\n </ellipse>\n\n \x3c!-- Layer 1: outer flame (orange/red) --\x3e\n <ellipse class="flame-layer l-outer" cx="45" cy="14" rx="16" ry="22" fill="url(#fOuter)">\n <animate attributeName="cx" values="45;45.9;44.3;45.6;45" dur="2.8s" repeatCount="indefinite"/>\n <animate attributeName="rx" values="16;13.5;17.2;14.5;16" dur="2.3s" repeatCount="indefinite"/>\n <animate attributeName="ry" values="22;24.5;19.5;23;22" dur="2.3s" repeatCount="indefinite"/>\n <animate attributeName="opacity" values="1;.85;.95;.88;1" dur="2.1s" repeatCount="indefinite"/>\n </ellipse>\n\n \x3c!-- Layer 2: mid flame (yellow body) --\x3e\n <path class="flame-layer l-mid" d="M45 2 C40 8 37 14 38.5 20 C39.5 25 42.5 28 45 28.5 C47.5 28 50.5 25 51.5 20 C53 14 50 8 45 2 Z" fill="url(#fMid)">\n <animateTransform attributeName="transform" type="skewX" values="0;3;-2.5;1.8;-1;0" dur="1.9s" repeatCount="indefinite" additive="sum"/>\n <animateTransform attributeName="transform" type="translate" values="0,0; .8,0; -.7,0; .4,0; 0,0" dur="1.7s" repeatCount="indefinite" additive="sum"/>\n </path>\n\n \x3c!-- Layer 3: inner white-hot core --\x3e\n <ellipse class="flame-layer l-core" cx="45" cy="20" rx="2.6" ry="7" fill="url(#fCore)">\n <animate attributeName="ry" values="7;5.4;8.2;6.4;
17" dur="1.5s" repeatCount="indefinite"/>\n <animate attributeName="cy" values="20;19.4;20.6;19.8;20" dur="1.5s" repeatCount="indefinite"/>\n <animate attributeName="cx" values="45;45.4;44.7;45.3;45" dur="2.1s" repeatCount="indefinite"/>\n <animate attributeName="opacity" values=".95;.78;1;.85;.95" dur="1.3s" repeatCount="indefinite"/>\n </ellipse>\n </svg>\n <div class="flame-glow"></div>\n <div class="wick-ember"></div>\n </div>\n <div class="tap-hint">Tap the candle to light it</div>\n </div>\n <div style="display:flex;flex-direction:column;align-items:center">\n <div id="candleAfterHint" class="candle-after-hint">\n <div class="user-rank-line" id="userRankLine">\n You are the <span class="urank-num" id="urankNum">\u2014</span><span class="urank-suffix" id="urankSuffix">th</span> person paying tribute\n </div>\n <button class="btn-share-primary" onclick="shareCollective(\'invite_others\')">\n <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg>\n Invite Others to Honor\n </button>\n <button class="btn-wall-link" onclick="scrollToWall()">\u2193 Or honor a hero by name below</button>\n </div>\n </div>\n</div>\n\n<div class="divider"></div>\n\n\x3c!-- NOMINATE BLOCK \u2014 drastically de-emphasized in v23 --\x3e\n<div class="nominate-section-v23">\n <a class="nominate-link-v23" onclick="openForm(\'nominate_link\')">\n Have a story to share? <span class="nominate-link-action">Remember a hero \u2192</span>\n </a>\n</div>\n\n</div>\x3c!-- /intro-screen --\x3e\n\n\x3c!-- Subtle scroll hint visible at the boundary between intro and wall --\x3e\n<div class="intro-scroll-hint" id="introScrollHint">\n <span class="ish-text">\u2193 Scroll to view the Honor Wall</span>\n</div>\n\n\x3c!-- HONOR WALL --\x3e\n<div class="wall">\n <div class="wall-header">\n <div class="wall-title">Honor Wall</div>\n <div class="wall-tagline">\n Each name carries a story.<br/>\n Each story deserves to be remembered.\n <span class="wt-accent">\u2014 Today, we honor them all \u2014</span>\n </div>\n <div class="wall-intro-divider"></div>\n <div class="layer-tabs">\n <button class="layer-tab active" id="ltabFallen" onclick="switchLayer(\'fallen\')">\n <span class="ltab-label">Killed in Action</span>\n <span class="ltab-count" id="fallenCount">0</span>\n </button>\n <button class="layer-tab" id="ltabServed" onclick="switchLayer(\'served\')">\n <span class="ltab-label">Veteran at Rest</span>\n <span class="ltab-count" id="servedCount">0</span>\n </button>\n </div>\n </div>\n\n <div class="filter-row">\n <div class="filter-tabs" id="filterTabs"></div>\n <button class="search-toggle" id="searchToggle" onclick="toggleSearch()" title="Search heroes">\n <svg width="16" height="16" viewBox="0 0 18 18" fill="none" stroke="#C9A84C" stroke-width="2.2"><circle cx="7.5" cy="7.5" r="5"/><line x1="11.5" y1="11.5" x2="16" y2="16"/></svg>\n </button>\n </div>\n <div class="srch-expand" id="srchExpand">\n <svg class="s-ico" width="14" height="14" viewBox="0 0 18 18" fill="none" stroke="#8A94A8" stroke-width="2"><circle cx="7.5" cy="7.5" r="5"/><line x1="11.5" y1="11.5" x2="16" y2="16"/></svg>\n <input id="srchIn" type="text" placeholder="Search by name, conflict, branch..." oninput="onSearch()" autocomplete="off"/>\n <button class="s-clr" id="sClear" onclick="clearSrch()">\xd7</button>\n </div>\n\n <div class="cards" id="cardsWrap"></div>\n <div class="no-r" id="noR">\n No results \u2014 be the first to honor them\n <div style="margin-top:12px"><button class="btn-honor" style="max-width:200px;margin:0 auto" onclick="openForm(\'empty_state\')">Honor them now</button></div>\n </div>
1\n <button class="load-more" id="loadMore" onclick="loadMore()">Load more heroes</button>\n\n <div class="wall-state-cta">\n <button type="button" class="wall-state-cta-btn" onclick="openStateOverlay()">\n <img src="/ms/memorial-day-2026/assets/poppy.webp" alt="" class="wall-state-cta-poppy"/>\n Honor heroes from your state\n <span style="opacity:.7;font-weight:400;margin-left:2px">\u2192</span>\n </button>\n </div>\n</div>\n\n\x3c!-- DETAIL SHEET --\x3e\n<div class="overlay" id="cardOv">\n <div class="sheet">\n <div class="handle"></div>\n <button class="sheet-close" onclick="close_(\'cardOv\')">\xd7</button>\n <div class="detail-top">\n <div id="dPhotoWrap"></div>\n <div class="detail-top-info">\n <div class="detail-name" id="dName"></div>\n <div class="detail-dates" id="dDates"></div>\n </div>\n </div>\n <div id="dMedal"></div>\n <div class="detail-story" id="dStory"></div>\n <div class="detail-tags" id="dTags"></div>\n <div id="dCandleStat" style="margin-top:14px;font-family:\'Inter\',sans-serif;font-size:13px;color:rgba(255,255,255,.6);text-align:center;letter-spacing:.03em;">\n Honored by <span style="color:var(--gold);font-weight:600" id="dCandleNum">0</span> people\n </div>\n <div class="detail-src" id="dSource"></div>\n\n <div class="detail-actions">\n <button class="btn-light-primary" id="btnDetailLight" onclick="lightCandleFromDetail()">\n <span class="btn-poppy-wrap" id="btnDetailIcon" aria-hidden="true"></span>\n <span id="btnDetailLightLabel">Pay Respects</span>\n </button>\n\n </div>\n </div>\n</div>\n\n\x3c!-- TRIBUTE CARD (shareable) - NEW in v22 --\x3e\n<div class="tcard-ov" id="tcardOv">\n <button class="tcard-close" onclick="close_tcard()">\xd7</button>\n <div class="tcard-modal">\n <div class="tcard-title">YOUR TRIBUTE</div>\n <div class="tcard-sub">Share to honor their memory</div>\n\n <div class="tcard" id="tcardVisual">\n \x3c!-- v33: watercolor poppies bottom-right decoration --\x3e\n <img class="tcard-watermark" id="tcardWatermark" src="" alt="" aria-hidden="true"/>\n <div class="tcard-header">\n <div class="tcard-eyebrow">\u2605 MEMORIAL DAY <span class="tcard-stars">\u2605</span></div>\n </div>\n <div class="tcard-photo-frame" id="tcardPhoto"></div>\n <div class="tcard-hero-name" id="tcardName"></div>\n <div class="tcard-hero-meta" id="tcardMeta"></div>\n <div class="tcard-divider"></div>\n <div class="tcard-flame">\n <img id="tcardPoppy" src="" alt="" style="width:132px;height:auto;display:block;margin:0 auto"/>\n </div>\n <div class="tcard-thought" id="tcardThought">Thank you for your service</div>\n <div class="tcard-signature">\u2014 Lit by someone who remembers</div>\n <div class="tcard-footer">\n <span class="tcard-footer-logo">NEWSBREAK</span>\n <span class="tcard-footer-dot">\u25cf</span>\n <span class="tcard-footer-tag">Memorial Wall \xb7 2026</span>\n </div>\n </div>\n\n <div class="tcard-actions">\n <button class="tcard-share-btn" onclick="shareTributeCard()">\n <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/><line x1="8.59" y1="13.51" x2="15.42" y2="17.49"/><line x1="15.41" y1="6.51" x2="8.59" y2="10.49"/></svg>\n Share This Tribute\n </button>\n <button class="tcard-secondary-btn" onclick="close_tcard()">Done</button>\n </div>\n </div>\n</div>\n\n\x3c!-- SUBMIT FORM --\x3e\n\x3c!-- STATE-WISE HONOR OVERLAY (sister to Nominate) --\x3e\n<div class="overlay" id="stateOv">\n <div class="sheet">\n <div class="handle"></div>\n <button class="sheet-close" onclick="close_(\'stateOv\')">\xd7</button>\n <div class="form-title" style="color:var(--gold)">Honor Your State\'s Heroes</div>\n <div class="form-sub">Pay your respects to the heroes from your state</div>\n <div class="state-card empty" id="stateCard">\n <div class="state-picker-prompt">Choose your state to honor your local heroes</div>\n <select class="state-select" id="stateSelect" aria-label="Cho
1ose your state" onchange="onStateSelected(this.value)">\n <option value="">\u2014 Select your state \u2014</option>\n </select>\n </div>\n </div>\n</div>\n\n<div class="overlay" id="formOv">\n <div class="sheet">\n <div class="handle"></div>\n <button class="sheet-close" onclick="close_(\'formOv\')">\xd7</button>\n <div class="form-title" style="color:var(--gold)">Remember A Hero</div>\n <div class="form-sub">Share their story with the world</div>\n <div class="terms-preview">\n Submissions are reviewed within 1 business day. By submitting, you agree to our <button type="button" class="terms-preview-link" onclick="openTermsPreview()">Memorial Submission Terms</button>.\n </div>\n\n <div class="fgrp">\n <label class="flbl">WHO ARE YOU HONORING? *</label>\n <div class="fradio-group" role="radiogroup" aria-label="Who are you honoring">\n <label class="fradio">\n <input type="radio" name="fHonorType" value="fallen" id="fHonorFallen"/>\n <span class="fradio-dot"></span>\n <span class="fradio-text">I am honoring someone who <strong>gave their life in service</strong>.</span>\n </label>\n <label class="fradio">\n <input type="radio" name="fHonorType" value="served" id="fHonorServed"/>\n <span class="fradio-dot"></span>\n <span class="fradio-text">I am honoring someone who <strong>passed away after service</strong>.</span>\n </label>\n </div>\n </div>\n\n <div class="fgrp"><label class="flbl">FULL NAME *</label><input class="finput" id="fName" type="text" placeholder="e.g. James R. Collins" maxlength="80"/></div>\n <div class="fgrp">\n <label class="flbl">THEIR STORY * <span style="font-size:11px;color:#8A94A8;letter-spacing:0">(max 150 chars)</span></label>\n <textarea class="ftxt" id="fStory" maxlength="150" placeholder="He served two tours..." oninput="updChar()"></textarea>\n <div class="char-ct"><span id="charLeft">150</span> characters left</div>\n </div>\n <div class="fgrp">\n <label class="flbl">BRANCH OF SERVICE *</label>\n <select class="fsel" id="fBranch">\n <option value="">Select a branch\u2026</option>\n <option value="Army">Army</option>\n <option value="Navy">Navy</option>\n <option value="Air Force">Air Force</option>\n <option value="Marine Corps">Marine Corps</option>\n <option value="Coast Guard">Coast Guard</option>\n <option value="Space Force">Space Force</option>\n <option value="National Guard">National Guard</option>\n </select>\n </div>\n <div class="fgrp">\n <label class="flbl">ERA / CONFLICT *</label>\n <select class="fsel" id="fEra">\n <option value="">
1Select an era or conflict\u2026</option>\n <option value="World War I">World War I</option>\n <option value="World War II">World War II</option>\n <option value="Korean War">Korean War</option>\n <option value="Vietnam War">Vietnam War</option>\n <option value="Cold War">Cold War</option>\n <option value="Gulf War">Gulf War</option>\n <option value="GWOT (Iraq / Afghanistan)">GWOT (Iraq / Afghanistan)</option>\n <option value="Peacetime Service">Peacetime Service</option>\n <option value="Other">Other</option>\n </select>\n </div>\n <div class="fgrp">\n <label class="flbl">RANK / RATE (optional)</label>\n <input class="finput" id="fRank" type="text" placeholder="e.g. Sergeant, Petty Officer 1st Class" maxlength="60"/>\n </div>\n <div class="fgrp">\n <label class="flbl">PHOTO (optional)</label>\n <div id="photoDropWrap">\n <label class="photo-drop" for="fPhoto">\n <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#8A94A8" stroke-width="1.5"><rect x="3" y="5" width="18" height="14" rx="2"/><circle cx="12" cy="12" r="3"/><path d="M8 5l1.5-2h5L16 5"/></svg>\n <span>Photos must be approved before being shown on the Wall.</span>\n </label>\n </div>\n <div id="photoCropWrap" style="display:none">\n <div class="crop-label">Drag to position \xb7 pinch/scroll to zoom</div>\n <div class="crop-canvas-wrap">\n <canvas id="photoCropCanvas" width="240" height="240"></canvas>\n </div>\n <div class="crop-actions">\n <button type="button" class="crop-btn" onclick="retakePhoto()">Retake</button>\n <input type="range" class="crop-zoom" id="photoZoom" min="1" max="3" step="0.01" value="1" oninput="redrawCrop()"/>\n </div>\n </div>\n <input type="file" id="fPhoto" accept="image/jpeg,image/png" style="display:none" onchange="prevPhoto(event)"/>\n </div>\n <div class="fgrp">\n <label class="flbl">YEARS OF SERVICE (optional)</label>\n <div class="fdates">\n <input class="finput" id="fBirth" type="number" placeholder="Start year" min="1880" max="2005"/>\n <input class="finput" id="fDeath" type="number" placeholder="End year" min="1900" max="2025"/>\n </div>\n </div>\n\n \x3c!-- v29: Optional email for review-status notification --\x3e\n <div class="fgrp">\n <label class="flbl">EMAIL <span style="font-size:11px;color:#8A94A8;letter-spacing:0;font-weight:400">(optional)</span></label>\n <input class="finput" id="fEmail" type="email" placeholder="[email protected]" maxlength="120" autocomplete="email"/>\n <div class="email-helper">\n We\'ll notify you when this tribute is reviewed.<br/>\n Your email won\'t be used for anything else.\n </div>\n </div>\n\n <button class="btn-pub" onclick="submitHero()">Submit for Review</button>\n </div>\n</div>\n\n\n\x3c!-- TERMS & CONSENT SHEET --\x3e\n<div class="overlay" id="termsOv">\n <div class="sheet terms-sheet">\n <div class="handle"></div>\n <button class="sheet-close" onclick="closeTermsSheet()">\xd7</button>\n <div class="terms-title">Memorial Submission Terms</div>\n <div class="terms-sub">Please review carefully before submitting</div>\n \n <div class="terms-body">\n <p class="terms-intro">By submitting photographs, name, or other information about a service member who has fallen in the line of duty (the <em>"Memorial Content"</em>), you agree to the following terms:</p>\n\n <div class="terms-section">\n <div class="terms-num">1. Accuracy of Information</div>\n <p>You confirm that all information you submitted is true, accurate, and to the best of your knowledge, not misleading. Submitting false, fabricated, or intentionally inaccurate information may result in removal of your submission.</p>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">2. Rights and Consent</div>\n <p>You represent and warrant that:</p>\n <ul>\n <li>You personally own the intellectual property rights (including copyright) to the photograph(s), or you have obtained all necessary permissions from the right holder(s);</li>\n <li>You are an immediate family member of the service member, or you have obtained the consent of the service member\'s immediate family; and</li>\n <li>Your submission does not infringe upon the rights, privacy, or dignity of any third party, including the service member being honored.</li>\n </ul>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">3. Limited License Grant</div>\n <p>You grant NewsBreak a non-exclusive, royalty-free, worldwide license to use, display, reproduce, and adapt the Memorial Content solely for this Memorial Day Activity. This license:</p>\n <ul>\n <li>Is limited to the scope and duration of this Activity;</li>\n <li>
1Shall not be used for commercial advertising unrelated to this Activity;</li>\n <li>Shall terminate upon conclusion of this Activity. Archival copies may be retained as required by law.</li>\n </ul>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">4. Content Review</div>\n <p>All submissions are subject to review by NewsBreak before publication. We reserve the right, at our sole discretion, to approve, reject, edit, or remove any submission. Review decisions are final. We aim to complete review <strong>within 1 business day</strong>.</p>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">5. Privacy and Data Use</div>\n <p>Any personal information you provide will be handled in accordance with our <a href="#" class="terms-link" onclick="return false">Privacy Policy</a>. We will not sell, share, or use this information for marketing purposes without separate consent. If you provide your email, it will be used only to notify you about this tribute\'s review status, and not for marketing.</p>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">6. Indemnification</div>\n <p>You agree to indemnify and hold harmless NewsBreak, its affiliates, officers, and employees from any claims, damages, or liabilities arising from your submission, including claims of copyright infringement, defamation, or violation of privacy rights.</p>\n </div>\n\n <div class="terms-section">\n <div class="terms-num">7. Respectful Use</div>\n <p>We are committed to treating every submission with the dignity it deserves. If you wish to withdraw your submission, contact us at <a href="mailto:[email protected]" class="terms-link">[email protected]</a> and we will respond promptly.</p>\n </div>\n </div>\n\n <div class="terms-footer">\n <label class="fchk terms-agree">\n <input type="checkbox" id="fAgree" onchange="updateAgreeState()"/>\n <span class="fchk-box"></span>\n <span class="fchk-label">I have read and agree to the above terms. I confirm that I have the right to submit this Memorial Content and that all information provided is accurate.</span>\n </label>\n <div class="terms-actions">\n <button class="terms-btn-cancel" onclick="closeTermsSheet()">Cancel</button>\n <button class="terms-btn-agree" id="btnAgreeSubmit" onclick="confirmSubmit()" disabled>Agree & Submit</button>\n </div>\n </div>\n </div>\n</div>\n\n\x3c!-- v29: NEW Success modal for tribute submission --\x3e\n<div class="app-ov" id="successOv">\n <div class="app-box success-box">\n <div class="success-icon" aria-hidden="true">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">\n <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/>\n <polyline points="22 4 12 14.01 9 11.01"/>\n </svg>\n </div>\n <div class="success-title">Thank you for honoring<br/><span id="successHeroName" class="success-hero-name"></span></div>\n <div class="success-desc">\n Your tribute has been received and is under review.\n <div class="success-subtext" id="successSubtext"></div>\n </div>\n <div class="success-divider"></div>\n <div class="app-btns">\n <button class="abtn skip" onclick="close_(\'successOv\')">Continue browsing the Wall</button>\n </div>\n </div>\n</div>\n<div class="toast" id="toast"></div>\n\n\n\n\x3c!-- BOTTOM SHARE SECTION --\x3e\n<div style="background:linear-gradient(180deg,#000 0%,#0a0a0a 100%);padding:42px 20px 56px;text-align:center;border-top:1px solid rgba(201,168,76,.15);position:relative;z-index:1">\n <div style="font-family:\'Cinzel\',serif;font-size:15px;color:var(--gold);letter-spacing:.13em;margin-bottom:8px">\n \u2605 MEMORIAL DAY \u2605\n </div>\n <div style="font-family:\'Cormorant Garamond\',serif;font-style:italic;font-size:14px;color:#8A94A8;letter-spacing:.04em;margin-bottom:22px">\n Share this tribute with those who care\n </div>\n <button onclick="doShare()" style="\n background:#000;color:var(--gold);\n font-family:\'Inter\',sans-serif;font-weight:700;font-size:15px;\n border:1.5px solid var(--gold);border-radius:14px;cursor:pointer;\n padding:15px 44px;letter-spacing:.05em;\n box-shadow:0 0 28px rgba(201,168,76,.35),inset 0 0 0 1px rgba(201,168,76,.15);\n display:inline-flex;align-items:center;gap:10px;\n transition:background .2s,transform .12s;\n " onmouseover="this.style.background=\'rgba(201,168,76,.12)\'" onmouseout="this.style.background=\'#000\'" onmousedown="this.style.transform=\'scale(.97)\'" onmouseup="this.style.transform=\'\'">\n <svg width="17" height="17" viewBox="0 0 18 18" fill="none" stroke="#C9A84C" stroke-width="2"><circle cx="14" cy="4" r="2"/><circle cx="4" cy="9" r="2"/><circle cx="14" cy="14" r="2"/><line x1="6" y1="10" x2="12" y2="13"/><line x1="12" y1="5" x2="6" y2="8"/></svg>\n Share This Tribute\n </button>\n <div style="margin-top:22px;font-size:11px;color:#555;letter-spacing:.08em;font-family:\'Inter\',sans-serif">\n REMEMBER \xb7 HONOR \xb7 PAY RESPECTS\n </div>\n <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAABXCAYAAADcbJbsAABNNElEQVR42u19eZwdVZX/99xa3nu9d/aEhLAISsABCYsg2gkIgkREoQOKCOoYHBT1Ny64zEwn6rgrAo5CdNAIiqYRlTVsJkEMa0AEwhIg+9bpdKe3t9Vyfn/UqXgp3+t+W3dap87nU5/0lnq3bt17z/Y930OIZVwIt7cb6085xWx94AHbSPctHsjzqtkPPXQ7v/BCgg4/PFfWvZiJiDie1VhiiSWW8SsqnoJxoHwZhDld1H/ffUZzc/Ka1kmT/r25MflJPs+36fDDcwxQOfeLlW8sscQSS6yAYynBW0XnckVLVrtHTWj4iWUnLkVzk1dXn+hCJ1xmJgJihRpLLLHEEivgWGqmfAHCt7/dQBdc6Dkf/uBXEgn7/a7rDMF1Db+uoZ8AH4uJ4pmKJZZYYokVcCy1VL5z55p05ZUDg+eefrbpu//p5h0XIAUiqETqGQDAjrlGRV51LLHEEksssQKOpYBcfnk9rV3rDL7njDMT9U03+oDLzL6hKOXk8jsHXn3lQX7iCQu9h/jl3jrOAccSSyyxjH+JPaX94f0uWmTh+uu9nvcumNNUX7/asKwJrue5pJRvEuxcb8/Kl63GM48EQJ2d+XjGYoklllj++cSMp2A/KN+lS72d6XRqckvLUkOpCa7r5onIADPDMIFU/Y6jbu7Mc1tb/H5iiSWWWBCHoGOphfKtrzfxzW82TrH8uw1DneQ6Tg6AIbFj03Mczx/suwMAMG+eXzGyOpZY9hOqP15/sc
1QSe8Djr9zoyCMJzz2XTS8852t1La1vdXNODoAVYLLAxGwyKDuQbF3JHR02jjzSq+Sz4hxwLPtL4rUXSyyxAh5/snixRevW5QfeOf8ziUTi067j5ohgMP52YCkieJ6zeUp7+25auNDjOEcfSyyxxII4BP0PIB0dHYo7OhQvWmQ9MXeuNW6837Y2k5Ysye89+7SLUslkh9U6yYfPhq5gCfCJiLP53C20cKHHV1yRqJSAIw4BxhJLLGMW2YvPp/+7HjAzCIs7jOfWrVNTt2xJPDcwkDtKkMPc3m5QZ6c3DkBX7tCnFp1o9/b/VClKOr7vEmneLTNYGQw3T1Y2twYAsGaNjzgMGEssseCfK+UQn0//4AqYOzoUenos9PaaRDcNAUtcebX5wfecMT1z4bn/vnVD1w7q7Pw+d3TUYcmSzP6gc2RA4frr3Z4GY2ZjV3enaSeSjuvliCLzTsSK2XSV0UtNzVsBAAsWeFi7Nl6hscQSSyxxHfD+lWc72u0j0eWjJ2XgmrtdIvIAgC+6aHqmpf4gdO2ab6dS7T54upWwp2Iwiy2bti2etWbNV7o/fE7D5BtuGxhrpqtVbW3GG3p7ExOOOvwO07Le5jH7RAWpJT3TsuxcLnvvjs2Pvvugj3/HwcKFfswBHUssscQSe8D7h6px0SITppno3L07cyTmgJZ0ugDcPS+demT+kgveQlAzHN+7LJXLTkNDAwDAYIabc7KUtGnWIQcsTk86/bnJN9x2C19ySZKWLcuO1di7P/e5hvnf+c5A7uKF37MTiXmu4zpEpIqEZDz4PiidfvHg1ZuyfOSqBgIGq8nLxGGeWGKJJZbYAy5P6S5vVxh6ZyPuumsgzN8+O2eOPfOkYw809u59R6Kx8Xx43uutRGI6lAEvlwMzO/IsDBCBQGD2yTANd0/Xlv509vQp9z+4fmVbmzl/9Wp3LDie8cQTvvOh93/KNM3v+Y6b46DWlwr+FyKC51F617Z/bbr3oZ93Amoh4MXLM5ZYYoklVsCjC1Ka3ktY0unoIdetpx0/cdL0g08m3z+ePafNSNWdYAJJKANghuv7OTAziMyiz0HkGb5nu0OD91mnHLcQa9a5aG3N0dKlzqg9z+WXN9CPfjSYvviC96dSqV96udxwyhcA2CAynfTQ1gGr4aSJr3vdTqxbx/sbPBZLLLHEEss/mQLu6OhQi3fsMNCYtrH5nCx1LtynaDZ/pH3ChL70gkRjy3zfyR9pp1LHgwH4PlzPYwReoQ9mQpFwbgH/0jXrUolMz+4b6pbf/hFub09RZ2dm1MBhAPrWPXlIyk780bDsA9j3fdAwLQWZfdMwLGdo8EV7+R/eEC/JWGLB/+mSnjh9FCvg2odl29utLYAxaw48WhKUCW2bO72u9ZC5k5BoPJnymXdZqdTpvu9PtJIJBc+H63pZEFRZCrfwQ3rsefZgb29765333cJtbSbVOBT9bHu7fVRnZ37ruedOnNKSut8yjGNcx3VGHLco4Ex66JrUr3/3aSxcqGLvN5ZYYokFMQirGgDV3lyuvmXZsj4CGFKb+9KZZzblP3Dhx5Wp6r187m0A3mgnrWmwFJgZrJTn5pxA8RIsCSVXPR5lWW5jwvzB4MlHv0yrV/+llkqYOzpMAOZLd91F05bfdJNhmce4uXxOwuOlFMbBz2WfJiLm9nYDcf43llhiiSX2gMtXvHNNLF3rhvlcngMbJ32kdah7xwKD/TardcKbDcs4DIYJuC58z4PPnBcvl0bRM/cNgkW+v2dw8tR5jd+75tlaoIUZIJx5pk0rVuQy73p7Z3L6Aee72VwegImS7s1skvLSKestdVMOegqLF3McgoolllhiiRVwRXLXmVckTmnefEJd84TXef17z7eSqXdS6MkS4Lp+DgQfgAFmNWyOtLYGgmdZlp3p2nHHqtlvOH9KLufPXbrUrabelufOtWjtWqd/4YLLG1ON/+MCYXcjKkH3+qZhWrn04FODG56dN/Gsi9JqyRI31r6xxBJLLIhD0CV7gQDww4763Io/fcao3/oOthNHGcSNRl09XM/zADB8n8O2e3r4dQytDcN13bydqjv7bRue+WzDHav/e/c55zTitspIOjZIbXH/Bee+u66u/usew4HvlWNQ+DANkJV4aKPXnJnY328x4MbLMpZYYokFcTOGkmTRIpOIeMdvV341n6XFZqruJDKMBieTzbqu6+zTf0SqGjBVTcT3FRqa3FSi/mvpM+dfOPmOOwa4Xfrxlmd0GAcvW5btf/uJRyTzuZ8YRM3seyjn+ZiIfN/zDQNPH7d2rYOtW+PcbyyxxBJLrIBL937XAuArP9aazrrn7ewd5P6+gawi5QGw9rvCLUA75bsu+ckUK4Wv7r3skkMwh5nb2kqOBghQinvf3dZiN03qtFomTPZ8L1vWszL7plK2l81t7enq/hMvWmRhzpzY+40lllhiiRUwSi3stW6fPt3b8qen5hm+PwUG+T279pi+z0RE4zXxTWQnnMTEKa/rX/fqNVi3kLB7tyq1/y51dnqd7e2UsBp+nmhpneN6nsMMqwJbADDNbE9LqideirHgH6RWlZktZjaZ2Shwxa3mYollzBTwvHlq8eLFnFeJBSlSCWJ2crk8DfUPwDQMMI9PSBF7nnJNw50+bcLZmZ4tH6B16/JoazNKKDmyn7j+euusgd3fSBnmu12fvWrm0fe8h99w8x3dACxassSvaU7+tYcmjUVvTmZWhX7GzEaZh/yoH+TDfUalvxvP/VkrHbcoVksjiSAiconI0y/JqrD2zq1q52oU1mcqfJb9PSZZ5yYzNzCzuT968/4z9huu9KySd2GN5ZjNag96mj8/y5/7cCPlswdnWQFESimFnZt2QimF+uYGeK6HcecNExF7HluppDtoN313y1mnd9Hd991djC+aAdpz0UWNtGRJ/9AZp1xRN2Hy5/xUfV5AVxV9PlwXTn/vkwCA3t5cDT18LtR/k5nr8Nrf5YjIr+VmCe/HzCnt8zOVNJIoMN5avv4MEXGxUjRtDKnIrzwiytfwcFHhM1b7LsJnEWMnoc0dEVG63PI2OaBsIsoC8ORwSgGYycyz/7Y1QAjAg88x8xCAvLxzX5R3EkA27GBWSe/YAu+h0nee0e6XL3VM+jqROU7q766C6hNX1pELabxS7pgKzVWBd1/rqhmPiHKosZItsudrtteKZSNl
1jSe1z8uN0rMQAF++z4fvq1qrixjAuhf75kxOJN42kHfzvusZSgWGxcDeATS2NMKjcdtMmlyG3zJt8qSeFzb876azTznSztt5bm//Oy7mLe3tyQN/+cv+zNvmnp5snXiNV1efZ9etqISKmaGUUrnurgGHrCe5gxV2XKZqTcAhBzwBmArgPwBcACCLoExKAXiRmW8A8CsAJhGlq1EkROQx89sBXAbgLWLg+cz8awAdAPqHo9oLx8vMzTLeD1ZwkBAARysDM+R7W+6lAGSZ+UEAXwKwlYM2keGmMeQ5ZgD4HIALo4qGmRcR0d3MbFdyQGiKN1iCwff1zDxUaQ24KEePmQ8E8DsAs+W5We79BwBLALw6krIXb0zJs2WZ+QwAUwBcAeAwGbsVmXNGUILnALCZ+XsA1gLYSETPh3O7r/tX6fNkA7gKwPtl7VIV+2E1gHsB/FkfUynjEeVmyedfAeCzmgKm8vwWJABsY+YHAGwA8BKAzUT0bDlj0iMUsmaPBXA9gNfJuxiNk9dl5v8G8GMABhHVAreS5CBUejOAUwGk5b2nmflyIrqdmc0afZZuqJ4E4JsAjpKz6mlm/iSApyt5NmZWotQTAL6nrVlb9sUkADcA+DcAdQAGqdqG8wT4W46fu3jijBkdvQND+YG9A4YyVMD/6HpomdiCKTOnwvf8cdt9WCnlZrr3JnZ1dS899PHHLmOfDQD7+vEub2832js7/b5z3j43lWq43ayrn+J5nl9NkpuIDD+TGbCs+ul0001Do2FRMnOSiLLM/HUAXwSQkcXgy2XLAjkfwN0AUpUoYVlwLoCTAdwqCy2/r9QqsDB/CODf5WDPDXMfTxbvJ2Vsw4X3VeRg40h9e2h1kvY3kM9IAfgMEX1fmyeSjegC+JYo4HAMSpuzLgBvBbBRPBm/wveUBPBGANuIaHs1rSRFOdgA7gAwTxs3yfMmAawUo6Zboh9cROmZROQw89tE2bxHDBlX5odlLqIKWGlzHr6bTQB+DuBeIlojyt0YydPQlMpJojTrIoZVJWLLv9sBPAbgp0R0pxgGPIJREq6BIwA8IfPhFfCCeRi+BdaMQo5EILcDeBTAD4noj7I23FKUADNb8r5+D+Ddwyhf0t4Va+9I/17fR9HvXXkPd4Vropzo1ghj/7icEa42VgNAD4A3i6Hi1yJip62tewCcIfMFMYy+A+DKcA+UaVRbMubvArhc7qvkmVIAXpZ52xBGhFTVz3L55Q1ZGB/3DPXamDoDhmFgsG8QnutBGWrctpf3Pc+onzoxP33KhI+sP/b4i0kpD+3tybDBwsLOTu+5tjn1Sc//oZ2qm+Z7nlcVwozZV0rBTyRuxI03pl+64sxEraPrf1sX3ATgRDksLG1jmXKgmXJAHkZE6UI53BI/0xPvaKLc19AuT6xMa4QDNPR4Dpf/Y4xwkXYp7edKUwb69+HvTVESbXLQ6WMKveEGLWRkaPfKiTf4LvEQrXJzTsx8oGz+F0RhPsLMzzPzRWI4qQoOFAfAG0T55rXDQGkH6WzNY6Mi42uUA/FzAP4gxpmvHVJeRPnqisWXw8aXMWTkMzsA3MXM3wQwg4hyzNxUYq6sTjPm9HcfNbpQ4GuOPK8j95oG4FwAtzDzl2TtjoQ7SIgyTGlGrKGtvejnU2Se9d952pyG8zRVDufbmPk/wv9bInYivPc0TZHqe4Q1o8mPvC9+DS/B335WzKB1I0ZEtRE6VwzvTxWYpxyACQDOl7m3akxA1a2t5X1RHCLiCpRvmCIJla+jGasJALsA/JtEOfwwwqGq6fxDAG9f99ejk431DUbC5mw6A1L0mjSn7/vY9upWuI47bj1gAJTLO2aquc5PJe1fvHzyyW+hzs4Mt7fbePRRixddbx0+7bCfJCZMPNH9m1VTjYb0yTTgKXqeiPgwHIZRJltJFRlzuLknA/gRMzcAsCpQwmG4zIl4P7olmy4jRJfTxjaaAERP3/QhwEie/y45GJORQyE8eN4jnnMlOaMvieU9W5T5LFGe/83Mh2u5qVIlRB9/WvPKCh04q4loW6EQtJbv7Ze0xLfFCAm9qUJtP7nIYR2+8zD0lgPQKJ7F48z8cSLqB1BXghL2Ix43aZGIhFy29r0d+V1CDm5LU0i+RAgsmfPFciAON+d5TSmwdmCHYmmfbWufaRX4nT7GcK7CMSUAfFXCsQYAswRgXSIy94iMK1FgrqLjHG7ewt+nZB30a4ZWNWLInrsQwAFyTxVJHzGAcyQylBuFs1FFDAyqAPyVlMjhElG++UgkqBfAxUR0PzOn9KhBxTngVUuWKAD+wGB+4eQm2x7qG3DyOcewbGsf8llyncikMxgaGETr5Alw8s64A2QxAIPArpmAsiymvoGr+eJz34EsBmjFitxQu/3JutYJF7q5nANmsyr2LmY2DcPK9u7dM7Bnz4MAgJ07eZQfzxvG81SyYE4D8AUi+g8JZ/oVWpZUxDIuR6GoEZ7HrzIU6WuWfPRevuyLP0uo+eAiz3m45DqVAGfckjATwcY+TRuD0oyY2QDORJATtDSvs5T8OzPzEVrOmyJGgw/gN/L3TrFDhJmXAviQGEyJAmeErxkuSe2QceR5DC1qgEj43pUIyQ+ZuQXA97XQdtFDOuLJhevyYwDWiVKIejH61xaA+QAWADhEnsmRn7N83cHMLxDRr5k5McJB70W8WgPAAIAvI8gdpiJzVGhdHw1gBoCzEeRrLS1qATH83g3gRiJql7C9W+a+Ccd2K4BrI94jRzxa1owsXdwCezsB4CWJklR7kJvM7AFok0hHVnsv+r2PRoApeajc/PgIEQOzBijqOslV/7sYmFntvuGcfZmI7hPMSKYmKOh5QXjTeOmktxzR0NKocqR8ZRhGtOyImWFaJrp3dMMwDNQ3N4B9Hk9ALJi2id6uHuzeulspg3IT65NzX32l+wuHrnnoc91tb367bduL4Th54a2uXiESKWXbu/PpgT3c0WFiyRIHo4QqLBCmK3bI5QB8mZk3ENH/lrnQaZj8V6Ew1njp4PUoEeUlBKYjI30i6hXg0qcLIVgBtABYRETfLaV0QUKJJoB/EW+QItZ3GCY+j5mvD5V1CflgBSDHzO8QBV7I2CIAWwGsFUXtFcjDpZn5/aJ8c1q+VFe8SvOIIPcMfzczcsj72liogKf3NQDPE9GtJSg93cs2AfwVwK+JqK/E93w3M/+XHOKfBHCOvEPSwq5fZeZVAHpDME2xUHSBn+UArCSi50oczwOivL4M4L3iNZ0iSljp2AwB/C0tYY6K7cu1RLRqtApJqvFDxPh5I4B3yFoxtXXiammDJIAvMPN5kYhbtSHoakFdCSIaZOb3IcCtZLQ9EK6tK4noellT+ZocZssBgwCv751vP9yEf4SfsLBn6y5zOM/W93z07u5FQ0sjfPbHhRdsGgrpdAa9m3uRHkgHDB0Mc8B1PT/vLeo/9519yVTyE0oZra7v18Z1V8oH+/AHBp58ZNbhO2dt3GhRjfmfK9wYYV50MTM/DOD5MpCHSg4UHqHhh1fl5mEEgJx1VShilgOuB8ANMu58kTHfIwqYC3jJNoCzmPlHCNDHIynLhCi5d0nI34mE2UPv5QQ5lJ7SPKPhvN8QUHIKAvBbtoAiNADcRkTd0YNcrHhf0NPf1AyyQqHMPIBfAHgcwG4A67X3Ok2iAocDOFRC7Lbm+RqRPH8PgFflGfwyD08FoJGZBzXveiRvxxEQ2lMAbgJwlvYOHBnzx4noP0U5FLunU8QIqtNQ0t4wRm/4vAkBWd3MzLcC+DgCAJCneaM5AF9j5jUAXhjBMCgmh8rzJGRtFJsfFEkxFNoXfg06tiWIaIiZz5RoQJgzHUIA3DtSixAxAgzJwQDWVzgPhZ7LqBLIlWHm0xHkfd2I8mVRvleFQLOaeRNv/cAHkrjppqHunsxpLYnEzO0btuWcvGsqQxUnTjYMZIey6O/pQ8vEFjiOu1+UMDNDEcFn0MD2HbndPUNW3vHIMI0gZw1Q1mV4jMZkqu6rVioF13PdWvFmM0DseUB2cNPC21Z4K9vaxlM83hVP5ioieoccKKUoYK8E8BANE5or5/C9iYhurEUryWEMGEee5XEATwJ4UyRcHB76MxDkrl4eJvS+TxFKedUpw6ylEGX8DiJ6YiQSm3DOmbleDqxC4XuW+95bRNmZEgV4J4JctFMglGkC+A2ArwBYX+QweRbA/TJvphgRXwTwdgDNWmjOkTDtd+X/qBEAL9Hccg4BEnkqEW1l5nLKmhqJqEfChSchyHHrxtUJgoNwC6x7a5j8ei80QE+J48lq6HUWNP5MBCUqetRgMoDziGiJRGrK9YIzMu58DUK3tSyPTDPzRASVEb72vKaEcj8jqYO8jP9AMepekr/J78fx6yWXNwqAztWMLw/AF4noag0gWRsmLAZo+k03DfHydsPLpc9smDYRpmmWBgomYKB3AO7+IOaQbWwYBkCEnZu287Zd/bbHINMy9VMN7PtobG7wyLJc13WcGtbTMQGWx0i7tvkAL19uzMO4kjD0M4+ZO6QGNFmje4deY7JKBRzmUZPCXFPJZTBz3Qih4zoAewE8ohkP+jhyCIBTx4khoEawlrMIUOLHRDxCFFB275AifhoBgBPmiQ+Vw8qP3Dec86cRlN0UssTD788toJzDfPhviehCIlonebuEzKPSLkPC7LZ4dmuJ6HwJ996p5YtTgjX4hig1vwSAX7SUzKzEeyGiAVHCLyAoeTEjSvV14snnCxiT3jBnplWpMyPvw5V99gUxSkzNE/YBvIuZ6yoEIVnVenujIJbsmXMRYAJ87d2+TER3Avij9vNw7P8PASrax/5TvrakqQ6XaNBUDXMRpm6uFuU74vqu2KvbeW/zgWQl3r5jxx7PcVxDRz8PQz6Bof4h7Ni4HaZhjKnXSwbBtEz07NyDTS9sRGYwg
11Dxhp4GEQG+j2QqiRkHzSCQdHCq3UBgBhW6Pb3d2TV47jnG6tXeOKNvC+vZ/gPAQqmPtWqEOs4XCYOV05/a18JgboWXJ8xQw3leOfEY7kHAVBQtuwhLDI6SEF9ymLkPF/vbAbQO4ymHNYNHIACeeCMcnOGhfyqCnLRXBEG8loh2Ffpc8aJNUeIq8g7Cv/+p0CYmhE0qJ/Poa1dISZmVA8qQ0NuDCEqZFkto8VIi+pZ2r1LwCUp7Fkvus2cY3EEp6ZKdBaIPswFMlPAmFXmHxd4bV8PIpLE+/VjLt4fh9kMQkKkkK6CsdMdxG9xztNRXOOe3yPv5IQLSGCsCUmzTWNmqDUGXW+5nSyRrJoBfA5iu5e0dMdp/BeArEpXyRlrfqhIlAgD8ykunm8qoy2ezvu+XbpAYpoFsJov0UHr0vWAZq2GalB3KoGvLLuzZtQeu60IFdct/91+Gcg4aWhqhiEaDx5pBgNPd9eqBjzySwZIlf0cbub/BERFr/ypm/hcJyZo1iQAMPzZ3f1q3BRh/DAAPyYFvFvCCQ88xREKq6PNpOVYLQZ3ncMxJYQhrEoDT5fvkSHSaAN5VoPwrVFZZCT8Plys1RkgNhN5Yvpy6cFk3FgCHiJYA+BciWibYglyZgBmd5exAMWQqAfW5MmdWkbCws58UWkgj+aiEjY2IwXlIhWFXA+OoAFSiQWlmPhEB3kEnM8kCWCF1uHsR1KFTBIT3rpEiTlWCRodzakxZN/+DIC2V1fZOEsD9RHSRvLNMKXnqci0A2nnxxXVQCpl0fqEB5nKVKBHBcz30dffBsEa5WYNhEHyPh3bszG/dsIN6unoQ5noLfi4zbNtC86RmuN4ohcmZ2Uum/gIA6OjA2DR/Ksl65wJI3+kAvh5SE47RWDFeqMLl3x4tHEYFctpzEOQTix3qoeEyVxDQIz1n+K7ehgA4kxmmQUJK3s1hBXLQ4SG1DcADkcO8kFJRI0QDfAD1lYRYJV9GEk1JlGlk+ZpxUZREpCz63GDOZkfehYEAWDYgitAvUgdMo1iXbuG15BCh8VOHIMdfjuKJslmNl17jCTEGz0MQ7g/z7QkEJVNPMXO9/M0tBUrMzmHm48ULNsYCBS3rJSXG2S3iuefkfYU0t38C8KGQza9UkFh5h+rChWraoYdm+t4x/3AjmfiX5mkTyXPKU1TMDNM0MdA3gJ6de6DU6DBkKQL76bS3bcN22rFzr6nAbFpmUYVPRHAdDwfOng5FozAmZrBhEvr2kp0Z+jUAYMmSseggwsMceCGAJKeFVBFBvZ4F4NsC1KmrILytW68jdUUySliTY6mkQxKEO4sYMuHcno3iCFlPkORnaTSXIyFNw9rIw0V5qWLlRwhAO1OKGAgM4A7xJuxi1JMSau8qMJbwc69k5lYpubCY2S738NMaX5TbAITx92xb1dRteghAYadrCi28Z5fUP6sy1x3VKMcaph+itbCk5U3LiRbode7GePB+ZY80yJ7xNWa6DIDlEoYP0emPB0U3+7ACjkQ+LpA9VTdGdcC2jO8mAO+Ur03N812DgPd5e6n0oRUp4FWdnURLlvi7etJnJX1/Igwj76N86kJBLqJ7ZzfYZ4yUPy4r4kwEpRScPXvyW17ZgmwmT2SZpOd6Cylf3/NR11gHuz4F3x8V3mo2wCpPauug522rMH9Vbc4DBTykAaEK3F0glxVu2k8x82mikM0KypAIxZl6Sil7KEjOUKQf7UhXOW82JGx4DEHpkyoyh0fJ4Wjr99eaSzTIgW8WeEajSPmHKZsdRTzrhCiyE8OSlgJKnADcMUKpT3jvOwt40eF9zgBwHzO/RzzavITVQyCcJUAsGoXUCBVgK0IRKs1iLTeVhMJD7uLztTIXXVH9XJjCuMyxcg1SJywH98FavXS4DnoB3FeC1zZOyX41vyjAXbRL5MjTFOF2AA+KkeTIfHgIGOkc7e8cAO3MfBCATKXUuSWUYO3jaxeWqy8hSDeFHq8n/z6MgMlrR1gSOGr9gOe0tycZUFA4NGnZqnvHbr/inr+y1bu27qoJMQcDUAZB+Z6/a8tObNnWY3vKNJQiRgnjY2Y0NDfATpijExYn8pRhKK++4eEJ9/95c6G2gfshB8ziDdyFAPZfiLQjPFj+Vw4Ht0A+ODywaBgPmDRvsBrDIS8AoHS0H22JF5cJjlFi8T4+TKj+jVIPGC3hCb2rYxAgbAvlaQcLeM7hZ5wnwA+lHzTydUbAIHMK3NfVGjOsCUuNRmDnumcYJcISQr+ZmZ9g5g8gQKOyvAtH5sqW3rZWqJRHoWd5ODeNYtjUM3OrlLS0yNcTwp8J9Z8vB7/FzB8D8I0IytgA8CKAZYI+9yrIAVe7l30tNBtFz+5FgEMYqWXlcNgC2t+lR4IJMBCgmaPz9T0i6tUiNZ4AmZaLkrO1/XcggCPlLDGqCEH7xd5fpJnNRQhK8MxIU5YnpcPcNuls5owaqxADijo7BzeceOJBluO+z5zZ5PGmocqBOQwopbB3z16kGlIBTaVTAdeFHO2WaaB/z17u39nlDzowDMMAlahJfc9Hsi7FzVNayHVGJ/fLRIDn
1QGXSuwCAL2lL0rLV2XHAwukiqKm8kZnfgwAolIvQqbkaqf6iCJXjSIcP6fy9goytpoPKQdIhxy7wHGYkVKk3IghR2E9JAX2pdcRhDvNuAJdqFrA+N5MAnEhE9/G2bXX7eK+3b0/QAQekmflQBPWcGe3/GqJ8v46ADel4TYGHnujBAI5DAMyhSCfNkHzjTZH76rnDTnnWVDFwkTRGMMXDv1W8w3SE8UlpVIlzEdQ+Pg3gWWbejKAO+jEhms8VAa+4VXjAiNSKAsAuIhos8fA/UoygSxEg0Z2I52ppTEbmCOOkWoagw5I6eU+XSaTE1bxgQpBf9CtsyRdWNdjM7JTpBYZjcKtkvSKJWHlyvhwYKevqkkjNPlrSkLFN1udyBPXzOtXt5yRqYzBzpePjYcacknfyPgDXRbAICkFHo38joi3VtEosWYF2trcTOjthNDecavZnJ+3t3ptjwER1tMgwLRN79+xFfWM9lFn+GiZDAczo3d2LXVt2EZmGZajyrFEG0Dq1lUYNf8vMSinTyWad9PYt9wLARhwEYPVoWpvlzEEIaPgYAmKJEyLenCEH8EUAniai74TWYS0XfYn/9zMIiveNCJox6gX6EWUW1qB+WpoNmCUgXvUD5HEE3YsOi3xWeP83Si1nXguF5mVejy/Qfs6Tz/+xGDfHR8bsSGnR6WEbP+29ppg5i6AOObqPQzDYbgAvF2H6KoRyNhGwMR0o7z+q1A2NSIURlEkdrf1+AzPvBPCKKPMnRSn3AnAk/G9KBIPLzIvqzQ/CBg9Lmbkv8uymBjjSw7iv0zi9deMyDL9fRUQ/k1rbdIl1tYWiPErQzFSCQboPfS4H/YUIGmCoCPnIVlEAleIfcrJPsxXmpGsSkZN3bwK4RKhYc9p8/lBC0EkiGioAfHtAY5oK68LnChjrLyXwiZeNRpd3coFE/mxtTYWh548S0WMlrpnqFXB7Z6cPZsoeO/d902ZN54GBjNrXZrBKLuZ8Oo8NL2/B6486FI7jjUy3zAxSCgb7frp/ADu3dSvXcQOEM1ByADlEZCfrU1zXUEejiMhmAzBd338uPXnCGgaIli0bNe+3AmvQk/xFlzSkvgcBUKJQjeoXmfkZIlqh0RqqEpRrOU0LhpPJRRoyUJESH46EZS8D8HsEHV1KKqeRTbaBmVeI0vMK8GgvBPBVInpWQolMRC4zT5Wogd6eLCTKf4CI+qQx+8Va5yWdH/qt0lIyJ/cLve56BDkpLtJMYgMCEhE1Ul5K8za6mPlyAD8Vj9EpkHelSMlY+C4OlitEhKclXfFrAJ0AnpBnpTKpBFUBMBYh6D1dliLSmJZCZXkXAtKEewW9mimhexYXAek0aEqiGJYhGqb0mHm2eFlXAmjSDN+QA/kGIlpbIRc0AzhYWM7MSOMMU+Ne9gvogjDqUSfv7qUqelWHgME5AI7VnlEhyJ3eqXGEI8LLbiGgPL0JwIe1aFc9grzswiLgxkojLSG168UArpd34ESoVAHgXGZ+RIzLiln5zFLZr4iIef3diReUeczAQJryeYdqFao1TANDmSwGevtR39IIrxhTFnMAsjIMeL6P3Zt3YGhgCB6MfUAuLmO6fc+HlbAwffZ0ClsnjkrpkVIMMNDb3T3z3of28Mh1l2NZhhRuNkc2+aPM/DUEvLTZAuTiTQB+zsxvFQ/LKnHaOUQVV5IrKWKVc5nzEFqxHHZzKTUMLYrvr1rhfaF9dCQzPxdaymLQnaUdfhxRkivk+1XisR6kseqEa+QEAK8HsFbjGs6Joju6QPOF0Hu+MyTEKIN+05DD/nQAVyPIRya0efc0Dz26rtyIUZSS570MwEcBPMrM9wL4puTV6iPeTomokX3rNRMBUY3099Eewj4C3uFjmPlxab4xHKGGobXbjK7rRgDTiehJydl7Bd6HknDqwQgoTJMIQHYLEPBnO3KFCiYpBsJ1YcetCva9L/dfUOUZ8nMAH6oiDG3Js58mz57T1s9G7Nz5IqZNqy+SUjBkbd4hClgnp3mTRI8216hLEgB0M/MxEnWwIukApRkwnwCwh4gWM3MjAjBr1QCHgrKqrc0AM/Z87Ovvam5paLFSCT+dzlC13u++laIIllLYvK0Liqi48lWKiBRy2Sx2btyOnr1DhqdMoxqdWd9UDzthj57yBQDfJ5BiTJmxmwFCezvGUKiE98yaRV5PRN8F8CONPjDqBUwV4v7GiGIZCeGsatDNiKoE9LgVhMHDOfi91GkWa0Z+rnZIhb1O2yLKIAwRvwJglVAjdiNoMlGoNWIjgDPEYzQ0MNW5WjiuUN7uZ6J8VTnkGRIqHADwQQBvBfA7ABs1T480RRHtBWxE8u4hktwTg6EDAV/0m4WIP1XB+g0NqZTMTUORq177uk7rhatHDNoBfAvAc8z8qRH6MHsFnBbde7yOmdcDeEZC8Pr1ojRTWI+gzeXtMq//Lso3qxk2YU/e3wJ4PxHtqACVHUXyhyHonPZ1VoyYnPyblq/1KyP//1QB1ZVbRRB6vw4zTwbwWc37Ds+SX9D06UPDYBRCJr5HpBohoT3XbADzZU9YNThXWNDxt8ma0VNNVqQOPQvgP5n5EqE4NUfNA24cHCQA6O3LzG2oN0xXeXmDqGZ1ZZ7vI5W0sWvvAF5ZvxmHHnbga5s1MECGQZTLON3d/UbP7r2kDAXbMrjisDEDZBAmTp0E1x3lxhBEyvU8yjnesiTAPGfOqJYLlOHZcYHv07LglyDISx5fJB/8XgDrpHtMCwKkZrU54FLQmlQhKYivMUuF+UivVMUk89onB8G5RULdbcw8G8Au8fabEIBH9NBpmG/9C4DNwmlNCBDLH9VziRHygW+HRBbiTZygKdvoc74q78Mv1yuQMLcnB90TRPReeaa3IgAIvU089WI9ljmSn1eRfN5bpB3fRwD8Vrh18yXWkuvv8X8Q5A29Eg2qOgQAsnlauDgM6U4H8H0B03yviDdFw4UtETQxKRcHkdfC4iEY7FEAPwPwkzCCUaVnF/bwLWQkcwFmKCrQSSsV6clczvkVerCnISDeUBoe4ikAPwnBgMPtXSLaIamaEyIK84vM/KsyoynFAGi+eNnQPN/Q4HxawufZCPf3txzH2UxEKyt5V2Ypegpr17rccXnDy/c/fSp7Hgb29rMyasdiRQBcz0drQx26unowc9Y0mJYZlCcpwFTgvr4B9GzdpVzXR0ioUenHExEcx8GUA6aADAJ7PMogfVZgHuIZU9dzR4dZLaHAaDNASZ12FzN/HkE+WBXJD13BzI8CuLMIe9BwB2mlIK10Eeam4WqIw5BjEkFZQ5/k47gMoyYsSbhGjA8nAsTyEZTmnE5EPxWleoZEC3S6vTBnfI8cTOEYHhVv6YgCz/J6AMcy8xMCEjkJQb416jGHjELXSHi1InCKzEtWA35tQlAGc5PUX06Tw+jdCNi9wiYbdRGv14goKWi15DcjoBW8o8z8ZmgcXCeo63IM0zoEgKxzxPtsDTsFyfv5FjPniejaAoaBNwzZCmtdcNwiCo4L1DUbEaPsLgAXEdHesK66BmFVEwHa3i1g4BYbn6k9Sz2CNo6uhNH9Csur3qMBH0MFfI/8PjVCZQRLjv6HAD4gxk443weL4fqDCvLkNEKKKwRcXYIAMXuHGHF5LUU01TTNm5n5fABrhms9WJECXtUGY/5quJvu+8ubkp53hDlxgkddewyMgsdoGQYMImzZtJ1f94aD2XM95Tgu9Wzd7vYN5QwfyjDMKrxeDX2dSCZQ39yAMSiA803LMnK9vY83f/LUTXTcZe5Y0ShW2Y4vQUSrmPmDAJZFDo7w62YEueKnBY5vlJCD9UYuKhs2hHyNHFRmCUo3GprdS0RPVTgtYYec3XKgJYsohncy888knHuWhvg0tT23C8A9mtFSh6C5wJ8kBJbTADKeHILvkPw8EABPpkbuG85dt5RacbUbJQTMyXMrKdHZKCHpRwD8SMLIRyFAzy9A0N3mdBmzVwCdHobvHQC/lBKhbcNEbajI940huUaJkQxLymn+CuCvklP8sXhUSjOKv8nMDxHRU0XAYsVIUzLiKdooD8/garnG0wB8l5m/BKC/wiqD6LieRFB3qyow+kPU+bMSGVEVdA7KM/MZku/2tHHkJO0yYj9oLRKwXXonfyqyvy9l5h9LZKvaXsEUAUpeSES/kYjZBQjacupKOC978VoNgFg7D3jeajCIwLZ9qu34jb3dvTkiMkdDcXi+j9aGOs4NZtkZTFuwLWfby1tUSvlMyiDFVZ8pAeWk66JlYguSqSScvDN64ecgbw2kB9l1sn9NzF3k8hXPJujaa3MY5yJhTlsW3zwEJUr5CBowjwAV/H0E+TSzhAPBGAFtOlIYeR0R/TnS6oui6Go5LCgSQqZyLdTXHgLP2sCRrwgi82MRkFp4OB0NYBYz92vhMhVR1A8S0WbtgHJFYa+QUq+UplDDov8zmPkqObgOK2CshIflOgT5RrvUMqsSCUl8QTXrOV6Wco2niOhxBDlySH3yseJlzo7Mk67EGgC8l4iukRKubBkREUcMxVLD7I5WUtZARH9h5kX4G8mD0krVPiU1wymJJBQ7M8P8bw8CsFmfGKVuETCY/v2bRDHWR4A+H5FqgctL8AxLiSQ9RkQPynOrSmqvw/mtQLFZcmAvkHcdnnsJBDnwtSHKuITuRr6s6Qfk/ehtQQ9DUL/+qyJpmUrmjUT53iKppCwRvcLMlwK4W6JAvgbOOwbAT4noAxJpyZYyX8MqUu7oUJgwwdyxeXNyYOXKBRNnz+TM7h4jl8nXjD4ystN9xUytSdvq2dN7w0B/5vx6W9VPqjNym/bkz
1VpoSt8PQtgtU1rhOu4Y9CUmH8ogRfQwKcV87LH+GLHO1CI/EDLXXCnK5NgC+eAsgPOZ+RNymNEoUuKRlr+1dWSo/IwLAQw14AhXV65wpC+ewBMF0NDhYXCIHAjbEDSlz2uhxvDA7gxpKjXvOgXgQQSAneM0NHQIHJsj4ele8TCL0YI+gwBEZZW7BsIxDXdwaMq4EGF9aPA8BOAhZr5fwobzI966rrzexcxLywDneTWIDg1IadkzzPxdBOCwvBbdOZ6ZZwHYVYJHRaJ4HyGirWUM5ffM/BAC8pMGDc3uAHg/M98uXaysKqsGbL1PM8rvpAQh8fYrAF+lJS3zIXn/ofG+B8BiIuovE0wGIcT5M4IytBBzUCdYld9UCdL0tfPrElG+zUTUp/Xffk6M5Hsj6OgsgIukPv9jsp7zVSngtTt2GHMBB9s3H02mfdzAUMbzPCaMiu4lj0C2SQTHsj9xwAOr/uf5N821mqdOu5jqzATv2Ua16g3cMrElaEfo82i7kUzMhmdZfebkGVvADCxY4GHt2rEMQVfcCUXCmAYR9Qv94MqQglBb6CGA5JP4W462rsAhXUoIutRN4oUe0Ggd1MMQliQQ5JE/odXKqojncLgcqlSAyekvAFbK3Oa1ec6LN7lWDJ1oGUsrgp69XQUOU9ZC29eVS6IQMhVJFGEfkUSpClyPPkiUIawxfQEB6f7PEJQ0+QXmaqaE8LaWEPLV59OqktglK8/5B3mXzVpLwoMBHEtEf5Bn8UdYVwygTtZGKWuPJJ96HzN/BgEBR4NmpDUDuALA/TWoFthXr12lIi9XwmYup4uXS1pYNwtgATO3y98MV0UR7epEEY6CsAb4gwiAeRuqMFpCZPYHJfJXHypfLTWXkojCpyWF4USe92IAfxZilxHJioZVwHOXLvUAcPrYY9/bMmkCe8rw87m8MgxVc+VrkbJ9dl81muo+Oev+VXcuR7vRdKD7g56du9pbZ88wIS0Eq/VYTcNE08TmsVqEvmEadj6TWf/M3Tc/Kx2QeD/QTXpVvJu8hEqfZ+b/QlCcHg1Fs3h9P9Ao2/7pWhdqALUB8V6Ojowj3BjvESWs/yzMET8CoF8DdYXRCsXMviiEf42UOoWHz/wCZB36XOwuF5ikNXbIMvM0BA3pnwu9mHI9H3kWV8LVIcXi90QRJyOlHGFnoilEtKmEmmXW1p2q0fvsE4+sVVu7dVq7wmjPZGcYw9DVUx4lGD4NRLSUmd8sXmJWY3s6WaIpr1RIwjEWBulwBp2S+f2cBr4Kw/wzAPx3DZ5Hz923AjiPiL6pGULlGvYWgP8R5ZsqhKyW9VxPRNfJev1hhFhEAfi2pKB+NxJN5bCLeOPPfmYTwFlfvcVWBhkKjBoowciOck0i2/OdjfUmnzfr/lV3Pjtnjv3mdtgzbr31qYzv/8IaGDIbmxvz7Ff+2UG7QRfNk5th2xZ8zx8b5cc+k5PbMXBOW447OtQYboBSiDioTCW8VKw+u4CSdWp1MI5z8WV+Vxdh4/IAnKohNaOe7BrdKNK8zBDZvUZYrChSX+sjQHteVOAwDf/ufq3zT0lhwjBXLgxoDyMAKH2LmZsE/JKqoAVlKDm5f5j3pyIlMqkyySWg5ROpBihhowBIrFgOupb4l4yG7u3Wak1DL/i/ymw4wMMAG40x7nqUYeZzJGqjE6aEqPN0FVcuUgMfrotPMnNrhA623NxvSMgynOealve2FAEo1NLOAl+AiEsBnCIpq1TZCrgDUAddeqn76ty5J6ZS1hs4YfsDfUOkDFXL8iO3XhkJgvdyHbBg6prH/8KAedS6dflZc+bk1l52mWlPbr5+556+XvY827BMv9LOS77vI5FKoLG1Ca7rjUHuN6j/heeTu3vnqvnLHsxi3TqTxr5lGA1zaHCZiieBAADxZ81SR8RLq7YMaTS5pGvhBTuiNO+Tw6AQcjsaag/LGR5DAFRS0RCx3NNCkL+9rQg61C2g9KHlD28v02NVovyulmumHI6fB/BjZj5AQECqwubnjfLvgQh4rb1IzalCAGDqGubdugV6AtdSnAJgNtKAgtHOOWYtI38SGn4S0lEncpCfIo08ciUikPdrx6NIH+0EgvKd5sh7D4lG6qq4QlKVKEtfs+d5Z8peMiuMqFkj7SEiYulr7SAgF7lLOw9DpqxmBGV7cyTdYZelgD/y5jcniMh1U/VntihjUk9Pf87JZlWtFBcDfoJUwkuYj04/uPXc6Y8//twTc+daFIZxlizxk729dNCK+5/MEO43ACOZSsDzKleeDc0NSCRsjCLn82sbIDEbTi476LVO+ssTiz5qjVUYqIwcMJVZkhLWBn5SvDSjlJ6aundYZV0ja0XwFHpwFV5URYQhZIu6rkgZDBXhqd5ERAPD5FdDsMtdYuVzCUQlIUr6PgBPSaTCKbE5uoGgrvKj+zo4BfPrIGgw/oi07wu7L6U0RqSCcyg5YEMUxoA8z4fkvoXKxDJC/5cqspZaIhEXqlGkxZQxvh3SZlN7/i0IELqFlH6+xts15Pe+OlLmlxfD5V+LcDUPx9iG/dh2MDwTZiEARukevC/kG7cjqAFeIev2bgR80Pp1t3bpP18h/94uZ5B+xtUZhvE+QdTbZe7xso08zSi6VGhqbY3py5M5uBVAk0QRVUk5YAYIxx/v86xZxiubN8/MWwn4+bwiVSPqSYLboIxE3jbvaX7TwRcmrl62l9vaTFq9+jUHx+6uLp+//B+qb/36L+x8cf35ja1NyrZteK5Xnq3HgCJC69SJcL0x8n6ZYRiG8vb2djWuWPVHbm+30dk53hpmcwUsSZZw3l4mm4PLUOS1mPgQfOXUoklVhTWDpuRMH9PCzqoEcMcKrYzHKxJlsAA8K9exRUhHoh6iBWCV8BmnSkTJe9JP97Ny2NsR5eYiyNX9GEEJ1NVEtLrAvep1T1xAJ2HZ1yRm/gqAMwvMUdhUYhURdUvOrZACDgFtQwhyyF6RJg1lGVByINYhQPgjwtDUB2C7vIuqP6+EPZiUqMdaBOVJnmbcniohzb4yqxt4P3nFppQwzhMFlNfQ/C8AeFupbSRLeI8fRtCtKKehjs+Qz7hXjAFvFB0dX5R9ryjhuxG0JnU1wp3Xiyf8QS18PqIHTHTttbkN27a9zvRxidnS6DDYrLoGN1gU+VbTSuSAq2fPn3rOD65e1r8c7QatXv13ier5q1e7W9atS7TcfPOriYbU0mTeNQzLcH3fLzNpBzIsC+z7Yxz5BdSkKT3c0aGoszNPY2ShFsgBqxpb7CkECM1vlXEohc0Y7CoPqxnMfAwzH8/Mx2rX8cx8AjMfJ98fJ9dc+f4EZn6z/Hu0EKhzFblNA1JzG6H6KzbuHgD3isL3ioW3JX+2C8BDJZAUsHz2bgCPi2eeKxF8ZCPoCLVc40guREiQQQAqu5WZX2Tmy5j5jdLFp0UDJuUkVD2BmV/PzF8Vb+ffihhLYWrkl0UYpnytrKqvAI/zvrIp8bqpgCceXoqZk8ycCEExzDwBwK8R5Cgdba49AE9ITlY30LzRUGhhuJSI9gD4hQZUCo2guQBOkLVhV2jgkrwbil5F5mvYawTDLid768sFOnv9lIgGmblV1kkdM9vyXpKRq9DPwp+n5DPu1jxPX6sxfq/sT3MMoo1pqSB4CgFy3dVywqFRsABBPj8nz0zDesCdADFA25qaDue9/dbe7t6qAFAaLQVaTTPV6/vXHPbImk/zrHZjMQBCZ1Er5REgzx/9qLVj9+7/Te/Y9d7mSS0tyjQ405+mUmqRmYhseO70AyaRYRqG7/k8Jh4w2INSRjab+0XjkiU+d3QoWrJkXNJPVnBgZMQ76EDAo/uhCDK62CHgVBGCDj2mbyBoBIEqGjJkETAEfURIK8rqbSwKjIhoHTM/iYCMxC/y/KFX9QcAXSWUSIRkFzcgYN6ZWqDjUbTBxUtS0lJXKslJCKyT+TxQQtF5LQwKLWeXl1DwBK3MaRMCLuvtWqekJvF6DpOvUWRdhJSZvxbDYbg5yRfIHYf8wDyMMcMRKkMOkcTM/DYAV0mEQa9PDpXfN0RJj1XEalCMp9sk5HyUBlwyELTdu6tCJLQv0Q6nmPdcLm/AMJEjU5D88yV64mvP8IIwnyUA9FXJVgWJmOxg5nsQ1NvrkaZLxTN+YiQUcg1Ji1JE1Cl76lpZ/+H+zCHoQ/5XKU8K0zyFPaP29uUggLO7u85tmNjMyVSCPM+rimADgGmZcNBgfv6wR9Z8its6zFVdXTSSV7iws9Nbv3mzmvH73z8+6Lp38VDWaGis90rpXkRE8F2XUw31lGxIke/x6CtfZobPjmlZCaQHyezd+wwzK/T0WBhbJfl35RE1ltBKv1IOY6uIt8YRZpxEhaVGrKFE81r7tnKvrNzjZACfk82gKmzcTQhAVbki1JjQmgXcW8ohpwFz/oqgrnckr8uTg4aEapHLKTGTcOAi8UTtImVkhraOXPytE81bxUi4CEEd5rnisTXI3xRC8IblWI8hICwot0FHGCpuZOYWZp7IzM1yTdSuFvG0JjLzTABvYubvM/MqBJ2GQuVraQQtFoArpPetHTEWzWHGWhXKOCxDE5rPlyJ14y6A45j5Qg1/UM7eSQoyuFHmqEW7muV3E8KvtaslcjWF8zzM+wo99Pdpterhc9wpEReqVvlq5DUkvaazEbIbSzqI8ViF4AX1nSCiXyKo61Za+ihUwv/LzB8I64kLesBhjoq/8YWWF2/949m5vEu+x1RF+Y+nGLaVsNITJzVdXP/7u27tvuiiJvrlkpJZUA5rbHT5/N8Ye5K//daelza/n4cytmmZ3khJdmaGUgqJxgblkzFC+9DqOZ9BBDIMyzAN08s7W3Kkrqp/YPXqDZdemjh42bIs9p/4RbiWqRoEp5B07GbmK4We
10RiGn7kWSFbWWrZV8//DUOMBorScKnJ3vwXwRS13V4gecj2AJ2VvlWIMGeJJfB8BD7dfxEgID/7bKn2XMiYPARBrL4CPR9DHVARU5hZAtdMwaQ/WAGOPAbhQO5DdEdYuRwgeHAG3OBHSkUTk75OReUpEjFJTOxQSAK4mouuL0Hi6I+wZrkF5mxLP/BxNoYe9gT/IzJ0jGItc4B1dIDSx+Ui9K0RxkWaE6DSjKpKK0Mu+FgO4VveEJeSbRtD966wIQU0vgD+I4vFqhSAXY+RpiWadrBm7BOA8Zr4OQE8NmQFL8YQtqUWehqBiJCNrK2TKu5GZdxDRA8xs/f3LXLiQiMjZePvK01PJxEQf7A8ODJBhGBWVGVlEtlK8uanOPrf+93fdylecmZh4001lNS+mzk4P6DQm/+qW5w3LWJZSiphoRIgbM8NO2Gid1AJ/lMBXzEHJiWmalkmwvN49XU7e6ejZtu20+l/99ipuazPGWvkWyAHTMDWCFStiLYx5C4CvRKgedYXLGoAqXyYherFDuZKLta8N4dzlKviRQ+/w8SJhYp39aougIbm025OPgLTDK9IEPjxonhG+X7/EuS30HA4RZYjoE3JgPy3KyRoGRU9ao3sj0gs4aoS4moe0UggTNpToDfkRwzEk42iQMF+jhMZbEfAqN8rVpJW7JLV8XE4rE2OtnOVbAD4f8nMXeE8GipfS+SUA8UqpMrCI6M9iUJkaGCuLgOj/rcLGVmpZIWlz0CpphCatV3KrzF2z/DwlV/h/UjJ39fK3zWHHLwEf6YC/kPr0bPk7X1P29yKgJk3VyPvd53HLmv+aBoYMwU//gqDbFpdZhsnVH7/cCOA/JTqWkvGQFkm6mplnEpHzdwtm7auvKgDIuGrepIY6007YeVWB4mKCZ5FK+ApbTJMvaLn3j/fx3LkWXbsiV+Gh57HnwWpOfhvgrPJ9eJ7Pw6kOz/MwcdpEeOyPAsEG+wSwZVu2aRi27/svZjND3+73+99kL7v5K1Puf3D97g9/uBGrV48ZA02BEDRFwCNRpcjDtFhDORytRPRVBOQUCQ35yJoSqgeQkI07kuJ1I0q4UPP3ahFynoyn8pKkVatCRPbvNVJ2RMK4GQA3yd+ly+hGZQlw6ymZUycyn4585j0CbElWyQhFEkJbLl7MBwWVa2kRB08bQ6F3wpHfh0opgaCD1GcBLCCireKVlLIx67XyDi8yBl3hqwLeOmv5ad3DM2VMHgIw4VlE9IUR2jdSxKD1NE86EaFHRJVsVdfJHvK1zlEtCMp6/ALN5/UaZS9yuVr6xY0YDKw9gx9pmelp69iNXAchQGZnQ5CbABPnSDrDiTzT3cPl66sBQMk++QsCQKRO0aqkj3b9MIaRrc2Fr0VoUIVh7sqeTyNoW3q/KOG8tm7mSDh6soqWH81dsMDji8+dWJc0jzSb6tG7q4cq6P2bryPDJtN4tW7mzLNn/fmxR7itzaS1ays+6Kmz01vZ1mbOuuuB9a7yv5qwTLNpQhN77t/ngokIvu+joakByfpULTmffQCeAkzTsizf93wnk1mRy7ufesZVc1O/ue3K3tkX7OFL2pLc0aEm33DDAO1f4ggfQb3qzfLi9c49htaT87lKu4iEeRbJ7S5CgKpNaQdeQiz4W7RDdLgDKCd/G+bnol5WLa7wng9XVVM6b17ojTwpYdWwcbmlbfBHiOh2UTjleKgeEXUjQFbu1ry40CtNIcgX/kSUb75ao01CaAaADBHdKF7XpZJe2CHPY2rsUaZ2hahmpf3MljFeBeBsIvpeSGpfwgHna+T3u+T5E1q5lBGh/4u2ytQvQxuvJSmBGwBcQESnE9EKSadkhjEK8jI3OTGMEnKZCEpP6qvNcQnwywawSsYXvvOQ0KQdQEryjTpfd7inXpDnTMo86Zf+/JZmWBkFDBmjwPza2njWa+mDMH/NCACZrXLvcH4eBXCb7JPR4KJWsj5+qY0zrDmfKGPMRYzscO11aWQ0Cfn6lbD/d5XRjPDz/hVB56eUBsjMISiXuuS10P2gFtftOWP+0f39mVXN06c0d23Z6ZWTACbAazFNe8D3/0wH2ucf3Ll6ZwegltSgBIfb2w3q7PR62hcc2Lul++FUff30bCbnuvm80vsTExE8z8O0mdPQPKkZTvVdjxikPMNzEmRZ8BndXjZ9L7P6+pqHn3hl/qZNWb7iisTG/n46KJ12gpD5+BGxUOfIwjxCFl6vLLrndMLxasgp5ACpRwDESWuoxCEieqHMYv7DtYOn1vVhrmzUZ8R7rDhHJAe3JzmfN8izkyh3D0Hv3F2VWNXhuJj5CDngScuBJhEQe2yuNdIzxIFEmiy8XsKUp0h473A5bBHxehvEG7lVvPe9Em4Ou8mUDBQLc4zMfDiC9m9OAV5jKrGXdKiokgC2ENFm+YyEhOD9EufFRMDR3KqFpocQlMP41eYatfXUhIAgpE4b/5C04/SKzNNkBHWnXhG2tEIpKS6hL7eeE7YBvEhEu6L7RubnpAgj1CYi6hrtPKwozMNkn4Tj3QNgffRztX01AQEO5FgxMHvkTMjVYk9p76VBPiOjzb0NoPs1L2lze3vqwM7OzPrjj//olNbW65OTmnIbX9xsldh6kAGQARhsGiuyMw9oP6qzc3AlYM6vIQqXFy2ycP317ivHHHNp44QJN+RBTrp/QOleuu/7SNYlMeuwA+FVTjvpU1A6ZRrMigjIDw5uQSrVuXfa5O9M/e6PdgIAX3FFAjt3MpYvd8Yi0T8a7QhrtTlCFpxCh9lYASEqUDRcg0NT1Ti3pd+7TmoNhzV8RhFLEL5Tr8jfhB45FQKzaZ2RKipBG611IyhUZ7RLVP5ZpdB7KfauxuPeHy9nDOnhZwL4iUWLrIbHn3z+gINmHJLJO17Pjm5SI3c/YiLyE0S2D/eq2Y889hksXJhEQD5RU29QGhrYmDFDvXjd9Y9NmjZlTl9vv+u67j6aTN/3MWP2DNQ115cffg7QzGwCNpSCz+w72fTDyKR/j+mH3J687roXQ28c06aZdO21uX+EzVLEO1AS6uRRWHTFQEsV36PWfYUrAS2VoKy8CPmAX4OaR6XVqEb3HY8hxaDScocYrq5Ua7nnjsZ6qlBClL5XRcSj4F6qtQFWyecMs89rzjBUyJiSz7cieVh/tIzTIvvPL3V/FJkvHoXzsNDnWAA8eg1bI+APLnzPsTs27FhLlukREXu5HGE4D5LIJ4ZKGcqwbf7OlAcf/vy2BQvqdsyY4Ry3dOmo9J98Yu5c67i1a52NJ5/8gTpl3Jg1jXxmMG2QtCxMJBOYeegscBm0nuAAWWUZhgXDQK67azOl6tamzfqvblu79rmjnn8+z//1XzZ6egjXXJsn2r9NAWKJZbx7RLHEEkuJRAdhfnXbW09aYljJ/2Qr4Q707lUYDnxF5IFhKYJrk/fFWY+88yosXEfo7PRHE3zEAG1ftCjlPvxwwknV3d/a0nTsnp6+PCllOHkHBxxyABpaGkcOPwcxaw9EpklkwDDg5LIvgvmqvZnMH6fceud68bpNbNxoYtmy3H4GVcUSSyyxxPJPImF9FHUBqZVAdiDtntyYdInJ8JVS5HseFSkz8k3AhkFesqXxQwesuPeX3HmQgeXL/dG2hAngzb29PPu5db2bT5j7o76e/p+CSDEzDNMIlC6XAPknZZkJy3RyeXY870V4uR+kc9uWt3Q+0hOC0gAAixd7/0i5otgbiSWWWGL5B/GAQ57igbPbjtqz1/1jsqFh8kDfgAPfV0XKjxxbUZKYdqEpuWj2/StvCwFcY9jGh3DFFTauuSb/8gkn/tWy7KOyuZzb1NpE0w+aASfvvNb7ZQ48dimXMG2LnHRmN2xzjet4v6678Te/gdRDdr/73Q2T3vSmoX8G7uZYYokllljGsQJ+ArCOA5yNp53+yWQmc5WTsJ10/4BZsP0gwUuRYbvgPdlE/fwjHrz/mVojnctSwgC2z3vbF72c+7VM3nWaJjQZ0w6c9rfSI2YGEUMZvglOgBmO7/VTzr0m09J0c9P1P1sXeo3PLVxoHQl4462MqJJ5iUPlscQSSywY/yHo2wGPV7aZG780eJpZV6/6+gdQQPkyQGwwbDLwfNqyLjrywfuf4blzrWoINqqWlSuN5p//6IZd6zZemkzYr5s8Y7LjuJ5BgE8gwDQMw3UUcnk4Pj/rDOy9d+iA6d+d8ovf7NiHUJs3zxBUXx7/HFZVrHxjiSWWWMa5KG5vt79C5G+7uvUQP5efZ7fUe6ZpvKb3rxT5+XWGYSl496lm1Xbkgw8+tbJKdqtaKJqF8+dz44237Kxvbf6RYSiCUp4CfNM0LSObtrzurlxmaPDOgW2bL99Zb7TV3/nHz2xGfTe3t9vc3m6DCNKLOFZascQSSyyxjKEH3NXlgxno7z21rrGxqWf3Xsdz/lZTC2Y2lGILsK06c/kBr2v9EKbPzfKJp9m0ZMl+9xiXM/s7zzijfvr9D/xg/fEntBtdvSe7k5o4PZje0r+r+7FpDcbi5xLNLx21+vE8r3qM+B2dKXR25v/Rw8yxxBJLLL
1H8gytgWr3ahWFgsGfggmkHTGVyPWQH01AGAUSsDMNPMGwkje9NW7n6s/xHYHn7HcbCzvERriUiZiDNACZPn/ahLbt7Ppbw3WdoQv2K6asf2sHMdCRRgGgm8qjEhuWxxBJLLLHEMqr66yXmxGHrr8ELF/1qw8yZ06b39w+4fXv6yLQs37ItrmO2s0nzOwetevDzvznvPKO9s5OpBrzOGAPg0cq2NnPe619PWLrU/b+UF41BWLHEEkss/wAKmBm0483H/z9K1n13woHT3e2vbiPA9xOJpJ0fHIJfl7zykAdXfxs+j/uDfXl7u3EGmpqb69w0DlqWpyWIy4hiiSWWWGIZv2VIz8898SczWxv/1W1IZbu2dqmm5gYbTn7TXhefOWLNn37L7e02Ojud2KuKJZZYYoklFtQIBd1xUVMiqV6fnNQCN+f4k6e02rnBgU2Djvv+I9b86bfdF13UhOXLY+UbSyyxxBJLLLX0gHe889T5fm/mzsYDpqqeTTsSPvsbLMM9d9ajT/01JOiIpymWWGKJJZZYaivm4IBzZmtTYzLf00+csO6bOrnhw/W/W7GVAYNi5RtLLLHEEkssoyLKymbauD9NfbncioNOOfp99b9bsXVlW5tZ6z6+sWDMKTpjiSWWWGIZx7LxhLkf2XHyyd/hK65oAgCeO9eKZyWWWGKJJZZYRlf+P5c+IofEc5yDAAAAAElFTkSuQmCC" alt="NewsBreak" style="display:block;margin:30px auto;width:150px;height:auto;opacity:.9">\n</div>\n'}})]})}d.isH5Page=i.b,d.getLayout=i.D;var h=!0,p=d},47803:function(e,n,t){(window.__NEXT_P=window.__NEXT_P||[]).push(["/ms/memorial-day-2026",function(){return t(44679)}])}},function(e){e.O(0,[9774,2888,179],(function(){return n=47803,e(e.s=n);var n}));var n=e.O();_N_E=n}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.