Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
The following has evaluated to null or missing:
==> cur_FileDinhKem.dtvb_filename1  [in template "29795641980326#20120#BASIC-WEB-CONTENT" at line 817, column 23]

----
Tip: It's the step after the last dot 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: #assign fileName = cur_FileDinhKem.dt...  [in template "29795641980326#20120#BASIC-WEB-CONTENT" at line 817, column 3]
----
1<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") /> 
2<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") /> 
3<#assign journalArticle = JournalArticleLocalService.getArticle(getterUtil.getLong(groupId),.vars['reserved-article-id'].data) /> 
4<#assign categories = AssetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) /> 
5<div class="content-tags"> 
6<ul class="tags-wrap"> 
7 
8 
9      	<#if categories?has_content> 
10    <#list categories as category> 
11		<#assign categoryURL = renderResponse.createRenderURL()  
12		               categoryId = category.getCategoryId()?string 
13		/> 
14					${categoryURL.setParameter("resetCur", "true")} 
15					${categoryURL.setParameter("categoryId", category.getCategoryId()?string)} 
16					  <li> 
17       <a  title="${category.getName()}" href="/w/${.vars["reserved-article-url-title"].data}/-/categories/${category.getCategoryId()}">${category.getName()}</a> ${category?has_next?then('   ', '')} 
18			   </li> 
19    </#list> 
20</#if> 
21 
22</ul> 
23</div> 
24 
25<#setting locale="vi_VN"> 
26<#if .vars["reserved-article-display-date"]??> 
27    <#assign date = .vars["reserved-article-display-date"].data?date("EEE, dd MMM yyyy hh:mm:ss zzz")?string("dd/MM/yyyy HH:mm:ss")> 
28<#else> 
29    <#assign date = ""> 
30</#if> 
31 
32 
33<div id="print-content"> 
34<style> 
35#print-content img { 
36  margin: 0 auto; 
37
38a { 
39  color: #292d32; 
40
41.side-bar-height { 
42  max-height: 3159.5px; 
43
44 
45.singular-sidebar { 
46  position: absolute; 
47  margin-top: 100px; 
48  left: -60px; 
49
50 
51.btn-font { 
52  padding: 8px; 
53  background: #fff; 
54  border: 1px solid #dfe0e3; 
55  box-sizing: border-box; 
56  border-radius: 100px; 
57  display: block; 
58  text-align: center; 
59
60 
61.btn-font span { 
62  display: flex; 
63
64.btn-font .font { 
65  margin: 10px 0; 
66  align-items: center; 
67  justify-content: center; 
68
69 
70.singular-footer .social-pin { 
71  display: flex; 
72  flex-direction: row-reverse; 
73  align-items: flex-end; 
74  width: 100%; 
75  margin-top: 22px; 
76  margin-bottom: 22px; 
77  position: static; 
78
79 
80.singular-footer .social-pin li { 
81  flex: 2; 
82
83 
84.singular-footer .social-pin li:first-child { 
85  flex: 1; 
86
87 
88.singular-footer .social-pin li:nth-child(6) { 
89  flex: 14; 
90
91 
92.singular-footer .social-pin li.line::before { 
93  content: none; 
94
95 
96.singular-footer .social-pin .link .tooltiptext { 
97  left: 0; 
98  margin-left: -78px; 
99  height: 34px; 
100  top: 2px; 
101  display: flex; 
102  justify-content: center; 
103  align-items: center; 
104
105 
106.singular-footer .social-pin .link .tooltiptext:after { 
107  left: 63px; 
108  transform: rotate(48deg); 
109
110 
111.cpanel-action { 
112  margin: 0 auto; 
113  padding: 0; 
114  list-style: none; 
115  position: fixed; 
116  top: 250px; 
117
118 
119.cpanel-action li:not(:first-of-type) { 
120  margin: 8px 0 0; 
121
122 
123.cpanel-action li.line::before { 
124  content: ""; 
125  display: block; 
126  width: 32px; 
127  margin: 0 auto; 
128  padding-top: 8px; 
129  border-top: 1px solid #e3e6e8; 
130
131 
132.cpanel-action li.save { 
133  width: 40px; 
134  height: 40px; 
135  margin-top: 18px; 
136
137 
138.cpanel-action li.save.comment-empty_saved { 
139  margin-top: 8px; 
140
141 
142.cpanel-action li.save.comment-empty_saved span { 
143  margin: 0; 
144
145 
146.cpanel-item { 
147  width: 40px; 
148  height: 40px; 
149  display: flex; 
150  align-items: center; 
151  justify-content: center; 
152  border: 0; 
153  padding: 0; 
154  border-radius: 50%; 
155  cursor: pointer; 
156  position: relative; 
157  color: #fff; 
158  font-size: 28px; 
159  transition: all 0.3s; 
160
161 
162.cpanel-item:active { 
163  transform: translateY(4px); 
164
165 
166.cpanel-item:active svg { 
167  background: #eee none; 
168
169 
170.cpanel-item:active:hover { 
171  box-shadow: none; 
172
173 
174.cpanel-item.save { 
175  margin-top: 18px; 
176
177 
178.cpanel-item svg { 
179  background: #fff none; 
180  border: 1px solid #e4e4e4; 
181  border-radius: 100px; 
182
183 
184.cpanel-item:hover { 
185  box-shadow: 0 0 8px 8px rgba(0, 0, 0, 0.05); 
186
187 
188.cpanel-item.link { 
189  position: relative; 
190
191 
192.cpanel-item.link .tooltiptext { 
193  width: 70px; 
194  background: #fff none; 
195  color: #000; 
196  text-align: center; 
197  border-radius: 6px; 
198  padding: 5px 0; 
199  position: absolute; 
200  z-index: 1; 
201  top: 0; 
202  left: 105px; 
203  margin-left: -60px; 
204  font-size: 14px; 
205  border: 2px solid #ccc; 
206  font-weight: 400; 
207
208 
209.cpanel-item.link .tooltiptext:after { 
210  content: ""; 
211  display: block; 
212  position: absolute; 
213  border-style: solid; 
214  border-color: #ccc; 
215  border-width: 2px 2px 0 0; 
216  width: 10px; 
217  height: 10px; 
218  top: 10px; 
219  left: -6px; 
220  transform: rotate(-137deg); 
221
222 
223.cpanel-item.comment { 
224  background-color: transparent; 
225  color: #999; 
226  font-size: 35px; 
227
228 
229.cpanel-item.comment span { 
230  height: 16px; 
231  padding: 1px 4px; 
232  background: #e7f0eb; 
233  border-radius: 4px; 
234  color: #0f6c32; 
235  display: flex; 
236  align-items: center; 
237  justify-content: center; 
238  position: absolute; 
239  bottom: -10px; 
240  text-indent: 0; 
241  font-size: 11px; 
242  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", 
243    "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji", 
244    "Segoe UI Symbol", sans-serif; 
245  line-height: 140%; 
246  font-weight: 600; 
247  z-index: 1; 
248
249 
250.cpanel-item.bookmark { 
251  background-color: transparent; 
252  color: #999; 
253  font-size: 35px; 
254
255 
256.cpanel-item.donate { 
257  font-size: 28px; 
258
259 
260.cpanel-item.donate:hover { 
261  background: #1a7900 none; 
262
263.woK3sep4ykUXzIebVRTv { 
264  background-image: url(https://cdnweb.dantri.com.vn/dist/654561c72dd30d1107f3.svg); 
265  background-repeat: no-repeat; 
266  background-size: cover; 
267  display: flex; 
268  justify-content: center; 
269  align-items: center; 
270  width: 18px; 
271  height: 18px; 
272  flex-shrink: 0; 
273  border: none; 
274
275.MXHPvY_upC4YgT_Z3MLn { 
276  background: #fff none; 
277  border: 1px solid #e4e4e4; 
278  border-radius: 100px; 
279  width: 40px; 
280  height: 40px; 
281  display: flex; 
282  align-items: center; 
283  justify-content: center; 
284  padding: 0; 
285  cursor: pointer; 
286  position: relative; 
287  color: #fff; 
288  font-size: 28px; 
289  transition: all 0.3s; 
290
291.title-page { 
292  font-size: 36px; 
293  line-height: 50px; 
294  font-weight: 600; 
295  color: #222; 
296  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", 
297    "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji", 
298    "Segoe UI Symbol", sans-serif; 
299
300.flex-author-collection { 
301  margin-top: 12px; 
302  display: flex; 
303  justify-content: space-between; 
304  align-items: center; 
305
306 
307.flex-author-collection .author-wrap { 
308  margin: 0; 
309
310 
311.flex-author-collection .collections-item__tag { 
312  display: inline-block; 
313  height: 32px; 
314
315 
316.flex-author-collection .collections-item__tag img { 
317  height: 100%; 
318  -o-object-fit: contain; 
319  object-fit: contain; 
320
321.author-wrap { 
322  margin: 12px 0 0; 
323  display: flex; 
324  align-items: center; 
325
326 
327.author-avatar { 
328  margin: 0 5px 0 0; 
329  display: flex; 
330  align-items: center; 
331
332 
333.author-avatar__picture { 
334  display: block; 
335  width: 32px; 
336  height: 32px; 
337  position: relative; 
338  overflow: hidden; 
339  border-radius: 50%; 
340  order: 3; 
341
342 
343.author-avatar__picture img { 
344  position: absolute; 
345  top: 50%; 
346  left: 50%; 
347  transform: translate(-50%, -50%); 
348  max-height: 100%; 
349
350 
351.author-avatar__picture:not(:last-child) { 
352  margin-left: -12px; 
353
354 
355.author-avatar__picture:nth-child(2) { 
356  order: 2; 
357
358 
359.author-avatar__picture:nth-child(3) { 
360  order: 1; 
361
362 
363.author-meta { 
364  display: flex; 
365  align-items: center; 
366
367 
368.author-name { 
369  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", 
370    "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji", 
371    "Segoe UI Symbol", sans-serif; 
372  font-weight: 500; 
373  font-size: 14px; 
374  line-height: 20px; 
375
376 
377.author-name b { 
378  font-weight: 600; 
379
380 
381.author-name a { 
382  color: #222; 
383
384 
385.author-name.multi { 
386  position: relative; 
387
388 
389.author-name.multi > b { 
390  display: flex; 
391  align-items: center; 
392  cursor: pointer; 
393
394 
395.author-name.multi > b svg { 
396  position: relative; 
397  top: 1px; 
398
399 
400.author-name.multi:hover .author-list { 
401  visibility: visible; 
402  opacity: 1; 
403  top: 35px; 
404
405 
406.author-position { 
407  margin: 6px 0 0; 
408  color: gray; 
409
410 
411.author-time { 
412  margin: 0 0 0 0px; 
413  display: flex; 
414  align-items: center; 
415  font-size: 14px; 
416  line-height: 20px; 
417  color: #a0a4a8; 
418
419.tags-wrap { 
420  padding: 0; 
421  list-style: none; 
422
423 
424.tags-wrap.mt-30 { 
425  margin-top: 20px; 
426
427 
428.tags-wrap::after { 
429  content: ""; 
430  display: block; 
431  clear: both; 
432
433 
434.tags-wrap li { 
435  float: left; 
436  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", 
437    "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji", 
438    "Segoe UI Symbol", sans-serif; 
439  line-height: 18px; 
440  margin: 10px 10px 0 0; 
441
442 
443.tags-wrap li:last-of-type { 
444  margin-right: 0; 
445
446 
447.tags-wrap li.label { 
448  color: #333; 
449  line-height: 26px; 
450  border: none; 
451  font-size: 14px; 
452
453 
454.tags-wrap li.label b { 
455  font-weight: 600; 
456
457 
458.tags-wrap li a { 
459  display: block; 
460  padding: 4px 12px; 
461  color: #666; 
462  background: #f1f5f9 none; 
463  border-radius: 13px; 
464  font-weight: 500; 
465
466 
467.tags-wrap li a:hover { 
468  background: var(--btn-link-hover-color) none; 
469  color: #fff; 
470
471 
472.audio-player .toggle-play { 
473  width: 30px; 
474  height: 30px; 
475  display: flex; 
476  justify-content: center; 
477  align-items: center; 
478  cursor: pointer; 
479  font-size: 20px; 
480  color: #957f3f; 
481  transition: all 0.3s; 
482  border-left: none; 
483
484 
485.audio_player_wrap { 
486  display: flex; 
487  align-items: center; 
488  justify-content: space-between; 
489  flex-wrap: wrap; 
490  margin: 6px 0 0 0px; 
491
492 
493.audio_player_wrap .date { 
494  width: 95px; 
495  font-size: 11px; 
496  color: #9e9e9e; 
497
498 
499.audio_player_wrap .post-view { 
500  width: auto; 
501  margin: 0; 
502  padding: 0; 
503  display: flex; 
504  list-style: none; 
505
506 
507.audio_player_wrap .audio-player { 
508  width: 100%; 
509
510 
511.audio_player_wrap .post-view li { 
512  padding-left: 10px; 
513
514 
515.audio_player_wrap .post-view li * { 
516  font-size: 12px; 
517  color: #000; 
518
519 
520.audio_player_wrap .audio-player .controls { 
521  display: flex; 
522  align-items: center; 
523  justify-content: space-between; 
524  padding: 4px 13px; 
525  background: #e7e7e7; 
526
527 
528.toggle-play { 
529  border-left: 10px solid #0072bc; 
530  border-top: 7px solid transparent; 
531  border-bottom: 7px solid transparent; 
532  cursor: pointer; 
533
534 
535.audio-player .time { 
536  width: 54px; 
537  padding: 0 2px; 
538  text-align: center; 
539  display: flex; 
540  align-items: center; 
541  justify-content: center; 
542  font-size: 10px; 
543  color: #010100; 
544  font-family: "Helvetica", sans-serif; 
545
546 
547.audio-player .name { 
548  width: 150px; 
549  height: 18px; 
550  background: #fff; 
551  position: relative; 
552  padding: 0 12px 0 6px; 
553  display: flex; 
554  align-items: center; 
555
556 
557#type_voice_active { 
558  font-size: 9px; 
559  font-weight: 700; 
560
561 
562.audio-player .name:after { 
563  content: ""; 
564  border-top: 3px solid; 
565  border-left: 3px solid transparent; 
566  border-right: 3px solid transparent; 
567  position: absolute; 
568  right: 4px; 
569  top: 7px; 
570
571 
572#box_list_voice { 
573  list-style: none; 
574  margin: 0; 
575  visibility: hidden; 
576  opacity: 0; 
577  position: absolute; 
578  left: 0; 
579  top: 105%; 
580  padding: 7px; 
581  width: max-content; 
582  border-radius: 5px; 
583  box-shadow: 0 5px 12px rgba(0, 0, 0, 0.3); 
584  background: #fff; 
585
586 
587.audio-player .name:hover #box_list_voice { 
588  visibility: visible; 
589  opacity: 1; 
590
591 
592#box_list_voice a { 
593  font-size: 11px; 
594  color: #000; 
595
596 
597.audio-player .audio-timeline { 
598  width: 100%; 
599  margin-right: 12px; 
600  background-color: #fff; 
601
602 
603.audio-player .audio-timeline .audio-progress { 
604  height: 4px; 
605  background-color: #957f3f; 
606
607 
608.audio-player .toggle-play:hover { 
609  background: #ddd; 
610
611 
612.audio-player .toggle-play i { 
613  transition: transform 0.3s; 
614
615 
616.audio-player .toggle-play.playing i { 
617  transform: scale(1.2); /* Phóng to biểu tượng khi đang phát */ 
618
619 
620.audio-timeline { 
621  cursor: pointer; 
622
623 
624.audio-timeline .audio-progress { 
625  height: 100%; 
626  background: #957f3f; 
627  width: 0; 
628  transition: width 0.2s ease; 
629
630.singular-sapo { 
631  margin: 6px 0 18px 0; 
632  font-size: 16px; 
633  line-height: 30px; 
634  color: #333; 
635  font-style: italic; 
636  font-family: "Arial", "Noto Serif", -apple-system, BlinkMacSystemFont, 
637    "Segoe UI", "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji", 
638    "Segoe UI Symbol", serif; 
639  font-weight: 400; 
640
641.article-content { 
642  text-align: justify; 
643
644 
645.img-caption-formatted { 
646    text-align: center !important; 
647    margin-top: 10px !important; 
648    font-style: italic; 
649    display: block; 
650
651</style> 
652<style> 
653.faq-send-upload { 
654    display: flex; 
655    gap: 12px; 
656    margin-top: 20px; 
657
658.article-content a#lnkAttachSOW { 
659    display: inline-block; 
660    padding: 8px 10px 7px 10px; 
661    gap: 6px; 
662    width: 100px; 
663    height: auto; 
664    text-align: center; 
665    background: #957F3F; 
666    border-radius: 4px; 
667    color: #fff !important; 
668
669.article-content a#lnkAttachSOW { 
670    display: flex; 
671    font-size: 0; 
672    width: 44px; 
673    height: auto; 
674    min-height: 44px; 
675    align-items: center; 
676    justify-content: center; 
677    gap: 0; 
678
679.article-content a#lnkAttachSOW>i { 
680    font-size: 20px; 
681
682.article-content a#lnkAttachSOW>i:before { 
683    content: "\f0c6"; 
684
685.article-content a#lnkAttachSOW~span { 
686    font-size: 12px; 
687    line-height: 14px; 
688    color: var(--brand-color-1); 
689
690.faq-send-upload>span { 
691    padding: 6px 12px; 
692    width: 100%; 
693    display: inline-block; 
694    background: var(--brand-color-2); 
695    border-radius: 4px; 
696    position: relative; 
697
698.article-content .faq-send-upload>span::before { 
699    content: 'File đính kèm'; 
700    width: 100%; 
701    display: block; 
702    height: 14px; 
703    font-family: 'Roboto'; 
704    font-style: normal; 
705    font-weight: 400; 
706    font-size: 12px; 
707    line-height: 14px; 
708    color: #465B7E; 
709    margin-bottom: 4px; 
710
711.faq-send-upload>span a { 
712    font-family: 'Roboto'; 
713    font-style: normal; 
714    font-weight: bold; 
715    font-size: 12px; 
716    line-height: 14px; 
717    color: #394E79; 
718
719.faq-send-upload>span a:hover { 
720    color: var(--brand-color-3); 
721
722.hienthixemtruoc { 
723      padding: 5px; 
724    text-align: center; 
725    background-color: #684d2f; 
726    color: #E9E5E4; 
727    font-weight: bold; 
728
729 
730.hienthixemtruoc:hover { 
731  cursor: pointer; } 
732 
733.noidungxemtruoc { 
734  display: none; } 
735</style> 
736 
737<h1 class="title-page detail">${.vars["reserved-article-title"].data}</h1> 
738 
739<div class="flex-author-collection"> 
740<div class="author-wrap"> 
741<#if date?? && date?has_content> 
742<div class="author-avatar"> 
743<div class="author-avatar__picture">  
744<span class="sticker sticker-user-icon sticker-null"><span class="sticker user-icon-color-8 sticker-circle"><span class="sticker-overlay"><svg class="lexicon-icon lexicon-icon-calendar" role="presentation"><use xlink:href="/o/admin-theme/images/clay/icons.svg#calendar"></use></svg></span></span></span> 
745</div> 
746</div> 
747</#if> 
748<div class="author-meta"> 
749<!--<div class="author-name"> 
750<b>${.vars["reserved-article-author-name"].data}</b>  
751</div>--> 
752<time class="author-time" datetime="${date}"> ${date} </time>		 
753</div> 
754</div> 
755</div> 
756<div class="audio_player_wrap"> 
757        <div class="audio-player"> 
758            <div class="controls"> 
759                <div class="toggle-play"><i class="fas fa-play"></i></div> 
760                <div class="time"> 
761                    <div class="current">0:00</div> 
762                    <div class="divider">/</div> 
763                    <div class="length">0:00</div> 
764                </div> 
765                <div class="audio-timeline"> 
766                    <div class="audio-progress"></div> 
767                </div> 
768                <div class="name"> 
769                    <span id="type_voice_active">Giọng Nam</span> 
770                    <ul id="box_list_voice" class="box_list_voice"> 
771                     
772                        <li> 
773                            <a href="#">Giọng Nam</a> 
774                        </li> 
775                        <li> 
776                            <a href="#">Giọng Nữ</a> 
777                        </li> 
778                      
779                    </ul> 
780                </div> 
781            </div> 
782        </div> 
783    </div> 
784</br> 
785<div class="article-content"> 
786<#if .vars["reserved-article-description"].data??> 
787<h4 class="singular-sapo">${.vars["reserved-article-description"].data}</h4> 
788</#if> 
789<#if (AnhNoiBat.getData())?? && AnhNoiBat.getData() != ""> 
790	<img alt="${AnhNoiBat_Alt.getData()}" data-fileentryid="${AnhNoiBat.getAttribute("fileEntryId")}" src="${AnhNoiBat.getData()}" /> 
791	<p style="text-align: center;"> 
792	<em>${AnhNoiBat.getAttribute("alt")}</em> 
793	</p> 
794</br> 
795<#elseif (AnhNoiBat_Url.getData())?? && (AnhNoiBat_Url.getData()) != ""> 
796	<img alt="${AnhNoiBat_Alt.getData()}"  src="${AnhNoiBat_Url.getData()}" /> 
797	<p style="text-align: center;"> 
798	<em>${AnhNoiBat_Alt.getData()}</em> 
799	</p> 
800</br> 
801</#if> 
802${content.getData()} 
803<#if (NguonTin.getData())??> 
804</br> 
805<strong> 
806	${NguonTin.getData()} 
807</strong> 
808</#if> 
809<#assign fileList = FileDinhKem1.getSiblings()?filter(f -> f.getData()?has_content) /> 
810<#assign fileListUrl = FileDinhKem1.getSiblings()?filter(f -> f.dtvb_fileurl.getData()?has_content) /> 
811<#assign textif = "textif"> 
812<#assign textelse = "textelse"> 
813 
814<#if fileListUrl?size gt 0 > 
815<#list FileDinhKem1.getSiblings() as cur_FileDinhKem> 
816  <#assign idx = cur_FileDinhKem?index> 
817  <#assign fileName = cur_FileDinhKem.dtvb_filename1.getData()!""> 
818  <#assign fileUrl =  cur_FileDinhKem.dtvb_fileurl1.getData()!""> 
819		${fileName} 
820		${fileUrl} 
821  <#-- CASE 1: filename là SBVxxx → lấy URL của item trước --> 
822  <#--  <#if fileName?starts_with("SBV") && idx gt 0> 
823    <#assign prev = siblings[idx - 1]> 
824    <#if prev.dtvb_fileurl??  
825       && prev.dtvb_fileurl.getData()?has_content> 
826      <#assign fileUrl = prev.dtvb_fileurl.getData()> 
827    </#if> 
828  </#if> --> 
829		<br> 
830</#list> 
831 
832 
833</#if> 
834<#if fileList?size gt 0 > 
835		${textif} 
836		<div class="cont"> 
837			<div class="faq-send-upload"> 
838			<a id="lnkAttachSOW"><i class="fa-solid fa-paperclip"></i> Đính kèm</a>  
839			<span>  
840	<#list FileDinhKem1.getSiblings() as cur_FileDinhKem> 
841	  <#if cur_FileDinhKem.dtvb_filelink1.getData()?has_content> 
842			<a href="${cur_FileDinhKem.dtvb_filelink1.getData()}"> 
843					<#if (cur_FileDinhKem.dtvb_filename1.getData())??> 
844						${cur_FileDinhKem.dtvb_filename1.getData()} 
845					</#if> 
846			</a> 
847		<#elseif cur_FileDinhKem.dtvb_fileurl1.getData()?has_content> 
848		  <a href="${cur_FileDinhKem.dtvb_fileurl1.getData()}"> 
849					<#if (cur_FileDinhKem.dtvb_filename1.getData())??> 
850						${cur_FileDinhKem.dtvb_filename1.getData()} 
851					</#if> 
852			</a> 
853		</#if> 
854				<br> 
855	</#list> 
856	</span> 
857			</div>                 
858    </div> 
859<br/> 
860</#if> 
861 
862 
863 
864 
865<#assign baseUrl = "https://sbv.tinhvan.com"> <!-- Thay bằng domain thực tế --> 
866 
867<#if fileList?size gt 0> 
868	<#list FileDinhKem1.getSiblings() as cur_FileDinhKem> 
869		<div class="hienthixemtruoc">Ẩn/Hiện nội dung file ${cur_FileDinhKem.dtvb_filename1.getData()} </div> 
870			<#if cur_FileDinhKem.dtvb_filelink1?? && cur_FileDinhKem.dtvb_filelink1.getData()?has_content> 
871				<div class="noidungxemtruoc"> 
872				<#assign fileUrl = cur_FileDinhKem.dtvb_filelink1.getData()?lower_case> 
873						<#assign url = baseUrl + fileUrl> 
874						<#if fileUrl?matches(".*\\.docx?(/|\\?).*")> 
875                <iframe src="https://docs.google.com/gview?url=${url}&embedded=true" 
876                       width="100%" height="800px" frameborder="0"></iframe> 
877            <#else> 
878						<embed src="${cur_FileDinhKem.dtvb_filelink1.getData()}" height="800px" width="100%" type="application/pdf"> 
879            </#if> 
880				</div> 
881			<#elseif  cur_FileDinhKem.dtvb_fileurl1.getData()?? && cur_FileDinhKem.dtvb_fileurl1.getData()?has_content> 
882			      <div class="noidungxemtruoc"> 
883				<#assign fileUrl = cur_FileDinhKem.dtvb_fileurl1.getData()?lower_case> 
884						<#assign url = baseUrl + fileUrl> 
885						<#if fileUrl?matches(".*\\.docx?(/|\\?).*")> 
886                <iframe src="https://docs.google.com/gview?url=${url}&embedded=true" 
887                       width="100%" height="800px" frameborder="0"></iframe> 
888            <#else> 
889						<embed src="${cur_FileDinhKem.dtvb_fileurl1.getData()}" height="800px" width="100%" type="application/pdf"> 
890            </#if> 
891				</div> 
892			</#if> 
893	</#list> 
894</#if> 
895 
896</div> 
897</div> 
898 
899 
900<div class="singular-sidebar side-bar-height" data-module="social-pin"> 
901  <ul class="cpanel-action social-pin "> 
902		<li> 
903      <a href="javascript:;" title="Tăng cỡ chữ" class="btn-font"> 
904            <span class="plus"> 
905                <svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg"> 
906                    <rect x="0.5" y="0.996155" width="21" height="21" rx="10.5" fill="white"></rect> 
907                    <path d="M13.9923 12.0339H11.5756V14.5518H10.4116V12.0339H8.00757V10.9458H10.4116V8.44054H11.5756V10.9458H13.9923V12.0339Z" fill="black"></path> 
908                    <rect x="0.5" y="0.996155" width="21" height="21" rx="10.5" stroke="#DFE0E3"></rect> 
909                </svg> 
910 
911            </span> 
912            <span class="font" "=""> 
913                aA 
914            </span> 
915            <span class="minus" "=""> 
916                <svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg"> 
917                    <rect x="0.5" y="0.996124" width="21" height="21" rx="10.5" fill="white"></rect> 
918                    <path d="M12.9233 10.9141V12.0781H9.0769V10.9141H12.9233Z" fill="black"></path> 
919                    <rect x="0.5" y="0.996124" width="21" height="21" rx="10.5" stroke="#DFE0E3"></rect> 
920                </svg> 
921 
922            </span> 
923        </a> 
924    </li> 
925    <li> 
926      <a class="cpanel-item facebook" target="_blank" href="https://www.facebook.com/sharer.php?u=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên facebook"> 
927        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
928          <path d="M21.125 16.3v2.9h2.925c.225 0 .337.2.337.4l-.45 1.9c0 .1-.225.2-.337.2h-2.475V29H17.75v-7.2h-1.912c-.225 0-.338-.1-.338-.3v-1.9c0-.2.113-.3.338-.3h1.912V16c0-1.7 1.462-3 3.375-3h3.038c.224 0 .337.1.337.3v2.4c0 .2-.113.3-.337.3h-2.7c-.226 0-.338.1-.338.3z" fill="#292D32"></path> 
929        </svg> 
930      </a> 
931    </li> 
932    <li> 
933      <a class="cpanel-item twitter" href="https://twitter.com/intent/tweet?text=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" target="_blank" rel="nofollow" title="Chia sẻ bài viết lên twitter"> 
934        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
935          <path d="M29.5 15.5c-.675.3-1.35.4-2.137.5.787-.4 1.35-1 1.575-1.8-.675.4-1.463.6-2.363.8-.675-.6-1.688-1-2.7-1-1.913 0-3.6 1.5-3.6 3.3 0 .3 0 .5.113.7-3.038-.1-5.85-1.4-7.65-3.4-.338.5-.45 1-.45 1.7 0 1.1.675 2.1 1.687 2.7-.563 0-1.125-.2-1.688-.4 0 1.6 1.238 2.9 2.925 3.2-.337.1-.675.1-1.012.1-.225 0-.45 0-.675-.1.45 1.3 1.8 2.3 3.487 2.3-1.237.9-2.812 1.4-4.612 1.4h-.9c1.688.9 3.6 1.5 5.625 1.5 6.75 0 10.462-5 10.462-9.3v-.4c.788-.5 1.463-1.1 1.913-1.8z" fill="#292D32" stroke="#292D32" stroke-linejoin="round"></path> 
936        </svg> 
937      </a> 
938    </li> 
939    <li> 
940      <a class="cpanel-item linkedin" target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=http://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên linkedin"> 
941        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
942          <g clip-path="url(#IconLinkedin_svg__prefix__clip0_752_6605)"> 
943            <path d="M27.8 12H13.2c-.4 0-.7.3-.7.7v14.7c0 .3.3.6.7.6h14.7c.4 0 .7-.3.7-.7V12.7c-.1-.4-.4-.7-.8-.7zM17.2 25.6h-2.3V18h2.4v7.6h-.1zM16.1 17c-.8 0-1.4-.7-1.4-1.4 0-.8.6-1.4 1.4-1.4.8 0 1.4.6 1.4 1.4-.1.7-.7 1.4-1.4 1.4zm10 8.6h-2.4v-3.7c0-.9 0-2-1.2-2s-1.4 1-1.4 2v3.8h-2.4V18H21v1c.3-.6 1.1-1.2 2.2-1.2 2.4 0 2.8 1.6 2.8 3.6v4.2h.1z" fill="#292D32"></path> 
944          </g> 
945        </svg> 
946      </a> 
947    </li> 
948    <li class="zalo-share-button" data-href="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}"  data-oaid="408045471040429277" data-layout="3" data-color="blue" data-customize="true"> 
949      <button class="cpanel-item zalo" title="Chia sẻ bài viết lên zalo" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-zalo" data-content-target="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}"> 
950        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
951          <g clip-path="url(#IconZalo_svg__a)"> 
952            <path fill-rule="evenodd" clip-rule="evenodd" d="M20.68 17.52v-.456h1.368v6.418h-.782a.585.585 0 0 1-.585-.581 3.334 3.334 0 0 1-5.301-2.69 3.334 3.334 0 0 1 5.3-2.69zM15.026 15v.208c0 .388-.052.705-.305 1.077l-.03.035a7.62 7.62 0 0 0-.246.288l-4.39 5.51h4.97v.78a.585.585 0 0 1-.585.584H8v-.367c0-.45.112-.652.253-.861l4.68-5.792H8.194V15h6.83zm8.681 8.482a.488.488 0 0 1-.487-.487V15h1.463v8.482h-.976zm5.304-6.644a3.357 3.357 0 1 1 0 6.713 3.357 3.357 0 0 1 0-6.713zm-10.297 5.333a1.96 1.96 0 1 0 0-3.92 1.96 1.96 0 1 0 0 3.92zm10.297-.003a1.975 1.975 0 1 0-.001-3.95 1.975 1.975 0 0 0 0 3.95z" fill="#292D32"></path> 
953          </g> 
954          <defs> 
955            <clipPath id="IconZalo_svg__a"> 
956              <path fill="#fff" transform="translate(8 15)" d="M0 0h25v9H0z"></path> 
957            </clipPath> 
958          </defs> 
959        </svg> 
960      </button> 
961    </li> 
962    <li> 
963      <button type="button" class="cpanel-item link" onclick="copyLink('https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}')" title="Copy"> 
964        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
965          <g clip-path="url(#IconLinking_svg__prefix__clip0_608_611)" fill="#292D32"> 
966            <path d="M16.5 28c-1.2 0-2.3-.5-3.2-1.3-1.8-1.8-1.8-4.6 0-6.4l.7-.7 1.4 1.4-.7.7c-1 1-1 2.6 0 3.6s2.6 1 3.6 0l3-3c1-1 1-2.6 0-3.6l-.7-.7 1.4-1.4.7.7c1.8 1.8 1.8 4.6 0 6.4l-3 3c-.8.8-2 1.3-3.2 1.3z"></path> 
967            <path d="m18 23.4-.7-.7c-1.8-1.8-1.8-4.6 0-6.4l3-3c.9-.9 2-1.3 3.2-1.3 1.2 0 2.3.5 3.2 1.3 1.8 1.8 1.8 4.6 0 6.4l-.7.7-1.4-1.4.7-.7c1-1 1-2.6 0-3.6s-2.6-1-3.6 0l-3 3c-1 1-1 2.6 0 3.6l.7.7-1.4 1.4z"></path> 
968          </g> 
969        </svg> 
970      </button> 
971    </li> 
972    <li class="line"> 
973      <a type="button" href="#p_p_id_com_liferay_comment_page_comments_web_portlet_PageCommentsPortlet_" class="cpanel-item comment" title="Bình luận"> 
974        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
975          <path d="M17.583 25.833h-.416c-3.334 0-5-.833-5-5v-4.166c0-3.334 1.666-5 5-5h6.666c3.334 0 5 1.666 5 5v4.166c0 3.334-1.666 5-5 5h-.416a.845.845 0 0 0-.667.334l-1.25 1.666c-.55.734-1.45.734-2 0l-1.25-1.666c-.133-.184-.442-.334-.667-.334z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
976          <path d="M16.333 16.667h8.334m-8.334 4.166h5" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path> 
977        </svg> 
978        <span class="x-comments"></span> 
979      </a> 
980    </li> 
981    <!-- <li class="save "> 
982      <button class="saved-article-20230824031513522 vLPsOJ4TxOzrC0g8QrVd MXHPvY_upC4YgT_Z3MLn "> 
983        <span class="woK3sep4ykUXzIebVRTv"></span> 
984      </button> 
985    </li> --> 
986    <li> 
987      <button id="ic_print" rel="nofollow" onclick="javascript:;" class="cpanel-item print" title="In"> 
988        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
989          <path d="M16.542 15.833h7.916v-1.666c0-1.667-.625-2.5-2.5-2.5h-2.916c-1.875 0-2.5.833-2.5 2.5v1.666z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
990          <path d="M28 18.333V22.5c0 1.667-.833 2.5-2.5 2.5v-2h-10v2c-1.667 0-2.5-.833-2.5-2.5v-4.167c0-1.666.833-2.5 2.5-2.5h10c1.667 0 2.5.834 2.5 2.5zM25.5 23h-10m.833-3.833h2.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
991          <path d="M25.5 23v2.857c0 1.429-1.25 2.143-3.75 2.143h-2.5c-2.5 0-3.75-.714-3.75-2.143V23h10z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
992        </svg> 
993      </button> 
994    </li> 
995    <li> 
996      <button onclick="history.back()" class="cpanel-item back"> 
997        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
998          <path d="M18.475 14.942 13.417 20l5.058 5.058M27.583 20H13.558" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
999        </svg> 
1000      </button> 
1001    </li> 
1002  </ul> 
1003</div> 
1004 
1005 
1006<div class="singular-footer" data-module="social-pin"> 
1007  <ul class="cpanel-action social-pin hidden"> 
1008    <li> 
1009      <a class="cpanel-item facebook" target="_blank" href="https://www.facebook.com/sharer.php?u=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-facebook" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên facebook"> 
1010        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1011          <path d="M21.125 16.3v2.9h2.925c.225 0 .337.2.337.4l-.45 1.9c0 .1-.225.2-.337.2h-2.475V29H17.75v-7.2h-1.912c-.225 0-.338-.1-.338-.3v-1.9c0-.2.113-.3.338-.3h1.912V16c0-1.7 1.462-3 3.375-3h3.038c.224 0 .337.1.337.3v2.4c0 .2-.113.3-.337.3h-2.7c-.226 0-.338.1-.338.3z" fill="#292D32"></path> 
1012        </svg> 
1013      </a> 
1014    </li> 
1015    <li> 
1016      <a class="cpanel-item twitter" href="https://twitter.com/intent/tweet?text=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" target="_blank" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-twitter" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên twitter"> 
1017        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1018          <path d="M29.5 15.5c-.675.3-1.35.4-2.137.5.787-.4 1.35-1 1.575-1.8-.675.4-1.463.6-2.363.8-.675-.6-1.688-1-2.7-1-1.913 0-3.6 1.5-3.6 3.3 0 .3 0 .5.113.7-3.038-.1-5.85-1.4-7.65-3.4-.338.5-.45 1-.45 1.7 0 1.1.675 2.1 1.687 2.7-.563 0-1.125-.2-1.688-.4 0 1.6 1.238 2.9 2.925 3.2-.337.1-.675.1-1.012.1-.225 0-.45 0-.675-.1.45 1.3 1.8 2.3 3.487 2.3-1.237.9-2.812 1.4-4.612 1.4h-.9c1.688.9 3.6 1.5 5.625 1.5 6.75 0 10.462-5 10.462-9.3v-.4c.788-.5 1.463-1.1 1.913-1.8z" fill="#292D32" stroke="#292D32" stroke-linejoin="round"></path> 
1019        </svg> 
1020      </a> 
1021    </li> 
1022    <li> 
1023      <a class="cpanel-item linkedin" target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-linkedin" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên linkedin"> 
1024        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1025          <g clip-path="url(#IconLinkedin_svg__prefix__clip0_752_6605)"> 
1026            <path d="M27.8 12H13.2c-.4 0-.7.3-.7.7v14.7c0 .3.3.6.7.6h14.7c.4 0 .7-.3.7-.7V12.7c-.1-.4-.4-.7-.8-.7zM17.2 25.6h-2.3V18h2.4v7.6h-.1zM16.1 17c-.8 0-1.4-.7-1.4-1.4 0-.8.6-1.4 1.4-1.4.8 0 1.4.6 1.4 1.4-.1.7-.7 1.4-1.4 1.4zm10 8.6h-2.4v-3.7c0-.9 0-2-1.2-2s-1.4 1-1.4 2v3.8h-2.4V18H21v1c.3-.6 1.1-1.2 2.2-1.2 2.4 0 2.8 1.6 2.8 3.6v4.2h.1z" fill="#292D32"></path> 
1027          </g> 
1028        </svg> 
1029      </a> 
1030    </li> 
1031    <li class="zalo-share-button" data-href="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}"  data-oaid="408045471040429277" data-layout="3" data-color="blue" data-customize="true"> 
1032      <button class="cpanel-item zalo" title="Chia sẻ bài viết lên zalo" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-zalo" data-content-target="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}"> 
1033        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1034          <g clip-path="url(#IconZalo_svg__a)"> 
1035            <path fill-rule="evenodd" clip-rule="evenodd" d="M20.68 17.52v-.456h1.368v6.418h-.782a.585.585 0 0 1-.585-.581 3.334 3.334 0 0 1-5.301-2.69 3.334 3.334 0 0 1 5.3-2.69zM15.026 15v.208c0 .388-.052.705-.305 1.077l-.03.035a7.62 7.62 0 0 0-.246.288l-4.39 5.51h4.97v.78a.585.585 0 0 1-.585.584H8v-.367c0-.45.112-.652.253-.861l4.68-5.792H8.194V15h6.83zm8.681 8.482a.488.488 0 0 1-.487-.487V15h1.463v8.482h-.976zm5.304-6.644a3.357 3.357 0 1 1 0 6.713 3.357 3.357 0 0 1 0-6.713zm-10.297 5.333a1.96 1.96 0 1 0 0-3.92 1.96 1.96 0 1 0 0 3.92zm10.297-.003a1.975 1.975 0 1 0-.001-3.95 1.975 1.975 0 0 0 0 3.95z" fill="#292D32"></path> 
1036          </g> 
1037          <defs> 
1038            <clipPath id="IconZalo_svg__a"> 
1039              <path fill="#fff" transform="translate(8 15)" d="M0 0h25v9H0z"></path> 
1040            </clipPath> 
1041          </defs> 
1042        </svg> 
1043      </button> 
1044    </li> 
1045    <li> 
1046      <button type="button" class="cpanel-item link" onclick="copyLink('https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}')"  title="Copy"> 
1047        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1048          <g clip-path="url(#IconLinking_svg__prefix__clip0_608_611)" fill="#292D32"> 
1049            <path d="M16.5 28c-1.2 0-2.3-.5-3.2-1.3-1.8-1.8-1.8-4.6 0-6.4l.7-.7 1.4 1.4-.7.7c-1 1-1 2.6 0 3.6s2.6 1 3.6 0l3-3c1-1 1-2.6 0-3.6l-.7-.7 1.4-1.4.7.7c1.8 1.8 1.8 4.6 0 6.4l-3 3c-.8.8-2 1.3-3.2 1.3z"></path> 
1050            <path d="m18 23.4-.7-.7c-1.8-1.8-1.8-4.6 0-6.4l3-3c.9-.9 2-1.3 3.2-1.3 1.2 0 2.3.5 3.2 1.3 1.8 1.8 1.8 4.6 0 6.4l-.7.7-1.4-1.4.7-.7c1-1 1-2.6 0-3.6s-2.6-1-3.6 0l-3 3c-1 1-1 2.6 0 3.6l.7.7-1.4 1.4z"></path> 
1051          </g> 
1052        </svg> 
1053      </button> 
1054    </li> 
1055    <li class="line"> 
1056      <a type="button" href="#p_p_id_com_liferay_comment_page_comments_web_portlet_PageCommentsPortlet_" class="cpanel-item comment" title="Bình luận"> 
1057        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1058          <path d="M17.583 25.833h-.416c-3.334 0-5-.833-5-5v-4.166c0-3.334 1.666-5 5-5h6.666c3.334 0 5 1.666 5 5v4.166c0 3.334-1.666 5-5 5h-.416a.845.845 0 0 0-.667.334l-1.25 1.666c-.55.734-1.45.734-2 0l-1.25-1.666c-.133-.184-.442-.334-.667-.334z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
1059          <path d="M16.333 16.667h8.334m-8.334 4.166h5" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path> 
1060        </svg> 
1061        <span  class="x-comments"></span> 
1062      </a> 
1063    </li> 
1064    <li> 
1065      <button id="ic_print2" rel="nofollow" onclick="javascript:;"  class="cpanel-item print"  title="In"> 
1066        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1067          <path d="M16.542 15.833h7.916v-1.666c0-1.667-.625-2.5-2.5-2.5h-2.916c-1.875 0-2.5.833-2.5 2.5v1.666z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
1068          <path d="M28 18.333V22.5c0 1.667-.833 2.5-2.5 2.5v-2h-10v2c-1.667 0-2.5-.833-2.5-2.5v-4.167c0-1.666.833-2.5 2.5-2.5h10c1.667 0 2.5.834 2.5 2.5zM25.5 23h-10m.833-3.833h2.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
1069          <path d="M25.5 23v2.857c0 1.429-1.25 2.143-3.75 2.143h-2.5c-2.5 0-3.75-.714-3.75-2.143V23h10z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
1070        </svg> 
1071      </button> 
1072    </li> 
1073    <li> 
1074      <button onclick="history.back()" class="cpanel-item back"> 
1075        <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg"> 
1076          <path d="M18.475 14.942 13.417 20l5.058 5.058M27.583 20H13.558" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path> 
1077        </svg> 
1078      </button> 
1079    </li> 
1080  </ul> 
1081</div> 
1082 
1083<div class="content-tags"> 
1084<ul class="tags-wrap mt-30"> 
1085      	<#if categories?has_content> 
1086  <li class="label"><b><@liferay.language key="categories" />:</b></li> 
1087    <#list categories as category> 
1088		<#assign categoryURL = renderResponse.createRenderURL()  
1089		               categoryId = category.getCategoryId()?string 
1090		/> 
1091					${categoryURL.setParameter("resetCur", "true")} 
1092					${categoryURL.setParameter("categoryId", category.getCategoryId()?string)} 
1093					<li> 
1094       <a  title="${category.getName()}" href="/w/${.vars["reserved-article-url-title"].data}/-/categories/${category.getCategoryId()}">${category.getName()}</a> ${category?has_next?then('   ', '')} 
1095  </li> 
1096    </#list> 
1097</#if> 
1098</ul> 
1099</div> 
1100 
1101<#assign tags = stringUtil.split(.vars["reserved-article-asset-tag-names"].data,",")> 
1102<#if tags?size gte 1> 
1103<div class="content-tags"> 
1104<ul class="tags-wrap"> 
1105  <li class="label"><b><@liferay.language key="keywords" />:</b></li> 
1106	<#list tags as tag> 
1107  <li> 
1108    <a 
1109      title="${tag}" 
1110      href="/w/${.vars["reserved-article-url-title"].data}/-/tag/${tag}" 
1111      data-content-name="article-tags" 
1112      data-content-piece="article-tags-position_1" 
1113      data-content-target="/w/${.vars["reserved-article-url-title"].data}/-/tag/${tag}?assetEntryId=${.vars["reserved-article-id"].data}" 
1114      data-track-content="" 
1115
1116      	${tag} 
1117    </a> 
1118  </li> 
1119	</#list> 
1120</ul> 
1121</div> 
1122</#if> 
1123<script> 
1124    $(document).ready(function() { 
1125        var xComments = []; 
1126        var yourArray = []; 
1127        $(".add-comment .show .panel-body .text-secondary.text-uppercase strong").each(function(){ 
1128            if($.trim($(this).text()).length > 0) { 
1129						   if($(this).text().substring(0, 1)!='T'){ 
1130							 xComments.push($(this).text().substring(0, 1)); 
1131							 }else{ 
1132							 xComments.push('0'); 
1133							 }   
1134
1135        }); 
1136 
1137        $(".x-comments").each(function(){ 
1138            $(this).text(xComments[0]); 
1139        }); 
1140 
1141        $(".x-comments").text(xComments[0]); 
1142 
1143        var images = $(".article-content picture"); 
1144 
1145        if (images.length <= 0) { 
1146            images = $(".article-content img, .article-content figure img, .article-content .document img"); 
1147
1148 
1149        images.each(function(){ 
1150        var imageSource; 
1151        var image= $(this); 
1152        if (image.is('picture')) { 
1153            var sources = image.find('source'); 
1154            sources.each(function() { 
1155                var mediaQuery = $(this).attr('media');  
1156                if (window.matchMedia(mediaQuery).matches) {  
1157                    imageSource = $(this).attr('srcset'); 
1158                    return false;  
1159
1160            }); 
1161        } else { 
1162            imageSource = image.attr('src');  
1163
1164 
1165        if (!imageSource) { 
1166            imageSource = image.find('img').attr('src');  
1167
1168 
1169        image.wrap(function() { 
1170            var dataCaption = $(this).next().text(); 
1171            if (!dataCaption || dataCaption.length === 0) { 
1172                dataCaption = $(this).parent().next().text().trim(); 
1173
1174						if (!dataCaption || dataCaption.length === 0) { 
1175                dataCaption = $(this).parent().parent().next().text().trim(); 
1176
1177            return '<a data-fancybox="gallery" data-src="' + imageSource + '" data-caption="' + dataCaption + '"/>'; 
1178        }); 
1179}); 
1180 
1181        Fancybox.bind('[data-fancybox="gallery"]', { 
1182            // 
1183        }); 
1184 
1185        var baseFont = 14; 
1186        function fontchange(n) { 
1187            baseFont += n; 
1188            $(".article-content p,.article-content span").css("font-size", baseFont + "px"); 
1189            savecookie("fontsize", baseFont) 
1190
1191 
1192        function fontdefault() { 
1193            $(".article-content p,.article-content span").css("font-size", "14px"); 
1194            savecookie("fontsize", 14); 
1195
1196 
1197        function getcookie(n) { 
1198            var t; 
1199            return (t = new RegExp("(?:^|; )" + encodeURIComponent(n) + "=([^;]*)").exec(document.cookie)) ? t[1] : null; 
1200
1201 
1202        function savecookie(n, t) { 
1203            var i = new Date, r; 
1204            i.setTime(i.getTime() + 31536e6); 
1205            r = "; expires=" + i.toGMTString(); 
1206            document.cookie = n + "=" + t + r + "; path=/;"; 
1207
1208 
1209        if ($('.btn-font').length > 0) { 
1210            $('.plus').off('click').on('click', function () { 
1211                fontchange(1); 
1212            }); 
1213            $('.minus').off('click').on('click', function () { 
1214                fontchange(-1); 
1215            }); 
1216            $('.font').off('click').on('click', function () { 
1217                fontdefault(); 
1218            }); 
1219
1220 
1221        function printDiv(divName){ 
1222				 
1223            var printContents = document.getElementById(divName).innerHTML; 
1224            var originalContents = document.body.innerHTML; 
1225 
1226            document.body.innerHTML = printContents; 
1227 
1228            window.print(); 
1229 
1230            document.body.innerHTML = originalContents; 
1231
1232 
1233        function copyLink(link) { 
1234            $(".link").append('<span class="tooltiptext">Đã copy</span>'); 
1235            const unsecuredCopyToClipboard = (text) => {  
1236                const textArea = document.createElement("textarea");  
1237                textArea.value=text;  
1238                document.body.appendChild(textArea);  
1239                textArea.select();  
1240                try { 
1241                    document.execCommand('copy'); 
1242                } catch(err) { 
1243                    console.error('Unable to copy to clipboard', err); 
1244
1245                document.body.removeChild(textArea); 
1246            }; 
1247 
1248            if (window.isSecureContext && navigator.clipboard) { 
1249                navigator.clipboard.writeText(link); 
1250            } else { 
1251                unsecuredCopyToClipboard(link); 
1252
1253 
1254            setTimeout(function() { 
1255                $(".tooltiptext").remove(); 
1256            }, 3000); 
1257
1258 
1259        function isOnScreen(){ 
1260            var curPos = $('.singular-footer').offset(); 
1261            var curTop = curPos.top - $(window).scrollTop(); 
1262            var screenHeight = $(window).height(); 
1263            if (curTop < screenHeight) { 
1264                $('.singular-sidebar').hide(); 
1265            } else { 
1266                $('.singular-sidebar').show(); 
1267
1268
1269 
1270        window.onscroll = isOnScreen; 
1271				 
1272				        //Start xử lý nút đọc nội dung 
1273        const playButton = document.querySelector(".toggle-play"); 
1274        const playIcon = playButton.querySelector("i"); 
1275        const voicesList = document.querySelectorAll("#box_list_voice li a"); 
1276        const activeVoiceLabel = document.querySelector("#type_voice_active"); 
1277        const currentTimeDisplay = document.querySelector(".time .current"); 
1278        const totalTimeDisplay = document.querySelector(".time .length"); 
1279        const timeline = document.querySelector(".audio-timeline"); 
1280        const progress = document.querySelector(".audio-progress"); 
1281        let selectedVoice = "Vietnamese Male"; 
1282 
1283        let isPlaying = false; 
1284        let intervalId; 
1285        let elapsedSeconds = 0; 
1286        let estimatedLength = 0; 
1287 
1288        // Kiểm tra giọng đọc hợp lệ 
1289        function validateVoice() { 
1290            const voices = responsiveVoice.getVoices(); 
1291            const validVoice = voices.find(v => v.name === selectedVoice); 
1292            if (!validVoice) { 
1293                console.warn("Giọng đọc không hợp lệ:", selectedVoice); 
1294                selectedVoice = "Vietnamese Female"; // Giọng mặc định nếu không tìm thấy 
1295
1296
1297				 
1298				// Lấy nội dung từ class entry_body, xóa .post_social 
1299        function getCleanContent() { 
1300            const entryBodyElement = document.querySelector(".article-content").cloneNode(true); 
1301            return entryBodyElement.innerText.replace("\n","").trim(); // Lấy nội dung sau khi xóa 
1302
1303 
1304        // Tính tổng thời gian dự kiến 
1305        function calculateEstimatedLength(content) { 
1306            const totalWords = content.split(/\s+/).length; // Đếm số từ 
1307            return Math.ceil(totalWords / 3.33); // Thời gian đọc (giây) với tốc độ ~3.33 từ/giây 
1308
1309 
1310        // Định dạng thời gian thành mm:ss 
1311        function formatTime(seconds) { 
1312            const mins = Math.floor(seconds / 60); 
1313            const secs = seconds % 60; 
1314            return mins + ":" + (secs < 10 ? "0" : "") + secs; 
1315
1316 
1317        // Cập nhật thanh timeline 
1318        function updateProgress() { 
1319            const percentage = (elapsedSeconds / estimatedLength) * 100; 
1320            progress.style.width = percentage + "%"; 
1321
1322 
1323        // Gán sự kiện cho nút play/pause 
1324        playButton.addEventListener("click", function () { 
1325            const cleanContent = getCleanContent(); // Lấy nội dung đã loại bỏ post_social 
1326            estimatedLength = calculateEstimatedLength(cleanContent); 
1327            totalTimeDisplay.textContent = formatTime(estimatedLength); 
1328 
1329            validateVoice(); 
1330 
1331            if (!cleanContent) { 
1332                 
1333                alert("Không có nội dung để đọc!"); 
1334                   
1335                return; 
1336
1337 
1338            if (isPlaying) { 
1339                responsiveVoice.cancel(); 
1340                isPlaying = false; 
1341                playIcon.classList.remove("fa-pause"); 
1342                playIcon.classList.add("fa-play"); 
1343                clearInterval(intervalId); // Dừng bộ đếm thời gian 
1344            } else { 
1345                responsiveVoice.speak(cleanContent, selectedVoice, { 
1346                    onend: function () { 
1347                        isPlaying = false; 
1348                        playIcon.classList.remove("fa-pause"); 
1349                        playIcon.classList.add("fa-play"); 
1350                        clearInterval(intervalId); 
1351                        elapsedSeconds = 0; 
1352                        currentTimeDisplay.textContent = formatTime(0); 
1353                        progress.style.width = "0%"; 
1354                    }, 
1355                    onerror: function (e) { 
1356                        console.error("Lỗi phát âm thanh:", e); 
1357                        alert("Không thể phát âm thanh. Vui lòng kiểm tra lại."); 
1358
1359                }); 
1360                isPlaying = true; 
1361                playIcon.classList.remove("fa-play"); 
1362                playIcon.classList.add("fa-pause"); 
1363 
1364                // Bắt đầu bộ đếm thời gian 
1365                elapsedSeconds = 0; // Đặt lại thời gian bắt đầu 
1366                intervalId = setInterval(function () { 
1367                    if (elapsedSeconds < estimatedLength) { 
1368                        elapsedSeconds++; 
1369                        currentTimeDisplay.textContent = formatTime(elapsedSeconds); 
1370                        updateProgress(); // Cập nhật thanh tiến trình 
1371                    } else { 
1372                        clearInterval(intervalId); // Dừng khi đạt tổng thời lượng 
1373
1374                }, 1000); 
1375
1376        }); 
1377 
1378        // Tua hoặc quay lại trong thanh timeline 
1379        timeline.addEventListener("click", function (e) { 
1380            const timelineWidth = timeline.offsetWidth; 
1381            const clickX = e.offsetX; 
1382            const newTime = (clickX / timelineWidth) * estimatedLength; 
1383            elapsedSeconds = Math.floor(newTime); 
1384            currentTimeDisplay.textContent = formatTime(elapsedSeconds); 
1385            updateProgress(); 
1386 
1387            // Nếu đang phát, cập nhật lại giọng nói từ thời điểm mới 
1388            if (isPlaying) { 
1389                responsiveVoice.cancel(); 
1390                const remainingContent = getRemainingContent(getCleanContent(), elapsedSeconds, estimatedLength); 
1391                responsiveVoice.speak(remainingContent, selectedVoice); 
1392
1393        }); 
1394 
1395        // Hàm lấy nội dung từ thời điểm tua 
1396        function getRemainingContent(content, elapsed, total) { 
1397            const totalWords = content.split(/\s+/).length; 
1398            const startWord = Math.floor((elapsed / total) * totalWords); 
1399            return content.split(/\s+/).slice(startWord).join(" "); 
1400
1401 
1402        // Gán sự kiện thay đổi giọng đọc 
1403        voicesList.forEach(function (voiceItem) { 
1404            voiceItem.addEventListener("click", function () { 
1405                const voiceName = voiceItem.textContent.trim(); 
1406 
1407                // Chuyển đổi giọng đọc dựa trên tên giọng 
1408                switch (voiceName) { 
1409                 
1410                    case "Giọng Nam": 
1411                        selectedVoice = "Vietnamese Male"; 
1412                        break; 
1413                    case "Giọng Nữ": 
1414                        selectedVoice = "Vietnamese Female"; 
1415                        break; 
1416                 
1417
1418 
1419                // Cập nhật nhãn hiển thị 
1420                activeVoiceLabel.textContent = voiceName; 
1421            }); 
1422        }); 
1423        //End xử lý nút đọc nội dung 
1424				 
1425				        //Start xử lý nút in trang 
1426        const printButton = document.querySelector("#ic_print"); 
1427 
1428        printButton.addEventListener("click", function (e) { 
1429            e.preventDefault(); // Ngăn hành vi mặc định 
1430debugger 
1431            // Lấy HTML của <head> (tất cả <link> và <style>) 
1432           const headHTML = document.head.outerHTML; 
1433            // Lấy nội dung của class .main 
1434            const mainContentElement = document.querySelector("#print-content").cloneNode(true); 
1435 
1436            // Xóa các phần tử không cần in 
1437            const audioPlayerWrap = mainContentElement.querySelector(".audio_player_wrap"); 
1438            if (audioPlayerWrap) audioPlayerWrap.remove(); // Xóa audio_player_wrap 
1439 
1440            // Lưu nội dung gốc của trang 
1441            const originalContent = document.body.innerHTML; 
1442 
1443            // Thay thế toàn bộ nội dung body bằng nội dung .main đã xử lý 
1444            document.body.innerHTML = mainContentElement.innerHTML; 
1445 
1446            // Gọi hàm in 
1447            window.print(); 
1448 
1449            // Khôi phục lại nội dung gốc 
1450            document.body.innerHTML = originalContent; 
1451 
1452            // Đảm bảo script được chạy lại sau khi khôi phục 
1453            window.location.reload(); 
1454        }); 
1455 
1456        const printButton2 = document.querySelector("#ic_print2"); 
1457 
1458        printButton2.addEventListener("click", function (e) { 
1459            e.preventDefault(); // Ngăn hành vi mặc định 
1460 
1461            // Lấy nội dung của class .main 
1462            const mainContentElement = document.querySelector("#print-content").cloneNode(true); 
1463 
1464            // Xóa các phần tử không cần in 
1465            const audioPlayerWrap = mainContentElement.querySelector(".audio_player_wrap"); 
1466            const postSocial = mainContentElement.querySelector(".post_social"); 
1467            const post_relate = mainContentElement.querySelector(".post_relate"); 
1468            const Danh_sach_comment = mainContentElement.querySelector("#Danh-sach-comment"); 
1469            const Danh_sach_ratting = mainContentElement.querySelector("#Danh-sach-ratting"); 
1470            if (audioPlayerWrap) audioPlayerWrap.remove(); // Xóa audio_player_wrap 
1471            if (postSocial) postSocial.remove(); // Xóa post_social 
1472            if (post_relate) post_relate.remove(); // Xóa post_relate 
1473            if (Danh_sach_comment) Danh_sach_comment.remove(); // Xóa Danh_sach_comment 
1474            if (Danh_sach_ratting) Danh_sach_ratting.remove(); // Xóa Danh_sach_ratting 
1475 
1476            // Lưu nội dung gốc của trang 
1477            const originalContent = document.body.innerHTML; 
1478 
1479            // Thay thế toàn bộ nội dung body bằng nội dung .main đã xử lý 
1480            document.body.innerHTML = mainContentElement.innerHTML; 
1481 
1482            // Gọi hàm in 
1483            window.print(); 
1484 
1485            // Khôi phục lại nội dung gốc 
1486            document.body.innerHTML = originalContent; 
1487 
1488            // Đảm bảo script được chạy lại sau khi khôi phục 
1489            window.location.reload(); 
1490        }); 
1491 
1492        //End xử lý nút In trang 
1493    }); 
1494</script> 
1495 
1496 
1497 
1498<script> 
1499 
1500function isInsideStrongTag(element) { 
1501  while (element) { 
1502    if ( 
1503      element.nodeType === Node.ELEMENT_NODE && 
1504      element.tagName.toLowerCase() === "strong" 
1505    ) { 
1506		 
1507      return true; 
1508
1509    element = element.parentElement; 
1510
1511  return false; 
1512
1513 
1514  function formatImageCaptions() { 
1515  const articleContents = document.querySelectorAll(".article-content"); 
1516  let formattedCount = 0; 
1517 
1518  articleContents.forEach((articleContent) => { 
1519    const images = articleContent.querySelectorAll("img"); 
1520 
1521    images.forEach((img) => { 
1522      const firstText = findFirstTextAfterElement(img); 
1523      if (firstText) { 
1524        // --- NEW: kiểm tra có nằm trong thẻ <strong> không --- 
1525        const isInStrongTag = isInsideStrongTag(firstText.element); 
1526        const isLongDescription = firstText.text.length > 150; 
1527 
1528        if (isInStrongTag || isLongDescription) { 
1529          return; 
1530
1531 
1532        removeBrElementsBetween(img, firstText.element); 
1533 
1534        const pElement = document.createElement("p"); 
1535        pElement.classList.add("img-caption-formatted"); 
1536        pElement.textContent = firstText.text; 
1537 
1538        if (firstText.type === "textNode") { 
1539          firstText.element.parentNode.replaceChild(pElement, firstText.element); 
1540        } else { 
1541          firstText.element.parentNode.replaceChild(pElement, firstText.element); 
1542
1543 
1544        formattedCount++; 
1545
1546    }); 
1547  }); 
1548
1549 
1550 
1551  function removeBrElementsBetween(startElement, endElement) { 
1552    let current = startElement.nextSibling; 
1553    const elementsToRemove = []; 
1554 
1555    // Duyệt qua các sibling elements cho đến khi gặp endElement 
1556    while (current && current !== endElement) { 
1557      if ( 
1558        current.nodeType === Node.ELEMENT_NODE && 
1559        current.tagName.toLowerCase() === "br" 
1560      ) { 
1561        elementsToRemove.push(current); 
1562      } else if ( 
1563        current.nodeType === Node.TEXT_NODE && 
1564        current.textContent.trim() === "" 
1565      ) { 
1566        // Cũng xóa các text node rỗng (chỉ chứa whitespace) 
1567        elementsToRemove.push(current); 
1568
1569      current = current.nextSibling; 
1570
1571 
1572    // Xóa tất cả các element đã đánh dấu 
1573    elementsToRemove.forEach((el) => { 
1574      if (el.parentNode) { 
1575        el.parentNode.removeChild(el); 
1576
1577    }); 
1578
1579 
1580  function findFirstTextAfterElement(element) { 
1581    // Tìm text đầu tiên sau element, bao gồm cả text node và element chứa text 
1582 
1583    function getNextElements(el) { 
1584      const results = []; 
1585      let current = el; 
1586 
1587      // Duyệt qua các sibling elements 
1588      while (current.nextSibling) { 
1589        current = current.nextSibling; 
1590        results.push(current); 
1591
1592 
1593      // Nếu không có sibling, đi lên parent và tìm tiếp 
1594      if (results.length === 0 && el.parentElement) { 
1595        const parentResults = getNextElements(el.parentElement); 
1596        results.push(...parentResults); 
1597
1598 
1599      return results; 
1600
1601 
1602    function findTextInElement(el) { 
1603      // Kiểm tra text node trực tiếp 
1604      if (el.nodeType === Node.TEXT_NODE) { 
1605        const text = el.textContent.trim(); 
1606        if (text) { 
1607          return { 
1608            text: text, 
1609            element: el, 
1610            type: "textNode", 
1611          }; 
1612
1613
1614 
1615      // Kiểm tra element có text content 
1616      if (el.nodeType === Node.ELEMENT_NODE) { 
1617        // Bỏ qua các thẻ br 
1618        if (el.tagName && el.tagName.toLowerCase() === "br") { 
1619          return null; 
1620
1621 
1622        // Tìm text đầu tiên trong element này (dùng TreeWalker) 
1623        const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, { 
1624          acceptNode: function (node) { 
1625            return node.textContent.trim() 
1626              ? NodeFilter.FILTER_ACCEPT 
1627              : NodeFilter.FILTER_SKIP; 
1628          }, 
1629        }); 
1630 
1631        const firstTextNode = walker.nextNode(); 
1632        if (firstTextNode) { 
1633          // Tìm element chứa text này (có thể là parent của text node) 
1634          let containingElement = firstTextNode.parentElement; 
1635 
1636          // Nếu element chứa text là con trực tiếp của element gốc 
1637          // thì lấy element đó, nếu không thì lấy element con đầu tiên có text 
1638          while ( 
1639            containingElement && 
1640            containingElement !== el && 
1641            containingElement.parentElement !== el 
1642          ) { 
1643            containingElement = containingElement.parentElement; 
1644
1645 
1646          if (containingElement && containingElement !== el) { 
1647            return { 
1648              text: firstTextNode.textContent.trim(), 
1649              element: containingElement, 
1650              type: "elementWithText", 
1651            }; 
1652          } else { 
1653            return { 
1654              text: firstTextNode.textContent.trim(), 
1655              element: el, 
1656              type: "directText", 
1657            }; 
1658
1659
1660
1661 
1662      return null; 
1663
1664 
1665    // Lấy danh sách các element tiếp theo 
1666    const nextElements = getNextElements(element); 
1667 
1668    // Tìm text đầu tiên trong các element này 
1669    for (let nextEl of nextElements) { 
1670      const textResult = findTextInElement(nextEl); 
1671      if (textResult) { 
1672        return textResult; 
1673
1674
1675 
1676    return null; 
1677
1678 
1679  function resetFormat() { 
1680    // Xóa tất cả format đã áp dụng 
1681    const formattedElements = document.querySelectorAll( 
1682      ".img-caption-formatted" 
1683    ); 
1684    formattedElements.forEach((el) => { 
1685      el.remove(); 
1686    }); 
1687
1688 
1689  // Tự động format khi trang load 
1690  document.addEventListener("DOMContentLoaded", function () { 
1691    formatImageCaptions(); 
1692  }); 
1693</script> 
1694 
1695<script> 
1696window.addEventListener("load", function () { 
1697  const images = document.querySelectorAll('.article-content img'); 
1698 
1699  images.forEach(function (img) { 
1700    const hasWidthAttr = img.hasAttribute('width'); 
1701    const hasHeightAttr = img.hasAttribute('height'); 
1702 
1703    if (!hasWidthAttr && !hasHeightAttr) { 
1704      img.style.width = '100%'; 
1705      img.style.height = 'auto'; // đảm bảo tỉ lệ hình ảnh không bị méo 
1706
1707  }); 
1708}); 
1709 
1710</script> 
No Results Found