Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> assetLinkLocalService.getDirectLinks(currentArticleAssetEntryId)[0]  [in template "42020#42061#105225" at line 29, column 25]

----
Tip: It's the final [] step that caused this error, not those before it.
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: relatedCountryLink = assetLinkLocalSe...  [in template "42020#42061#105225" at line 29, column 1]
----
1<#assign 
2projectStructureName = "SACYR_CON_STR_PROYECTO" 
3 
4journalArticleLocalService = serviceLocator.findService( 
5"com.liferay.journal.service.JournalArticleLocalService" 
6
7assetLinkLocalService = serviceLocator.findService( 
8"com.liferay.asset.link.service.AssetLinkLocalService" 
9
10assetEntryLocalService = serviceLocator.findService( 
11"com.liferay.asset.kernel.service.AssetEntryLocalService" 
12
13assetEntryService = serviceLocator.findService( 
14"com.liferay.asset.kernel.service.AssetEntryService" 
15
16 
17assetVocabularyLocalServiceUtil = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService") 
18 
19assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService") 
20 
21currentArticle = journalArticleLocalService.getArticle( 
22groupId, .vars['reserved-article-id'].data 
23
24currentArticleResourcePrimKey = currentArticle.getResourcePrimKey() 
25currentArticleAssetEntry = assetEntryLocalService.getEntry( 
26"com.liferay.journal.model.JournalArticle", currentArticleResourcePrimKey 
27
28currentArticleAssetEntryId = currentArticleAssetEntry.getEntryId() 
29relatedCountryLink    = assetLinkLocalService.getDirectLinks(currentArticleAssetEntryId)[0] 
30relatedCountryAsset   = assetEntryService.fetchEntry(relatedCountryLink.entryId2) 
31relatedCountryPK      = relatedCountryAsset.classPK?number 
32relatedCountryArticle = journalArticleLocalService.getLatestArticle(relatedCountryPK) 
33relatedCountryContent = relatedCountryArticle.getContentByLocale(locale.toString()) 
34relatedCountryDocument= saxReaderUtil.read(relatedCountryContent) 
35relatedCountryName    = relatedCountryDocument.selectSingleNode( 
36"//dynamic-element[@name='nombre']/dynamic-content" 
37).getStringValue() 
38relatedCountryURL = relatedCountryAsset.getAssetRenderer().getURLViewInContext( 
39renderRequest, renderResponse , "" 
40
41relatedProjects = assetLinkLocalService.getDirectLinks(relatedCountryLink.entryId2) 
42 
43categoriesData = [] 
44categoriesValueData = [] 
45data = [] 
46projects = [] 
47 
48cabeceraBg     = "" 
49cabeceraBgHalf = "${themeDisplay.getPathThemeImages()}/fondos/trama-assets.png" 
50mask           = "${themeDisplay.getPathThemeImages()}/mockup/branding/mask.svg" 
51/> 
52 
53<#assign vocabularies = assetVocabularyLocalServiceUtil.getGroupVocabularies(themeDisplay.getScopeGroupId()) /> 
54 
55<#list vocabularies as voc> 
56	<#if voc.getName()?matches("(?i).*SACYR_CON_VOC_TIPO_PROYECTO.*")> 
57		<#list voc.getCategories() as cat> 
58			<#assign color = "" /> 
59			<#assign imagen = "" /> 
60			<#assign listCategoryProperties = assetCategoryPropertyLocalService.getCategoryProperties(cat.getCategoryId()) /> 
61			<#list listCategoryProperties as categoryProperty> 
62				<#if categoryProperty.getKey() == "color" > 
63					<#assign color =  categoryProperty.getValue() /> 
64				</#if> 
65				<#if categoryProperty.getKey() == "icon" > 
66					<#assign imagen =  categoryProperty.getValue() /> 
67				</#if> 
68			</#list> 
69			<#assign categoriesData = categoriesData + [{'name': cat.getName(), 'color': color , 'text': cat.getTitle(locale), 'imagen': imagen}] /> 
70		</#list> 
71		<#break> 
72	</#if> 
73</#list> 
74 
75<#list vocabularies as voc> 
76	<#if voc.getName()?matches("(?i).*SACYR_CON_VOC_VALUE_CREATION.*")> 
77		<#list voc.getCategories() as cat> 
78			<#assign name = "" /> 
79			<#assign color = "" /> 
80			<#assign imagen = "" /> 
81			<#assign listCategoryProperties = assetCategoryPropertyLocalService.getCategoryProperties(cat.getCategoryId()) /> 
82			<#list listCategoryProperties as categoryProperty> 
83				<#if categoryProperty.getKey() == "color" > 
84					<#assign color =  categoryProperty.getValue() /> 
85				</#if> 
86				<#if categoryProperty.getKey() == "icon" > 
87					<#assign imagen =  categoryProperty.getValue() /> 
88				</#if> 
89			</#list> 
90 
91			<#if cat.getName()?contains("Society") > 
92				<#assign name = "Society" /> 
93			<#elseif cat.getName()?contains("Shareholders") > 
94				<#assign name = "Shareholders" /> 
95			<#elseif cat.getName()?contains("People") > 
96				<#assign name = "People" /> 
97			</#if> 
98			<#assign categoriesValueData = categoriesValueData + [{'name': name, 'color': color , 'text': cat.getTitle(locale), 'imagen': imagen}] /> 
99		</#list> 
100		<#break> 
101	</#if> 
102</#list> 
103 
104 
105<#if locale == "en_US"> 
106	<#assign 
107	sharedValue     = 'Shared Value' 
108	characteristics = 'Characteristics' 
109	seeDetail       = 'SEE DETAIL' 
110	projectsTitle   = 'Other projects in ' + relatedCountryName 
111	/> 
112<#elseif locale == "es_ES"> 
113	<#assign 
114	sharedValue     = 'Valor Compartido' 
115	characteristics = 'Características' 
116	seeDetail       = 'VER DETALLE' 
117	projectsTitle   = 'Otros proyectos en ' + relatedCountryName 
118	/> 
119<#else> 
120	<h1> Tweak SACYR_CON_TMP_DETALLE_PROYECTO to support this locale! </h1> 
121</#if> 
122 
123 
124 
125<#list relatedProjects as assetLink> 
126	<#if assetLink.entryId2 != currentArticleAssetEntryId> 
127		<#assign 
128		project = assetEntryService.fetchEntry(assetLink.entryId2) 
129		article = journalArticleLocalService.getLatestArticle( 
130		project.classPK?number 
131
132		ddmStructure = article.getDDMStructure() 
133		ddmStructureName = ddmStructure.getName(locale) 
134		/> 
135		<#if projectStructureName == ddmStructureName> 
136			<#assign projects = projects + [project]> 
137			<#list project.getCategories() as projectCategory> 
138				<#assign isCategoryInData = false /> 
139				<#list categoriesData as curCategoryData> 
140					<#if projectCategory.getTitle("en_US") == curCategoryData.name> 
141						<#assign categoryData = curCategoryData> 
142						<#break> 
143					</#if> 
144				</#list> 
145				<#list data as d> 
146					<#if d.category == projectCategory> 
147						<#assign isCategoryInData = true /> 
148						<#assign categoryIndex = d?index /> 
149					</#if> 
150				</#list> 
151 
152				<#if isCategoryInData> 
153					<#assign data = 
154					data[0..<categoryIndex] 
155					+ [{ 
156					"category" : projectCategory, 
157					"categoryData" : categoryData, 
158					"projects" : 
159					data[categoryIndex].projects + [project] 
160					}] 
161					+ data[(categoryIndex+1)..] 
162					/> 
163				<#else> 
164					<#assign data = 
165					data + [{ 
166					"category" : projectCategory, 
167					"categoryData" : categoryData, 
168					"projects" : [project] 
169					}] 
170					/> 
171				</#if> 
172			</#list> 
173		</#if> 
174	</#if> 
175</#list> 
176 
177<#assign isSimple = projects?size gt 3 /> 
178 
179<script> 
180	$(".h2").hide() 
181</script> 
182 
183<#----------------------------------------------------------------------------> 
184<#----------------------------- BREADCRUMBS ----------------------------------> 
185<#----------------------------------------------------------------------------> 
186<#assign 
187layout = themeDisplay.getLayout() 
188home   = themeDisplay.getScopeGroup() 
189assetscrumb = layout.getAncestors()[0] 
190breadcrumbs = [{ 
191"name": home.getName(locale), 
192"url":  portalUtil.getGroupFriendlyURL(home.getPublicLayoutSet(), themeDisplay, false, false) 
193}, { 
194"name": assetscrumb.getName(locale), 
195"url":  portalUtil.getLayoutFriendlyURL(assetscrumb, themeDisplay) 
196}, { 
197"name": relatedCountryName, 
198"url":  relatedCountryURL 
199}, { 
200"name": cabecera.tituloCabecera.getData(), 
201"url":  themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() 
202}] 
203test = themeDisplay.getLayout().getGroup() 
204test2 = test.getAncestors() + test.getChildren(true) 
205/> 
206 
207<div class="container breadcrumbs-country"> 
208	<div class="breadcrumbs"> 
209		<#-- breadcrumb --> 
210		<#list breadcrumbs as crumb> 
211			<#if crumb?is_last > 
212				<span>${crumb.name}</span> 
213			<#else> 
214				<a href="${crumb.url}">${crumb.name}</a> 
215			</#if> 
216		</#list> 
217	</div> 
218</div> 
219 
220<#----------------------------------------------------------------------------> 
221<#---------------------------------------------------------------- CABECERA --> 
222<#----------------------------------------------------------------------------> 
223 
224<#macro textBox> 
225	<div class="${sp[0]}"></div> 
226	<div class="text-box"> 
227		<#if cabecera.iconoCabecera.getData()?has_content> 
228			<div class="icon-box bg-darkblue"> 
229				<span class="icon ${cabecera.iconoCabecera.getData()}"></span> 
230			</div> 
231		</#if> 
232		<div class="title text-darkblue"> 
233			<h1>${cabecera.tituloCabecera.getData()}</h1> 
234		</div> 
235		<div class="description text-darkblue"> 
236			${cabecera.entradillaCabecera.getData()} 
237		</div> 
238	</div> 
239	<div class="${sp[1]}"></div> 
240</#macro> 
241 
242<#assign 
243extra = "" 
244sp = ["margin", "spacer"] 
245/> 
246 
247<#switch cabecera.variacion.getData()> 
248	<#case "centrado"> 
249		<div class="assets-project-heading" 
250			 style="background-image: url('${cabeceraBg}')"> 
251			<@textBox/> 
252		</div> 
253		<#break> 
254	<#case "imagenDerecha"> 
255		<#assign 
256		extra = "assets-project-heading--bg-picture-right" 
257		sp = sp?reverse 
258		/> 
259	<#case "imagenIzquierda"> 
260		<div class="assets-project-heading assets-project-heading--bg-picture ${extra}"> 
261			<div class="media-box" 
262				 style="background-image: url('${cabecera.cabeceraFg.getData()}')"> 
263			</div> 
264			<div class="bg-box" 
265				 style="background-image: url('${cabeceraBgHalf}')"> 
266				<@textBox/> 
267			</div> 
268		</div> 
269		<#break> 
270	<#case "mascaraDerecha"> <#assign extra = "assets-project-heading--bg-picture-right"> 
271	<#case "mascaraIzquierda"> 
272		<div class="assets-project-heading ${extra} assets-project-heading--bg-mask"> 
273			<div class="media-box"> 
274				<div class="background" 
275					 style="background-image: url('${cabecera.cabeceraFg.getData()}')"> 
276				</div> 
277				<img src="${mask}" class="mask" /> 
278			</div> 
279			<div class="bg-box"> 
280				<div class="text-box"> 
281					<@textBox/> 
282				</div> 
283			</div> 
284		</div> 
285</#switch> 
286 
287 
288 
289<div style="margin: 60px;"></div> 
290 
291 
292<#----------------------------------------------------------------------------> 
293<#------------------------------------------------------------------- CAJAS --> 
294<#----------------------------------------------------------------------------> 
295<#macro boxes clase=""> 
296	<div class="assets-highlight-title ${clase}"> 
297		<div class="container"> 
298			<div class="title text-darkblue"> 
299				<p>${sharedValue}</p> 
300			</div> 
301			<div class="boxes"> 
302				<#list cajas.caja.getSiblings() as caja> 
303 
304				<#list categoriesValueData as valueasd> 
305                    <#if valueasd.name == caja.categoriaCaja.getData() > 
306                        <#assign colorCategory = valueasd.color /> 
307                        <#assign titleCategory = valueasd.text /> 
308					</#if> 
309                </#list> 
310 
311                <div class="box" 
312                     data-aos="fade-up" 
313                     data-aos-delay="${caja?index * 250}"> 
314                    <#nested 
315                    caja.categoriaCaja.getData(), 
316                    caja.cajaBg.getData() 
317
318                    <div class="title text-darkblue"> 
319                        <h3>${titleCategory}</h3> 
320                    </div> 
321						<div class="description text-darkblue"> 
322							${caja.cajaTexto.getData()} 
323						</div> 
324					</div> 
325				</#list> 
326			</div> 
327		</div> 
328	</div> 
329</#macro> 
330 
331<#if cajas.caja.getSiblings()?size != 0> 
332 
333	<#switch cajas.variacionCajas.getData()> 
334		<#case "lightblue"> 
335			<@boxes ; category, picture> 
336				<div style="width: 5.375rem; height: 5.375rem; color: #ffffff; background-color: #9fd0da; line-height: 5.375rem; border-bottom-right-radius: 1.5rem; border-top-left-radius: 1.5rem; margin: 1.875rem auto; font-size: 3.75rem; text-align: center;"> 
337					<span class="icon icon-${category}"></span> 
338				</div> 
339			</@boxes> 
340			<#break> 
341		<#case "colores"> 
342			<@boxes clase="assets-highlight-title--stripe" ; category, picture> 
343				<div class="stripe"></div> 
344				<div class="icon-box icon-box--${category}"> 
345					<span class="icon icon-${category}"></span> 
346				</div> 
347			</@boxes> 
348			<#break> 
349		<#case "fotos"> 
350			<@boxes "assets-highlight-title--picture" ; category, picture> 
351				<div class="picture" 
352					 style="background-image: url('${picture}')"> 
353				</div> 
354			</@boxes> 
355			<#break> 
356		<#case "grafico"> 
357			<div class="assets-highlight-title assets-highlight-title--hemicycle"> 
358				<div class="container"> 
359					<div class="title text-darkblue"> 
360						<p>${sharedValue}</p> 
361					</div> 
362					<div class="hemi-boxes"> 
363						<#list cajas.caja.getSiblings() as caja> 
364							<div class="box" 
365								 data-aos="fade-up" 
366								 data-aos-delay="${caja?index * 250}"> 
367								<div class="box-content"> 
368									<span class="icon icon-${caja.categoriaCaja.getData()}"></span> 
369									<div class="title text-white"> 
370										<h3>${value[caja.categoriaCaja.getData()]}</h3> 
371									</div> 
372								</div> 
373							</div> 
374						</#list> 
375						<#if cajas.textoGrafico.getData()?has_content> 
376							<div class="description text-darkblue"> 
377								${cajas.textoGrafico.getData()} 
378							</div> 
379						</#if> 
380					</div> 
381				</div> 
382			</div> 
383			<#break> 
384	</#switch> 
385</#if> 
386 
387 
388<div style="margin: 60px;"></div> 
389 
390 
391<#----------------------------------------------------------------------------> 
392<#----------------------------------------------------------------- DETALLE --> 
393<#----------------------------------------------------------------------------> 
394<div class="assets-project-detail"> 
395	<div class="container"> 
396		<div class="project-box"> 
397			<div class="text-box"> 
398				<div class="title text-blue"> 
399					<h3>${characteristics}</h3> 
400				</div> 
401				<#list detalle.caracteristica.getSiblings() as item> 
402					<div class="detail"> 
403						<div class="detail-name text-darkblue"> 
404							<p>${item.nombreCaracteristica.getData()}</p> 
405						</div> 
406						<div class="detail-value text-grey"> 
407							<p>${item.valorCaracteristica.getData()}</p> 
408						</div> 
409					</div> 
410				</#list> 
411			</div> 
412 
413			<#if detalle.mapa.imagenMapa.getData()?? && detalle.mapa.imagenMapa.getData() != ""> 
414				<div class="map-box"> 
415					<img alt="${detalle.mapa.imagenMapa.getAttribute("alt")}" 
416						 data-fileentryid="${detalle.mapa.imagenMapa.getAttribute("fileEntryId")}" 
417						 src="${detalle.mapa.imagenMapa.getData()}" 
418						 class="map" /> 
419					<#list detalle.mapa.chincheta.getSiblings() as pin> 
420						<#if pin.mapaEnlace.getData()?? && pin.mapaEnlace.getData() != ""> 
421							<span class="icon icon-location poi" 
422								  style="left: ${pin.ubicacionX.getData()}%; 
423										  top: ${pin.ubicacionY.getData()}%; 
424										  transform: translate(-10px, -12px);" 
425								  data-toggle="modal" data-target="#pin-${pin?index}"></span> 
426							<div class="modal fade videoModal" id="pin-${pin?index}" role="dialog"> 
427								<div class="modal-dialog modal-lg modal-dialog-centered"> 
428									<div class="modal-content"> 
429										<div class="modal-header"> 
430											<button type="button" class="close" 
431													data-dismiss="modal">×</button> 
432										</div> 
433										<div class="modal-body"> 
434											<iframe src="${pin.mapaEnlace.getData()}" width="100%" height="480"></iframe> 
435										</div> 
436									</div> 
437								</div> 
438							</div> 
439						<#else> 
440							<span class="icon icon-location poi" 
441								  style="left: ${pin.ubicacionX.getData()}%; 
442										  top: ${pin.ubicacionY.getData()}%; 
443										  transform: translate(-10px, -12px); 
444										  cursor: default;"></span> 
445						</#if> 
446					</#list> 
447				</div> 
448			</#if> 
449			<#if detalle.linkDetalle.getData()?has_content> 
450				<div class="action-box"> 
451					<a href="${detalle.linkDetalle.getData()}" 
452					   target="_blank" 
453					   class="btn btn-primary btn-xl"> 
454						${seeDetail} 
455					</a> 
456				</div> 
457			</#if> 
458		</div> 
459		<#if detalle.descripcion.textoDescripcion.getData()?has_content> 
460			<div class="highlight-box"> 
461				<#if detalle.descripcion.imagenDescripcion.getData()?has_content> 
462					<div class="media-box" 
463						 style="background-image: url('${detalle.descripcion.imagenDescripcion.getData()}')"> 
464					</div> 
465				</#if> 
466				<div class="text-box"> 
467					<#if detalle.descripcion.antetituloDescripcion.getData()?has_content> 
468						<div class="tagline text-purple"> 
469							<p>${detalle.descripcion.antetituloDescripcion.getData()}</p> 
470						</div> 
471					</#if> 
472					<div class="title text-darkblue"> 
473						<#if detalle.descripcion.tituloDescripcion.getData()?has_content> 
474						<h4>${detalle.descripcion.tituloDescripcion.getData()}</h4> 
475						<#else> 
476						<h4>${cabecera.tituloCabecera.getData()}<h4> 
477								</#if> 
478					</div> 
479					<div class="description text-grey"> 
480						${detalle.descripcion.textoDescripcion.getData()} 
481					</div> 
482				</div> 
483			</div> 
484		</#if> 
485	</div> 
486</div> 
487 
488 
489<#----------------------------------------------------------------------------> 
490<#----------------------------------------------------- MÓDULOS ADICIONALES --> 
491<#----------------------------------------------------------------------------> 
492<div> 
493	<#list modulosAdicionales.getSiblings() as modulo> 
494		<#attempt> 
495			<#assign pHData = modulo.getData()/> 
496			<#if pHData?has_content> 
497				<div class="my-info-detail-components"> 
498					<#assign 
499					pHEval = pHData?eval 
500					pHArticle = journalArticleLocalService.getLatestArticle(pHEval.classPK?number) 
501					pHContent = journalArticleLocalService.getArticleContent(pHArticle, pHArticle.getDDMTemplateKey(), "view", locale, null, themeDisplay) /> 
502					${pHContent} 
503				</div> 
504			</#if> 
505			<#recover></#recover> 
506	</#list> 
507</div> 
508 
509 
510<#----------------------------------------------------------------------------> 
511<#---------------------------------------------- PROYECTOS EN EL MISMO PAIS --> 
512<#----------------------------------------------------------------------------> 
513<#if projects?has_content> 
514	<div class="valuecr-button-filters"> 
515		<div class="title text-darkblue"> 
516			<p>${projectsTitle}</p> 
517		</div> 
518		<div class="filters-box"> 
519 
520			<#if data?size gt 1> 
521				<#if locale == "en_US"> 
522					<#assign todos = 'All' /> 
523				<#elseif locale == "es_ES"> 
524					<#assign todos = 'Todos' /> 
525				</#if> 
526				<div class="entry white aos-init aos-animate selected" data-aos="fade-right" data-aos-delay="0" data-filter="All" onclick="changeCategory('All')"> 
527					<div class="filter"> 
528						<span class="icon text-icon">${todos?upper_case}</span> 
529					</div> 
530					<span class="label">${todos}</span> 
531					<span class="selection"></span> 
532				</div> 
533			</#if> 
534			<#list data as d> 
535				<#assign 
536				categoria = d.categoryData.name 
537				imagen = d.categoryData.imagen 
538				color = d.categoryData.color 
539				label = d.categoryData.text 
540				/> 
541 
542				<#assign sel = (d?index == 0)?then("selected","") /> 
543 
544 
545				<div class="entry ${color} ${sel} aos-init" 
546					 data-filter="${categoria}" 
547					 data-aos="fade-up" 
548					 data-aos-delay="${(data?size - d?index - 1) * 250}" 
549					 onclick="changeCategory('${categoria}')" 
550
551					<div class="filter"> 
552						${d.text!} 
553						<#if imagen?has_content> 
554							<img src="${themeDisplay.getPathThemeImages()}/pictogramas/${imagen}.png"> 
555						</#if> 
556					</div> 
557					<span class="label">${label}</span> 
558					<span class="selection"></span> 
559				</div> 
560 
561			</#list> 
562 
563			<script> 
564				$( document ).ready(function() { 
565					unselectAll(); 
566 
567				}); 
568 
569			</script> 
570		</div> 
571 
572		<#assign 
573		simpleClass = isSimple?then("assets-project-list--simple", "") 
574		index = 0 
575		/> 
576		<div class="assets-project-list ${simpleClass}"> 
577			<div class="container"> 
578				<div class="project-list"> 
579					<#list data as d> 
580						<#assign color = d.categoryData.color> 
581						<#list d.projects as project> 
582							<#assign 
583							index = index+1 
584							assetRenderer = project.getAssetRenderer() 
585							url = assetRenderer.getURLViewInContext( 
586							renderRequest, renderResponse , "" 
587
588							pk      = project.classPK?number 
589							article = journalArticleLocalService.getLatestArticle(pk) 
590							content = article.getContentByLocale(locale.toString()) 
591							document= saxReaderUtil.read(content) 
592							titulo  = document.selectSingleNode( 
593							"//dynamic-element[@name='tituloCabecera']/dynamic-content" 
594							).getStringValue() 
595							entradilla = document.selectSingleNode( 
596							"//dynamic-element[@name='entradillaCabecera']/dynamic-content" 
597							).getStringValue() 
598							imagen = document.selectSingleNode( 
599							"//dynamic-element[@name='cabeceraFg']/dynamic-content" 
600							).getStringValue() 
601 
602							isOdd = index % 2 == 1 
603							xtra = (isOdd && imagen?has_content)?then("project-card--reverse", "") 
604							tagline = d.category.getTitle(locale) 
605							/> 
606							<a href="${url}" 
607							   class="project-card ${color} ${xtra}" 
608							   data-filter="${d.categoryData.name}"> 
609								<#if isSimple> 
610									<div class="separator text-${color}"> 
611										<div class="pill bg-${color}"></div> 
612									</div> 
613									<div class="text-box"> 
614										<div class="title text-darkblue"> 
615											<h3>${titulo}</h3> 
616										</div> 
617										<div class="description text-grey"> 
618											<p>${entradilla}</p> 
619										</div> 
620										<div class="location"> 
621											<div class="icon-box text-darkblue"> 
622												<span class="icon icon-location"></span> 
623											</div> 
624											<div class="location-name text-darkblue"> 
625												<p>${relatedCountryName}</p> 
626											</div> 
627										</div> 
628									</div> 
629								<#else> 
630									<#if imagen?has_content> 
631										<div class="media-box" 
632												 
633											 
634												<#assign json = jsonFactoryUtil.createJSONObject(imagen)> 
635												<#assign fileUrl = json.getString("url")> 
636												 
637												<#if fileUrl == ""> 
638																	<#assign fileUrl = '/documents/${json.getString("groupId")}/${json.getString("fileEntryId")}/${json.getString("title")}/${json.getString("uuid")}'/> 
639												</#if> 
640 
641											 style="background-image: url('${fileUrl}')"> 
642										</div> 
643									</#if> 
644									<div class="text-box"> 
645										<div class="tagline text-darkblue"> 
646											${tagline} 
647										</div> 
648										<div class="title text-darkblue"> 
649											<h3>${titulo}</h3> 
650										</div> 
651										<div class="description text-grey"> 
652											<p>${entradilla}</p> 
653										</div> 
654										<object type="custom/link"> <#-- IE 9 --> 
655											<a href="${relatedCountryURL}" class="location"> 
656												<div class="icon-box text-darkblue"> 
657													<span class="icon icon-location"></span> 
658												</div> 
659												<div class="location-name text-darkblue"> 
660													${relatedCountryName} 
661												</div> 
662											</a> 
663										</object> 
664									</div> 
665								</#if> 
666							</a> 
667						</#list> 
668					</#list> 
669				</div> 
670			</div> 
671		</div> 
672	</div> 
673 
674	<script> 
675		var buttons, allProjects; 
676		var collapse = true; 
677		function unselectAll() { 
678			// unselect all buttons 
679			buttons.forEach(function (el) { 
680				el.classList.remove("selected") 
681			}) 
682
683		function changeCategory(category) { 
684 
685			// unselect all buttons 
686			buttons.forEach(function (el) { 
687				el.classList.remove("selected") 
688			}) 
689 
690			// reset everything = show by default 
691			allProjects.forEach(function (el) { 
692				el.style.display = "block"; 
693			}) 
694 
695			// try to find button (with fallback to all) and add the selected class 
696			var selectedButton = 
697					document.querySelector(".entry[data-filter='" + category + "']") 
698					|| document.querySelector(".entry[data-filter='All']"); 
699			selectedButton.classList.add("selected"); 
700 
701			if (category == "All") { 
702				return; 
703
704 
705			var toHide = document.querySelectorAll(".project-card:not([data-filter='" + category + "'])"); 
706			toHide.forEach(function (el) { 
707				el.style.display = "none"; 
708			}) 
709 
710
711 
712		buttons = document.querySelectorAll(".entry"); 
713		allProjects = document.querySelectorAll(".project-card"); 
714	</script> 
715</#if> 
716 
717 
718<@liferay_util["html-top"] outputKey="htmltop" > 
719<#-- SEO --> 
720	<script type="application/ld+json"> 
721
722		"@context": "http://schema.org", 
723		"@type": "BreadcrumbList", 
724		"itemListElement": [ 
725			<#list breadcrumbs as crumb> 
726
727					"@type": "ListItem", 
728					"position": ${crumb?index + 1}, 
729					"item": { 
730						"@id": "${crumb.url}", 
731						"name": "${crumb.name}" 
732
733				}<#sep>, 
734			</#list> 
735
736
737	</script> 
738</@>