{"id":526,"date":"2026-08-10T20:29:09","date_gmt":"2026-08-10T13:29:09","guid":{"rendered":"https:\/\/app.mitunet.com\/home\/?page_id=526"},"modified":"2026-08-17T11:49:25","modified_gmt":"2026-08-17T04:49:25","slug":"chinh-sua-anh","status":"publish","type":"page","link":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/","title":{"rendered":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn"},"content":{"rendered":"<div id=\"tdi_1\" class=\"tdc-zone\"><div class=\"tdc_zone tdi_2  wpb_row td-pb-row\"  >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_2{\r\n                    min-height: 0;\r\n                }\n<\/style><div id=\"tdi_3\" class=\"tdc-row stretch_row_1400 td-stretch-content\"><div class=\"vc_row tdi_4  wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_4,\r\n                .tdi_4 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_4,\r\n\t\t\t\t.tdi_4 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_4 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_4:before,\r\n\t\t\t\t.tdi_4:after{\r\n\t\t\t\t    display: table;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_6  wpb_column vc_column_container tdc-column td-pb-span8 td-is-sticky\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_6{\r\n                    vertical-align: baseline;\r\n                }.tdi_6 > .wpb_wrapper,\r\n\t\t\t\t.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_6 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" data-sticky-enabled-on=\"W3RydWUsdHJ1ZSx0cnVlLHRydWVd\" data-sticky-offset=\"20\" data-sticky-is-width-auto=\"W2ZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlXQ==\"><div class=\"vc_row_inner tdi_8  vc_row vc_inner wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_8{\r\n                    position: relative !important;\r\n                    top: 0;\r\n                    transform: none;\r\n                    -webkit-transform: none;\r\n                }.tdi_8,\r\n\t\t\t\t.tdi_8 .tdc-inner-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_8 .tdc-inner-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_8{\n--tdb-scroll-anim:none !important;\n}\n\n.tdi_8 .td_block_wrap{ text-align:left }\n\n<\/style><div class=\"vc_column_inner tdi_10  wpb_column vc_column_container tdc-inner-column td-pb-span12\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_10{\r\n                    vertical-align: baseline;\r\n                }.tdi_10 .vc_column-inner > .wpb_wrapper,\r\n\t\t\t\t.tdi_10 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_10 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_10{\nmargin-bottom:-50px !important;\n--tdb-scroll-anim:none !important;\n}\n\n<\/style><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\" ><div class=\"td_block_wrap td_block_text_with_title tdi_11 tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_11\" >\n<style>\n\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_11{\npadding-top:10px !important;\npadding-right:5px !important;\npadding-bottom:10px !important;\npadding-left:5px !important;\njustify-content:center !important;\ntext-align:center !important;\n--tdb-scroll-anim:none !important;\nposition:relative;\n}\n\n<\/style>\n<style>\n\/* custom css - generated by TagDiv Composer *\/\n.td_block_text_with_title{\r\n                  margin-bottom: 44px;\r\n                  -webkit-transform: translateZ(0);\r\n                  transform: translateZ(0);\r\n                }.td_block_text_with_title p:last-child{\r\n                  margin-bottom: 0;\r\n                }.tdi_11 h1{\r\n\t\t\t        font-family:Baskerville, \"Times New Roman\", Times, serif !important;font-weight:600 !important;\r\n\t\t        }\n<\/style>\n<div class=\"tdi_11_rand_style td-element-style\"><style>\n.tdi_11_rand_style{\nbackground-color:rgba(226,220,213,0.51) !important;\n}\n <\/style><\/div><div class=\"td-block-title-wrap\"><\/div><div class=\"td_mod_wrap td-fix-index\"><h1>C\u00f4ng C\u1ee5 Ch\u1ec9nh S\u1eeda \u1ea2nh Online, \u1ee8ng D\u1ee5ng Ch\u1ec9nh S\u1eeda H\u00ecnh Tr\u1ef1c Tuy\u1ebfn<\/h1>\n<\/div><\/div><\/div><\/div><\/div><\/div><div class=\"vc_row_inner tdi_13  vc_row vc_inner wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_13{\r\n                    position: relative !important;\r\n                    top: 0;\r\n                    transform: none;\r\n                    -webkit-transform: none;\r\n                }.tdi_13,\r\n\t\t\t\t.tdi_13 .tdc-inner-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_13 .tdc-inner-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column_inner tdi_15  wpb_column vc_column_container tdc-inner-column td-pb-span12\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_15{\r\n                    vertical-align: baseline;\r\n                }.tdi_15 .vc_column-inner > .wpb_wrapper,\r\n\t\t\t\t.tdi_15 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_15 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\" ><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_16  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_16\" >\n<style>\n\/* custom css - generated by TagDiv Composer *\/\n.vc_column_text > .td-element-style{\r\n\t\t\t\t\tz-index: -1;\r\n\t\t\t\t}\n<\/style><div class=\"td-fix-index\">\n        <div\n            class=\"itools-wrapper\"\n            id=\"itools_99485\"\n            data-tool=\"all\"\n        >\n\n            \n                <div class=\"itools-tabs\">\n\n                    <button type=\"button\" class=\"itools-tab active\" data-tab=\"compressor\">\n                        \ud83d\udddc\ufe0f N\u00e9n \u1ea3nh\n                    <\/button>\n\n                    <button type=\"button\" class=\"itools-tab\" data-tab=\"cropper\">\n                        \u2702\ufe0f C\u1eaft \u1ea3nh\n                    <\/button>\n\n                    <button type=\"button\" class=\"itools-tab\" data-tab=\"converter\">\n                        \ud83d\udd04 Chuy\u1ec3n \u0111\u1ed5i\n                    <\/button>\n\n                    <button type=\"button\" class=\"itools-tab\" data-tab=\"watermark\">\n                        \ud83c\udff7\ufe0f Ch\u1ec9nh s\u1eeda\n                    <\/button>\n\n                <\/div>\n\n                <div class=\"itools-panel active\" data-panel=\"compressor\">\n                            <div class=\"itool-box\" data-module=\"compressor\">\n            <div class=\"itool-title\">\n                <h2>\ud83d\udddc\ufe0f N\u00e9n \u1ea3nh online<\/h2>\n                <p>Gi\u1ea3m dung l\u01b0\u1ee3ng \u1ea3nh ngay tr\u00ean tr\u00ecnh duy\u1ec7t.<\/p>\n            <\/div>\n\n            <label class=\"itool-upload\">\n                <input\n                    type=\"file\"\n                    class=\"compress-files\"\n                    accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp,image\/gif\"\n                    multiple\n                >\n                <span class=\"upload-icon\">\ud83d\udcc1<\/span>\n                <strong>Ch\u1ecdn \u1ea3nh<\/strong>\n                <small>JPG, PNG, WebP, AVIF, BMP ho\u1eb7c GIF<\/small>\n            <\/label>\n\n            <div class=\"compress-options\">\n                <label>\n                    Ch\u1ea5t l\u01b0\u1ee3ng\n                    <select class=\"compress-quality\">\n                        <option value=\"0.5\">50%<\/option>\n                        <option value=\"0.6\">60%<\/option>\n                        <option value=\"0.7\">70%<\/option>\n                        <option value=\"0.8\" selected>80%<\/option>\n                        <option value=\"0.9\">90%<\/option>\n                        <option value=\"0.95\">95%<\/option>\n                    <\/select>\n                    <small class=\"field-help\">JPG\/WebP\/AVIF s\u1eed d\u1ee5ng ch\u1ea5t l\u01b0\u1ee3ng. PNG\/BMP kh\u00f4ng d\u00f9ng.<\/small>\n                <\/label>\n\n                <label>\n                    \u0110\u1ecbnh d\u1ea1ng xu\u1ea5t\n                    <select class=\"compress-output\">\n                        <option value=\"image\/webp\" selected>WebP<\/option>\n                        <option value=\"image\/avif\">AVIF<\/option>\n                        <option value=\"image\/jpeg\">JPG<\/option>\n                        <option value=\"image\/png\">PNG<\/option>\n                        <option value=\"image\/bmp\">BMP<\/option>\n                    <\/select>\n                <\/label>\n            <\/div>\n\n            <div class=\"compress-list\"><\/div>\n\n            <button type=\"button\" class=\"itool-primary compress-start\">\n                \ud83d\udddc\ufe0f B\u1eaft \u0111\u1ea7u n\u00e9n\n            <\/button>\n\n            <div class=\"itool-message\"><\/div>\n        <\/div>\n                        <\/div>\n\n                <div class=\"itools-panel\" data-panel=\"cropper\">\n                            <div class=\"itool-box\" data-module=\"cropper\">\n            <div class=\"itool-title\">\n                <h2>\u2702\ufe0f C\u1eaft \u1ea3nh<\/h2>\n                <p>K\u00e9o v\u00f9ng ch\u1ecdn \u0111\u1ec3 l\u1ea5y \u0111\u00fang ph\u1ea7n \u1ea3nh b\u1ea1n mu\u1ed1n.<\/p>\n            <\/div>\n\n            <label class=\"itool-upload crop-upload\">\n                <input\n                    type=\"file\"\n                    class=\"crop-file\"\n                    accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp,image\/gif\"\n                >\n                <span class=\"upload-icon\">\ud83d\uddbc\ufe0f<\/span>\n                <strong>Ch\u1ecdn \u1ea3nh<\/strong>\n                <small>JPG, PNG, WebP, AVIF, BMP ho\u1eb7c GIF<\/small>\n            <\/label>\n\n            <div class=\"crop-editor\">\n                <div class=\"crop-stage\">\n                    <canvas class=\"crop-canvas\"><\/canvas>\n\n                    <div class=\"crop-selection\" style=\"display:none;\">\n                        <div class=\"crop-shade shade-top\"><\/div>\n                        <div class=\"crop-shade shade-left\"><\/div>\n                        <div class=\"crop-shade shade-right\"><\/div>\n                        <div class=\"crop-shade shade-bottom\"><\/div>\n\n                        <div class=\"crop-box\">\n                            <div class=\"crop-handle nw\" data-handle=\"nw\"><\/div>\n                            <div class=\"crop-handle n\" data-handle=\"n\"><\/div>\n                            <div class=\"crop-handle ne\" data-handle=\"ne\"><\/div>\n                            <div class=\"crop-handle e\" data-handle=\"e\"><\/div>\n                            <div class=\"crop-handle se\" data-handle=\"se\"><\/div>\n                            <div class=\"crop-handle s\" data-handle=\"s\"><\/div>\n                            <div class=\"crop-handle sw\" data-handle=\"sw\"><\/div>\n                            <div class=\"crop-handle w\" data-handle=\"w\"><\/div>\n                            <div class=\"crop-move-area\"><\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n\n                <div class=\"crop-controls\">\n                    <div class=\"crop-control-title\">V\u00f9ng c\u1eaft<\/div>\n\n                    <label>\n                        Chi\u1ec1u r\u1ed9ng xu\u1ea5t\n                        <input type=\"number\" class=\"crop-output-width\" min=\"1\" value=\"1200\">\n                    <\/label>\n\n                    <label>\n                        Chi\u1ec1u cao xu\u1ea5t\n                        <input type=\"number\" class=\"crop-output-height\" min=\"1\" value=\"800\">\n                    <\/label>\n\n                    <label class=\"check-line\">\n                        <input type=\"checkbox\" class=\"crop-lock-ratio\">\n                        Gi\u1eef t\u1ef7 l\u1ec7 v\u00f9ng c\u1eaft\n                    <\/label>\n\n                    <label>\n                        \u0110\u1ecbnh d\u1ea1ng xu\u1ea5t\n                        <select class=\"crop-format\">\n                            <option value=\"image\/webp\" selected>WebP<\/option>\n                            <option value=\"image\/avif\">AVIF<\/option>\n                            <option value=\"image\/jpeg\">JPG<\/option>\n                            <option value=\"image\/png\">PNG<\/option>\n                            <option value=\"image\/bmp\">BMP<\/option>\n                        <\/select>\n                    <\/label>\n\n                    <div class=\"crop-zoom-title\">Zoom \u1ea3nh<\/div>\n\n                    <input\n                        type=\"range\"\n                        class=\"crop-zoom\"\n                        min=\"0.5\"\n                        max=\"3\"\n                        step=\"0.01\"\n                        value=\"1\"\n                    >\n\n                    <div class=\"crop-buttons\">\n                        <button type=\"button\" class=\"itool-secondary crop-reset\">\u21ba Reset<\/button>\n                        <button type=\"button\" class=\"itool-secondary crop-center\">\u25ce Gi\u1eefa \u1ea3nh<\/button>\n                    <\/div>\n                <\/div>\n            <\/div>\n\n            <div class=\"crop-info\">\n                <span class=\"crop-info-selection\">V\u00f9ng ch\u1ecdn: \u2014<\/span>\n                <span class=\"crop-info-image\">\u1ea2nh g\u1ed1c: \u2014<\/span>\n            <\/div>\n\n            <button type=\"button\" class=\"itool-primary crop-start\">\n                \u2702\ufe0f C\u1eaft \u1ea3nh\n            <\/button>\n\n            <div class=\"crop-result\"><\/div>\n            <div class=\"itool-message\"><\/div>\n        <\/div>\n                        <\/div>\n\n                <div class=\"itools-panel\" data-panel=\"converter\">\n                            <div class=\"itool-box\" data-module=\"converter\">\n\n            <div class=\"itool-title\">\n                <h2>\ud83d\udd04 Chuy\u1ec3n \u0111\u1ed5i \u0111\u1ecbnh d\u1ea1ng<\/h2>\n                <p>\u1ea2nh v\u00e0 m\u1ed9t s\u1ed1 file t\u00e0i li\u1ec7u \u0111\u01b0\u1ee3c x\u1eed l\u00fd tr\u1ef1c ti\u1ebfp tr\u00ean thi\u1ebft b\u1ecb.<\/p>\n            <\/div>\n\n            <div class=\"converter-mode-tabs\">\n                <button type=\"button\" class=\"converter-mode active\" data-convert-mode=\"image\">\n                    \ud83d\uddbc\ufe0f \u1ea2nh \u2192 \u1ea2nh\n                <\/button>\n\n                <button type=\"button\" class=\"converter-mode\" data-convert-mode=\"document\">\n                    \ud83d\udcc4 PDF \/ Office \u2192 \u1ea2nh\n                <\/button>\n            <\/div>\n\n            <div class=\"converter-mode-panel active\" data-convert-mode-panel=\"image\">\n\n                <label class=\"itool-upload\">\n                    <input\n                        type=\"file\"\n                        class=\"convert-files\"\n                        accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp,image\/gif\"\n                        multiple\n                    >\n                    <span class=\"upload-icon\">\ud83d\udd04<\/span>\n                    <strong>Ch\u1ecdn \u1ea3nh<\/strong>\n                    <small>JPG, PNG, WebP, AVIF, BMP ho\u1eb7c GIF<\/small>\n                <\/label>\n\n                <div class=\"converter-options\">\n                    <label>\n                        Chuy\u1ec3n sang\n                        <select class=\"convert-format\">\n                            <option value=\"image\/webp\">WebP<\/option>\n                            <option value=\"image\/avif\">AVIF<\/option>\n                            <option value=\"image\/jpeg\">JPG<\/option>\n                            <option value=\"image\/png\">PNG<\/option>\n                            <option value=\"image\/bmp\">BMP<\/option>\n                        <\/select>\n                    <\/label>\n\n                    <label>\n                        Ch\u1ea5t l\u01b0\u1ee3ng\n                        <select class=\"convert-quality\">\n                            <option value=\"0.6\">60%<\/option>\n                            <option value=\"0.7\">70%<\/option>\n                            <option value=\"0.8\" selected>80%<\/option>\n                            <option value=\"0.9\">90%<\/option>\n                            <option value=\"0.95\">95%<\/option>\n                        <\/select>\n                    <\/label>\n                <\/div>\n\n                <div class=\"convert-list\"><\/div>\n\n                <button type=\"button\" class=\"itool-primary convert-start\">\n                    \ud83d\udd04 Chuy\u1ec3n \u0111\u1ed5i \u1ea3nh\n                <\/button>\n\n                <div class=\"itool-message\"><\/div>\n            <\/div>\n\n\n            <div class=\"converter-mode-panel\" data-convert-mode-panel=\"document\">\n\n                <div class=\"converter-notice\">\n                    <strong>\ud83d\udd12 C\u00f4ng c\u1ee5 chuy\u1ec3n c\u00e1c file Office th\u00e0nh h\u00ecnh \u1ea3nh<\/strong>\n                <\/div>\n\n                <label class=\"itool-upload document-upload\">\n                    <input\n                        type=\"file\"\n                        class=\"document-files\"\n                        accept=\".pdf,.docx,.doc,.xlsx,.xls,.pptx,.ppt,application\/pdf,application\/vnd.openxmlformats-officedocument.wordprocessingml.document,application\/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application\/vnd.openxmlformats-officedocument.presentationml.presentation\"\n                        multiple\n                    >\n                    <span class=\"upload-icon\">\ud83d\udcc4<\/span>\n                    <strong>Ch\u1ecdn PDF \/ Word \/ Excel \/ PowerPoint<\/strong>\n                    <small>PDF, DOCX, XLSX, PPTX v\u00e0 \u0111\u1ecbnh d\u1ea1ng c\u0169 DOC\/XLS\/PPT<\/small>\n                <\/label>\n\n                <div class=\"document-options\">\n\n                    <label>\n                        \u0110\u1ecbnh d\u1ea1ng \u1ea3nh\n                        <select class=\"document-output-format\">\n                            <option value=\"image\/png\" selected>PNG<\/option>\n                            <option value=\"image\/jpeg\">JPG<\/option>\n                            <option value=\"image\/webp\">WebP<\/option>\n                        <\/select>\n                    <\/label>\n\n                    <label>\n                        Ch\u1ea5t l\u01b0\u1ee3ng\n                        <select class=\"document-output-quality\">\n                            <option value=\"0.75\">75%<\/option>\n                            <option value=\"0.85\" selected>85%<\/option>\n                            <option value=\"0.95\">95%<\/option>\n                        <\/select>\n                    <\/label>\n\n                    <label class=\"document-page-limit-wrap\">\n                        Trang \/ Sheet\n                        <input\n                            type=\"text\"\n                            class=\"document-pages\"\n                            placeholder=\"V\u00ed d\u1ee5: all ho\u1eb7c 1,2,5\"\n                            value=\"all\"\n                        >\n                        <small class=\"field-help\">PDF\/DOCX\/PPTX: trang\/slides. Excel: sheet; all = t\u1ea5t c\u1ea3.<\/small>\n                    <\/label>\n\n                    <label class=\"document-scale-wrap\">\n                        \u0110\u1ed9 ph\u00e2n gi\u1ea3i\n                        <select class=\"document-scale\">\n                            <option value=\"1\">100%<\/option>\n                            <option value=\"1.5\" selected>150%<\/option>\n                            <option value=\"2\">200%<\/option>\n                        <\/select>\n                    <\/label>\n\n                <\/div>\n\n                <div class=\"document-list\"><\/div>\n\n                <button type=\"button\" class=\"itool-primary document-start\">\n                    \ud83d\udcc4 Chuy\u1ec3n file th\u00e0nh \u1ea3nh\n                <\/button>\n\n                <div class=\"itool-message\"><\/div>\n            <\/div>\n\n        <\/div>\n                        <\/div>\n\n                <div class=\"itools-panel\" data-panel=\"watermark\">\n                            <div class=\"itool-box\" data-module=\"watermark\">\n\n            <div class=\"itool-title\">\n                <h2>\ud83c\udff7\ufe0f Ch\u1ec9nh s\u1eeda \u1ea3nh<\/h2>\n                <p>Ch\u00e8n logo, v\u0103n b\u1ea3n v\u00e0 emoji. C\u00f3 th\u1ec3 x\u1eed l\u00fd nhi\u1ec1u \u1ea3nh c\u00f9ng l\u00fac.<\/p>\n            <\/div>\n\n            <div class=\"editor-mode-tabs\">\n                <button type=\"button\" class=\"editor-mode active\" data-editor-mode=\"single\">\n                    \ud83d\uddbc\ufe0f Ch\u1ec9nh m\u1ed9t \u1ea3nh\n                <\/button>\n\n                <button type=\"button\" class=\"editor-mode\" data-editor-mode=\"batch\">\n                    \ud83d\udcda Ch\u00e8n logo h\u00e0ng lo\u1ea1t\n                <\/button>\n            <\/div>\n\n\n            <!-- SINGLE EDITOR -->\n\n            <div class=\"editor-mode-panel active\" data-editor-mode-panel=\"single\">\n\n                <div class=\"watermark-upload-grid\">\n\n                    <label class=\"itool-upload small-upload\">\n                        <input\n                            type=\"file\"\n                            class=\"watermark-image\"\n                            accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp,image\/gif\"\n                        >\n                        <span class=\"upload-icon\">\ud83d\uddbc\ufe0f<\/span>\n                        <strong>\u1ea2nh ch\u00ednh<\/strong>\n                        <small>Ch\u1ecdn \u1ea3nh c\u1ea7n ch\u1ec9nh s\u1eeda<\/small>\n                    <\/label>\n\n                    <label class=\"itool-upload small-upload\">\n                        <input\n                            type=\"file\"\n                            class=\"watermark-logo\"\n                            accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp\"\n                        >\n                        <span class=\"upload-icon\">\ud83c\udff7\ufe0f<\/span>\n                        <strong>Ch\u1ecdn logo<\/strong>\n                        <small>PNG n\u1ec1n trong su\u1ed1t \u0111\u01b0\u1ee3c khuy\u1ebfn ngh\u1ecb<\/small>\n                    <\/label>\n\n                <\/div>\n\n                <div class=\"watermark-workspace\">\n\n                    <div class=\"watermark-preview\">\n                        <canvas class=\"watermark-canvas\"><\/canvas>\n\n                        <div class=\"watermark-drag-logo\" style=\"display:none;\">\n                            <img class=\"watermark-logo-preview\" alt=\"Logo xem tr\u01b0\u1edbc\">\n                            <span class=\"wm-resize-handle\"><\/span>\n                        <\/div>\n\n                        <div class=\"editor-object-layer\"><\/div>\n\n                        <div class=\"editor-crop-layer\" aria-hidden=\"true\">\n                            <div class=\"editor-crop-box\">\n                                <span class=\"editor-crop-handle n\" data-crop-handle=\"n\"><\/span>\n                                <span class=\"editor-crop-handle ne\" data-crop-handle=\"ne\"><\/span>\n                                <span class=\"editor-crop-handle e\" data-crop-handle=\"e\"><\/span>\n                                <span class=\"editor-crop-handle se\" data-crop-handle=\"se\"><\/span>\n                                <span class=\"editor-crop-handle s\" data-crop-handle=\"s\"><\/span>\n                                <span class=\"editor-crop-handle sw\" data-crop-handle=\"sw\"><\/span>\n                                <span class=\"editor-crop-handle w\" data-crop-handle=\"w\"><\/span>\n                                <span class=\"editor-crop-handle nw\" data-crop-handle=\"nw\"><\/span>\n                            <\/div>\n                        <\/div>\n\n                    <\/div>\n\n\n                    <div class=\"watermark-settings\">\n\n\n                        <div class=\"settings-section-title\">\ud83d\udee0\ufe0f Bi\u1ebfn \u0111\u1ed5i \u1ea3nh<\/div>\n\n                        <div class=\"editor-transform-buttons\">\n                            <button type=\"button\" class=\"itool-secondary editor-flip-x\">\u2194\ufe0f L\u1eadt ngang<\/button>\n                            <button type=\"button\" class=\"itool-secondary editor-flip-y\">\u2195\ufe0f L\u1eadt d\u1ecdc<\/button>\n                            <button type=\"button\" class=\"itool-secondary editor-rotate-left\">\u21ba Xoay tr\u00e1i<\/button>\n                            <button type=\"button\" class=\"itool-secondary editor-rotate-right\">\u21bb Xoay ph\u1ea3i<\/button>\n                        <\/div>\n\n                        <div class=\"editor-transform-status\">\n                            <span>G\u00f3c xoay: <strong class=\"editor-rotation-value\">0\u00b0<\/strong><\/span>\n                            <span>\u1ea2nh: <strong class=\"editor-transform-flip-value\">B\u00ecnh th\u01b0\u1eddng<\/strong><\/span>\n                        <\/div>\n\n                        <button type=\"button\" class=\"itool-secondary editor-reset-transform\">\n                            \u21ba \u0110\u1eb7t l\u1ea1i bi\u1ebfn \u0111\u1ed5i\n                        <\/button>\n\n                        <div class=\"settings-section-title\">\u2702\ufe0f C\u1eaft \u1ea3nh<\/div>\n\n                        <div class=\"editor-crop-buttons\">\n                            <button type=\"button\" class=\"itool-secondary editor-crop-toggle\">\n                                \u2702\ufe0f B\u1eadt khung c\u1eaft\n                            <\/button>\n                            <button type=\"button\" class=\"itool-secondary editor-crop-reset\">\n                                \u21ba \u0110\u1eb7t l\u1ea1i v\u00f9ng c\u1eaft\n                            <\/button>\n                            <button type=\"button\" class=\"itool-primary editor-crop-apply\">\n                                \u2702\ufe0f C\u1eaft theo v\u00f9ng \u0111\u00e3 ch\u1ecdn\n                            <\/button>\n                        <\/div>\n\n                        <label>\n                            T\u1ef7 l\u1ec7 c\u1eaft\n                            <select class=\"editor-crop-ratio\">\n                                <option value=\"free\" selected>T\u1ef1 do<\/option>\n                                <option value=\"1:1\">1 : 1<\/option>\n                                <option value=\"4:3\">4 : 3<\/option>\n                                <option value=\"3:4\">3 : 4<\/option>\n                                <option value=\"16:9\">16 : 9<\/option>\n                                <option value=\"9:16\">9 : 16<\/option>\n                            <\/select>\n                        <\/label>\n\n                        <small class=\"field-help editor-crop-help\">\n                            K\u00e9o khung c\u1eaft ho\u1eb7c c\u00e1c g\u00f3c\/c\u1ea1nh \u0111\u1ec3 ch\u1ecdn v\u00f9ng \u1ea3nh. B\u1ea5m \u201cC\u1eaft theo v\u00f9ng \u0111\u00e3 ch\u1ecdn\u201d \u0111\u1ec3 \u00e1p d\u1ee5ng ngay, ho\u1eb7c b\u1ea5m \u201cXu\u1ea5t \u1ea3nh\u201d \u0111\u1ec3 xu\u1ea5t theo v\u00f9ng \u0111ang ch\u1ecdn.\n                        <\/small>\n\n                        <div class=\"settings-section-title\">\ud83c\udff7\ufe0f Logo<\/div>\n\n                        <label>\n                            V\u1ecb tr\u00ed nhanh\n                            <select class=\"watermark-position\">\n                                <option value=\"free\" selected>K\u00e9o t\u1ef1 do<\/option>\n                                <option value=\"top-left\">Tr\u00ean tr\u00e1i<\/option>\n                                <option value=\"top-center\">Tr\u00ean gi\u1eefa<\/option>\n                                <option value=\"top-right\">Tr\u00ean ph\u1ea3i<\/option>\n                                <option value=\"center\">Ch\u00ednh gi\u1eefa<\/option>\n                                <option value=\"bottom-left\">D\u01b0\u1edbi tr\u00e1i<\/option>\n                                <option value=\"bottom-center\">D\u01b0\u1edbi gi\u1eefa<\/option>\n                                <option value=\"bottom-right\">D\u01b0\u1edbi ph\u1ea3i<\/option>\n                            <\/select>\n                        <\/label>\n\n                        <label>\n                            K\u00edch th\u01b0\u1edbc logo\n                            <input type=\"range\" class=\"watermark-size\" min=\"5\" max=\"60\" value=\"20\">\n                            <span class=\"range-value\">20%<\/span>\n                        <\/label>\n\n                        <label>\n                            \u0110\u1ed9 trong su\u1ed1t logo\n                            <input type=\"range\" class=\"watermark-opacity\" min=\"10\" max=\"100\" value=\"80\">\n                            <span class=\"opacity-value\">80%<\/span>\n                        <\/label>\n\n                        <label>\n                            Kho\u1ea3ng c\u00e1ch m\u00e9p\n                            <input type=\"range\" class=\"watermark-margin\" min=\"0\" max=\"10\" value=\"3\">\n                            <span class=\"margin-value\">3%<\/span>\n                        <\/label>\n\n                        <button type=\"button\" class=\"itool-secondary watermark-reset\">\n                            \u21ba \u0110\u1eb7t l\u1ea1i logo\n                        <\/button>\n\n\n                        <div class=\"settings-section-title\">\ud83d\udd24 V\u0103n b\u1ea3n<\/div>\n\n                        <label>\n                            N\u1ed9i dung\n                            <input type=\"text\" class=\"editor-text-input\" placeholder=\"Nh\u1eadp v\u0103n b\u1ea3n...\">\n                        <\/label>\n\n                        <div class=\"editor-two-col\">\n\n                            <label>\n                                M\u00e0u ch\u1eef\n                                <input type=\"color\" class=\"editor-text-color\" value=\"#ffffff\">\n                            <\/label>\n\n                            <label>\n                                C\u1ee1 ch\u1eef\n                                <input type=\"number\" class=\"editor-text-size\" min=\"8\" max=\"300\" value=\"48\">\n                            <\/label>\n\n                        <\/div>\n\n                        <div class=\"editor-two-col\">\n\n                            <label>\n                                Font\n                                <select class=\"editor-text-font\">\n                                    <option value=\"Arial\">Arial<\/option>\n                                    <option value=\"Verdana\">Verdana<\/option>\n                                    <option value=\"Tahoma\">Tahoma<\/option>\n                                    <option value=\"Trebuchet MS\">Trebuchet MS<\/option>\n                                    <option value=\"Segoe UI\">Segoe UI<\/option>\n                                    <option value=\"Calibri\">Calibri<\/option>\n                                    <option value=\"Cambria\">Cambria<\/option>\n                                    <option value=\"Georgia\">Georgia<\/option>\n                                    <option value=\"Garamond\">Garamond<\/option>\n                                    <option value=\"Palatino Linotype\">Palatino Linotype<\/option>\n                                    <option value=\"Book Antiqua\">Book Antiqua<\/option>\n                                    <option value=\"Times New Roman\">Times New Roman<\/option>\n                                    <option value=\"Courier New\">Courier New<\/option>\n                                    <option value=\"Consolas\">Consolas<\/option>\n                                    <option value=\"Lucida Console\">Lucida Console<\/option>\n                                    <option value=\"Lucida Sans\">Lucida Sans<\/option>\n                                    <option value=\"Century Gothic\">Century Gothic<\/option>\n                                    <option value=\"Franklin Gothic Medium\">Franklin Gothic Medium<\/option>\n                                    <option value=\"Arial Black\">Arial Black<\/option>\n                                    <option value=\"Impact\">Impact<\/option>\n                                    <option value=\"Comic Sans MS\">Comic Sans MS<\/option>\n                                    <option value=\"Gill Sans\">Gill Sans<\/option>\n                                    <option value=\"Helvetica\">Helvetica<\/option>\n                                    <option value=\"Brush Script MT\">Brush Script MT<\/option>\n                                    <option value=\"Copperplate\">Copperplate<\/option>\n                                    <option value=\"Rockwell\">Rockwell<\/option>\n                                    <option value=\"Baskerville\">Baskerville<\/option>\n                                    <option value=\"Optima\">Optima<\/option>\n                                <\/select>\n                            <\/label>\n\n                            <label>\n                                Ki\u1ec3u\n                                <select class=\"editor-text-weight\">\n                                    <option value=\"400\">Th\u01b0\u1eddng<\/option>\n                                    <option value=\"700\">\u0110\u1eadm<\/option>\n                                <\/select>\n                            <\/label>\n                            <label>\n                                Ki\u1ec3u n\u00e2ng cao\n                                <div class=\"text-style-buttons\">\n                                    <button type=\"button\" class=\"text-style-btn\" data-text-style=\"italic\" title=\"Nghi\u00eang\"><em>I<\/em><\/button>\n                                    <button type=\"button\" class=\"text-style-btn\" data-text-style=\"underline\" title=\"G\u1ea1ch ch\u00e2n\"><u>U<\/u><\/button>\n                                    <button type=\"button\" class=\"text-style-btn\" data-text-style=\"shadow\" title=\"\u0110\u1ed5 b\u00f3ng\">S<\/button>\n                                <\/div>\n                            <\/label>\n\n                        <\/div>\n\n                        <div class=\"editor-inline-buttons\">\n                            <button type=\"button\" class=\"itool-secondary add-text-object\">\u2795 Th\u00eam ch\u1eef<\/button>\n                            <button type=\"button\" class=\"itool-secondary update-text-object\">\u270f\ufe0f C\u1eadp nh\u1eadt ch\u1eef<\/button>\n                        <\/div>\n\n\n                        <div class=\"settings-section-title\">\ud83d\ude00 Emoji<\/div>\n\n                        <div class=\"emoji-palette-shell\"><div class=\"emoji-palette\">\n                            <!-- M\u1eb7t c\u1ea3m x\u00fac -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude00\">\ud83d\ude00<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude03\">\ud83d\ude03<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude04\">\ud83d\ude04<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude01\">\ud83d\ude01<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude06\">\ud83d\ude06<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude05\">\ud83d\ude05<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude02\">\ud83d\ude02<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd23\">\ud83e\udd23<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude0a\">\ud83d\ude0a<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude07\">\ud83d\ude07<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd70\">\ud83e\udd70<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude0d\">\ud83d\ude0d<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd29\">\ud83e\udd29<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude18\">\ud83d\ude18<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude0e\">\ud83d\ude0e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd17\">\ud83e\udd17<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd14\">\ud83e\udd14<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude10\">\ud83d\ude10<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude0f\">\ud83d\ude0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude44\">\ud83d\ude44<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude2e\">\ud83d\ude2e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude31\">\ud83d\ude31<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude22\">\ud83d\ude22<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude2d\">\ud83d\ude2d<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude21\">\ud83d\ude21<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd2c\">\ud83e\udd2c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd2f\">\ud83e\udd2f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd73\">\ud83e\udd73<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd2a\">\ud83e\udd2a<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude34\">\ud83d\ude34<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd24\">\ud83e\udd24<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd13\">\ud83e\udd13<\/button>\n\n                            <!-- C\u1eed ch\u1ec9 -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc4d\">\ud83d\udc4d<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc4e\">\ud83d\udc4e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc4c\">\ud83d\udc4c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u270c\ufe0f\">\u270c\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd1e\">\ud83e\udd1e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd1f\">\ud83e\udd1f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd18\">\ud83e\udd18<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc4f\">\ud83d\udc4f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude4c\">\ud83d\ude4c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude4f\">\ud83d\ude4f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udcaa\">\ud83d\udcaa<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc4b\">\ud83d\udc4b<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u261d\ufe0f\">\u261d\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc46\">\ud83d\udc46<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc47\">\ud83d\udc47<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc49\">\ud83d\udc49<\/button>\n\n                            <!-- Tr\u00e1i tim & t\u00ecnh c\u1ea3m -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2764\ufe0f\">\u2764\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udde1\">\ud83e\udde1<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc9b\">\ud83d\udc9b<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc9a\">\ud83d\udc9a<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc99\">\ud83d\udc99<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc9c\">\ud83d\udc9c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udda4\">\ud83d\udda4<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd0d\">\ud83e\udd0d<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd0e\">\ud83e\udd0e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc94\">\ud83d\udc94<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc95\">\ud83d\udc95<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc96\">\ud83d\udc96<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc97\">\ud83d\udc97<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc93\">\ud83d\udc93<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc9e\">\ud83d\udc9e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc98\">\ud83d\udc98<\/button>\n\n                            <!-- Bi\u1ec3u t\u01b0\u1ee3ng n\u1ed5i b\u1eadt -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udd25\">\ud83d\udd25<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2b50\">\u2b50<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf1f\">\ud83c\udf1f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2728\">\u2728<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udcab\">\ud83d\udcab<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udca5\">\ud83d\udca5<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udcaf\">\ud83d\udcaf<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfaf\">\ud83c\udfaf<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\ude80\">\ud83d\ude80<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u26a1\">\u26a1<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2600\ufe0f\">\u2600\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf08\">\ud83c\udf08<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2744\ufe0f\">\u2744\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2601\ufe0f\">\u2601\ufe0f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2614\">\u2614<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf19\">\ud83c\udf19<\/button>\n\n                            <!-- \u0110\u1ed9ng v\u1eadt -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc36\">\ud83d\udc36<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc31\">\ud83d\udc31<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc2d\">\ud83d\udc2d<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc39\">\ud83d\udc39<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc30\">\ud83d\udc30<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd8a\">\ud83e\udd8a<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc3b\">\ud83d\udc3b<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc3c\">\ud83d\udc3c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc28\">\ud83d\udc28<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc2f\">\ud83d\udc2f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd81\">\ud83e\udd81<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc2e\">\ud83d\udc2e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc37\">\ud83d\udc37<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc38\">\ud83d\udc38<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83d\udc35\">\ud83d\udc35<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd84\">\ud83e\udd84<\/button>\n\n                            <!-- \u0110\u1ed3 \u0103n & th\u1ee9c u\u1ed1ng -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf4e\">\ud83c\udf4e<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf53\">\ud83c\udf53<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf49\">\ud83c\udf49<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf4c\">\ud83c\udf4c<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf55\">\ud83c\udf55<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf54\">\ud83c\udf54<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf5f\">\ud83c\udf5f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf57\">\ud83c\udf57<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf70\">\ud83c\udf70<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf69\">\ud83c\udf69<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf6b\">\ud83c\udf6b<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf7f\">\ud83c\udf7f<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\u2615\">\u2615<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\uddcb\">\ud83e\uddcb<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf79\">\ud83c\udf79<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf7a\">\ud83c\udf7a<\/button>\n\n                            <!-- Ti\u1ec7c & qu\u00e0 t\u1eb7ng -->\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf89\">\ud83c\udf89<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf8a\">\ud83c\udf8a<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf88\">\ud83c\udf88<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf81\">\ud83c\udf81<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf82\">\ud83c\udf82<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf84\">\ud83c\udf84<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf83\">\ud83c\udf83<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf86\">\ud83c\udf86<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udf87\">\ud83c\udf87<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfb5\">\ud83c\udfb5<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfb6\">\ud83c\udfb6<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfc6\">\ud83c\udfc6<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83e\udd47\">\ud83e\udd47<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfc5\">\ud83c\udfc5<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfa8\">\ud83c\udfa8<\/button>\n                            <button type=\"button\" class=\"emoji-choice\" data-emoji=\"\ud83c\udfae\">\ud83c\udfae<\/button>\n                        <\/div><\/div>\n\n                        <div class=\"editor-two-col emoji-controls-row\">\n\n                            <label>\n                                Emoji t\u00f9y ch\u1ecdn\n                                <input type=\"text\" class=\"editor-emoji-input\" placeholder=\"\ud83d\ude00\">\n                            <\/label>\n\n                            <label>\n                                C\u1ee1 emoji\n                                <input type=\"number\" class=\"editor-emoji-size\" min=\"10\" max=\"300\" value=\"72\">\n                            <\/label>\n\n                        <\/div>\n\n                        <button type=\"button\" class=\"itool-secondary add-emoji-object\">\n                            \u2795 Th\u00eam emoji\n                        <\/button>\n\n                        <button type=\"button\" class=\"itool-secondary delete-selected-object\">\n                            \ud83d\uddd1\ufe0f X\u00f3a \u0111\u1ed1i t\u01b0\u1ee3ng \u0111ang ch\u1ecdn\n                        <\/button>\n\n\n                        <div class=\"settings-section-title\">\ud83d\udcbe Xu\u1ea5t \u1ea3nh<\/div>\n\n                        <label>\n                            \u0110\u1ecbnh d\u1ea1ng xu\u1ea5t\n                            <select class=\"watermark-format\">\n                                <option value=\"image\/webp\" selected>WebP<\/option>\n                                <option value=\"image\/avif\">AVIF<\/option>\n                                <option value=\"image\/jpeg\">JPG<\/option>\n                                <option value=\"image\/png\">PNG<\/option>\n                                <option value=\"image\/bmp\">BMP<\/option>\n                            <\/select>\n                        <\/label>\n\n                        <small class=\"field-help\">\n                            K\u00e9o logo, ch\u1eef ho\u1eb7c emoji tr\u1ef1c ti\u1ebfp tr\u00ean \u1ea3nh. B\u1ea5m v\u00e0o \u0111\u1ed1i t\u01b0\u1ee3ng \u0111\u1ec3 ch\u1ecdn.\n                        <\/small>\n\n                    <\/div>\n                <\/div>\n\n                <button type=\"button\" class=\"itool-primary watermark-start\">\n                    \ud83c\udff7\ufe0f Xu\u1ea5t \u1ea3nh\n                <\/button>\n\n                <div class=\"watermark-result\"><\/div>\n                <div class=\"itool-message\"><\/div>\n\n            <\/div>\n\n\n            <!-- BATCH LOGO -->\n\n            <div class=\"editor-mode-panel\" data-editor-mode-panel=\"batch\">\n\n                <div class=\"converter-notice\">\n                    <strong>\ud83d\udcda Ch\u00e8n logo h\u00e0ng lo\u1ea1t<\/strong>\n                    <span>M\u1ed9t logo + nhi\u1ec1u \u1ea3nh. T\u1ea5t c\u1ea3 x\u1eed l\u00fd ngay tr\u00ean tr\u00ecnh duy\u1ec7t.<\/span>\n                <\/div>\n\n                <div class=\"watermark-upload-grid\">\n\n                    <label class=\"itool-upload small-upload\">\n                        <input\n                            type=\"file\"\n                            class=\"batch-images\"\n                            accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp,image\/gif\"\n                            multiple\n                        >\n                        <span class=\"upload-icon\">\ud83d\uddbc\ufe0f<\/span>\n                        <strong>Ch\u1ecdn nhi\u1ec1u \u1ea3nh<\/strong>\n                        <small>C\u00f3 th\u1ec3 ch\u1ecdn h\u00e0ng ch\u1ee5c ho\u1eb7c h\u00e0ng tr\u0103m \u1ea3nh<\/small>\n                    <\/label>\n\n                    <label class=\"itool-upload small-upload\">\n                        <input\n                            type=\"file\"\n                            class=\"batch-logo\"\n                            accept=\"image\/jpeg,image\/png,image\/webp,image\/avif,image\/bmp\"\n                        >\n                        <span class=\"upload-icon\">\ud83c\udff7\ufe0f<\/span>\n                        <strong>Ch\u1ecdn logo<\/strong>\n                        <small>Logo s\u1ebd \u0111\u01b0\u1ee3c \u00e1p d\u1ee5ng cho t\u1ea5t c\u1ea3 \u1ea3nh<\/small>\n                    <\/label>\n\n                <\/div>\n\n                <div class=\"batch-options\">\n\n                    <label>\n                        V\u1ecb tr\u00ed\n                        <select class=\"batch-position\">\n                            <option value=\"top-left\">Tr\u00ean tr\u00e1i<\/option>\n                            <option value=\"top-center\">Tr\u00ean gi\u1eefa<\/option>\n                            <option value=\"top-right\">Tr\u00ean ph\u1ea3i<\/option>\n                            <option value=\"center\">Ch\u00ednh gi\u1eefa<\/option>\n                            <option value=\"bottom-left\">D\u01b0\u1edbi tr\u00e1i<\/option>\n                            <option value=\"bottom-center\">D\u01b0\u1edbi gi\u1eefa<\/option>\n                            <option value=\"bottom-right\" selected>D\u01b0\u1edbi ph\u1ea3i<\/option>\n                        <\/select>\n                    <\/label>\n\n                    <label>\n                        K\u00edch th\u01b0\u1edbc logo\n                        <input type=\"range\" class=\"batch-size\" min=\"5\" max=\"60\" value=\"20\">\n                        <span class=\"batch-size-value\">20%<\/span>\n                    <\/label>\n\n                    <label>\n                        \u0110\u1ed9 trong su\u1ed1t\n                        <input type=\"range\" class=\"batch-opacity\" min=\"10\" max=\"100\" value=\"80\">\n                        <span class=\"batch-opacity-value\">80%<\/span>\n                    <\/label>\n\n                    <label>\n                        Kho\u1ea3ng c\u00e1ch m\u00e9p\n                        <input type=\"range\" class=\"batch-margin\" min=\"0\" max=\"10\" value=\"3\">\n                        <span class=\"batch-margin-value\">3%<\/span>\n                    <\/label>\n\n                    <label>\n                        \u0110\u1ecbnh d\u1ea1ng xu\u1ea5t\n                        <select class=\"batch-format\">\n                            <option value=\"image\/webp\" selected>WebP<\/option>\n                            <option value=\"image\/jpeg\">JPG<\/option>\n                            <option value=\"image\/png\">PNG<\/option>\n                            <option value=\"image\/avif\">AVIF<\/option>\n                            <option value=\"image\/bmp\">BMP<\/option>\n                        <\/select>\n                    <\/label>\n\n                <\/div>\n\n                <div class=\"batch-file-list\"><\/div>\n\n                <button type=\"button\" class=\"itool-primary batch-start\">\n                    \ud83c\udff7\ufe0f Ch\u00e8n logo cho t\u1ea5t c\u1ea3 \u1ea3nh\n                <\/button>\n\n                <div class=\"batch-result\"><\/div>\n                <div class=\"itool-message\"><\/div>\n\n            <\/div>\n\n        <\/div>\n                        <\/div>\n\n            \n        <\/div>\n\n        <style>\n.itools-wrapper{\n    --it-primary:#111827;\n    --it-border:#e2e8f0;\n    --it-bg:#fff;\n    --it-soft:#f8fafc;\n    --it-text:#111827;\n    --it-muted:#64748b;\n    max-width:1100px;\n    margin:30px auto;\n    font-family:Arial,Helvetica,sans-serif;\n    color:var(--it-text)\n}\n.itools-wrapper *,.itools-wrapper *::before,.itools-wrapper *::after{box-sizing:border-box}\n.itools-tabs,.converter-mode-tabs,.editor-mode-tabs{\n    display:grid;\n    grid-template-columns:repeat(4,1fr);\n    gap:6px;\n    padding:6px;\n    margin-bottom:20px;\n    background:#f8fafc;\n    border:1px solid var(--it-border);\n    border-radius:14px\n}\n.converter-mode-tabs,.editor-mode-tabs{grid-template-columns:1fr 1fr}\n.itools-tab,.converter-mode,.editor-mode{\n    border:0;\n    background:transparent;\n    padding:14px 10px;\n    border-radius:10px;\n    cursor:pointer;\n    font-size:15px;\n    font-weight:600;\n    color:#64748b\n}\n.itools-tab:hover,.converter-mode:hover,.editor-mode:hover{background:#fff}\n.itools-tab.active,.converter-mode.active,.editor-mode.active{\n    background:#111827;\n    color:#fff\n}\n.itools-panel,.converter-mode-panel,.editor-mode-panel{display:none}\n.itools-panel.active,.converter-mode-panel.active,.editor-mode-panel.active{display:block}\n.itool-box{\n    background:#fff;\n    border:1px solid var(--it-border);\n    border-radius:18px;\n    padding:28px;\n    box-shadow:0 8px 30px rgba(15,23,42,.05)\n}\n.itool-title{text-align:center;margin-bottom:25px}\n.itool-title h2{margin:0 0 8px;font-size:27px}\n.itool-title p{margin:0;color:var(--it-muted)}\n.itool-upload{\n    min-height:170px;\n    border:2px dashed #cbd5e1;\n    border-radius:16px;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    flex-direction:column;\n    gap:7px;\n    cursor:pointer;\n    background:#fafafa;\n    transition:.2s\n}\n.itool-upload:hover,.itool-upload.dragover{\n    border-color:#111827;\n    background:#f1f5f9\n}\n.itool-upload input{display:none}\n.upload-icon{font-size:34px}\n.itool-upload strong{font-size:16px}\n.itool-upload small{color:#64748b;text-align:center}\n.small-upload{min-height:130px}\n.compress-options,.converter-options,.document-options,.batch-options{\n    display:grid;\n    grid-template-columns:repeat(2,1fr);\n    gap:15px;\n    margin:20px 0\n}\n.document-options{grid-template-columns:repeat(4,1fr)}\n.batch-options{grid-template-columns:repeat(3,1fr)}\n.itool-box label{\n    display:block;\n    font-size:14px;\n    font-weight:600;\n    color:#334155\n}\n.itool-box select,\n.itool-box input[type=number],\n.itool-box input[type=text]{\n    display:block;\n    width:100%;\n    margin-top:7px;\n    border:1px solid #cbd5e1;\n    border-radius:9px;\n    padding:11px;\n    background:#fff;\n    font-size:14px\n}\n.itool-box input[type=range]{width:100%;margin-top:12px}\n.itool-box input[type=color]{\n    display:block;\n    width:100%;\n    height:42px;\n    margin-top:7px;\n    padding:2px;\n    border:1px solid #cbd5e1;\n    border-radius:9px;\n    background:#fff\n}\n.field-help{\n    display:block;\n    margin-top:5px;\n    color:#94a3b8!important;\n    font-size:12px!important;\n    font-weight:400!important\n}\n.itool-primary{\n    width:100%;\n    border:0;\n    border-radius:10px;\n    padding:14px 18px;\n    background:#111827;\n    color:#fff;\n    font-size:15px;\n    font-weight:700;\n    cursor:pointer;\n    margin-top:20px\n}\n.itool-primary:hover{background:#000}\n.itool-primary:disabled{opacity:.6;cursor:not-allowed}\n.itool-secondary{\n    border:1px solid #cbd5e1;\n    background:#fff;\n    border-radius:9px;\n    padding:10px;\n    cursor:pointer;\n    font-weight:600\n}\n.itool-secondary:hover{background:#f8fafc}\n.itool-message{\n    margin-top:15px;\n    text-align:center;\n    color:#64748b;\n    font-size:14px\n}\n.compress-list,.convert-list,.document-list{margin-top:15px}\n.file-row{\n    display:flex;\n    align-items:center;\n    justify-content:space-between;\n    gap:12px;\n    padding:12px;\n    border:1px solid #e2e8f0;\n    border-radius:10px;\n    margin-bottom:8px;\n    background:#fff\n}\n.file-name{\n    overflow:hidden;\n    text-overflow:ellipsis;\n    white-space:nowrap\n}\n.file-size{color:#64748b;font-size:13px}\n.download-link{\n    display:inline-block;\n    margin-top:10px;\n    padding:9px 13px;\n    background:#111827;\n    color:#fff!important;\n    text-decoration:none;\n    border-radius:8px;\n    font-size:13px\n}\n.crop-editor{\n    display:grid;\n    grid-template-columns:minmax(0,1fr) 260px;\n    gap:20px;\n    margin-top:22px\n}\n.crop-stage{\n    position:relative;\n    min-height:450px;\n    background:#111827;\n    border-radius:12px;\n    overflow:hidden;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    touch-action:none\n}\n.crop-canvas{\n    display:block;\n    max-width:100%;\n    max-height:650px;\n    user-select:none;\n    pointer-events:none\n}\n.crop-selection{position:absolute;inset:0;pointer-events:none}\n.crop-shade{position:absolute;background:rgba(0,0,0,.58);pointer-events:none}\n.shade-top{left:0;right:0;top:0}\n.shade-left{left:0}\n.shade-right{right:0}\n.shade-bottom{left:0;right:0;bottom:0}\n.crop-box{\n    position:absolute;\n    border:2px solid #fff;\n    box-shadow:0 0 0 1px rgba(0,0,0,.4);\n    cursor:move;\n    pointer-events:auto;\n    touch-action:none\n}\n.crop-move-area{position:absolute;inset:10px;cursor:move}\n.crop-handle{\n    position:absolute;\n    width:13px;\n    height:13px;\n    background:#fff;\n    border:2px solid #111827;\n    border-radius:3px;\n    z-index:10\n}\n.crop-handle.nw{left:-7px;top:-7px;cursor:nwse-resize}\n.crop-handle.n{left:50%;top:-7px;transform:translateX(-50%);cursor:ns-resize}\n.crop-handle.ne{right:-7px;top:-7px;cursor:nesw-resize}\n.crop-handle.e{right:-7px;top:50%;transform:translateY(-50%);cursor:ew-resize}\n.crop-handle.se{right:-7px;bottom:-7px;cursor:nwse-resize}\n.crop-handle.s{left:50%;bottom:-7px;transform:translateX(-50%);cursor:ns-resize}\n.crop-handle.sw{left:-7px;bottom:-7px;cursor:nesw-resize}\n.crop-handle.w{left:-7px;top:50%;transform:translateY(-50%);cursor:ew-resize}\n.crop-controls{\n    display:flex;\n    flex-direction:column;\n    gap:15px;\n    padding:15px;\n    background:#f8fafc;\n    border:1px solid #e2e8f0;\n    border-radius:12px\n}\n.crop-control-title{font-size:17px;font-weight:700}\n.crop-zoom-title{font-size:14px;font-weight:600;margin-top:5px}\n.crop-buttons{display:grid;grid-template-columns:1fr 1fr;gap:8px}\n.check-line{display:flex!important;align-items:center;gap:8px}\n.check-line input{margin:0}\n.crop-info{\n    display:flex;\n    justify-content:space-between;\n    gap:15px;\n    padding:12px 0;\n    color:#64748b;\n    font-size:13px\n}\n.result-card{\n    margin-top:20px;\n    padding:18px;\n    background:#f8fafc;\n    border-radius:12px;\n    text-align:center\n}\n.result-card img{\n    max-width:100%;\n    max-height:500px;\n    display:block;\n    margin:0 auto 15px;\n    border-radius:8px\n}\n.watermark-upload-grid{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n    gap:15px\n}\n.watermark-workspace{\n    display:grid;\n    grid-template-columns:minmax(0,1.5fr) minmax(270px,.7fr);\n    gap:25px;\n    margin-top:20px;\n    align-items:start\n}\n@media(min-width:751px){\n    .watermark-workspace{\n        height:min(650px,calc(100vh - 40px));\n        min-height:300px\n    }\n    .watermark-preview{\n        height:100%;\n        min-height:0\n    }\n    .watermark-settings{\n        height:100%;\n        max-height:100%;\n        overflow-y:auto;\n        overflow-x:hidden;\n        padding-right:5px;\n        box-sizing:border-box;\n        overscroll-behavior:contain;\n        min-height:0\n    }\n    .watermark-settings .text-style-buttons{display:flex;gap:6px;flex-wrap:wrap;margin-top:5px}\n.text-style-btn{min-width:36px;height:34px;padding:0 9px;border:1px solid #d1d5db;background:#fff;border-radius:8px;cursor:pointer;font-size:16px;line-height:1}\n.text-style-btn.active{background:#111827;color:#fff;border-color:#111827}\n.emoji-palette{\n        display:grid;\n        grid-template-columns:repeat(8,minmax(0,1fr));\n        width:100%;\n        max-width:100%;\n        box-sizing:border-box;\n        overflow:visible\n    }\n    .watermark-settings .emoji-choice{\n        min-width:0;\n        width:100%;\n        max-width:100%;\n        box-sizing:border-box;\n        display:flex;\n        align-items:center;\n        justify-content:center;\n        overflow:hidden\n    }\n}\n.watermark-workspace{\n    align-items:start\n}\n.watermark-preview{\n    min-height:300px;\n    height:min(650px,calc(100vh - 40px));\n    background:#e5e7eb;\n    border-radius:12px;\n    display:flex;\n    align-items:center;\n    justify-content:center;\n    overflow:hidden;\n    position:relative;\n    align-self:start;\n    touch-action:none;\n    box-sizing:border-box;\n    z-index:2\n}\n.watermark-canvas{\n    max-width:100%;\n    max-height:100%;\n    display:block\n}\n.watermark-drag-logo{\n    position:absolute;\n    border:2px dashed #111827;\n    cursor:move;\n    touch-action:none;\n    user-select:none;\n    line-height:0;\n    z-index:5\n}\n.watermark-logo-preview{\n    display:block;\n    width:100%;\n    height:100%;\n    object-fit:contain;\n    pointer-events:none;\n    user-select:none\n}\n.wm-resize-handle{\n    position:absolute;\n    width:15px;\n    height:15px;\n    right:-8px;\n    bottom:-8px;\n    background:#fff;\n    border:2px solid #111827;\n    border-radius:3px;\n    cursor:nwse-resize;\n    touch-action:none\n}\n.watermark-settings{\n    display:flex;\n    flex-direction:column;\n    gap:12px\n}\n.settings-section-title{\n    font-size:16px;\n    font-weight:800;\n    padding-top:5px;\n    border-top:1px solid #e2e8f0\n}\n.range-value,.opacity-value,.margin-value,\n.batch-size-value,.batch-opacity-value,.batch-margin-value{\n    display:block;\n    text-align:right;\n    color:#64748b;\n    font-size:12px\n}\n.editor-two-col{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n    gap:10px\n}\n.editor-inline-buttons{\n    display:grid;\n    grid-template-columns:1fr 1fr;\n    gap:8px\n}\n.emoji-palette{\n    display:grid;\n    grid-template-columns:repeat(8,minmax(0,1fr));\n    gap:5px;\n    width:100%;\n    max-width:100%;\n    box-sizing:border-box;\n    overflow:hidden\n}\n.emoji-choice{\n    min-width:0!important;\n    width:100%!important;\n    max-width:100%!important;\n    min-height:42px!important;\n    box-sizing:border-box;\n    border:1px solid #e2e8f0!important;\n    background:#fff!important;\n    color:#111827!important;\n    -webkit-text-fill-color:#111827!important;\n    border-radius:8px;\n    padding:5px!important;\n    margin:0!important;\n    cursor:pointer!important;\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Twemoji Mozilla\",\"Arial Unicode MS\",sans-serif!important;\n    font-size:24px!important;\n    font-style:normal!important;\n    font-weight:400!important;\n    line-height:1!important;\n    text-align:center!important;\n    text-indent:0!important;\n    text-transform:none!important;\n    letter-spacing:normal!important;\n    white-space:nowrap!important;\n    display:flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    visibility:visible!important;\n    opacity:1!important;\n    overflow:visible!important;\n    appearance:none!important;\n    -webkit-appearance:none!important;\n    text-shadow:none!important;\n    transform:none;\n}\n.emoji-choice:hover{background:#f8fafc}\n.editor-object-layer{\n    position:absolute;\n    inset:0;\n    pointer-events:none;\n    z-index:20!important;\n    overflow:visible;\n}\n.editor-object{\n    position:absolute;\n    transform:translate(-50%,-50%);\n    cursor:move;\n    user-select:none;\n    touch-action:none;\n    pointer-events:auto;\n    white-space:pre\n}\n.editor-object.selected{\n    outline:2px dashed #111827;\n    outline-offset:5px\n}\n.editor-object-resize-handle{\n    position:absolute;\n    width:14px;\n    height:14px;\n    right:-10px;\n    bottom:-10px;\n    box-sizing:border-box;\n    background:#fff;\n    border:2px solid #111827;\n    border-radius:50%;\n    cursor:nwse-resize;\n    touch-action:none;\n    z-index:10\n}\n.editor-object.text-object{\n    line-height:1.15;\n    text-align:center\n}\n.editor-object.emoji-object{\n    line-height:1\n}\n.converter-notice{\n    display:flex;\n    flex-direction:column;\n    gap:4px;\n    padding:14px;\n    background:#f8fafc;\n    border:1px solid #e2e8f0;\n    border-radius:10px;\n    margin-bottom:15px\n}\n.converter-notice span{\n    color:#64748b;\n    font-size:13px\n}\n.batch-file-list{\n    margin-top:15px;\n    max-height:300px;\n    overflow:auto\n}\n.batch-result{\n    margin-top:20px\n}\n.batch-result-grid{\n    display:grid;\n    grid-template-columns:repeat(3,1fr);\n    gap:10px\n}\n.batch-result-item{\n    padding:10px;\n    border:1px solid #e2e8f0;\n    border-radius:10px;\n    background:#f8fafc;\n    text-align:center\n}\n.batch-result-item img{\n    max-width:100%;\n    max-height:180px;\n    display:block;\n    margin:0 auto 8px;\n    border-radius:6px\n}\n.document-preview-host{\n    position:fixed;\n    left:-100000px;\n    top:-100000px;\n    width:1200px;\n    background:#fff;\n    z-index:-1\n}\n.document-render-page{\n    background:#fff;\n    box-sizing:border-box;\n    overflow:hidden;\n    margin:0;\n    padding:45px;\n    color:#111;\n    font-family:Arial,sans-serif;\n    width:1000px;\n    min-height:1414px\n}\n.document-render-page table{\n    width:100%;\n    border-collapse:collapse\n}\n.document-render-page td,\n.document-render-page th{\n    border:1px solid #999;\n    padding:5px;\n    font-size:14px\n}\n.document-render-page img{\n    max-width:100%\n}\n.document-render-page h1{font-size:30px}\n.document-render-page h2{font-size:25px}\n.document-render-page h3{font-size:21px}\n.document-render-page p{line-height:1.45}\n@media(max-width:750px){\n    .itools-wrapper{margin:15px auto}\n    .itool-box{padding:17px}\n    .itools-tabs{grid-template-columns:1fr 1fr}\n    .itool-title h2{font-size:23px}\n    .compress-options,\n    .converter-options,\n    .document-options,\n    .batch-options,\n    .crop-editor,\n    .watermark-workspace,\n    .watermark-upload-grid{grid-template-columns:1fr}\n    .crop-stage{min-height:320px}\n    .crop-info{flex-direction:column}\n    .file-row{flex-wrap:wrap}\n    .watermark-settings{\n        height:auto;\n        max-height:none;\n        overflow:visible\n        }\n    .watermark-preview{\n        position:relative;\n        height:auto;\n        min-height:300px\n    }\n    .watermark-canvas{\n        max-height:650px\n    }\n    .watermark-drag-logo{max-width:70%}\n    .emoji-palette{grid-template-columns:repeat(6,minmax(0,1fr))}\n    .batch-result-grid{grid-template-columns:1fr 1fr}\n}\n\n\/* =========================================================\n   V2 RESPONSIVE \/ MOBILE EDITOR FIXES\n   ========================================================= *\/\n.emoji-choice{\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Twemoji Mozilla\",\"Arial Unicode MS\",sans-serif!important;\n    font-variant-emoji:emoji;\n    font-size:24px!important;\n    min-height:42px!important;\n    color:#111827!important;\n    -webkit-text-fill-color:#111827!important;\n    line-height:1!important;\n    visibility:visible!important;\n    opacity:1!important;\n}\n.emoji-choice.selected{background:#111827;color:#fff;border-color:#111827;transform:translateY(-1px)}\n.watermark-settings{overscroll-behavior:contain;}\n@media(max-width:750px){\n    .watermark-workspace{\n        grid-template-columns:1fr;\n        align-items:start;\n        gap:16px;\n    }\n    .watermark-preview{\n        position:sticky;\n        top:10px;\n        z-index:30;\n        height:min(48vh,420px);\n        min-height:230px;\n        max-height:420px;\n        overflow:hidden;\n        box-shadow:0 5px 18px rgba(0,0,0,.12);\n    }\n    .watermark-settings{\n        height:auto!important;\n        max-height:none!important;\n        overflow:visible!important;\n        min-height:0;\n        position:relative;\n        z-index:10;\n    }\n    .watermark-canvas{max-width:100%;max-height:100%;}\n    .watermark-drag-logo{max-width:70%;}\n    .emoji-palette{grid-template-columns:repeat(6,minmax(0,1fr));gap:6px;overflow:visible;}\n    .emoji-choice{font-size:22px;padding:7px 4px;min-height:40px;}\n}\n@media(max-width:750px) and (max-height:700px){\n    .watermark-preview{height:42vh;min-height:210px;max-height:330px;}\n}\n@media(min-width:751px){\n    .watermark-settings{overflow-y:auto;overflow-x:hidden;}\n}\n\/* Emoji rendering hardening: override common WordPress\/theme button rules. *\/\n.emoji-palette{\n    display:grid!important;\n    visibility:visible!important;\n    opacity:1!important;\n    position:relative;\n    z-index:25;\n    isolation:isolate;\n}\n.emoji-palette .emoji-choice{\n    visibility:visible!important;\n    opacity:1!important;\n    color:#111827!important;\n    -webkit-text-fill-color:#111827!important;\n    background:#fff!important;\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Twemoji Mozilla\",\"Arial Unicode MS\",sans-serif!important;\n    font-size:24px!important;\n    line-height:1!important;\n    min-height:42px!important;\n    display:flex!important;\n}\n.emoji-palette .emoji-choice:hover,.emoji-palette .emoji-choice:focus{\n    color:#111827!important;\n    -webkit-text-fill-color:#111827!important;\n    background:#f8fafc!important;\n    outline:2px solid #cbd5e1;\n    outline-offset:1px;\n}\n.emoji-palette .emoji-choice.selected{\n    background:#111827!important;\n    color:#fff!important;\n    -webkit-text-fill-color:#fff!important;\n}\n@media(max-width:750px){\n    .emoji-palette .emoji-choice{font-size:24px!important;min-height:42px!important;padding:5px!important;}\n}\n\n\/* Emoji picker: use real image icons so WordPress emoji replacement cannot hide them. *\/\n.emoji-palette .emoji-choice .image-tools-emoji-icon,\n.emoji-palette .emoji-choice .image-tools-emoji-fallback{\n    display:block!important;\n    visibility:visible!important;\n    opacity:1!important;\n    pointer-events:none!important;\n}\n.emoji-palette .emoji-choice .image-tools-emoji-icon{\n    width:28px!important;height:28px!important;max-width:28px!important;max-height:28px!important;\n    object-fit:contain!important;border:0!important;background:transparent!important;\n}\n@media(max-width:750px){\n    .emoji-palette .emoji-choice .image-tools-emoji-icon{\n        width:28px!important;height:28px!important;max-width:28px!important;max-height:28px!important;\n    }\n}\n\n\/* =========================================================\n   V2.3 MOBILE EDITOR SCROLL + EMOJI HARD FIX\n   ========================================================= *\/\n@media(max-width:750px){\n    .watermark-workspace{\n        display:grid!important;\n        grid-template-columns:1fr!important;\n        grid-template-rows:minmax(220px,44vh) minmax(0,1fr)!important;\n        gap:12px!important;\n        height:calc(100svh - 24px)!important;\n        min-height:520px!important;\n        max-height:820px!important;\n        overflow:hidden!important;\n        align-items:stretch!important;\n    }\n    .watermark-preview{\n        position:relative!important;\n        inset:auto!important;\n        width:100%!important;\n        height:auto!important;\n        min-height:220px!important;\n        max-height:none!important;\n        overflow:hidden!important;\n        z-index:2!important;\n        align-self:stretch!important;\n        box-shadow:0 4px 14px rgba(0,0,0,.12)!important;\n    }\n    .watermark-settings{\n        grid-row:2!important;\n        height:auto!important;\n        min-height:0!important;\n        max-height:none!important;\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        -webkit-overflow-scrolling:touch!important;\n        overscroll-behavior:contain!important;\n        touch-action:pan-y!important;\n        padding-right:4px!important;\n        position:relative!important;\n        z-index:10!important;\n    }\n}\n@media(max-width:750px) and (max-height:700px){\n    .watermark-workspace{\n        grid-template-rows:minmax(200px,40vh) minmax(0,1fr)!important;\n        min-height:500px!important;\n    }\n}\n\n\/* =========================================================\n   V4 EMOJI PICKER LAYOUT FIX\n   - Palette gets its own bounded scroll area.\n   - It can never overlap the controls below it.\n   - The parent settings panel remains independently scrollable.\n   - No high z-index on the palette.\n   ========================================================= *\/\n.emoji-palette{\n    display:grid!important;\n    grid-template-columns:repeat(8,minmax(0,1fr))!important;\n    gap:6px!important;\n    width:100%!important;\n    max-width:100%!important;\n    height:auto!important;\n    max-height:280px!important;\n    min-height:0!important;\n    box-sizing:border-box!important;\n    padding:2px!important;\n    margin:0!important;\n    visibility:visible!important;\n    opacity:1!important;\n    overflow-y:auto!important;\n    overflow-x:hidden!important;\n    position:relative!important;\n    z-index:1!important;\n    align-content:start!important;\n    overscroll-behavior:contain!important;\n    -webkit-overflow-scrolling:touch!important;\n}\n.emoji-palette .emoji-choice{\n    appearance:none!important;\n    -webkit-appearance:none!important;\n    display:flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    width:100%!important;\n    min-width:0!important;\n    min-height:42px!important;\n    height:42px!important;\n    padding:4px!important;\n    margin:0!important;\n    border:1px solid #dbe3ec!important;\n    border-radius:8px!important;\n    background:#fff!important;\n    color:#111827!important;\n    -webkit-text-fill-color:#111827!important;\n    opacity:1!important;\n    visibility:visible!important;\n    overflow:hidden!important;\n    cursor:pointer!important;\n    box-sizing:border-box!important;\n    flex:none!important;\n}\n.emoji-palette .emoji-choice img.image-tools-emoji-icon{\n    display:block!important;\n    width:30px!important;\n    height:30px!important;\n    max-width:30px!important;\n    max-height:30px!important;\n    min-width:30px!important;\n    min-height:30px!important;\n    object-fit:contain!important;\n    visibility:visible!important;\n    opacity:1!important;\n    pointer-events:none!important;\n    border:0!important;\n    background:transparent!important;\n    box-shadow:none!important;\n}\n.emoji-palette .emoji-choice .image-tools-emoji-fallback{\n    display:block!important;\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Arial Unicode MS\",sans-serif!important;\n    font-size:27px!important;\n    line-height:1!important;\n    visibility:visible!important;\n    opacity:1!important;\n    pointer-events:none!important;\n}\n.emoji-palette .emoji-choice.selected{\n    background:#111827!important;\n    border-color:#111827!important;\n    color:#fff!important;\n    -webkit-text-fill-color:#fff!important;\n    transform:none!important;\n}\n\n\/* Desktop: keep the whole right settings column scrollable. *\/\n@media(min-width:751px){\n    .watermark-workspace{\n        height:min(650px,calc(100vh - 40px))!important;\n        min-height:300px!important;\n        align-items:stretch!important;\n    }\n    .watermark-settings{\n        height:100%!important;\n        max-height:100%!important;\n        min-height:0!important;\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        padding-right:8px!important;\n        box-sizing:border-box!important;\n        overscroll-behavior:contain!important;\n    }\n}\n\n\/* Mobile: preview is a fixed-height first row; tools have their own scroll. *\/\n@media(max-width:750px){\n    .watermark-workspace{\n        display:grid!important;\n        grid-template-columns:1fr!important;\n        grid-template-rows:minmax(210px,42vh) minmax(0,1fr)!important;\n        gap:12px!important;\n        height:calc(100svh - 24px)!important;\n        min-height:500px!important;\n        max-height:900px!important;\n        overflow:hidden!important;\n        align-items:stretch!important;\n    }\n    .watermark-preview{\n        grid-row:1!important;\n        position:relative!important;\n        width:100%!important;\n        height:100%!important;\n        min-height:210px!important;\n        max-height:none!important;\n        overflow:hidden!important;\n        z-index:2!important;\n    }\n    .watermark-settings{\n        grid-row:2!important;\n        height:100%!important;\n        min-height:0!important;\n        max-height:none!important;\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        -webkit-overflow-scrolling:touch!important;\n        overscroll-behavior:contain!important;\n        touch-action:pan-y!important;\n        padding-right:6px!important;\n        position:relative!important;\n        z-index:3!important;\n    }\n    .emoji-palette{\n        grid-template-columns:repeat(6,minmax(0,1fr))!important;\n        max-height:230px!important;\n        gap:6px!important;\n    }\n    .emoji-palette .emoji-choice{\n        min-height:40px!important;\n        height:40px!important;\n    }\n}\n@media(max-width:750px) and (max-height:700px){\n    .watermark-workspace{\n        grid-template-rows:minmax(190px,38vh) minmax(0,1fr)!important;\n        min-height:480px!important;\n    }\n    .emoji-palette{max-height:200px!important;}\n}\n\n\/* =========================================================\n   V5 FINAL EMOJI \/ SETTINGS SCROLL FIX\n   - Do NOT create a nested scrollbar inside the emoji palette.\n   - The entire tools panel (.watermark-settings) is the only\n     vertical scrolling area on desktop and mobile.\n   - The emoji list expands naturally, so no rows are clipped\n     or covered by the controls below.\n   ========================================================= *\/\n.emoji-palette{\n    display:grid!important;\n    grid-template-columns:repeat(8,minmax(0,1fr))!important;\n    gap:6px!important;\n    width:100%!important;\n    max-width:100%!important;\n    height:auto!important;\n    max-height:none!important;\n    min-height:0!important;\n    box-sizing:border-box!important;\n    padding:2px 2px 6px!important;\n    margin:0!important;\n    overflow:visible!important;\n    position:relative!important;\n    z-index:auto!important;\n    align-content:start!important;\n    isolation:auto!important;\n}\n.emoji-palette .emoji-choice{\n    position:relative!important;\n    z-index:1!important;\n    display:flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    width:100%!important;\n    min-width:0!important;\n    max-width:100%!important;\n    min-height:42px!important;\n    height:42px!important;\n    padding:4px!important;\n    margin:0!important;\n    box-sizing:border-box!important;\n    overflow:hidden!important;\n    flex:none!important;\n}\n.emoji-palette .emoji-choice img.image-tools-emoji-icon{\n    display:block!important;\n    width:30px!important;\n    height:30px!important;\n    min-width:30px!important;\n    min-height:30px!important;\n    max-width:30px!important;\n    max-height:30px!important;\n    object-fit:contain!important;\n    visibility:visible!important;\n    opacity:1!important;\n    pointer-events:none!important;\n    border:0!important;\n    background:transparent!important;\n    box-shadow:none!important;\n}\n.emoji-palette .emoji-choice .image-tools-emoji-fallback{\n    display:block!important;\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Arial Unicode MS\",sans-serif!important;\n    font-size:27px!important;\n    line-height:1!important;\n    visibility:visible!important;\n    opacity:1!important;\n    pointer-events:none!important;\n}\n.emoji-palette .emoji-choice.selected{\n    background:#111827!important;\n    border-color:#111827!important;\n    color:#fff!important;\n    -webkit-text-fill-color:#fff!important;\n    transform:none!important;\n}\n\n\/* Desktop: the settings panel is the sole scroll container. *\/\n@media(min-width:751px){\n    .watermark-workspace{\n        height:min(650px,calc(100vh - 40px))!important;\n        min-height:300px!important;\n        align-items:stretch!important;\n        overflow:visible!important;\n    }\n    .watermark-settings{\n        height:100%!important;\n        max-height:100%!important;\n        min-height:0!important;\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        overscroll-behavior:contain!important;\n        -webkit-overflow-scrolling:touch!important;\n        padding-right:8px!important;\n        box-sizing:border-box!important;\n    }\n}\n\n\/* Mobile: preview stays in the first row; the entire tools panel\n   in the second row scrolls as one continuous area. *\/\n@media(max-width:750px){\n    .watermark-workspace{\n        display:grid!important;\n        grid-template-columns:1fr!important;\n        grid-template-rows:minmax(210px,42vh) minmax(0,1fr)!important;\n        gap:12px!important;\n        height:calc(100svh - 24px)!important;\n        min-height:500px!important;\n        max-height:900px!important;\n        overflow:hidden!important;\n        align-items:stretch!important;\n    }\n    .watermark-preview{\n        grid-row:1!important;\n        position:relative!important;\n        width:100%!important;\n        height:100%!important;\n        min-height:210px!important;\n        max-height:none!important;\n        overflow:hidden!important;\n        z-index:2!important;\n    }\n    .watermark-settings{\n        grid-row:2!important;\n        height:100%!important;\n        min-height:0!important;\n        max-height:none!important;\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        -webkit-overflow-scrolling:touch!important;\n        overscroll-behavior:contain!important;\n        touch-action:pan-y!important;\n        padding:0 6px 18px 0!important;\n        position:relative!important;\n        z-index:3!important;\n        box-sizing:border-box!important;\n    }\n    .emoji-palette{\n        grid-template-columns:repeat(6,minmax(0,1fr))!important;\n        gap:6px!important;\n        max-height:none!important;\n        overflow:visible!important;\n    }\n    .emoji-palette .emoji-choice{\n        min-height:40px!important;\n        height:40px!important;\n    }\n}\n@media(max-width:750px) and (max-height:700px){\n    .watermark-workspace{\n        grid-template-rows:minmax(190px,38vh) minmax(0,1fr)!important;\n        min-height:480px!important;\n    }\n}\n\n\n\n\/* =========================================================\n   V6 EMOJI GRID FINAL FIX\n   - Every emoji button is a true square.\n   - The palette participates in normal document flow.\n   - No emoji row can overlap the controls below it.\n   - Only .watermark-settings is a vertical scroll container.\n   ========================================================= *\/\n.emoji-palette{\n    display:grid!important;\n    grid-template-columns:repeat(8,minmax(0,1fr))!important;\n    grid-auto-rows:auto!important;\n    gap:6px!important;\n    width:100%!important;\n    height:auto!important;\n    min-height:0!important;\n    max-height:none!important;\n    margin:0!important;\n    padding:2px 2px 8px!important;\n    box-sizing:border-box!important;\n    overflow:visible!important;\n    position:relative!important;\n    z-index:1!important;\n    align-items:start!important;\n    align-content:start!important;\n}\n\n.emoji-palette > .emoji-choice{\n    position:relative!important;\n    display:flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    width:100%!important;\n    height:auto!important;\n    min-width:0!important;\n    min-height:0!important;\n    max-width:none!important;\n    max-height:none!important;\n    aspect-ratio:1 \/ 1!important;\n    box-sizing:border-box!important;\n    padding:2px!important;\n    margin:0!important;\n    border:1px solid #dbe3ec!important;\n    border-radius:9px!important;\n    background:#fff!important;\n    overflow:hidden!important;\n    flex:none!important;\n    line-height:1!important;\n    font-size:24px!important;\n}\n\n.emoji-palette > .emoji-choice > .image-tools-emoji-icon{\n    display:block!important;\n    width:72%!important;\n    height:72%!important;\n    min-width:0!important;\n    min-height:0!important;\n    max-width:100%!important;\n    max-height:100%!important;\n    object-fit:contain!important;\n    margin:0!important;\n    padding:0!important;\n    border:0!important;\n    box-shadow:none!important;\n    background:transparent!important;\n    pointer-events:none!important;\n}\n\n.emoji-palette > .emoji-choice > .image-tools-emoji-fallback{\n    display:flex!important;\n    align-items:center!important;\n    justify-content:center!important;\n    width:100%!important;\n    height:100%!important;\n    min-width:0!important;\n    min-height:0!important;\n    margin:0!important;\n    padding:0!important;\n    font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Arial Unicode MS\",sans-serif!important;\n    font-size:clamp(18px,2.2vw,28px)!important;\n    line-height:1!important;\n    white-space:nowrap!important;\n    pointer-events:none!important;\n}\n\n\/* Make sure the controls after the palette remain in normal flow. *\/\n.emoji-palette + *{\n    position:relative!important;\n    z-index:2!important;\n}\n\n@media(min-width:751px){\n    .emoji-palette{\n        grid-template-columns:repeat(8,minmax(0,1fr))!important;\n    }\n    .watermark-settings{\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n    }\n}\n\n@media(max-width:750px){\n    .emoji-palette{\n        grid-template-columns:repeat(6,minmax(0,1fr))!important;\n        gap:6px!important;\n        max-height:none!important;\n        overflow:visible!important;\n    }\n    .emoji-palette > .emoji-choice{\n        aspect-ratio:1 \/ 1!important;\n        min-height:0!important;\n        height:auto!important;\n        font-size:22px!important;\n    }\n    .watermark-settings{\n        overflow-y:auto!important;\n        overflow-x:hidden!important;\n        -webkit-overflow-scrolling:touch!important;\n    }\n}\n\n\n\/* =========================================================\n   V7 STABLE EMOJI LAYOUT\n   ========================================================= *\/\n.emoji-palette-shell{\n    display:block!important;width:100%!important;max-width:100%!important;\n    height:auto!important;min-height:0!important;max-height:none!important;\n    margin:0!important;padding:0!important;overflow:visible!important;\n    position:relative!important;clear:both!important;flex:0 0 auto!important;\n}\n.emoji-palette-shell .emoji-palette{\n    display:grid!important;grid-template-columns:repeat(8,minmax(0,1fr))!important;\n    grid-auto-flow:row!important;grid-auto-rows:auto!important;\n    align-items:start!important;align-content:start!important;justify-items:stretch!important;\n    gap:6px!important;width:100%!important;max-width:100%!important;\n    height:auto!important;min-height:0!important;max-height:none!important;\n    margin:0!important;padding:2px!important;overflow:visible!important;\n    position:static!important;box-sizing:border-box!important;\n}\n.emoji-palette-shell .emoji-palette > .emoji-choice{\n    display:flex!important;position:relative!important;width:100%!important;\n    max-width:100%!important;min-width:0!important;height:auto!important;\n    min-height:0!important;aspect-ratio:1 \/ 1!important;padding:3px!important;\n    margin:0!important;border:1px solid #dbe3ec!important;border-radius:9px!important;\n    box-sizing:border-box!important;align-items:center!important;justify-content:center!important;\n    overflow:hidden!important;line-height:1!important;white-space:normal!important;flex:none!important;\n}\n.emoji-palette-shell .emoji-palette > .emoji-choice img.image-tools-emoji-icon{\n    display:block!important;width:78%!important;height:78%!important;max-width:78%!important;\n    max-height:78%!important;min-width:0!important;min-height:0!important;object-fit:contain!important;\n    margin:0!important;padding:0!important;border:0!important;box-shadow:none!important;pointer-events:none!important;\n}\n.emoji-palette-shell .emoji-palette > .emoji-choice .image-tools-emoji-fallback{\n    display:block!important;width:auto!important;height:auto!important;max-width:100%!important;\n    max-height:100%!important;font-size:clamp(18px,5vw,28px)!important;line-height:1!important;\n    margin:0!important;padding:0!important;pointer-events:none!important;\n}\n.emoji-controls-row{\n    display:grid!important;grid-template-columns:minmax(0,1fr) minmax(0,1fr)!important;\n    gap:10px!important;width:100%!important;height:auto!important;min-height:0!important;\n    margin:0!important;padding:0!important;position:relative!important;clear:both!important;flex:0 0 auto!important;\n}\n.emoji-controls-row > label,.emoji-controls-row input{min-width:0!important;position:relative!important;}\n.emoji-controls-row ~ .itool-secondary{position:relative!important;clear:both!important;flex:0 0 auto!important;}\n.watermark-settings > *{position:relative;flex-shrink:0;}\n@media(min-width:751px){\n    .watermark-workspace{height:min(650px,calc(100vh - 40px))!important;min-height:300px!important;overflow:visible!important;align-items:stretch!important;}\n    .watermark-settings{height:100%!important;min-height:0!important;max-height:100%!important;overflow-y:auto!important;overflow-x:hidden!important;overscroll-behavior:contain!important;-webkit-overflow-scrolling:touch!important;padding-right:8px!important;}\n    .emoji-palette-shell .emoji-palette{grid-template-columns:repeat(8,minmax(0,1fr))!important;}\n}\n@media(max-width:750px){\n    .watermark-workspace{display:grid!important;grid-template-columns:minmax(0,1fr)!important;grid-template-rows:minmax(210px,42vh) minmax(0,1fr)!important;gap:12px!important;height:calc(100svh - 24px)!important;min-height:500px!important;max-height:900px!important;overflow:hidden!important;align-items:stretch!important;}\n    .watermark-preview{grid-row:1!important;width:100%!important;height:100%!important;min-height:210px!important;max-height:none!important;position:relative!important;overflow:hidden!important;z-index:2!important;}\n    .watermark-settings{grid-row:2!important;width:100%!important;height:100%!important;min-height:0!important;max-height:none!important;overflow-y:auto!important;overflow-x:hidden!important;overscroll-behavior:contain!important;-webkit-overflow-scrolling:touch!important;touch-action:pan-y!important;padding:0 6px 18px 0!important;position:relative!important;z-index:3!important;}\n    .emoji-palette-shell .emoji-palette{grid-template-columns:repeat(6,minmax(0,1fr))!important;gap:6px!important;}\n}\n@media(max-width:420px){.emoji-palette-shell .emoji-palette{grid-template-columns:repeat(6,minmax(0,1fr))!important;gap:5px!important;padding:2px!important;}}\n@media(max-width:750px) and (max-height:700px){.watermark-workspace{grid-template-rows:minmax(190px,38vh) minmax(0,1fr)!important;min-height:480px!important;}}\n\n\n\/* =========================================================\n   V8 IMAGE TRANSFORM + CROP\n   ========================================================= *\/\n.editor-transform-buttons,\n.editor-crop-buttons{display:grid;grid-template-columns:1fr 1fr;gap:8px}\n.editor-transform-status{\n    display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px 12px;\n    padding:8px 10px;border:1px solid #e2e8f0;border-radius:9px;\n    background:#f8fafc;color:#475569;font-size:12px\n}\n.editor-transform-status strong{color:#111827}\n.editor-crop-help{display:block}\n.editor-crop-layer{\n    position:absolute;inset:0;z-index:15!important;pointer-events:none;\n    display:none;overflow:hidden;touch-action:none\n}\n.editor-crop-layer.active{display:block;z-index:40!important}\n.editor-crop-box{\n    position:absolute;left:5%;top:5%;width:90%;height:90%;\n    border:2px solid #fff;box-shadow:0 0 0 9999px rgba(15,23,42,.48),0 0 0 1px rgba(15,23,42,.85);\n    box-sizing:border-box;pointer-events:auto;touch-action:none;cursor:move\n}\n.editor-crop-box::before,.editor-crop-box::after{\n    content:\"\";position:absolute;pointer-events:none\n}\n.editor-crop-box::before{\n    inset:33.333% 0;border-top:1px solid rgba(255,255,255,.55);border-bottom:1px solid rgba(255,255,255,.55)\n}\n.editor-crop-box::after{\n    inset:0 33.333%;border-left:1px solid rgba(255,255,255,.55);border-right:1px solid rgba(255,255,255,.55)\n}\n.editor-crop-handle{\n    position:absolute;width:14px;height:14px;border:2px solid #111827;background:#fff;border-radius:3px;\n    box-sizing:border-box;pointer-events:auto;z-index:2\n}\n.editor-crop-handle.n{left:50%;top:-8px;transform:translateX(-50%);cursor:ns-resize}\n.editor-crop-handle.ne{right:-8px;top:-8px;cursor:nesw-resize}\n.editor-crop-handle.e{right:-8px;top:50%;transform:translateY(-50%);cursor:ew-resize}\n.editor-crop-handle.se{right:-8px;bottom:-8px;cursor:nwse-resize}\n.editor-crop-handle.s{left:50%;bottom:-8px;transform:translateX(-50%);cursor:ns-resize}\n.editor-crop-handle.sw{left:-8px;bottom:-8px;cursor:nesw-resize}\n.editor-crop-handle.w{left:-8px;top:50%;transform:translateY(-50%);cursor:ew-resize}\n.editor-crop-handle.nw{left:-8px;top:-8px;cursor:nwse-resize}\n.editor-crop-layer:not(.active){visibility:hidden}\n.watermark-preview.crop-mode .watermark-canvas{cursor:default}\n@media(max-width:750px){\n    .editor-transform-buttons,.editor-crop-buttons{grid-template-columns:1fr 1fr}\n    .editor-crop-handle{width:18px;height:18px}\n}\n\n<\/style>\n\n<script>\n(function(){\n\"use strict\";\n\n\/* =========================================================\n   GLOBAL HELPERS\n   ========================================================= *\/\n\nfunction formatBytes(bytes){\n    if(!bytes) return \"0 B\";\n    var u=[\"B\",\"KB\",\"MB\",\"GB\"], i=Math.min(\n        Math.floor(Math.log(bytes)\/Math.log(1024)),\n        u.length-1\n    );\n    return (bytes\/Math.pow(1024,i)).toFixed(i===0?0:2)+\" \"+u[i];\n}\n\nfunction extensionFromMime(type){\n    return ({\n        \"image\/jpeg\":\"jpg\",\n        \"image\/png\":\"png\",\n        \"image\/webp\":\"webp\",\n        \"image\/avif\":\"avif\",\n        \"image\/bmp\":\"bmp\"\n    })[type] || \"png\";\n}\n\nfunction loadImage(file){\n    return new Promise(function(resolve,reject){\n        var maxBytes=25*1024*1024;\n        var maxPixels=40000000;\n\n        if(!file || !\/^image\\\/\/i.test(file.type)){\n            reject(new Error(\"\u0110\u1ecbnh d\u1ea1ng \u1ea3nh kh\u00f4ng h\u1ee3p l\u1ec7.\"));\n            return;\n        }\n\n        if(file.size>maxBytes){\n            reject(new Error(\"\u1ea2nh v\u01b0\u1ee3t qu\u00e1 gi\u1edbi h\u1ea1n 25 MB.\"));\n            return;\n        }\n\n        var url=URL.createObjectURL(file);\n        var img=new Image();\n\n        img.onload=function(){\n            URL.revokeObjectURL(url);\n\n            if(!img.naturalWidth || !img.naturalHeight){\n                reject(new Error(\"\u1ea2nh kh\u00f4ng h\u1ee3p l\u1ec7.\"));\n                return;\n            }\n\n            if(img.naturalWidth*img.naturalHeight>maxPixels){\n                reject(new Error(\"\u1ea2nh c\u00f3 k\u00edch th\u01b0\u1edbc qu\u00e1 l\u1edbn. Gi\u1edbi h\u1ea1n 40 megapixel.\"));\n                return;\n            }\n\n            resolve(img);\n        };\n\n        img.onerror=function(){\n            URL.revokeObjectURL(url);\n            reject(new Error(\"Kh\u00f4ng th\u1ec3 \u0111\u1ecdc \u1ea3nh ho\u1eb7c \u0111\u1ecbnh d\u1ea1ng ch\u01b0a \u0111\u01b0\u1ee3c tr\u00ecnh duy\u1ec7t h\u1ed7 tr\u1ee3.\"));\n        };\n\n        img.src=url;\n    });\n}\n\nfunction canvasToBlob(canvas,type,quality){\n    return new Promise(function(resolve){\n        canvas.toBlob(\n            resolve,\n            type,\n            type===\"image\/png\" || type===\"image\/bmp\" ? undefined : quality\n        );\n    });\n}\n\nfunction bmpBlob(canvas){\n    var w=canvas.width,h=canvas.height;\n    var ctx=canvas.getContext(\"2d\");\n    var data=ctx.getImageData(0,0,w,h).data;\n    var rowSize=Math.floor((24*w+31)\/32)*4;\n    var pixelSize=rowSize*h;\n    var offset=54;\n    var total=offset+pixelSize;\n    var buf=new ArrayBuffer(total);\n    var dv=new DataView(buf);\n\n    function w16(p,v){dv.setUint16(p,v,true)}\n    function w32(p,v){dv.setUint32(p,v,true)}\n\n    w16(0,0x4d42);\n    w32(2,total);\n    w16(6,0);\n    w16(8,0);\n    w32(10,offset);\n    w32(14,40);\n    w32(18,w);\n    w32(22,h);\n    w16(26,1);\n    w16(28,24);\n    w32(30,0);\n    w32(34,pixelSize);\n    w32(38,2835);\n    w32(42,2835);\n    w32(46,0);\n    w32(50,0);\n\n    var p=offset;\n\n    for(var y=h-1;y>=0;y--){\n        for(var x=0;x<w;x++){\n            var i=(y*w+x)*4;\n            dv.setUint8(p++,data[i+2]);\n            dv.setUint8(p++,data[i+1]);\n            dv.setUint8(p++,data[i]);\n        }\n        while((p-offset)%rowSize)p++;\n    }\n\n    return new Blob([buf],{type:\"image\/bmp\"});\n}\n\nfunction makeBlob(canvas,type,quality){\n    if(type===\"image\/bmp\"){\n        return Promise.resolve(bmpBlob(canvas));\n    }\n    return canvasToBlob(canvas,type,quality);\n}\n\nfunction canEncode(type){\n    var c=document.createElement(\"canvas\");\n    try{\n        return !!c.toDataURL(type).startsWith(\"data:\"+type);\n    }catch(e){\n        return false;\n    }\n}\n\nfunction ensureCanvasSize(width,height,label){\n    var w=Math.ceil(Number(width)||0);\n    var h=Math.ceil(Number(height)||0);\n    var maxPixels=40000000;\n    var maxSide=32767;\n\n    if(w<1 || h<1){\n        throw new Error((label||\"\u1ea2nh\")+\" c\u00f3 k\u00edch th\u01b0\u1edbc kh\u00f4ng h\u1ee3p l\u1ec7.\");\n    }\n    if(w>maxSide || h>maxSide){\n        throw new Error((label||\"\u1ea2nh\")+\" v\u01b0\u1ee3t gi\u1edbi h\u1ea1n chi\u1ec1u d\u00e0i canvas c\u1ee7a tr\u00ecnh duy\u1ec7t.\");\n    }\n    if(w*h>maxPixels){\n        throw new Error((label||\"\u1ea2nh\")+\" qu\u00e1 l\u1edbn \u0111\u1ec3 x\u1eed l\u00fd an to\u00e0n tr\u00ean tr\u00ecnh duy\u1ec7t. Vui l\u00f2ng gi\u1ea3m \u0111\u1ed9 ph\u00e2n gi\u1ea3i ho\u1eb7c ch\u1ecdn scale th\u1ea5p h\u01a1n.\");\n    }\n    return {width:w,height:h};\n}\n\nfunction canvasPixelCount(canvas){\n    return (canvas.width||0)*(canvas.height||0);\n}\n\nfunction escapeHtml(text){\n    var d=document.createElement(\"div\");\n    d.textContent=text;\n    return d.innerHTML;\n}\n\nfunction setupDragDrop(upload){\n    if(!upload)return;\n\n    var input=upload.querySelector('input[type=\"file\"]');\n    if(!input)return;\n\n    [\"dragenter\",\"dragover\"].forEach(function(name){\n        upload.addEventListener(name,function(e){\n            e.preventDefault();\n            e.stopPropagation();\n            upload.classList.add(\"dragover\");\n        });\n    });\n\n    [\"dragleave\",\"drop\"].forEach(function(name){\n        upload.addEventListener(name,function(e){\n            e.preventDefault();\n            e.stopPropagation();\n            upload.classList.remove(\"dragover\");\n        });\n    });\n\n    upload.addEventListener(\"drop\",function(e){\n        var files=Array.from((e.dataTransfer&&e.dataTransfer.files)||[]);\n        if(!files.length)return;\n\n        try{\n            var dt=new DataTransfer();\n            if(input.multiple){\n                files.forEach(function(file){dt.items.add(file);});\n            }else{\n                dt.items.add(files[0]);\n            }\n            input.files=dt.files;\n            input.dispatchEvent(new Event(\"change\",{bubbles:true}));\n        }catch(err){\n            \/* M\u1ed9t s\u1ed1 browser c\u0169 kh\u00f4ng cho g\u00e1n input.files. Khi \u0111\u00f3\n             * ng\u01b0\u1eddi d\u00f9ng v\u1eabn c\u00f3 th\u1ec3 d\u00f9ng n\u00fat ch\u1ecdn file b\u00ecnh th\u01b0\u1eddng. *\/\n            console.warn(\"Drag & drop kh\u00f4ng th\u1ec3 g\u00e1n file v\u00e0o input:\",err);\n        }\n    });\n}\n\nfunction downloadBlob(blob,name){\n    var url=URL.createObjectURL(blob);\n    var a=document.createElement(\"a\");\n    a.href=url;\n    a.download=name;\n    document.body.appendChild(a);\n    a.click();\n    a.remove();\n    setTimeout(function(){URL.revokeObjectURL(url)},30000);\n}\n\nfunction parseSelection(value,max){\n    value=(value||\"all\").trim().toLowerCase();\n\n    if(value===\"all\" || !value){\n        var all=[];\n        for(var i=1;i<=max;i++)all.push(i);\n        return all;\n    }\n\n    if(!\/^\\d+(?:\\s*-\\s*\\d+)?(?:\\s*,\\s*\\d+(?:\\s*-\\s*\\d+)?)*$\/.test(value)){\n        throw new Error(\"Danh s\u00e1ch trang\/slide\/sheet kh\u00f4ng h\u1ee3p l\u1ec7. V\u00ed d\u1ee5: all, 1,2,5 ho\u1eb7c 1-5.\");\n    }\n\n    var out=[];\n    value.split(\",\").forEach(function(part){\n        part=part.trim();\n        if(part.indexOf(\"-\")>=0){\n            var a=part.split(\"-\");\n            var from=parseInt(a[0],10);\n            var to=parseInt(a[1],10);\n            if(from>to){var tmp=from;from=to;to=tmp;}\n            if(from<1 || to>max){\n                throw new Error(\"Trang\/slide\/sheet ph\u1ea3i n\u1eb1m trong kho\u1ea3ng 1 \u0111\u1ebfn \"+max+\".\");\n            }\n            for(var n=from;n<=to;n++){\n                if(out.indexOf(n)<0)out.push(n);\n            }\n        }else{\n            var p=parseInt(part,10);\n            if(p<1 || p>max){\n                throw new Error(\"Trang\/slide\/sheet \"+p+\" kh\u00f4ng t\u1ed3n t\u1ea1i. Ph\u1ea1m vi h\u1ee3p l\u1ec7: 1 \u0111\u1ebfn \"+max+\".\");\n            }\n            if(out.indexOf(p)<0)out.push(p);\n        }\n    });\n\n    if(!out.length){\n        throw new Error(\"Kh\u00f4ng c\u00f3 trang\/slide\/sheet h\u1ee3p l\u1ec7 \u0111\u1ec3 x\u1eed l\u00fd.\");\n    }\n\n    return out.sort(function(a,b){return a-b;});\n}\n\nfunction sleep(ms){\n    return new Promise(function(resolve){setTimeout(resolve,ms)});\n}\n\nfunction loadScriptOnce(src,testFn){\n    return new Promise(function(resolve,reject){\n        try{\n            if(testFn && testFn()){\n                resolve();\n                return;\n            }\n        }catch(e){}\n\n        var existing=document.querySelector('script[data-itools-src=\"'+src+'\"]');\n\n        if(existing){\n            existing.addEventListener(\"load\",function(){resolve()});\n            existing.addEventListener(\"error\",function(){reject(new Error(\"Kh\u00f4ng t\u1ea3i \u0111\u01b0\u1ee3c th\u01b0 vi\u1ec7n.\"))});\n            return;\n        }\n\n        var s=document.createElement(\"script\");\n        s.src=src;\n        s.async=true;\n        s.dataset.itoolsSrc=src;\n\n        s.onload=function(){resolve()};\n        s.onerror=function(){reject(new Error(\"Kh\u00f4ng t\u1ea3i \u0111\u01b0\u1ee3c th\u01b0 vi\u1ec7n: \"+src))};\n\n        document.head.appendChild(s);\n    });\n}\n\n\n\/* =========================================================\n   TABS\n   ========================================================= *\/\n\nfunction initTabs(wrapper){\n    var tabs=wrapper.querySelectorAll(\".itools-tab\");\n    var panels=wrapper.querySelectorAll(\".itools-panel\");\n\n    tabs.forEach(function(tab){\n        tab.addEventListener(\"click\",function(){\n            var target=tab.dataset.tab;\n\n            tabs.forEach(function(x){x.classList.remove(\"active\")});\n            panels.forEach(function(x){x.classList.remove(\"active\")});\n\n            tab.classList.add(\"active\");\n\n            var p=wrapper.querySelector('[data-panel=\"'+target+'\"]');\n            if(p)p.classList.add(\"active\");\n        });\n    });\n}\n\nfunction initInnerTabs(box,buttonSelector,panelSelector,dataName){\n    var buttons=box.querySelectorAll(buttonSelector);\n    var panels=box.querySelectorAll(panelSelector);\n\n    buttons.forEach(function(btn){\n        btn.addEventListener(\"click\",function(){\n            var target=btn.dataset[dataName];\n\n            buttons.forEach(function(x){x.classList.remove(\"active\")});\n            panels.forEach(function(x){x.classList.remove(\"active\")});\n\n            btn.classList.add(\"active\");\n\n            var p=box.querySelector(\n                panelSelector+'[data-'+dataName.replace(\/([A-Z])\/g,\"-$1\").toLowerCase()+'-panel=\"'+target+'\"]'\n            );\n\n            if(p)p.classList.add(\"active\");\n        });\n    });\n}\n\n\n\/* =========================================================\n   FILE LIST\n   ========================================================= *\/\n\nfunction renderFileList(list,files){\n    list.innerHTML=\"\";\n\n    files.forEach(function(file){\n        var row=document.createElement(\"div\");\n        row.className=\"file-row\";\n\n        row.innerHTML=\n            '<span class=\"file-name\">'+escapeHtml(file.name)+'<\/span>'+\n            '<span class=\"file-size\">'+formatBytes(file.size)+'<\/span>';\n\n        list.appendChild(row);\n    });\n}\n\n\n\/* =========================================================\n   COMPRESSOR\n   ========================================================= *\/\n\nfunction initCompressor(box){\n    var input=box.querySelector(\".compress-files\");\n    var list=box.querySelector(\".compress-list\");\n    var button=box.querySelector(\".compress-start\");\n    var quality=box.querySelector(\".compress-quality\");\n    var output=box.querySelector(\".compress-output\");\n    var message=box.querySelector(\".itool-message\");\n    var files=[];\n\n    input.addEventListener(\"change\",function(){\n        files=Array.from(input.files||[]);\n        renderFileList(list,files);\n    });\n\n    button.addEventListener(\"click\",async function(){\n        if(!files.length){\n            message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u00edt nh\u1ea5t m\u1ed9t \u1ea3nh.\";\n            return;\n        }\n\n        var type=output.value;\n\n        if(type===\"image\/avif\"&&!canEncode(type)){\n            message.textContent=\"Tr\u00ecnh duy\u1ec7t n\u00e0y ch\u01b0a h\u1ed7 tr\u1ee3 xu\u1ea5t AVIF. H\u00e3y ch\u1ecdn WebP, JPG, PNG ho\u1eb7c BMP.\";\n            return;\n        }\n\n        button.disabled=true;\n        message.textContent=\"\u0110ang n\u00e9n \u1ea3nh...\";\n        list.innerHTML=\"\";\n\n        for(var file of files){\n            try{\n                var img=await loadImage(file);\n                var canvas=document.createElement(\"canvas\");\n\n                canvas.width=img.naturalWidth;\n                canvas.height=img.naturalHeight;\n\n                var ctx=canvas.getContext(\"2d\");\n\n                if(type===\"image\/jpeg\"){\n                    ctx.fillStyle=\"#fff\";\n                    ctx.fillRect(0,0,canvas.width,canvas.height);\n                }\n\n                ctx.drawImage(img,0,0);\n\n                var blob=await makeBlob(canvas,type,parseFloat(quality.value));\n\n                if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c file.\");\n\n                var ext=extensionFromMime(type);\n                var name=file.name.replace(\/\\.[^\/.]+$\/,\"\");\n                var newName=name+\"-compressed.\"+ext;\n                var saving=Math.round((1-blob.size\/file.size)*100);\n\n                var row=document.createElement(\"div\");\n                row.className=\"file-row\";\n\n                var info=document.createElement(\"span\");\n                info.className=\"file-size\";\n                info.innerHTML=\n                    \"<strong>\"+escapeHtml(newName)+\"<\/strong><br>\"+\n                    formatBytes(file.size)+\" \u2192 \"+formatBytes(blob.size)+\" (\"+saving+\"%)\";\n\n                var link=document.createElement(\"a\");\n                link.className=\"download-link\";\n                link.textContent=\"\u2b07\ufe0f T\u1ea3i xu\u1ed1ng\";\n                link.href=URL.createObjectURL(blob);\n                link.download=newName;\n\n                row.appendChild(info);\n                row.appendChild(link);\n                list.appendChild(row);\n\n            }catch(e){\n                console.error(e);\n\n                var er=document.createElement(\"div\");\n                er.className=\"file-row\";\n                er.textContent=\"Kh\u00f4ng th\u1ec3 x\u1eed l\u00fd: \"+file.name;\n                list.appendChild(er);\n            }\n        }\n\n        message.textContent=\"\u0110\u00e3 x\u1eed l\u00fd \"+files.length+\" \u1ea3nh.\";\n        button.disabled=false;\n    });\n\n    setupDragDrop(input.closest(\".itool-upload\"));\n}\n\n\n\/* =========================================================\n   CROPPER\n   ========================================================= *\/\n\nfunction initCropper(box){\n    var input=box.querySelector(\".crop-file\");\n    var stage=box.querySelector(\".crop-stage\");\n    var canvas=box.querySelector(\".crop-canvas\");\n    var selection=box.querySelector(\".crop-selection\");\n    var cropBox=box.querySelector(\".crop-box\");\n    var ow=box.querySelector(\".crop-output-width\");\n    var oh=box.querySelector(\".crop-output-height\");\n    var lock=box.querySelector(\".crop-lock-ratio\");\n    var format=box.querySelector(\".crop-format\");\n    var zoomInput=box.querySelector(\".crop-zoom\");\n    var reset=box.querySelector(\".crop-reset\");\n    var center=box.querySelector(\".crop-center\");\n    var button=box.querySelector(\".crop-start\");\n    var result=box.querySelector(\".crop-result\");\n    var message=box.querySelector(\".itool-message\");\n    var infoSel=box.querySelector(\".crop-info-selection\");\n    var infoImg=box.querySelector(\".crop-info-image\");\n\n    var image=null;\n    var imageScale=1;\n    var imageLeft=0;\n    var imageTop=0;\n    var imageDisplayWidth=0;\n    var imageDisplayHeight=0;\n    var crop={x:0,y:0,width:0,height:0};\n    var drag=null;\n    var initialRatio=1;\n\n    function layout(){\n        if(!image)return;\n\n        var maxW=Math.max(100,stage.clientWidth-20);\n        var maxH=Math.min(650,Math.max(260,stage.clientHeight-20));\n\n        imageScale=Math.min(\n            maxW\/image.naturalWidth,\n            maxH\/image.naturalHeight,\n            1\n        );\n\n        imageDisplayWidth=image.naturalWidth*imageScale;\n        imageDisplayHeight=image.naturalHeight*imageScale;\n\n        canvas.width=Math.round(imageDisplayWidth);\n        canvas.height=Math.round(imageDisplayHeight);\n\n        canvas.style.width=canvas.width+\"px\";\n        canvas.style.height=canvas.height+\"px\";\n\n        imageLeft=(stage.clientWidth-imageDisplayWidth)\/2;\n        imageTop=(stage.clientHeight-imageDisplayHeight)\/2;\n\n        drawCanvas();\n        clampCrop();\n        updateUI();\n    }\n\n    function drawCanvas(){\n        var ctx=canvas.getContext(\"2d\");\n        ctx.clearRect(0,0,canvas.width,canvas.height);\n        ctx.drawImage(image,0,0,canvas.width,canvas.height);\n    }\n\n    function setupCrop(){\n        if(!image)return;\n\n        var z=parseFloat(zoomInput.value)||1;\n        var w=imageDisplayWidth\/z;\n        var h=imageDisplayHeight\/z;\n\n        w=Math.max(30,Math.min(w,imageDisplayWidth));\n        h=Math.max(30,Math.min(h,imageDisplayHeight));\n\n        crop.width=w;\n        crop.height=h;\n        crop.x=imageLeft+(imageDisplayWidth-w)\/2;\n        crop.y=imageTop+(imageDisplayHeight-h)\/2;\n\n        initialRatio=w\/h;\n        updateUI();\n    }\n\n    function clampCrop(){\n        crop.width=Math.min(crop.width,imageDisplayWidth);\n        crop.height=Math.min(crop.height,imageDisplayHeight);\n\n        crop.x=Math.max(\n            imageLeft,\n            Math.min(crop.x,imageLeft+imageDisplayWidth-crop.width)\n        );\n\n        crop.y=Math.max(\n            imageTop,\n            Math.min(crop.y,imageTop+imageDisplayHeight-crop.height)\n        );\n    }\n\n    function updateUI(){\n        if(!image)return;\n\n        clampCrop();\n\n        cropBox.style.left=crop.x+\"px\";\n        cropBox.style.top=crop.y+\"px\";\n        cropBox.style.width=crop.width+\"px\";\n        cropBox.style.height=crop.height+\"px\";\n\n        selection.style.display=\"block\";\n\n        var top=crop.y;\n        var left=crop.x;\n        var right=stage.clientWidth-(crop.x+crop.width);\n        var bottom=stage.clientHeight-(crop.y+crop.height);\n\n        selection.querySelector(\".shade-top\").style.height=top+\"px\";\n\n        selection.querySelector(\".shade-left\").style.top=top+\"px\";\n        selection.querySelector(\".shade-left\").style.width=left+\"px\";\n        selection.querySelector(\".shade-left\").style.height=crop.height+\"px\";\n\n        selection.querySelector(\".shade-right\").style.top=top+\"px\";\n        selection.querySelector(\".shade-right\").style.width=right+\"px\";\n        selection.querySelector(\".shade-right\").style.height=crop.height+\"px\";\n\n        selection.querySelector(\".shade-bottom\").style.height=bottom+\"px\";\n\n        infoSel.textContent=\n            \"V\u00f9ng ch\u1ecdn: \"+\n            Math.round(crop.width\/imageScale)+\n            \" \u00d7 \"+\n            Math.round(crop.height\/imageScale)+\n            \" px\";\n\n        infoImg.textContent=\n            \"\u1ea2nh g\u1ed1c: \"+\n            image.naturalWidth+\n            \" \u00d7 \"+\n            image.naturalHeight+\n            \" px\";\n    }\n\n    function point(e){\n        var r=stage.getBoundingClientRect();\n\n        return {\n            x:e.clientX-r.left,\n            y:e.clientY-r.top\n        };\n    }\n\n    function startDrag(e,mode){\n        if(!image)return;\n\n        e.preventDefault();\n\n        var p=point(e);\n\n        drag={\n            mode:mode,\n            sx:p.x,\n            sy:p.y,\n            orig:{\n                x:crop.x,\n                y:crop.y,\n                w:crop.width,\n                h:crop.height\n            }\n        };\n\n        if(mode===\"move\"){\n            initialRatio=crop.width\/crop.height;\n        }\n    }\n\n    function moveDrag(e){\n        if(!drag)return;\n\n        e.preventDefault();\n\n        var p=point(e);\n        var dx=p.x-drag.sx;\n        var dy=p.y-drag.sy;\n        var o=drag.orig;\n        var min=30;\n\n        var left=o.x;\n        var top=o.y;\n        var right=o.x+o.w;\n        var bottom=o.y+o.h;\n\n        if(drag.mode===\"move\"){\n            left=o.x+dx;\n            top=o.y+dy;\n\n            crop.x=Math.max(\n                imageLeft,\n                Math.min(left,imageLeft+imageDisplayWidth-o.w)\n            );\n\n            crop.y=Math.max(\n                imageTop,\n                Math.min(top,imageTop+imageDisplayHeight-o.h)\n            );\n\n            updateUI();\n            return;\n        }\n\n        var m=30;\n\n        if(drag.mode.indexOf(\"e\")>=0){\n            right=Math.max(\n                o.x+m,\n                Math.min(o.x+o.w+dx,imageLeft+imageDisplayWidth)\n            );\n        }\n\n        if(drag.mode.indexOf(\"w\")>=0){\n            left=Math.min(\n                o.x+o.w-m,\n                Math.max(o.x+dx,imageLeft)\n            );\n        }\n\n        if(drag.mode.indexOf(\"s\")>=0){\n            bottom=Math.max(\n                o.y+m,\n                Math.min(o.y+o.h+dy,imageTop+imageDisplayHeight)\n            );\n        }\n\n        if(drag.mode.indexOf(\"n\")>=0){\n            top=Math.min(\n                o.y+o.h-m,\n                Math.max(o.y+dy,imageTop)\n            );\n        }\n\n        if(lock.checked){\n            var ratio=initialRatio||o.w\/o.h;\n\n            if(\n                drag.mode.indexOf(\"e\")>=0 ||\n                drag.mode.indexOf(\"w\")>=0\n            ){\n                var nw=right-left;\n                var nh=nw\/ratio;\n\n                if(drag.mode.indexOf(\"n\")>=0){\n                    top=bottom-nh;\n                }else{\n                    bottom=top+nh;\n                }\n            }else{\n                var nh2=bottom-top;\n                var nw2=nh2*ratio;\n\n                if(drag.mode.indexOf(\"w\")>=0){\n                    left=right-nw2;\n                }else{\n                    right=left+nw2;\n                }\n            }\n\n            if(left<imageLeft){\n                left=imageLeft;\n                right=left+(bottom-top)*ratio;\n            }\n\n            if(right>imageLeft+imageDisplayWidth){\n                right=imageLeft+imageDisplayWidth;\n                left=right-(bottom-top)*ratio;\n            }\n\n            if(top<imageTop){\n                top=imageTop;\n                bottom=top+(right-left)\/ratio;\n            }\n\n            if(bottom>imageTop+imageDisplayHeight){\n                bottom=imageTop+imageDisplayHeight;\n                top=bottom-(right-left)\/ratio;\n            }\n        }\n\n        crop.x=left;\n        crop.y=top;\n        crop.width=Math.max(m,right-left);\n        crop.height=Math.max(m,bottom-top);\n\n        updateUI();\n    }\n\n    document.addEventListener(\"pointermove\",moveDrag);\n    document.addEventListener(\"pointerup\",function(){drag=null});\n\n    cropBox.querySelectorAll(\".crop-handle\").forEach(function(h){\n        h.addEventListener(\"pointerdown\",function(e){\n            startDrag(e,h.dataset.handle);\n        });\n    });\n\n    cropBox.querySelector(\".crop-move-area\").addEventListener(\n        \"pointerdown\",\n        function(e){startDrag(e,\"move\")}\n    );\n\n    input.addEventListener(\"change\",async function(){\n        var file=input.files&&input.files[0];\n\n        if(!file)return;\n\n        try{\n            image=await loadImage(file);\n            infoImg.textContent=\n                \"\u1ea2nh g\u1ed1c: \"+\n                image.naturalWidth+\n                \" \u00d7 \"+\n                image.naturalHeight+\n                \" px\";\n\n            layout();\n            setupCrop();\n\n        }catch(e){\n            message.textContent=e.message;\n        }\n    });\n\n    window.addEventListener(\"resize\",function(){\n        if(image)layout();\n    });\n\n    reset.addEventListener(\"click\",function(){\n        if(!image)return;\n\n        zoomInput.value=\"1\";\n        layout();\n        setupCrop();\n        message.textContent=\"\u0110\u00e3 reset v\u00f9ng c\u1eaft.\";\n    });\n\n    center.addEventListener(\"click\",function(){\n        if(!image)return;\n\n        crop.x=imageLeft+(imageDisplayWidth-crop.width)\/2;\n        crop.y=imageTop+(imageDisplayHeight-crop.height)\/2;\n        updateUI();\n    });\n\n    zoomInput.addEventListener(\"input\",function(){\n        if(!image)return;\n        setupCrop();\n    });\n\n    ow.addEventListener(\"input\",function(){\n        if(lock.checked&&crop.width){\n            var r=crop.width\/crop.height;\n            var v=parseInt(ow.value,10);\n\n            if(v)oh.value=Math.round(v\/r);\n        }\n    });\n\n    oh.addEventListener(\"input\",function(){\n        if(lock.checked&&crop.height){\n            var r=crop.width\/crop.height;\n            var v=parseInt(oh.value,10);\n\n            if(v)ow.value=Math.round(v*r);\n        }\n    });\n\n    button.addEventListener(\"click\",async function(){\n        if(!image){\n            message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh.\";\n            return;\n        }\n\n        var tw=parseInt(ow.value,10);\n        var th=parseInt(oh.value,10);\n\n        if(!tw||!th){\n            message.textContent=\"K\u00edch th\u01b0\u1edbc xu\u1ea5t kh\u00f4ng h\u1ee3p l\u1ec7.\";\n            return;\n        }\n\n        var type=format.value;\n\n        if(type===\"image\/avif\"&&!canEncode(type)){\n            message.textContent=\"Tr\u00ecnh duy\u1ec7t ch\u01b0a h\u1ed7 tr\u1ee3 xu\u1ea5t AVIF.\";\n            return;\n        }\n\n        var sx=(crop.x-imageLeft)\/imageScale;\n        var sy=(crop.y-imageTop)\/imageScale;\n        var sw=crop.width\/imageScale;\n        var sh=crop.height\/imageScale;\n\n        var out=document.createElement(\"canvas\");\n        out.width=tw;\n        out.height=th;\n\n        var ctx=out.getContext(\"2d\");\n\n        if(type===\"image\/jpeg\"){\n            ctx.fillStyle=\"#fff\";\n            ctx.fillRect(0,0,tw,th);\n        }\n\n        ctx.imageSmoothingEnabled=true;\n        ctx.imageSmoothingQuality=\"high\";\n\n        ctx.drawImage(\n            image,\n            sx,sy,sw,sh,\n            0,0,tw,th\n        );\n\n        var blob=await makeBlob(out,type,.9);\n\n        if(!blob){\n            message.textContent=\"Kh\u00f4ng th\u1ec3 t\u1ea1o \u1ea3nh.\";\n            return;\n        }\n\n        var url=URL.createObjectURL(blob);\n        var ext=extensionFromMime(type);\n\n        result.innerHTML=\n            '<div class=\"result-card\">'+\n            '<img decoding=\"async\" src=\"'+url+'\" alt=\"\u1ea2nh \u0111\u00e3 c\u1eaft\">'+\n            '<strong>'+tw+\" \u00d7 \"+th+\" px<\/strong><br>\"+\n            '<span>'+formatBytes(blob.size)+'<\/span>'+\n            '<\/div>';\n\n        var link=document.createElement(\"a\");\n        link.className=\"download-link\";\n        link.textContent=\"\u2b07\ufe0f T\u1ea3i \u1ea3nh xu\u1ed1ng\";\n        link.href=url;\n        link.download=\"cropped-image.\"+ext;\n\n        result.querySelector(\".result-card\").appendChild(link);\n\n        message.textContent=\"\u0110\u00e3 c\u1eaft \u1ea3nh th\u00e0nh c\u00f4ng.\";\n    });\n\n    setupDragDrop(input.closest(\".itool-upload\"));\n}\n\n\n\/* =========================================================\n   IMAGE CONVERTER\n   ========================================================= *\/\n\nfunction initConverter(box){\n    var modeButtons=box.querySelectorAll(\".converter-mode\");\n    var modePanels=box.querySelectorAll(\".converter-mode-panel\");\n\n    modeButtons.forEach(function(btn){\n        btn.addEventListener(\"click\",function(){\n            var target=btn.dataset.convertMode;\n\n            modeButtons.forEach(function(x){x.classList.remove(\"active\")});\n            modePanels.forEach(function(x){x.classList.remove(\"active\")});\n\n            btn.classList.add(\"active\");\n\n            var p=box.querySelector(\n                '[data-convert-mode-panel=\"'+target+'\"]'\n            );\n\n            if(p)p.classList.add(\"active\");\n        });\n    });\n\n    initImageConverter(box);\n    initDocumentConverter(box);\n}\n\n\n\/* =========================================================\n   IMAGE CONVERTER\n   ========================================================= *\/\n\nfunction initImageConverter(box){\n    var input=box.querySelector(\".convert-files\");\n    var list=box.querySelector(\".convert-list\");\n    var button=box.querySelector(\".convert-start\");\n    var format=box.querySelector(\".convert-format\");\n    var quality=box.querySelector(\".convert-quality\");\n    var message=box.querySelector(\".converter-mode-panel[data-convert-mode-panel='image'] .itool-message\");\n    var files=[];\n\n    input.addEventListener(\"change\",function(){\n        files=Array.from(input.files||[]);\n        renderFileList(list,files);\n    });\n\n    button.addEventListener(\"click\",async function(){\n        if(!files.length){\n            message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh.\";\n            return;\n        }\n\n        var type=format.value;\n\n        if(type===\"image\/avif\"&&!canEncode(type)){\n            message.textContent=\"Tr\u00ecnh duy\u1ec7t n\u00e0y ch\u01b0a h\u1ed7 tr\u1ee3 xu\u1ea5t AVIF.\";\n            return;\n        }\n\n        button.disabled=true;\n        message.textContent=\"\u0110ang chuy\u1ec3n \u0111\u1ed5i...\";\n        list.innerHTML=\"\";\n\n        for(var file of files){\n            try{\n                var img=await loadImage(file);\n                var canvas=document.createElement(\"canvas\");\n\n                canvas.width=img.naturalWidth;\n                canvas.height=img.naturalHeight;\n\n                var ctx=canvas.getContext(\"2d\");\n\n                if(type===\"image\/jpeg\"){\n                    ctx.fillStyle=\"#fff\";\n                    ctx.fillRect(0,0,canvas.width,canvas.height);\n                }\n\n                ctx.drawImage(img,0,0);\n\n                var blob=await makeBlob(\n                    canvas,\n                    type,\n                    parseFloat(quality.value)\n                );\n\n                if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c file.\");\n\n                var ext=extensionFromMime(type);\n                var base=file.name.replace(\/\\.[^\/.]+$\/,\"\");\n                var newName=base+\"-converted.\"+ext;\n\n                var row=document.createElement(\"div\");\n                row.className=\"file-row\";\n\n                var info=document.createElement(\"span\");\n                info.className=\"file-size\";\n                info.innerHTML=\n                    \"<strong>\"+escapeHtml(newName)+\"<\/strong><br>\"+\n                    formatBytes(blob.size);\n\n                var link=document.createElement(\"a\");\n                link.className=\"download-link\";\n                link.textContent=\"\u2b07\ufe0f T\u1ea3i xu\u1ed1ng\";\n                link.href=URL.createObjectURL(blob);\n                link.download=newName;\n\n                row.appendChild(info);\n                row.appendChild(link);\n                list.appendChild(row);\n\n            }catch(e){\n                console.error(e);\n\n                var er=document.createElement(\"div\");\n                er.className=\"file-row\";\n                er.textContent=\"Kh\u00f4ng th\u1ec3 chuy\u1ec3n \u0111\u1ed5i: \"+file.name;\n                list.appendChild(er);\n            }\n        }\n\n        message.textContent=\"\u0110\u00e3 chuy\u1ec3n \u0111\u1ed5i \"+files.length+\" \u1ea3nh.\";\n        button.disabled=false;\n    });\n\n    setupDragDrop(input.closest(\".itool-upload\"));\n}\n\n\n\/* =========================================================\n   LAZY LIBRARIES\n   ========================================================= *\/\n\nvar libPromises={};\n\nfunction loadPDFJS(){\n    if(libPromises.pdf)return libPromises.pdf;\n\n    libPromises.pdf=import(\n        \"https:\/\/cdn.jsdelivr.net\/npm\/pdfjs-dist@6.1.200\/build\/pdf.mjs\"\n    ).then(function(pdfjsLib){\n        pdfjsLib.GlobalWorkerOptions.workerSrc=\n            \"https:\/\/cdn.jsdelivr.net\/npm\/pdfjs-dist@6.1.200\/build\/pdf.worker.mjs\";\n\n        window.__IT_PDFJS=pdfjsLib;\n        return pdfjsLib;\n    });\n\n    return libPromises.pdf;\n}\n\nfunction loadSheetJS(){\n    if(libPromises.xlsx)return libPromises.xlsx;\n\n    libPromises.xlsx=loadScriptOnce(\n        \"https:\/\/cdn.sheetjs.com\/xlsx-0.20.3\/package\/dist\/xlsx.full.min.js\",\n        function(){return !!window.XLSX}\n    ).then(function(){\n        if(!window.XLSX){\n            throw new Error(\"Kh\u00f4ng kh\u1edfi t\u1ea1o \u0111\u01b0\u1ee3c SheetJS.\");\n        }\n\n        return window.XLSX;\n    });\n\n    return libPromises.xlsx;\n}\n\nfunction loadMammoth(){\n    if(libPromises.mammoth)return libPromises.mammoth;\n\n    libPromises.mammoth=loadScriptOnce(\n        \"https:\/\/cdn.jsdelivr.net\/npm\/mammoth@1.12.0\/mammoth.browser.min.js\",\n        function(){return !!window.mammoth}\n    ).then(function(){\n        if(!window.mammoth){\n            throw new Error(\"Kh\u00f4ng kh\u1edfi t\u1ea1o \u0111\u01b0\u1ee3c Mammoth.\");\n        }\n\n        return window.mammoth;\n    });\n\n    return libPromises.mammoth;\n}\n\nfunction loadHtml2Canvas(){\n    if(libPromises.html2canvas)return libPromises.html2canvas;\n\n    libPromises.html2canvas=loadScriptOnce(\n        \"https:\/\/cdn.jsdelivr.net\/npm\/html2canvas@1.4.1\/dist\/html2canvas.min.js\",\n        function(){return !!window.html2canvas}\n    ).then(function(){\n        if(!window.html2canvas){\n            throw new Error(\"Kh\u00f4ng kh\u1edfi t\u1ea1o \u0111\u01b0\u1ee3c html2canvas.\");\n        }\n\n        return window.html2canvas;\n    });\n\n    return libPromises.html2canvas;\n}\n\nfunction loadPptxViewJS(){\n    if(libPromises.pptx)return libPromises.pptx;\n\n    libPromises.pptx=loadScriptOnce(\n        \"https:\/\/cdn.jsdelivr.net\/npm\/jszip@3.10.1\/dist\/jszip.min.js\",\n        function(){return !!window.JSZip}\n    ).then(function(){\n        return loadScriptOnce(\n            \"https:\/\/cdn.jsdelivr.net\/npm\/pptxviewjs@1.1.9\/dist\/PptxViewJS.min.js\",\n            function(){return !!window.PptxViewJS}\n        );\n    }).then(function(){\n        if(!window.PptxViewJS){\n            throw new Error(\"Kh\u00f4ng kh\u1edfi t\u1ea1o \u0111\u01b0\u1ee3c PptxViewJS.\");\n        }\n\n        return window.PptxViewJS;\n    });\n\n    return libPromises.pptx;\n}\n\n\n\/* =========================================================\n   DOCUMENT CONVERTER\n   ========================================================= *\/\n\nfunction initDocumentConverter(box){\n\n    var input=box.querySelector(\".document-files\");\n    var list=box.querySelector(\".document-list\");\n    var button=box.querySelector(\".document-start\");\n    var format=box.querySelector(\".document-output-format\");\n    var quality=box.querySelector(\".document-output-quality\");\n    var pageInput=box.querySelector(\".document-pages\");\n    var scaleInput=box.querySelector(\".document-scale\");\n    var message=box.querySelector(\".converter-mode-panel[data-convert-mode-panel='document'] .itool-message\");\n    var files=[];\n\n    input.addEventListener(\"change\",function(){\n        files=Array.from(input.files||[]);\n        renderFileList(list,files);\n    });\n\n    button.addEventListener(\"click\",async function(){\n\n        if(!files.length){\n            message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u00edt nh\u1ea5t m\u1ed9t file.\";\n            return;\n        }\n\n        var type=format.value;\n\n        if(type===\"image\/avif\"&&!canEncode(type)){\n            message.textContent=\"Tr\u00ecnh duy\u1ec7t ch\u01b0a h\u1ed7 tr\u1ee3 AVIF.\";\n            return;\n        }\n\n        button.disabled=true;\n        cleanupListObjectURLs(list);\n        list.innerHTML=\"\";\n        message.textContent=\"\u0110ang t\u1ea3i th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft...\";\n\n        var totalDone=0;\n\n        try{\n\n            for(var file of files){\n\n                var ext=file.name.toLowerCase().split(\".\").pop();\n\n                try{\n\n                    if(ext===\"pdf\"){\n                        totalDone+=await convertPDF(\n                            file,\n                            type,\n                            parseFloat(quality.value),\n                            pageInput.value,\n                            parseFloat(scaleInput.value),\n                            list,\n                            message\n                        );\n\n                    }else if(ext===\"xlsx\" || ext===\"xls\"){\n                        totalDone+=await convertExcel(\n                            file,\n                            type,\n                            parseFloat(quality.value),\n                            parseFloat(scaleInput.value),\n                            pageInput.value,\n                            list,\n                            message\n                        );\n\n                    }else if(ext===\"docx\"){\n                        totalDone+=await convertDOCX(\n                            file,\n                            type,\n                            parseFloat(quality.value),\n                            parseFloat(scaleInput.value),\n                            pageInput.value,\n                            list,\n                            message\n                        );\n\n                    }else if(ext===\"pptx\"){\n                        totalDone+=await convertPPTX(\n                            file,\n                            type,\n                            parseFloat(quality.value),\n                            pageInput.value,\n                            parseFloat(scaleInput.value),\n                            list,\n                            message\n                        );\n\n                    }else if(ext===\"doc\" || ext===\"ppt\"){\n                        addDocumentError(\n                            list,\n                            file.name,\n                            \"DOC\/PPT \u0111\u1eddi c\u0169 kh\u00f4ng \u0111\u01b0\u1ee3c parser browser-side n\u00e0y h\u1ed7 tr\u1ee3. H\u00e3y l\u01b0u l\u1ea1i th\u00e0nh DOCX\/PPTX r\u1ed3i th\u1eed l\u1ea1i.\"\n                        );\n\n                    }else{\n                        addDocumentError(\n                            list,\n                            file.name,\n                            \"\u0110\u1ecbnh d\u1ea1ng ch\u01b0a \u0111\u01b0\u1ee3c h\u1ed7 tr\u1ee3.\"\n                        );\n                    }\n\n                }catch(err){\n                    console.error(err);\n\n                    addDocumentError(\n                        list,\n                        file.name,\n                        err && err.message\n                            ? err.message\n                            : \"Kh\u00f4ng th\u1ec3 x\u1eed l\u00fd file.\"\n                    );\n                }\n            }\n\n            message.textContent=\n                \"Ho\u00e0n t\u1ea5t. \u0110\u00e3 t\u1ea1o \"+totalDone+\" \u1ea3nh.\";\n\n        }catch(e){\n            console.error(e);\n            message.textContent=e.message||\"C\u00f3 l\u1ed7i khi x\u1eed l\u00fd.\";\n        }\n\n        button.disabled=false;\n    });\n\n    setupDragDrop(input.closest(\".itool-upload\"));\n}\n\nfunction addDocumentError(list,name,error){\n    var row=document.createElement(\"div\");\n    row.className=\"file-row\";\n    row.innerHTML=\n        \"<span><strong>\"+escapeHtml(name)+\"<\/strong><br>\"+\n        '<span class=\"file-size\">'+escapeHtml(error)+'<\/span><\/span>';\n    list.appendChild(row);\n}\n\nasync function convertPDF(\n    file,\n    outputType,\n    quality,\n    selection,\n    scale,\n    list,\n    message\n){\n    var pdfjsLib=await loadPDFJS();\n    message.textContent=\"\u0110ang \u0111\u1ecdc PDF: \"+file.name;\n\n    var data=await file.arrayBuffer();\n    var pdf=await pdfjsLib.getDocument({data:data}).promise;\n    var pages=parseSelection(selection,pdf.numPages);\n    var done=0;\n\n    for(var i=0;i<pages.length;i++){\n        var pageNo=pages[i];\n        message.textContent=\"PDF \"+file.name+\": trang \"+(i+1)+\"\/\"+pages.length+\" (trang PDF \"+pageNo+\")\";\n\n        var page=await pdf.getPage(pageNo);\n        var viewport=page.getViewport({scale:Math.max(.5,parseFloat(scale)||1)*1.5});\n        var dims=ensureCanvasSize(viewport.width,viewport.height,\"Trang PDF\");\n        var canvas=document.createElement(\"canvas\");\n        canvas.width=dims.width;\n        canvas.height=dims.height;\n\n        try{\n            var ctx=canvas.getContext(\"2d\",{alpha:false});\n            await page.render({canvasContext:ctx,viewport:viewport}).promise;\n            var blob=await makeBlob(canvas,outputType,quality);\n            if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb PDF.\");\n\n            var ext=extensionFromMime(outputType);\n            var base=file.name.replace(\/\\.[^\/.]+$\/i,\"\");\n            var name=base+\"-page-\"+pageNo+\".\"+ext;\n            addDocumentDownload(list,name,blob,\"Trang \"+pageNo+\" \u2022 \"+formatBytes(blob.size));\n            done++;\n        }finally{\n            canvas.width=1;\n            canvas.height=1;\n        }\n        await sleep(0);\n    }\n    return done;\n}\n\nasync function convertExcel(\n    file,\n    outputType,\n    quality,\n    scale,\n    selection,\n    list,\n    message\n){\n    var XLSX=await loadSheetJS();\n    await loadHtml2Canvas();\n    message.textContent=\"\u0110ang \u0111\u1ecdc Excel: \"+file.name;\n\n    var buffer=await file.arrayBuffer();\n    var workbook=XLSX.read(buffer,{type:\"array\",cellStyles:true,cellDates:true});\n    if(!workbook.SheetNames.length)throw new Error(\"File Excel kh\u00f4ng c\u00f3 worksheet.\");\n\n    var selected=parseSelection(selection,workbook.SheetNames.length);\n    var done=0;\n\n    for(var i=0;i<selected.length;i++){\n        var sheetIndex=selected[i]-1;\n        var sheetName=workbook.SheetNames[sheetIndex];\n        message.textContent=\"Excel \"+file.name+\": sheet \"+(i+1)+\"\/\"+selected.length+\" \u2014 \"+sheetName;\n        var sheet=workbook.Sheets[sheetName];\n        var html=XLSX.utils.sheet_to_html(sheet,{header:\"\",footer:\"\",editable:false});\n\n        var host=document.createElement(\"div\");\n        host.className=\"document-preview-host\";\n        var page=document.createElement(\"div\");\n        page.className=\"document-render-page\";\n        page.style.width=(1000*parseFloat(scale))+\"px\";\n        page.style.minHeight=(1414*parseFloat(scale))+\"px\";\n        page.innerHTML=\"<h2>\"+escapeHtml(sheetName)+\"<\/h2>\"+html;\n        host.appendChild(page);\n        document.body.appendChild(host);\n\n        try{\n            await sleep(50);\n            var shot=await window.html2canvas(page,{scale:Math.max(1,parseFloat(scale)||1),backgroundColor:\"#ffffff\",useCORS:true,logging:false});\n            ensureCanvasSize(shot.width,shot.height,\"Sheet Excel\");\n            var blob=await makeBlob(shot,outputType,quality);\n            if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb Excel.\");\n\n            var ext=extensionFromMime(outputType);\n            var base=file.name.replace(\/\\.[^\/.]+$\/i,\"\");\n            var name=base+\"-\"+safeFileName(sheetName)+\".\"+ext;\n            addDocumentDownload(list,name,blob,\"Sheet: \"+sheetName+\" \u2022 \"+formatBytes(blob.size));\n            done++;\n            shot.width=1; shot.height=1;\n        }finally{\n            host.remove();\n        }\n        await sleep(0);\n    }\n    return done;\n}\n\nasync function convertDOCX(\n    file,\n    outputType,\n    quality,\n    scale,\n    selection,\n    list,\n    message\n){\n    var mammoth=await loadMammoth();\n    await loadHtml2Canvas();\n    message.textContent=\"\u0110ang \u0111\u1ecdc Word: \"+file.name;\n\n    var arrayBuffer=await file.arrayBuffer();\n    var result=await mammoth.convertToHtml({arrayBuffer:arrayBuffer});\n    var html=result.value||\"\";\n    if(!html.trim())throw new Error(\"DOCX kh\u00f4ng c\u00f3 n\u1ed9i dung c\u00f3 th\u1ec3 hi\u1ec3n th\u1ecb.\");\n\n    var host=document.createElement(\"div\");\n    host.className=\"document-preview-host\";\n    var source=document.createElement(\"div\");\n    source.className=\"document-render-page\";\n    source.style.width=(1000*scale)+\"px\";\n    source.innerHTML=html;\n    host.appendChild(source);\n    document.body.appendChild(host);\n\n    var pageHeight=1414*scale;\n    var pageInnerHeight=Math.max(200,pageHeight-90*scale);\n    var nodes=Array.from(source.children);\n    var pages=[];\n    var current=null;\n\n    function newPage(){\n        var page=document.createElement(\"div\");\n        page.className=\"document-render-page\";\n        page.style.width=(1000*scale)+\"px\";\n        page.style.minHeight=pageHeight+\"px\";\n        page.style.height=pageHeight+\"px\";\n        page.style.overflow=\"hidden\";\n        current=page;\n        pages.push(page);\n        return page;\n    }\n\n    try{\n        newPage();\n        for(var i=0;i<nodes.length;i++){\n            var node=nodes[i];\n            current.appendChild(node);\n            await sleep(0);\n            if(current.scrollHeight>pageInnerHeight && current.children.length>1){\n                current.removeChild(node);\n                current=newPage();\n                current.appendChild(node);\n            }\n        }\n\n        \/* N\u1ebfu DOCX ch\u1ec9 c\u00f3 text node ngo\u00e0i element, \u0111\u1ea3m b\u1ea3o v\u1eabn c\u00f3 \u00edt nh\u1ea5t 1 trang. *\/\n        if(!pages.length)newPage();\n\n        var selected=parseSelection(selection,pages.length);\n        var base=file.name.replace(\/\\.[^\/.]+$\/i,\"\");\n        var ext=extensionFromMime(outputType);\n        var done=0;\n\n        for(var p=0;p<selected.length;p++){\n            var pageNo=selected[p];\n            message.textContent=\"Word \"+file.name+\": trang \"+(p+1)+\"\/\"+selected.length+\" (trang \"+pageNo+\")\";\n            document.body.appendChild(pages[pageNo-1]);\n            await sleep(30);\n            var shot=await window.html2canvas(pages[pageNo-1],{scale:Math.max(1,scale),backgroundColor:\"#ffffff\",useCORS:true,logging:false});\n            ensureCanvasSize(shot.width,shot.height,\"Trang DOCX\");\n            var blob=await makeBlob(shot,outputType,quality);\n            if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb DOCX.\");\n            var name=base+\"-page-\"+pageNo+\".\"+ext;\n            addDocumentDownload(list,name,blob,\"DOCX \u2192 HTML \u2192 \u1ea3nh \u2022 Trang \"+pageNo+\" \u2022 \"+formatBytes(blob.size));\n            done++;\n            shot.width=1; shot.height=1;\n            pages[pageNo-1].remove();\n            await sleep(0);\n        }\n\n        if(result.messages && result.messages.length){\n            var warning=document.createElement(\"div\");\n            warning.className=\"file-row\";\n            warning.innerHTML=\"<span class='file-size'>L\u01b0u \u00fd DOCX: \"+result.messages.length+\" c\u1ea3nh b\u00e1o v\u1ec1 \u0111\u1ecbnh d\u1ea1ng trong qu\u00e1 tr\u00ecnh chuy\u1ec3n \u0111\u1ed5i. B\u1ed1 c\u1ee5c c\u00f3 th\u1ec3 kh\u00e1c Microsoft Word.<\/span>\";\n            list.appendChild(warning);\n        }\n        return done;\n    }finally{\n        host.remove();\n        pages.forEach(function(page){if(page.parentNode)page.parentNode.removeChild(page);});\n    }\n}\n\nasync function convertPPTX(\n    file,\n    outputType,\n    quality,\n    selection,\n    scale,\n    list,\n    message\n){\n    var PptxViewJS=await loadPptxViewJS();\n\n    message.textContent=\"\u0110ang \u0111\u1ecdc PowerPoint: \"+file.name;\n\n    if(!PptxViewJS.PPTXViewer){\n        throw new Error(\"PptxViewJS kh\u00f4ng cung c\u1ea5p PPTXViewer.\");\n    }\n\n    var host=document.createElement(\"div\");\n    host.style.position=\"fixed\";\n    host.style.left=\"-100000px\";\n    host.style.top=\"-100000px\";\n    host.style.width=\"1280px\";\n    host.style.height=\"720px\";\n    host.style.background=\"#fff\";\n\n    var canvas=document.createElement(\"canvas\");\n    var pptDims=ensureCanvasSize(1280*scale,720*scale,\"Slide PPTX\");\n    canvas.width=pptDims.width;\n    canvas.height=pptDims.height;\n\n    host.appendChild(canvas);\n    document.body.appendChild(host);\n\n    var viewer=new PptxViewJS.PPTXViewer({\n        canvas:canvas\n    });\n\n    await viewer.loadFile(file);\n\n    var count=viewer.getSlideCount();\n    var slides=parseSelection(selection,count);\n    var done=0;\n\n    for(var i=0;i<slides.length;i++){\n\n        var slideNo=slides[i];\n\n        message.textContent=\n            \"PPTX \"+file.name+\": slide \"+(i+1)+\"\/\"+slides.length+\" (slide \"+slideNo+\")\";\n\n        await viewer.goToSlide(slideNo-1);\n        await viewer.render();\n\n        \/*\n         * Ch\u1edd browser ho\u00e0n t\u1ea5t paint c\u1ee7a canvas.\n         *\/\n        await sleep(80);\n\n        var copy=document.createElement(\"canvas\");\n        copy.width=canvas.width;\n        copy.height=canvas.height;\n\n        copy.getContext(\"2d\").drawImage(\n            canvas,\n            0,\n            0,\n            copy.width,\n            copy.height\n        );\n\n        var blob=await makeBlob(\n            copy,\n            outputType,\n            quality\n        );\n\n        if(!blob)throw new Error(\"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh t\u1eeb PPTX.\");\n\n        var ext=extensionFromMime(outputType);\n        var base=file.name.replace(\/\\.[^\/.]+$\/,\"\");\n        var name=base+\"-slide-\"+slideNo+\".\"+ext;\n\n        addDocumentDownload(\n            list,\n            name,\n            blob,\n            \"Slide \"+slideNo+\" \u2022 \"+formatBytes(blob.size)\n        );\n\n        done++;\n        await sleep(0);\n    }\n\n    host.remove();\n\n    return done;\n}\n\nfunction safeFileName(name){\n    return String(name||\"sheet\")\n        .replace(\/[\\\\\/:*?\"<>|]+\/g,\"-\")\n        .replace(\/\\s+\/g,\"-\")\n        .substring(0,80);\n}\n\nfunction addDocumentDownload(list,name,blob,meta){\n    if(!list._itoolObjectURLs)list._itoolObjectURLs=[];\n    var url=URL.createObjectURL(blob);\n    list._itoolObjectURLs.push(url);\n\n    var row=document.createElement(\"div\");\n    row.className=\"file-row\";\n    var info=document.createElement(\"span\");\n    info.className=\"file-size\";\n    info.innerHTML=\"<strong>\"+escapeHtml(name)+\"<\/strong><br>\"+escapeHtml(meta||formatBytes(blob.size));\n\n    var link=document.createElement(\"a\");\n    link.className=\"download-link\";\n    link.textContent=\"\u2b07\ufe0f T\u1ea3i xu\u1ed1ng\";\n    link.href=url;\n    link.download=name;\n\n    row.appendChild(info);\n    row.appendChild(link);\n    list.appendChild(row);\n}\n\nfunction cleanupListObjectURLs(list){\n    if(!list || !list._itoolObjectURLs)return;\n    list._itoolObjectURLs.forEach(function(url){\n        try{URL.revokeObjectURL(url);}catch(e){}\n    });\n    list._itoolObjectURLs=[];\n}\n\n\n\n\/* =========================================================\n   WATERMARK \/ EDITOR\n   ========================================================= *\/\n\nfunction initWatermark(box){\n\n    var editorButtons=box.querySelectorAll(\".editor-mode\");\n    var editorPanels=box.querySelectorAll(\".editor-mode-panel\");\n\n    editorButtons.forEach(function(btn){\n        btn.addEventListener(\"click\",function(){\n            var target=btn.dataset.editorMode;\n\n            editorButtons.forEach(function(x){x.classList.remove(\"active\")});\n            editorPanels.forEach(function(x){x.classList.remove(\"active\")});\n\n            btn.classList.add(\"active\");\n\n            var p=box.querySelector(\n                '[data-editor-mode-panel=\"'+target+'\"]'\n            );\n\n            if(p)p.classList.add(\"active\");\n        });\n    });\n\n    initSingleEditor(box);\n    initBatchWatermark(box);\n}\n\n\n\/* =========================================================\n   SINGLE EDITOR\n   ========================================================= *\/\n\nfunction initSingleEditor(box){\n    var imageInput=box.querySelector(\".watermark-image\");\n    var logoInput=box.querySelector(\".watermark-logo\");\n    var canvas=box.querySelector(\".watermark-canvas\");\n    var preview=box.querySelector(\".watermark-preview\");\n    var dragLogo=box.querySelector(\".watermark-drag-logo\");\n    var logoPreview=box.querySelector(\".watermark-logo-preview\");\n    var resizeHandle=box.querySelector(\".wm-resize-handle\");\n    var position=box.querySelector(\".watermark-position\");\n    var size=box.querySelector(\".watermark-size\");\n    var opacity=box.querySelector(\".watermark-opacity\");\n    var margin=box.querySelector(\".watermark-margin\");\n    var format=box.querySelector(\".watermark-format\");\n    var button=box.querySelector(\".watermark-start\");\n    var resetBtn=box.querySelector(\".watermark-reset\");\n    var result=box.querySelector(\".watermark-result\");\n    var message=box.querySelector(\".editor-mode-panel[data-editor-mode-panel='single'] .itool-message\");\n    var sizeValue=box.querySelector(\".range-value\");\n    var opacityValue=box.querySelector(\".opacity-value\");\n    var marginValue=box.querySelector(\".margin-value\");\n    var textInput=box.querySelector(\".editor-text-input\");\n    var textColor=box.querySelector(\".editor-text-color\");\n    var textSize=box.querySelector(\".editor-text-size\");\n    var textFont=box.querySelector(\".editor-text-font\");\n    var textWeight=box.querySelector(\".editor-text-weight\");\n    var addText=box.querySelector(\".add-text-object\");\n    var updateText=box.querySelector(\".update-text-object\");\n    var emojiInput=box.querySelector(\".editor-emoji-input\");\n    var emojiSize=box.querySelector(\".editor-emoji-size\");\n    var addEmoji=box.querySelector(\".add-emoji-object\");\n    var deleteObject=box.querySelector(\".delete-selected-object\");\n    var objectLayer=box.querySelector(\".editor-object-layer\");\n    var flipXBtn=box.querySelector(\".editor-flip-x\");\n    var flipYBtn=box.querySelector(\".editor-flip-y\");\n    var rotateLeftBtn=box.querySelector(\".editor-rotate-left\");\n    var rotateRightBtn=box.querySelector(\".editor-rotate-right\");\n    var resetTransformBtn=box.querySelector(\".editor-reset-transform\");\n    var rotationValue=box.querySelector(\".editor-rotation-value\");\n    var flipValue=box.querySelector(\".editor-transform-flip-value\");\n    var cropToggle=box.querySelector(\".editor-crop-toggle\");\n    var cropReset=box.querySelector(\".editor-crop-reset\");\n    var cropApply=box.querySelector(\".editor-crop-apply\");\n    var cropRatio=box.querySelector(\".editor-crop-ratio\");\n    var cropLayer=box.querySelector(\".editor-crop-layer\");\n    var cropBox=box.querySelector(\".editor-crop-box\");\n\n\n    var mainImage=null;\n    var logoImage=null;\n    var logoPreviewURL=null;\n    var resultURL=null;\n    var displayScale=1;\n    var logoState={x:.75,y:.75,w:.20,h:.20};\n    var logoDrag=null;\n    var objects=[];\n    var selectedObjectId=null;\n    var objectDrag=null;\n    var objectResize=null;\n    var transformState={rotation:0,flipX:false,flipY:false};\n    var cropState={active:false,x:0,y:0,w:1,h:1};\n    var cropDrag=null;\n\n    var MIN_SIZE=8;\n    var MAX_SIZE=300;\n    var MAX_OUTPUT_PIXELS=40000000;\n\n    function clamp(v,min,max){return Math.max(min,Math.min(max,v));}\n\n    function editorFont(obj,size){\n        if(obj.type===\"emoji\"){\n            return size+\"px \\\"Segoe UI Emoji\\\",\\\"Apple Color Emoji\\\",\\\"Noto Color Emoji\\\",\\\"Twemoji Mozilla\\\",sans-serif\";\n        }\n        return (obj.italic?\"italic \":\"\")+(obj.weight||400)+\" \"+size+\"px \\\"\"+String(obj.font||\"Arial\").replace(\/\\\"\/g,\"\\\\\\\"\")+\"\\\"\";\n    }\n\n    function getObjectMetrics(ctx,obj,size){\n        ctx.save();\n        ctx.font=editorFont(obj,size);\n        var m=ctx.measureText(obj.text||\"\");\n        var width=Math.max(1,m.width);\n        var ascent=m.actualBoundingBoxAscent||size*.75;\n        var descent=m.actualBoundingBoxDescent||size*.25;\n        ctx.restore();\n        return {width:width,height:Math.max(size,ascent+descent)};\n    }\n\n    function clampObjectPosition(obj){\n        if(!mainImage||!canvas.width||!canvas.height)return;\n        var ctx=canvas.getContext(\"2d\");\n        var metrics=getObjectMetrics(ctx,obj,obj.size);\n        var halfW=Math.min(.49,(metrics.width\/2)\/canvas.width);\n        var halfH=Math.min(.49,(metrics.height\/2)\/canvas.height);\n        obj.x=clamp(obj.x,halfW,1-halfW);\n        obj.y=clamp(obj.y,halfH,1-halfH);\n    }\n\n    function transformedSize(){\n        if(!mainImage)return {width:0,height:0};\n        var w=mainImage.naturalWidth,h=mainImage.naturalHeight;\n        if(transformState.rotation===90||transformState.rotation===270){\n            return {width:h,height:w};\n        }\n        return {width:w,height:h};\n    }\n\n    function drawTransformedImage(ctx,img,outWidth,outHeight){\n        ctx.save();\n        ctx.translate(outWidth\/2,outHeight\/2);\n        ctx.rotate(transformState.rotation*Math.PI\/180);\n        ctx.scale(transformState.flipX?-1:1,transformState.flipY?-1:1);\n        ctx.drawImage(img,-img.naturalWidth\/2,-img.naturalHeight\/2);\n        ctx.restore();\n    }\n\n    function updateTransformStatus(){\n        if(rotationValue)rotationValue.textContent=(transformState.rotation||0)+\"\u00b0\";\n        if(flipValue){\n            if(transformState.flipX&&transformState.flipY)flipValue.textContent=\"L\u1eadt ngang + d\u1ecdc\";\n            else if(transformState.flipX)flipValue.textContent=\"L\u1eadt ngang\";\n            else if(transformState.flipY)flipValue.textContent=\"L\u1eadt d\u1ecdc\";\n            else flipValue.textContent=\"B\u00ecnh th\u01b0\u1eddng\";\n        }\n    }\n\n\n    var emojiImageCache={};\n    function getEmojiImage(value){\n        if(!value)return null;\n        var key=value;\n        if(emojiImageCache[key])return emojiImageCache[key];\n        var img=new Image();\n        img.crossOrigin=\"anonymous\";\n        img.src=\"https:\/\/cdn.jsdelivr.net\/gh\/twitter\/twemoji@14.0.2\/assets\/svg\/\"+emojiCodePoints(value)+\".svg\";\n        emojiImageCache[key]=img;\n        img.onload=function(){ if(mainImage){ draw(); } };\n        return img;\n    }\n\n    function drawObjectToCanvas(ctx,obj,outWidth,outHeight){\n        var px=Math.max(MIN_SIZE,obj.size);\n        var x=obj.x*outWidth;\n        var y=obj.y*outHeight;\n        ctx.save();\n        ctx.textAlign=\"center\";\n        ctx.textBaseline=\"middle\";\n        ctx.font=editorFont(obj,px);\n\n        if(obj.type===\"text\"){\n            ctx.fillStyle=obj.color||\"#ffffff\";\n            if(obj.shadow){\n                ctx.shadowColor=\"rgba(0,0,0,.38)\";\n                ctx.shadowBlur=Math.max(2,px*.08);\n                ctx.shadowOffsetX=Math.max(1,px*.05);\n                ctx.shadowOffsetY=Math.max(1,px*.05);\n            }\n        }else{\n            ctx.fillStyle=\"#000000\";\n        }\n\n        if(obj.type===\"emoji\") {\n            var emojiImg=getEmojiImage(obj.text);\n            if(emojiImg && emojiImg.complete && emojiImg.naturalWidth){\n                var es=Math.max(MIN_SIZE,obj.size);\n                ctx.drawImage(emojiImg,x-es\/2,y-es\/2,es,es);\n            }else{\n                ctx.fillStyle=\"#111827\";\n                ctx.fillText(obj.text,x,y);\n            }\n        } else {\n            ctx.fillText(obj.text,x,y);\n        }\n\n        if(obj.type===\"text\" && obj.underline){\n            var metrics=getObjectMetrics(ctx,obj,px);\n            var lineY=y+metrics.height*.32;\n            ctx.save();\n            ctx.shadowColor=\"transparent\";\n            ctx.shadowBlur=0;\n            ctx.shadowOffsetX=0;\n            ctx.shadowOffsetY=0;\n            ctx.strokeStyle=obj.color||\"#ffffff\";\n            ctx.lineWidth=Math.max(1,px*.045);\n            ctx.beginPath();\n            ctx.moveTo(x-metrics.width\/2,lineY);\n            ctx.lineTo(x+metrics.width\/2,lineY);\n            ctx.stroke();\n            ctx.restore();\n        }\n        ctx.restore();\n    }\n\n    function draw(){\n        if(!mainImage)return;\n        var dims=transformedSize();\n        var mw=900,mh=650;\n        displayScale=Math.min(mw\/dims.width,mh\/dims.height,1);\n        var w=Math.max(1,Math.round(dims.width*displayScale));\n        var h=Math.max(1,Math.round(dims.height*displayScale));\n        canvas.width=w;\n        canvas.height=h;\n        var ctx=canvas.getContext(\"2d\");\n        ctx.clearRect(0,0,w,h);\n        drawTransformedImage(ctx,mainImage,w,h);\n\n        if(logoImage){\n            var lw=w*logoState.w;\n            var lh=logoImage.naturalHeight\/logoImage.naturalWidth*lw;\n            logoState.h=clamp(lh\/h,.001,1);\n            logoState.x=clamp(logoState.x,0,1-logoState.w);\n            logoState.y=clamp(logoState.y,0,1-logoState.h);\n            ctx.save();\n            ctx.globalAlpha=parseInt(opacity.value,10)\/100;\n            ctx.drawImage(logoImage,logoState.x*w,logoState.y*h,lw,lh);\n            ctx.restore();\n            updateLogoOverlay();\n        }else{\n            dragLogo.style.display=\"none\";\n        }\n\n        objects.forEach(clampObjectPosition);\n        renderObjectsOverlay();\n        updateCropOverlay();\n        updateTransformStatus();\n    }\n\n    function updateLogoOverlay(){\n        if(!mainImage||!logoImage)return;\n        var canvasRect=canvas.getBoundingClientRect();\n        var previewRect=preview.getBoundingClientRect();\n        if(!canvasRect.width||!canvasRect.height)return;\n        var lw=canvasRect.width*logoState.w;\n        var lh=canvasRect.height*logoState.h;\n        var ox=canvasRect.left-previewRect.left;\n        var oy=canvasRect.top-previewRect.top;\n        dragLogo.style.display=\"block\";\n        dragLogo.style.left=(ox+logoState.x*canvasRect.width)+\"px\";\n        dragLogo.style.top=(oy+logoState.y*canvasRect.height)+\"px\";\n        dragLogo.style.width=lw+\"px\";\n        dragLogo.style.height=lh+\"px\";\n        logoPreview.style.opacity=parseInt(opacity.value,10)\/100;\n    }\n\n    function setQuick(v){\n        if(!logoImage)return;\n        var m=parseInt(margin.value,10)\/100;\n        var w=logoState.w,h=logoState.h;\n        position.value=v;\n        switch(v){\n            case\"top-left\": logoState.x=m;logoState.y=m;break;\n            case\"top-center\": logoState.x=(1-w)\/2;logoState.y=m;break;\n            case\"top-right\": logoState.x=1-w-m;logoState.y=m;break;\n            case\"center\": logoState.x=(1-w)\/2;logoState.y=(1-h)\/2;break;\n            case\"bottom-left\": logoState.x=m;logoState.y=1-h-m;break;\n            case\"bottom-center\": logoState.x=(1-w)\/2;logoState.y=1-h-m;break;\n            case\"bottom-right\": logoState.x=1-w-m;logoState.y=1-h-m;break;\n        }\n        logoState.x=clamp(logoState.x,0,1-logoState.w);\n        logoState.y=clamp(logoState.y,0,1-logoState.h);\n        draw();\n    }\n\n    function pointer(e){\n        var r=preview.getBoundingClientRect();\n        return {x:e.clientX-r.left,y:e.clientY-r.top};\n    }\n\n    function startLogoDrag(e,mode){\n        if(!logoImage)return;\n        e.preventDefault();\n        e.stopPropagation();\n        if(dragLogo.setPointerCapture){try{dragLogo.setPointerCapture(e.pointerId);}catch(err){}}\n        var p=pointer(e);\n        logoDrag={mode:mode,sx:p.x,sy:p.y,x:logoState.x,y:logoState.y,w:logoState.w,h:logoState.h};\n        position.value=\"free\";\n    }\n\n    function moveLogo(e){\n        if(!logoDrag||!logoImage)return;\n        e.preventDefault();\n        var p=pointer(e),r=canvas.getBoundingClientRect();\n        if(!r.width||!r.height)return;\n        var dx=(p.x-logoDrag.sx)\/r.width,dy=(p.y-logoDrag.sy)\/r.height;\n        if(logoDrag.mode===\"move\"){\n            logoState.x=clamp(logoDrag.x+dx,0,1-logoDrag.w);\n            logoState.y=clamp(logoDrag.y+dy,0,1-logoDrag.h);\n        }else{\n            var ratio=logoImage.naturalHeight\/logoImage.naturalWidth;\n            var nw=clamp(logoDrag.w+dx,.03,1-logoDrag.x);\n            var nh=clamp(nw*ratio*r.width\/r.height,.03,1-logoDrag.y);\n            logoState.w=nw;logoState.h=nh;\n            size.value=Math.round(nw*100);\n            sizeValue.textContent=size.value+\"%\";\n        }\n        draw();\n    }\n\n    dragLogo.addEventListener(\"pointerdown\",function(e){startLogoDrag(e,\"move\")});\n    resizeHandle.addEventListener(\"pointerdown\",function(e){startLogoDrag(e,\"resize\")});\n    document.addEventListener(\"pointermove\",moveLogo,{passive:false});\n    document.addEventListener(\"pointerup\",function(){logoDrag=null;});\n\n    function toggleTextStyle(styleName){\n        var obj=selectedObject();\n        if(!obj||obj.type!==\"text\"){\n            message.textContent=\"H\u00e3y ch\u1ecdn m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng ch\u1eef tr\u01b0\u1edbc.\";\n            return;\n        }\n        obj[styleName]=!obj[styleName];\n        syncStyleButtons(obj);\n        renderObjectsOverlay();\n        draw();\n    }\n\n    function syncStyleButtons(obj){\n        box.querySelectorAll(\".text-style-btn\").forEach(function(btn){\n            btn.classList.toggle(\"active\",!!(obj&&obj[btn.dataset.textStyle]));\n        });\n    }\n\n    box.querySelectorAll(\".text-style-btn\").forEach(function(btn){\n        btn.addEventListener(\"click\",function(){toggleTextStyle(btn.dataset.textStyle);});\n    });\n\n    function createObject(type,value){\n        if(!mainImage){message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh tr\u01b0\u1edbc.\";return;}\n        value=String(value||\"\").trim();\n        if(!value)return;\n        var id=\"obj_\"+Date.now()+\"_\"+Math.floor(Math.random()*10000);\n        var obj={\n            id:id,type:type,text:value,x:.5,y:.5,\n            size:clamp(parseInt(type===\"text\"?textSize.value:emojiSize.value,10)||48,MIN_SIZE,MAX_SIZE),\n            color:type===\"text\"?textColor.value:\"#ffffff\",\n            font:type===\"text\"?textFont.value:\"Arial\",\n            weight:type===\"text\"?parseInt(textWeight.value,10)||400:400,\n            italic:false,underline:false,shadow:false\n        };\n        objects.push(obj);selectedObjectId=id;\n        clampObjectPosition(obj);\n        renderObjectsOverlay();syncSelectedControls();draw();\n    }\n\n    function selectedObject(){\n        return objects.find(function(o){return o.id===selectedObjectId;})||null;\n    }\n\n    function renderObjectsOverlay(){\n        objectLayer.innerHTML=\"\";\n        if(!mainImage)return;\n        var canvasRect=canvas.getBoundingClientRect();\n        var previewRect=preview.getBoundingClientRect();\n        if(!canvasRect.width||!canvasRect.height)return;\n        var visualScale=canvasRect.width\/canvas.width;\n\n        objects.forEach(function(obj){\n            var el=document.createElement(\"div\");\n            el.className=\"editor-object \"+(obj.type===\"text\"?\"text-object\":\"emoji-object\");\n            if(obj.id===selectedObjectId)el.classList.add(\"selected\");\n            el.dataset.objectId=obj.id;\n            el.textContent=obj.text;\n            el.style.left=(canvasRect.left-previewRect.left+obj.x*canvasRect.width)+\"px\";\n            el.style.top=(canvasRect.top-previewRect.top+obj.y*canvasRect.height)+\"px\";\n            el.style.fontSize=(obj.size*visualScale)+\"px\";\n            if(obj.type===\"text\"){\n                el.style.color=obj.color;\n                el.style.fontFamily=obj.font;\n                el.style.fontWeight=obj.weight;\n                el.style.fontStyle=obj.italic?\"italic\":\"normal\";\n                el.style.textDecoration=obj.underline?\"underline\":\"none\";\n                el.style.textShadow=obj.shadow?\"2px 2px 3px rgba(0,0,0,.38)\":\"none\";\n            }else{\n                el.style.fontFamily='\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",\"Twemoji Mozilla\",sans-serif';\n                el.style.fontVariantEmoji=\"emoji\";\n                \/* Keep the editable overlay visible even if WordPress rewrites emoji. *\/\n                el.innerHTML=\"\";\n                var emojiImg=document.createElement(\"img\");\n                emojiImg.alt=obj.text;\n                emojiImg.draggable=false;\n                emojiImg.src=\"https:\/\/cdn.jsdelivr.net\/gh\/twitter\/twemoji@14.0.2\/assets\/svg\/\"+emojiCodePoints(obj.text)+\".svg\";\n                emojiImg.style.cssText=\"display:block!important;width:\"+(obj.size*visualScale)+\"px!important;height:\"+(obj.size*visualScale)+\"px!important;max-width:none!important;object-fit:contain!important;pointer-events:none!important;\";\n                emojiImg.onerror=function(){\n                    emojiImg.remove();\n                    var span=document.createElement(\"span\");\n                    span.textContent=obj.text;\n                    span.style.cssText='font-family:\"Segoe UI Emoji\",\"Apple Color Emoji\",\"Noto Color Emoji\",sans-serif!important;font-size:'+(obj.size*visualScale)+'px!important;line-height:1!important;';\n                    el.appendChild(span);\n                };\n                el.appendChild(emojiImg);\n            }\n            if(obj.id===selectedObjectId){\n                var handle=document.createElement(\"span\");\n                handle.className=\"editor-object-resize-handle\";\n                handle.title=\"K\u00e9o \u0111\u1ec3 ph\u00f3ng to \/ thu nh\u1ecf\";\n                handle.addEventListener(\"pointerdown\",function(e){e.preventDefault();e.stopPropagation();startObjectResize(e,obj.id);});\n                el.appendChild(handle);\n            }\n            el.addEventListener(\"pointerdown\",function(e){\n                if(!e.target.classList || !e.target.classList.contains(\"editor-object-resize-handle\")){selectObject(obj.id);startObjectDrag(e,obj.id);}\n            });\n            objectLayer.appendChild(el);\n        });\n    }\n\n    function selectObject(id){\n        selectedObjectId=id;renderObjectsOverlay();syncSelectedControls();\n    }\n\n    function syncSelectedControls(){\n        var obj=selectedObject();\n        if(!obj){syncStyleButtons(null);return;}\n        if(obj.type===\"text\"){\n            textInput.value=obj.text;textColor.value=obj.color;textSize.value=obj.size;textFont.value=obj.font;textWeight.value=obj.weight;syncStyleButtons(obj);\n        }else{\n            emojiInput.value=obj.text;emojiSize.value=obj.size;syncStyleButtons(null);\n        }\n    }\n\n\n    function resetCropState(){\n        cropState={active:false,x:0,y:0,w:1,h:1};\n        if(cropLayer)cropLayer.classList.remove(\"active\");\n        if(preview)preview.classList.remove(\"crop-mode\");\n        if(cropToggle)cropToggle.textContent=\"\u2702\ufe0f B\u1eadt khung c\u1eaft\";\n    }\n\n    function resetCropRect(){\n        cropState.x=0;cropState.y=0;cropState.w=1;cropState.h=1;\n        updateCropOverlay();\n    }\n\n    function setCropRatio(value){\n        if(!mainImage||!canvas.width||!canvas.height)return;\n        if(value===\"free\"){updateCropOverlay();return;}\n        var parts=value.split(\":\");\n        var ratio=parseFloat(parts[0])\/parseFloat(parts[1]);\n        if(!isFinite(ratio)||ratio<=0)return;\n        var current=canvas.width\/canvas.height;\n        var x=cropState.x,y=cropState.y,w=cropState.w,h=cropState.h;\n        if(w\/h>ratio){\n            w=h*ratio;\n        }else{\n            h=w\/ratio;\n        }\n        w=clamp(w,.05,1);h=clamp(h,.05,1);\n        x=clamp(x+(cropState.w-w)\/2,0,1-w);\n        y=clamp(y+(cropState.h-h)\/2,0,1-h);\n        cropState.x=x;cropState.y=y;cropState.w=w;cropState.h=h;\n        updateCropOverlay();\n    }\n\n    function updateCropOverlay(){\n        if(!cropLayer||!cropBox||!canvas||!preview)return;\n        if(!cropState.active){\n            cropLayer.classList.remove(\"active\");\n            preview.classList.remove(\"crop-mode\");\n            return;\n        }\n        var cr=canvas.getBoundingClientRect();\n        var pr=preview.getBoundingClientRect();\n        if(!cr.width||!cr.height)return;\n        cropLayer.classList.add(\"active\");\n        preview.classList.add(\"crop-mode\");\n        var left=cr.left-pr.left+cropState.x*cr.width;\n        var top=cr.top-pr.top+cropState.y*cr.height;\n        cropBox.style.left=left+\"px\";\n        cropBox.style.top=top+\"px\";\n        cropBox.style.width=(cropState.w*cr.width)+\"px\";\n        cropBox.style.height=(cropState.h*cr.height)+\"px\";\n        cropLayer.setAttribute(\"aria-hidden\",\"false\");\n    }\n\n    function cropPointerPosition(e){\n        var r=canvas.getBoundingClientRect();\n        return {\n            x:clamp((e.clientX-r.left)\/Math.max(r.width,1),0,1),\n            y:clamp((e.clientY-r.top)\/Math.max(r.height,1),0,1)\n        };\n    }\n\n    function startCropDrag(e,mode){\n        if(!cropState.active||!mainImage)return;\n        e.preventDefault();e.stopPropagation();\n        var p=cropPointerPosition(e);\n        cropDrag={\n            mode:mode,sx:p.x,sy:p.y,\n            x:cropState.x,y:cropState.y,w:cropState.w,h:cropState.h\n        };\n        if(cropBox.setPointerCapture){try{cropBox.setPointerCapture(e.pointerId);}catch(err){}}\n    }\n\n    function applyCropRatioToRect(state,ratio,anchorX,anchorY){\n        if(ratio===\"free\")return state;\n        var parts=ratio.split(\":\");\n        var target=parseFloat(parts[0])\/parseFloat(parts[1]);\n        if(!isFinite(target)||target<=0)return state;\n        var maxW=state.w,maxH=state.h;\n        if(maxW\/maxH>target)maxW=maxH*target;\n        else maxH=maxW\/target;\n        var x=anchorX===\"right\"?state.x+state.w-maxW:anchorX===\"center\"?state.x+(state.w-maxW)\/2:state.x;\n        var y=anchorY===\"bottom\"?state.y+state.h-maxH:anchorY===\"center\"?state.y+(state.h-maxH)\/2:state.y;\n        state.w=clamp(maxW,.05,1);state.h=clamp(maxH,.05,1);\n        state.x=clamp(x,0,1-state.w);state.y=clamp(y,0,1-state.h);\n        return state;\n    }\n\n    function moveCrop(e){\n        if(!cropDrag)return;\n        e.preventDefault();\n        var p=cropPointerPosition(e);\n        var dx=p.x-cropDrag.sx,dy=p.y-cropDrag.sy;\n        var min=.03;\n        var s={\n            x:cropDrag.x,y:cropDrag.y,w:cropDrag.w,h:cropDrag.h\n        };\n        var mode=cropDrag.mode;\n        if(mode===\"move\"){\n            s.x=clamp(cropDrag.x+dx,0,1-cropDrag.w);\n            s.y=clamp(cropDrag.y+dy,0,1-cropDrag.h);\n        }else{\n            var left=cropDrag.x,top=cropDrag.y,right=cropDrag.x+cropDrag.w,bottom=cropDrag.y+cropDrag.h;\n            if(mode.indexOf(\"w\")>=0)left=clamp(cropDrag.x+dx,0,right-min);\n            if(mode.indexOf(\"e\")>=0)right=clamp(cropDrag.x+cropDrag.w+dx,left+min,1);\n            if(mode.indexOf(\"n\")>=0)top=clamp(cropDrag.y+dy,0,bottom-min);\n            if(mode.indexOf(\"s\")>=0)bottom=clamp(cropDrag.y+cropDrag.h+dy,top+min,1);\n            s.x=left;s.y=top;s.w=right-left;s.h=bottom-top;\n            if(cropRatio.value!==\"free\"){\n                var parts=cropRatio.value.split(\":\");\n                var target=parseFloat(parts[0])\/parseFloat(parts[1]);\n                if(isFinite(target)&&target>0){\n                    var fixedX=mode.indexOf(\"w\")>=0?\"right\":mode.indexOf(\"e\")>=0?\"left\":\"center\";\n                    var fixedY=mode.indexOf(\"n\")>=0?\"bottom\":mode.indexOf(\"s\")>=0?\"top\":\"center\";\n                    if(s.w\/s.h>target){\n                        s.w=s.h*target;\n                    }else{\n                        s.h=s.w\/target;\n                    }\n                    if(fixedX===\"right\")s.x=cropDrag.x+cropDrag.w-s.w;\n                    else if(fixedX===\"center\")s.x=cropDrag.x+(cropDrag.w-s.w)\/2;\n                    if(fixedY===\"bottom\")s.y=cropDrag.y+cropDrag.h-s.h;\n                    else if(fixedY===\"center\")s.y=cropDrag.y+(cropDrag.h-s.h)\/2;\n                    s.x=clamp(s.x,0,1-s.w);s.y=clamp(s.y,0,1-s.h);\n                }\n            }\n        }\n        cropState.x=s.x;cropState.y=s.y;cropState.w=s.w;cropState.h=s.h;\n        updateCropOverlay();\n    }\n\n    document.addEventListener(\"pointermove\",moveCrop,{passive:false});\n    document.addEventListener(\"pointerup\",function(){cropDrag=null;});\n\n    if(cropBox){\n        cropBox.addEventListener(\"pointerdown\",function(e){\n            var handle=e.target.closest ? e.target.closest(\"[data-crop-handle]\") : null;\n            startCropDrag(e,handle?handle.getAttribute(\"data-crop-handle\"):\"move\");\n        });\n    }\n\n    if(cropToggle)cropToggle.addEventListener(\"click\",function(){\n        if(!mainImage){message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh tr\u01b0\u1edbc khi b\u1eadt khung c\u1eaft.\";return;}\n        cropState.active=!cropState.active;\n        if(cropState.active){\n            if(cropState.w>=.999&&cropState.h>=.999){cropState.x=.05;cropState.y=.05;cropState.w=.9;cropState.h=.9;}\n            cropToggle.textContent=\"\u2705 \u0110ang ch\u1ec9nh khung c\u1eaft\";\n        }else{\n            cropToggle.textContent=\"\u2702\ufe0f B\u1eadt khung c\u1eaft\";\n        }\n        updateCropOverlay();\n    });\n\n    if(cropReset)cropReset.addEventListener(\"click\",function(){\n        resetCropRect();\n        message.textContent=\"\u0110\u00e3 \u0111\u1eb7t l\u1ea1i v\u00f9ng c\u1eaft v\u1ec1 to\u00e0n b\u1ed9 \u1ea3nh.\";\n    });\n\n    if(cropRatio)cropRatio.addEventListener(\"change\",function(){\n        if(!mainImage)return;\n        setCropRatio(cropRatio.value);\n    });\n\n    async function applyEditorCrop(){\n        if(!mainImage){\n            message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh tr\u01b0\u1edbc khi c\u1eaft.\";\n            return;\n        }\n        if(!cropState.active){\n            message.textContent=\"H\u00e3y b\u1eadt khung c\u1eaft v\u00e0 ch\u1ecdn v\u00f9ng c\u1ea7n c\u1eaft tr\u01b0\u1edbc.\";\n            return;\n        }\n        var dims=transformedSize();\n        var sx=Math.max(0,Math.round(cropState.x*dims.width));\n        var sy=Math.max(0,Math.round(cropState.y*dims.height));\n        var sw=Math.max(1,Math.round(cropState.w*dims.width));\n        var sh=Math.max(1,Math.round(cropState.h*dims.height));\n        sw=Math.min(sw,dims.width-sx);\n        sh=Math.min(sh,dims.height-sy);\n        if(sw<2||sh<2){\n            message.textContent=\"V\u00f9ng c\u1eaft qu\u00e1 nh\u1ecf.\";\n            return;\n        }\n        if(sw*sh>MAX_OUTPUT_PIXELS){\n            message.textContent=\"V\u00f9ng c\u1eaft qu\u00e1 l\u1edbn \u0111\u1ec3 x\u1eed l\u00fd an to\u00e0n.\";\n            return;\n        }\n\n        if(cropApply)cropApply.disabled=true;\n        try{\n            \/* Render only the transformed base image. Logo\/Text\/Emoji are NOT\n               baked into the crop, so the user can continue editing them. *\/\n            var full=document.createElement(\"canvas\");\n            full.width=dims.width;\n            full.height=dims.height;\n            var fctx=full.getContext(\"2d\");\n            drawTransformedImage(fctx,mainImage,full.width,full.height);\n\n            var out=document.createElement(\"canvas\");\n            out.width=sw;\n            out.height=sh;\n            var octx=out.getContext(\"2d\");\n            octx.drawImage(full,sx,sy,sw,sh,0,0,sw,sh);\n\n            var blob=await new Promise(function(resolve,reject){\n                out.toBlob(function(b){b?resolve(b):reject(new Error(\"Kh\u00f4ng th\u1ec3 t\u1ea1o \u1ea3nh sau khi c\u1eaft.\"));},\"image\/png\");\n            });\n            var url=URL.createObjectURL(blob);\n            var img=new Image();\n            img.onload=function(){\n                \/* Map existing overlay positions from the old transformed\n                   canvas into the new cropped canvas. *\/\n                var oldW=dims.width,oldH=dims.height;\n                if(logoImage){\n                    var oldLX=logoState.x*oldW;\n                    var oldLY=logoState.y*oldH;\n                    var oldLW=logoState.w*oldW;\n                    var oldLH=logoState.h*oldH;\n                    logoState.x=(oldLX-sx)\/sw;\n                    logoState.y=(oldLY-sy)\/sh;\n                    logoState.w=oldLW\/sw;\n                    logoState.h=oldLH\/sh;\n                    logoState.x=clamp(logoState.x,0,Math.max(0,1-logoState.w));\n                    logoState.y=clamp(logoState.y,0,Math.max(0,1-logoState.h));\n                    logoState.w=clamp(logoState.w,.001,1);\n                    logoState.h=clamp(logoState.h,.001,1);\n                }\n                objects.forEach(function(obj){\n                    var oldX=obj.x*oldW,oldY=obj.y*oldH;\n                    obj.x=(oldX-sx)\/sw;\n                    obj.y=(oldY-sy)\/sh;\n                    clampObjectPosition(obj);\n                });\n\n                mainImage=img;\n                transformState={rotation:0,flipX:false,flipY:false};\n                cropState={active:false,x:0,y:0,w:1,h:1};\n                if(cropLayer)cropLayer.classList.remove(\"active\");\n                if(preview)preview.classList.remove(\"crop-mode\");\n                if(cropToggle)cropToggle.textContent=\"\u2702\ufe0f B\u1eadt khung c\u1eaft\";\n                URL.revokeObjectURL(url);\n                full.width=1;full.height=1;out.width=1;out.height=1;\n                draw();\n                message.textContent=\"\u0110\u00e3 c\u1eaft \u1ea3nh theo \u0111\u00fang v\u00f9ng b\u1ea1n ch\u1ecdn. B\u1ea1n c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c ch\u1ec9nh s\u1eeda.\";\n                if(cropApply)cropApply.disabled=false;\n            };\n            img.onerror=function(){\n                URL.revokeObjectURL(url);\n                if(cropApply)cropApply.disabled=false;\n                message.textContent=\"Kh\u00f4ng th\u1ec3 t\u1ea3i \u1ea3nh sau khi c\u1eaft.\";\n            };\n            img.src=url;\n        }catch(err){\n            console.error(err);\n            if(cropApply)cropApply.disabled=false;\n            message.textContent=err.message||\"Kh\u00f4ng th\u1ec3 \u00e1p d\u1ee5ng v\u00f9ng c\u1eaft.\";\n        }\n    }\n\n    if(cropApply)cropApply.addEventListener(\"click\",function(){applyEditorCrop();});\n\n    function applyTransform(action){\n        if(!mainImage){message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh tr\u01b0\u1edbc.\";return;}\n        if(action===\"flipX\")transformState.flipX=!transformState.flipX;\n        if(action===\"flipY\")transformState.flipY=!transformState.flipY;\n        if(action===\"left\")transformState.rotation=(transformState.rotation+270)%360;\n        if(action===\"right\")transformState.rotation=(transformState.rotation+90)%360;\n        draw();\n        message.textContent=\"\u0110\u00e3 c\u1eadp nh\u1eadt bi\u1ebfn \u0111\u1ed5i \u1ea3nh.\";\n    }\n\n    if(flipXBtn)flipXBtn.addEventListener(\"click\",function(){applyTransform(\"flipX\");});\n    if(flipYBtn)flipYBtn.addEventListener(\"click\",function(){applyTransform(\"flipY\");});\n    if(rotateLeftBtn)rotateLeftBtn.addEventListener(\"click\",function(){applyTransform(\"left\");});\n    if(rotateRightBtn)rotateRightBtn.addEventListener(\"click\",function(){applyTransform(\"right\");});\n    if(resetTransformBtn)resetTransformBtn.addEventListener(\"click\",function(){\n        transformState={rotation:0,flipX:false,flipY:false};\n        draw();\n        message.textContent=\"\u0110\u00e3 \u0111\u1eb7t l\u1ea1i l\u1eadt\/xoay \u1ea3nh.\";\n    });\n\n    function startObjectDrag(e,id){\n        e.preventDefault();e.stopPropagation();\n        var obj=objects.find(function(o){return o.id===id;});if(!obj)return;\n        if(e.currentTarget&&e.currentTarget.setPointerCapture){try{e.currentTarget.setPointerCapture(e.pointerId);}catch(err){}}\n        var p=pointer(e);\n        objectDrag={id:id,sx:p.x,sy:p.y,x:obj.x,y:obj.y};\n    }\n\n    function moveObject(e){\n        if(!objectDrag)return;e.preventDefault();\n        var obj=objects.find(function(o){return o.id===objectDrag.id;});if(!obj)return;\n        var p=pointer(e),r=canvas.getBoundingClientRect();if(!r.width||!r.height)return;\n        obj.x=objectDrag.x+(p.x-objectDrag.sx)\/r.width;\n        obj.y=objectDrag.y+(p.y-objectDrag.sy)\/r.height;\n        clampObjectPosition(obj);renderObjectsOverlay();\n    }\n    document.addEventListener(\"pointermove\",moveObject,{passive:false});\n\n    function startObjectResize(e,id){\n        e.preventDefault();e.stopPropagation();\n        var obj=objects.find(function(o){return o.id===id;});if(!obj)return;\n        var p=pointer(e);objectResize={id:id,sx:p.x,sy:p.y,size:obj.size};selectedObjectId=id;\n    }\n\n    function moveObjectResize(e){\n        if(!objectResize)return;e.preventDefault();\n        var obj=objects.find(function(o){return o.id===objectResize.id;});if(!obj||!mainImage)return;\n        var p=pointer(e),r=canvas.getBoundingClientRect();if(!r.width)return;\n        var delta=((p.x-objectResize.sx)+(p.y-objectResize.sy))\/2;\n        var visualScale=r.width\/mainImage.naturalWidth;\n        obj.size=clamp(Math.round(objectResize.size+delta\/Math.max(visualScale,.0001)),MIN_SIZE,MAX_SIZE);\n        if(obj.type===\"text\")textSize.value=obj.size;else emojiSize.value=obj.size;\n        clampObjectPosition(obj);renderObjectsOverlay();\n    }\n    document.addEventListener(\"pointermove\",moveObjectResize,{passive:false});\n    document.addEventListener(\"pointerup\",function(){objectDrag=null;objectResize=null;logoDrag=null;});\n\n    imageInput.addEventListener(\"change\",async function(){\n        var f=imageInput.files&&imageInput.files[0];if(!f)return;\n        try{mainImage=await loadImage(f);objects=[];selectedObjectId=null;transformState={rotation:0,flipX:false,flipY:false};cropState={active:false,x:0,y:0,w:1,h:1};if(cropToggle)cropToggle.textContent=\"\u2702\ufe0f B\u1eadt khung c\u1eaft\";if(cropLayer)cropLayer.classList.remove(\"active\");draw();message.textContent=\"\u0110\u00e3 t\u1ea3i \u1ea3nh: \"+f.name;}catch(e){message.textContent=e.message;}\n    });\n\n    logoInput.addEventListener(\"change\",async function(){\n        var f=logoInput.files&&logoInput.files[0];if(!f)return;\n        try{\n            logoImage=await loadImage(f);\n            if(logoPreviewURL)URL.revokeObjectURL(logoPreviewURL);\n            logoPreviewURL=URL.createObjectURL(f);logoPreview.src=logoPreviewURL;\n            var w=parseInt(size.value,10)\/100;\n            logoState.w=w;logoState.x=clamp(1-w-parseInt(margin.value,10)\/100,0,1-w);\n            logoState.y=clamp(1-logoState.h-parseInt(margin.value,10)\/100,0,1-logoState.h);\n            draw();\n        }catch(e){message.textContent=e.message;}\n    });\n\n    position.addEventListener(\"change\",function(){if(position.value!==\"free\")setQuick(position.value);});\n    size.addEventListener(\"input\",function(){sizeValue.textContent=size.value+\"%\";if(logoImage){logoState.w=clamp(parseInt(size.value,10)\/100,.03,.95);logoState.x=clamp(logoState.x,0,1-logoState.w);draw();}});\n    opacity.addEventListener(\"input\",function(){opacityValue.textContent=opacity.value+\"%\";draw();});\n    margin.addEventListener(\"input\",function(){marginValue.textContent=margin.value+\"%\";if(position.value!==\"free\")setQuick(position.value);});\n\n    resetBtn.addEventListener(\"click\",function(){\n        if(!logoImage)return;\n        logoState.w=clamp(parseInt(size.value,10)\/100,.03,.95);\n        logoState.x=clamp(1-logoState.w-parseInt(margin.value,10)\/100,0,1-logoState.w);\n        logoState.y=clamp(1-logoState.h-parseInt(margin.value,10)\/100,0,1-logoState.h);\n        position.value=\"free\";draw();message.textContent=\"\u0110\u00e3 \u0111\u1eb7t l\u1ea1i v\u1ecb tr\u00ed logo.\";\n    });\n\n    addText.addEventListener(\"click\",function(){createObject(\"text\",textInput.value);});\n\n    updateText.addEventListener(\"click\",function(){\n        var obj=selectedObject();\n        if(!obj||obj.type!==\"text\"){message.textContent=\"H\u00e3y ch\u1ecdn m\u1ed9t \u0111\u1ed1i t\u01b0\u1ee3ng ch\u1eef tr\u01b0\u1edbc.\";return;}\n        obj.text=textInput.value||\"\";obj.color=textColor.value;obj.size=clamp(parseInt(textSize.value,10)||48,MIN_SIZE,MAX_SIZE);obj.font=textFont.value;obj.weight=parseInt(textWeight.value,10)||400;\n        clampObjectPosition(obj);renderObjectsOverlay();draw();message.textContent=\"\u0110\u00e3 c\u1eadp nh\u1eadt ch\u1eef.\";\n    });\n\n    \/* =========================================================\n       EMOJI PALETTE - V2.3\n       Build the picker entirely from data-emoji attributes.\n       This prevents WordPress wp-emoji from replacing the source\n       glyphs before our JavaScript can read them.\n       ========================================================= *\/\n    function emojiCodePoints(value){\n        return Array.from(value).map(function(ch){return ch.codePointAt(0).toString(16);}).join(\"-\");\n    }\n\n    function emojiValueFromButton(btn){\n        var v=btn.getAttribute(\"data-emoji\");\n        if(v)return v;\n        var img=btn.querySelector(\"img.emoji\");\n        if(img){\n            v=img.getAttribute(\"alt\")||img.getAttribute(\"aria-label\")||\"\";\n            if(v)return v.trim();\n        }\n        return String(btn.textContent||\"\").trim();\n    }\n\n    function makeEmojiIcon(btn,value){\n        btn.innerHTML=\"\";\n        var img=document.createElement(\"img\");\n        img.className=\"image-tools-emoji-icon\";\n        img.alt=\"\";\n        img.setAttribute(\"aria-hidden\",\"true\");\n        img.draggable=false;\n        img.decoding=\"async\";\n        img.loading=\"eager\";\n        var cp=emojiCodePoints(value);\n        var urls=[\n            \"https:\/\/cdn.jsdelivr.net\/gh\/twitter\/twemoji@14.0.2\/assets\/svg\/\"+cp+\".svg\",\n            \"https:\/\/unpkg.com\/@twitter\/twemoji@latest\/assets\/svg\/\"+cp+\".svg\"\n        ];\n        var n=0;\n        function fail(){\n            n++;\n            if(n<urls.length){img.src=urls[n];return;}\n            img.remove();\n            var span=document.createElement(\"span\");\n            span.className=\"image-tools-emoji-fallback\";\n            span.textContent=value;\n            btn.appendChild(span);\n        }\n        img.onerror=fail;\n        img.src=urls[0];\n        btn.appendChild(img);\n    }\n\n    function setupEmojiPalette(box){\n        var palette=box.querySelector(\".emoji-palette\");\n        if(!palette)return;\n        var source=Array.prototype.slice.call(palette.querySelectorAll(\".emoji-choice\"));\n        source.forEach(function(btn){\n            var value=emojiValueFromButton(btn);\n            if(!value)return;\n            btn.setAttribute(\"data-emoji\",value);\n            btn.setAttribute(\"aria-label\",value);\n            btn.setAttribute(\"title\",value+\" \u2014 nh\u1ea5n \u0111\u1ec3 ch\u1ecdn; nh\u1ea5n 2 l\u1ea7n \u0111\u1ec3 ch\u00e8n\");\n            makeEmojiIcon(btn,value);\n        });\n        return source;\n    }\n\n    var emojiButtons=setupEmojiPalette(box) || [];\n\n    function getSelectedEmoji(btn){\n        return btn.getAttribute(\"data-emoji\")||emojiValueFromButton(btn);\n    }\n\n    emojiButtons.forEach(function(btn){\n        btn.addEventListener(\"click\",function(e){\n            e.preventDefault();\n            e.stopPropagation();\n            var value=getSelectedEmoji(btn);\n            if(!value)return;\n            emojiInput.value=value;\n            emojiButtons.forEach(function(x){x.classList.remove(\"selected\");});\n            btn.classList.add(\"selected\");\n            message.textContent=mainImage?\"\u0110\u00e3 ch\u1ecdn \"+value+\". Nh\u1ea5n \u201c\u2795 Th\u00eam emoji\u201d \u0111\u1ec3 ch\u00e8n v\u00e0o \u1ea3nh.\":\"\u0110\u00e3 ch\u1ecdn \"+value+\". H\u00e3y t\u1ea3i \u1ea3nh tr\u01b0\u1edbc.\";\n        });\n        btn.addEventListener(\"dblclick\",function(e){\n            e.preventDefault();\n            e.stopPropagation();\n            var value=getSelectedEmoji(btn);\n            if(!value)return;\n            emojiInput.value=value;\n            if(mainImage){\n                createObject(\"emoji\",value);\n                message.textContent=\"\u0110\u00e3 ch\u00e8n emoji \"+value+\" v\u00e0o \u1ea3nh.\";\n            }else{\n                message.textContent=\"\u0110\u00e3 ch\u1ecdn \"+value+\". H\u00e3y t\u1ea3i \u1ea3nh tr\u01b0\u1edbc.\";\n            }\n        });\n    });\n\n    \/* Clicking the Add button is the primary insertion path. *\/\n    addEmoji.addEventListener(\"click\",function(e){\n        e.preventDefault();\n        e.stopPropagation();\n        var emoji=String(emojiInput.value||\"\").trim();\n        if(!emoji){message.textContent=\"H\u00e3y ch\u1ecdn m\u1ed9t emoji trong danh s\u00e1ch ho\u1eb7c nh\u1eadp emoji tr\u01b0\u1edbc.\";return;}\n        if(!mainImage){message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh tr\u01b0\u1edbc khi ch\u00e8n emoji.\";return;}\n        createObject(\"emoji\",emoji);\n        message.textContent=\"\u0110\u00e3 ch\u00e8n emoji \"+emoji+\" v\u00e0o \u1ea3nh.\";\n    });\n\n    deleteObject.addEventListener(\"click\",function(){\n        if(!selectedObjectId){message.textContent=\"Ch\u01b0a ch\u1ecdn \u0111\u1ed1i t\u01b0\u1ee3ng.\";return;}\n        objects=objects.filter(function(o){return o.id!==selectedObjectId;});\n        selectedObjectId=null;renderObjectsOverlay();syncSelectedControls();draw();message.textContent=\"\u0110\u00e3 x\u00f3a \u0111\u1ed1i t\u01b0\u1ee3ng.\";\n    });\n\n    button.addEventListener(\"click\",async function(){\n        if(!mainImage){message.textContent=\"Vui l\u00f2ng ch\u1ecdn \u1ea3nh ch\u00ednh.\";return;}\n        var type=format.value;\n        if(type===\"image\/avif\"&&!canEncode(type)){message.textContent=\"Tr\u00ecnh duy\u1ec7t ch\u01b0a h\u1ed7 tr\u1ee3 xu\u1ea5t AVIF.\";return;}\n        if(mainImage.naturalWidth*mainImage.naturalHeight>MAX_OUTPUT_PIXELS){message.textContent=\"\u1ea2nh qu\u00e1 l\u1edbn \u0111\u1ec3 xu\u1ea5t an to\u00e0n. Vui l\u00f2ng d\u00f9ng \u1ea3nh nh\u1ecf h\u01a1n 40 MP.\";return;}\n        button.disabled=true;\n        try{\n            var dims=transformedSize();\n            ensureCanvasSize(dims.width,dims.height,\"\u1ea2nh xu\u1ea5t\");\n            var full=document.createElement(\"canvas\");\n            full.width=dims.width;full.height=dims.height;\n            var fctx=full.getContext(\"2d\");\n            if(type===\"image\/jpeg\"){fctx.fillStyle=\"#fff\";fctx.fillRect(0,0,full.width,full.height);}\n            drawTransformedImage(fctx,mainImage,full.width,full.height);\n            if(logoImage){\n                var lw=full.width*logoState.w,lh=logoImage.naturalHeight\/logoImage.naturalWidth*lw;\n                fctx.save();fctx.globalAlpha=parseInt(opacity.value,10)\/100;\n                fctx.drawImage(logoImage,logoState.x*full.width,logoState.y*full.height,lw,lh);\n                fctx.restore();\n            }\n            objects.forEach(function(obj){clampObjectPosition(obj);drawObjectToCanvas(fctx,obj,full.width,full.height);});\n\n            var sx=0,sy=0,sw=full.width,sh=full.height;\n            if(cropState.active){\n                sx=Math.max(0,Math.round(cropState.x*full.width));\n                sy=Math.max(0,Math.round(cropState.y*full.height));\n                sw=Math.max(1,Math.round(cropState.w*full.width));\n                sh=Math.max(1,Math.round(cropState.h*full.height));\n                sw=Math.min(sw,full.width-sx);\n                sh=Math.min(sh,full.height-sy);\n            }\n            ensureCanvasSize(sw,sh,\"V\u00f9ng c\u1eaft\");\n            var out=document.createElement(\"canvas\");\n            out.width=sw;out.height=sh;\n            var ctx=out.getContext(\"2d\");\n            if(type===\"image\/jpeg\"){ctx.fillStyle=\"#fff\";ctx.fillRect(0,0,out.width,out.height);}\n            ctx.drawImage(full,sx,sy,sw,sh,0,0,sw,sh);\n            var blob=await makeBlob(out,type,.9);\n            if(!blob)throw new Error(\"Kh\u00f4ng th\u1ec3 t\u1ea1o \u1ea3nh.\");\n            if(resultURL)URL.revokeObjectURL(resultURL);\n            resultURL=URL.createObjectURL(blob);\n            var ext=extensionFromMime(type);\n            result.innerHTML='<div class=\"result-card\"><img decoding=\"async\" src=\"'+resultURL+'\" alt=\"\u1ea2nh \u0111\u00e3 ch\u1ec9nh s\u1eeda\"><strong>'+formatBytes(blob.size)+'<\/strong><\/div>';\n            var link=document.createElement(\"a\");link.className=\"download-link\";link.textContent=\"\u2b07\ufe0f T\u1ea3i \u1ea3nh xu\u1ed1ng\";link.href=resultURL;link.download=\"edited-image.\"+ext;result.querySelector(\".result-card\").appendChild(link);\n            message.textContent=\"\u0110\u00e3 xu\u1ea5t \u1ea3nh th\u00e0nh c\u00f4ng.\";\n            out.width=1;out.height=1;full.width=1;full.height=1;\n        }catch(e){console.error(e);message.textContent=e.message||\"Kh\u00f4ng th\u1ec3 xu\u1ea5t \u1ea3nh.\";}\n        finally{button.disabled=false;}\n    });\n\n    window.addEventListener(\"resize\",function(){if(mainImage){requestAnimationFrame(function(){updateLogoOverlay();renderObjectsOverlay();updateCropOverlay();});}});\n    if(window.ResizeObserver){var ro=new ResizeObserver(function(){if(mainImage){updateLogoOverlay();renderObjectsOverlay();updateCropOverlay();}});ro.observe(preview);}\n\n    setupDragDrop(imageInput.closest(\".itool-upload\"));\n    setupDragDrop(logoInput.closest(\".itool-upload\"));\n}\n\n\n\/* =========================================================\n   BATCH LOGO\n   ========================================================= *\/\n\nfunction initBatchWatermark(box){\n\n    var imagesInput=box.querySelector(\".batch-images\");\n    var logoInput=box.querySelector(\".batch-logo\");\n\n    var position=box.querySelector(\".batch-position\");\n    var size=box.querySelector(\".batch-size\");\n    var opacity=box.querySelector(\".batch-opacity\");\n    var margin=box.querySelector(\".batch-margin\");\n    var format=box.querySelector(\".batch-format\");\n\n    var sizeValue=box.querySelector(\".batch-size-value\");\n    var opacityValue=box.querySelector(\".batch-opacity-value\");\n    var marginValue=box.querySelector(\".batch-margin-value\");\n\n    var list=box.querySelector(\".batch-file-list\");\n    var button=box.querySelector(\".batch-start\");\n    var result=box.querySelector(\".batch-result\");\n    var message=box.querySelector(\".editor-mode-panel[data-editor-mode-panel='batch'] .itool-message\");\n\n    var images=[];\n    var logo=null;\n    var resultURLs=[];\n    var MAX_BATCH_FILES=100;\n    var MAX_BATCH_PIXELS=40000000;\n\n    imagesInput.addEventListener(\n        \"change\",\n        function(){\n            images=Array.from(imagesInput.files||[]);\n            if(images.length>MAX_BATCH_FILES){\n                images=images.slice(0,MAX_BATCH_FILES);\n                message.textContent=\"Batch t\u1ed1i \u0111a \"+MAX_BATCH_FILES+\" \u1ea3nh m\u1ed7i l\u1ea7n.\";\n            }\n\n            list.innerHTML=\"\";\n\n            images.forEach(\n                function(file,index){\n\n                    var row=document.createElement(\"div\");\n                    row.className=\"file-row\";\n\n                    row.innerHTML=\n                        \"<span>\"+\n                        \"<strong>\"+(index+1)+\". \"+\n                        escapeHtml(file.name)+\n                        \"<\/strong>\"+\n                        \"<\/span>\"+\n                        '<span class=\"file-size\">'+\n                        formatBytes(file.size)+\n                        \"<\/span>\";\n\n                    list.appendChild(row);\n                }\n            );\n\n            message.textContent=\n                \"\u0110\u00e3 ch\u1ecdn \"+images.length+\" \u1ea3nh.\";\n        }\n    );\n\n    logoInput.addEventListener(\n        \"change\",\n        function(){\n            logo=logoInput.files&&logoInput.files[0]\n                ? logoInput.files[0]\n                : null;\n\n            if(logo){\n                message.textContent=\n                    \"\u0110\u00e3 ch\u1ecdn logo: \"+logo.name;\n            }\n        }\n    );\n\n    size.addEventListener(\n        \"input\",\n        function(){\n            sizeValue.textContent=\n                size.value+\"%\";\n        }\n    );\n\n    opacity.addEventListener(\n        \"input\",\n        function(){\n            opacityValue.textContent=\n                opacity.value+\"%\";\n        }\n    );\n\n    margin.addEventListener(\n        \"input\",\n        function(){\n            marginValue.textContent=\n                margin.value+\"%\";\n        }\n    );\n\n    button.addEventListener(\n        \"click\",\n        async function(){\n\n            if(!images.length){\n                message.textContent=\n                    \"Vui l\u00f2ng ch\u1ecdn \u00edt nh\u1ea5t m\u1ed9t \u1ea3nh.\";\n                return;\n            }\n\n            if(!logo){\n                message.textContent=\n                    \"Vui l\u00f2ng ch\u1ecdn logo.\";\n                return;\n            }\n\n            var type=format.value;\n\n            if(\n                type===\"image\/avif\" &&\n                !canEncode(type)\n            ){\n                message.textContent=\n                    \"Tr\u00ecnh duy\u1ec7t ch\u01b0a h\u1ed7 tr\u1ee3 AVIF.\";\n                return;\n            }\n\n            button.disabled=true;\n            resultURLs.forEach(function(url){try{URL.revokeObjectURL(url);}catch(e){}});\n            resultURLs=[];\n            result.innerHTML=\"\";\n            message.textContent=\n                \"\u0110ang \u0111\u1ecdc logo...\";\n\n            try{\n\n                var logoImage=await loadImage(logo);\n\n                var grid=document.createElement(\"div\");\n                grid.className=\"batch-result-grid\";\n\n                result.appendChild(grid);\n\n                var logoSize=\n                    parseInt(size.value,10)\/100;\n\n                var alpha=\n                    parseInt(opacity.value,10)\/100;\n\n                var marginPct=\n                    parseInt(margin.value,10)\/100;\n\n                for(var i=0;i<images.length;i++){\n\n                    var file=images[i];\n\n                    message.textContent=\n                        \"\u0110ang x\u1eed l\u00fd \"+(i+1)+\"\/\"+\n                        images.length+\": \"+\n                        file.name;\n\n                    try{\n\n                        var image=await loadImage(file);\n\n                        ensureCanvasSize(image.naturalWidth,image.naturalHeight,\"\u1ea2nh batch\");\n                        var out=document.createElement(\"canvas\");\n                        out.width=image.naturalWidth;\n                        out.height=image.naturalHeight;\n\n                        var ctx=out.getContext(\"2d\");\n\n                        if(type===\"image\/jpeg\"){\n                            ctx.fillStyle=\"#fff\";\n                            ctx.fillRect(\n                                0,\n                                0,\n                                out.width,\n                                out.height\n                            );\n                        }\n\n                        ctx.drawImage(\n                            image,\n                            0,\n                            0,\n                            out.width,\n                            out.height\n                        );\n\n                        var lw=\n                            out.width*logoSize;\n\n                        var lh=\n                            logoImage.naturalHeight\/\n                            logoImage.naturalWidth*\n                            lw;\n\n                        var x=marginPct*out.width;\n                        var y=marginPct*out.height;\n\n                        switch(position.value){\n\n                            case\"top-left\":\n                                break;\n\n                            case\"top-center\":\n                                x=(out.width-lw)\/2;\n                                break;\n\n                            case\"top-right\":\n                                x=out.width-lw-marginPct*out.width;\n                                break;\n\n                            case\"center\":\n                                x=(out.width-lw)\/2;\n                                y=(out.height-lh)\/2;\n                                break;\n\n                            case\"bottom-left\":\n                                y=out.height-lh-marginPct*out.height;\n                                break;\n\n                            case\"bottom-center\":\n                                x=(out.width-lw)\/2;\n                                y=out.height-lh-marginPct*out.height;\n                                break;\n\n                            case\"bottom-right\":\n                                x=out.width-lw-marginPct*out.width;\n                                y=out.height-lh-marginPct*out.height;\n                                break;\n                        }\n\n                        x=Math.max(\n                            0,\n                            Math.min(\n                                out.width-lw,\n                                x\n                            )\n                        );\n\n                        y=Math.max(\n                            0,\n                            Math.min(\n                                out.height-lh,\n                                y\n                            )\n                        );\n\n                        ctx.save();\n\n                        ctx.globalAlpha=alpha;\n\n                        ctx.drawImage(\n                            logoImage,\n                            x,\n                            y,\n                            lw,\n                            lh\n                        );\n\n                        ctx.restore();\n\n                        var blob=await makeBlob(\n                            out,\n                            type,\n                            .9\n                        );\n\n                        if(!blob){\n                            throw new Error(\n                                \"Kh\u00f4ng t\u1ea1o \u0111\u01b0\u1ee3c \u1ea3nh.\"\n                            );\n                        }\n\n                        var ext=\n                            extensionFromMime(type);\n\n                        var base=\n                            file.name.replace(\n                                \/\\.[^\/.]+$\/,\n                                \"\"\n                            );\n\n                        var name=\n                            base+\n                            \"-logo.\"+\n                            ext;\n\n                        var item=\n                            document.createElement(\"div\");\n\n                        item.className=\n                            \"batch-result-item\";\n\n                        var url=URL.createObjectURL(blob);\n                        resultURLs.push(url);\n\n                        item.innerHTML=\n                            '<img decoding=\"async\" src=\"'+url+'\" alt=\"\">'+\n                            \"<strong>\"+\n                            escapeHtml(name)+\n                            \"<\/strong><br>\"+\n                            '<span class=\"file-size\">'+\n                            formatBytes(blob.size)+\n                            \"<\/span><br>\";\n\n                        var link=\n                            document.createElement(\"a\");\n\n                        link.className=\n                            \"download-link\";\n\n                        link.textContent=\n                            \"\u2b07\ufe0f T\u1ea3i\";\n\n                        link.href=url;\n                        link.download=name;\n\n                        item.appendChild(link);\n                        grid.appendChild(item);\n\n                        out.width=1;\n                        out.height=1;\n\n                    }catch(e){\n\n                        var err=\n                            document.createElement(\"div\");\n\n                        err.className=\n                            \"batch-result-item\";\n\n                        err.textContent=\n                            \"L\u1ed7i: \"+file.name;\n\n                        grid.appendChild(err);\n\n                        console.error(e);\n                    }\n\n                    await sleep(0);\n                }\n\n                message.textContent=\n                    \"\u0110\u00e3 x\u1eed l\u00fd xong \"+images.length+\" \u1ea3nh. \"+\n                    \"B\u1ea1n c\u00f3 th\u1ec3 t\u1ea3i t\u1eebng \u1ea3nh \u1edf ph\u00eda tr\u00ean.\";\n\n            }catch(e){\n\n                console.error(e);\n\n                message.textContent=\n                    e.message||\n                    \"Kh\u00f4ng th\u1ec3 x\u1eed l\u00fd h\u00e0ng lo\u1ea1t.\";\n\n            }finally{\n                button.disabled=false;\n            }\n        }\n    );\n\n    setupDragDrop(\n        imagesInput.closest(\".itool-upload\")\n    );\n\n    setupDragDrop(\n        logoInput.closest(\".itool-upload\")\n    );\n}\n\n\n\/* =========================================================\n   INITIALIZE\n   ========================================================= *\/\n\nfunction initialize(){\n\n    document.querySelectorAll(\n        \".itools-wrapper\"\n    ).forEach(function(wrapper){\n\n        if(wrapper.dataset.initialized===\"1\"){\n            return;\n        }\n\n        wrapper.dataset.initialized=\"1\";\n\n        initTabs(wrapper);\n\n        wrapper.querySelectorAll(\n            \"[data-module]\"\n        ).forEach(function(box){\n\n            var m=box.dataset.module;\n\n            if(m===\"compressor\"){\n                initCompressor(box);\n            }\n\n            if(m===\"cropper\"){\n                initCropper(box);\n            }\n\n            if(m===\"converter\"){\n                initConverter(box);\n            }\n\n            if(m===\"watermark\"){\n                initWatermark(box);\n            }\n        });\n    });\n}\n\nif(document.readyState===\"loading\"){\n    document.addEventListener(\n        \"DOMContentLoaded\",\n        initialize\n    );\n}else{\n    initialize();\n}\n\n})();\n<\/script>\n        \n<\/div><\/div><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_17  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_17\" >\n<style>\n\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_17{\npadding-top:5px !important;\npadding-right:3px !important;\npadding-left:3px !important;\nborder-color:#f2f2f2 !important;\n--tdb-scroll-anim:none !important;\nborder-style:solid !important;\nborder-width: 2px 2px 2px 2px !important;\n}\n\n<\/style><div class=\"td-fix-index\"><p><strong>\u1ee8ng d\u1ee5ng ch\u1ec9nh s\u1eeda \u1ea3nh online<\/strong> l\u00e0 c\u00f4ng c\u1ee5 ti\u1ec7n l\u1ee3i gi\u00fap b\u1ea1n x\u1eed l\u00fd h\u00ecnh \u1ea3nh nhanh ch\u00f3ng ngay tr\u00ean tr\u00ecnh duy\u1ec7t m\u00e0 kh\u00f4ng c\u1ea7n c\u00e0i \u0111\u1eb7t ph\u1ea7n m\u1ec1m. V\u1edbi giao di\u1ec7n \u0111\u01a1n gi\u1ea3n, d\u1ec5 s\u1eed d\u1ee5ng, b\u1ea1n c\u00f3 th\u1ec3 th\u1ef1c hi\u1ec7n nhi\u1ec1u thao t\u00e1c ch\u1ec9nh s\u1eeda \u1ea3nh ph\u1ed5 bi\u1ebfn nh\u01b0 n\u00e9n \u1ea3nh, c\u1eaft \u1ea3nh, chuy\u1ec3n \u0111\u1ed5i \u0111\u1ecbnh d\u1ea1ng h\u00ecnh \u1ea3nh v\u00e0 ch\u00e8n logo ch\u1ec9 trong v\u00e0i b\u01b0\u1edbc.<\/p>\n<h2>Ch\u1ec9nh s\u1eeda \u1ea3nh online nhanh ch\u00f3ng<\/h2>\n<p>Thay v\u00ec ph\u1ea3i c\u00e0i \u0111\u1eb7t c\u00e1c ph\u1ea7n m\u1ec1m ch\u1ec9nh s\u1eeda \u1ea3nh chuy\u00ean nghi\u1ec7p, b\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng c\u00f4ng c\u1ee5 tr\u1ef1c tuy\u1ebfn \u0111\u1ec3 x\u1eed l\u00fd h\u00ecnh \u1ea3nh ngay tr\u00ean m\u00e1y t\u00ednh ho\u1eb7c \u0111i\u1ec7n tho\u1ea1i. \u1ee8ng d\u1ee5ng h\u1ed7 tr\u1ee3 nhi\u1ec1u nhu c\u1ea7u kh\u00e1c nhau, t\u1eeb t\u1ed1i \u01b0u dung l\u01b0\u1ee3ng \u1ea3nh \u0111\u1ec3 \u0111\u0103ng website \u0111\u1ebfn thay \u0111\u1ed5i k\u00edch th\u01b0\u1edbc, \u0111\u1ecbnh d\u1ea1ng v\u00e0 th\u00eam logo nh\u1eadn di\u1ec7n th\u01b0\u01a1ng hi\u1ec7u.<\/p>\n<h3>N\u00e9n \u1ea3nh online<\/h3>\n<p><a href=\"https:\/\/app.mitunet.com\/home\/nen-anh-online\/\">T\u00ednh n\u0103ng n\u00e9n \u1ea3nh online<\/a> gi\u00fap gi\u1ea3m dung l\u01b0\u1ee3ng h\u00ecnh \u1ea3nh m\u00e0 v\u1eabn c\u1ed1 g\u1eafng duy tr\u00ec ch\u1ea5t l\u01b0\u1ee3ng hi\u1ec3n th\u1ecb. \u0110\u00e2y l\u00e0 l\u1ef1a ch\u1ecdn h\u1eefu \u00edch khi b\u1ea1n c\u1ea7n t\u1ed1i \u01b0u \u1ea3nh \u0111\u1ec3 \u0111\u0103ng website, g\u1eedi email, chia s\u1ebb tr\u00ean m\u1ea1ng x\u00e3 h\u1ed9i ho\u1eb7c l\u01b0u tr\u1eef. H\u00ecnh \u1ea3nh c\u00f3 dung l\u01b0\u1ee3ng nh\u1ecf h\u01a1n c\u0169ng gi\u00fap qu\u00e1 tr\u00ecnh t\u1ea3i l\u00ean v\u00e0 t\u1ea3i xu\u1ed1ng nhanh ch\u00f3ng, \u0111\u1ed3ng th\u1eddi h\u1ed7 tr\u1ee3 t\u1ed1i \u01b0u t\u1ed1c \u0111\u1ed9 website.<\/p>\n<h3>C\u1eaft \u1ea3nh online<\/h3>\n<p>V\u1edbi t\u00ednh n\u0103ng <a href=\"https:\/\/app.mitunet.com\/home\/cat-anh-online\/\">c\u1eaft \u1ea3nh online<\/a>, b\u1ea1n c\u00f3 th\u1ec3 d\u1ec5 d\u00e0ng lo\u1ea1i b\u1ecf nh\u1eefng ph\u1ea7n kh\u00f4ng c\u1ea7n thi\u1ebft v\u00e0 \u0111i\u1ec1u ch\u1ec9nh h\u00ecnh \u1ea3nh theo k\u00edch th\u01b0\u1edbc mong mu\u1ed1n. C\u00f4ng c\u1ee5 ph\u00f9 h\u1ee3p \u0111\u1ec3 t\u1ea1o \u1ea3nh \u0111\u1ea1i di\u1ec7n, \u1ea3nh s\u1ea3n ph\u1ea9m, \u1ea3nh b\u00e0i vi\u1ebft ho\u1eb7c chu\u1ea9n b\u1ecb h\u00ecnh \u1ea3nh cho c\u00e1c n\u1ec1n t\u1ea3ng m\u1ea1ng x\u00e3 h\u1ed9i.<\/p>\n<h3>Chuy\u1ec3n \u0111\u1ed5i \u0111\u1ecbnh d\u1ea1ng h\u00ecnh \u1ea3nh<\/h3>\n<p>\u1ee8ng d\u1ee5ng h\u1ed7 tr\u1ee3 <a href=\"https:\/\/app.mitunet.com\/home\/doi-duoi-anh\/\">chuy\u1ec3n \u0111\u1ed5i h\u00ecnh \u1ea3nh online<\/a> gi\u1eefa c\u00e1c \u0111\u1ecbnh d\u1ea1ng ph\u1ed5 bi\u1ebfn nh\u01b0 JPG, PNG, WebP v\u00e0 nhi\u1ec1u \u0111\u1ecbnh d\u1ea1ng kh\u00e1c. Vi\u1ec7c chuy\u1ec3n \u0111\u1ed5i \u0111\u1ecbnh d\u1ea1ng gi\u00fap b\u1ea1n l\u1ef1a ch\u1ecdn lo\u1ea1i t\u1ec7p ph\u00f9 h\u1ee3p v\u1edbi t\u1eebng m\u1ee5c \u0111\u00edch s\u1eed d\u1ee5ng, \u0111\u1eb7c bi\u1ec7t l\u00e0 khi c\u1ea7n t\u1ed1i \u01b0u h\u00ecnh \u1ea3nh cho website ho\u1eb7c c\u00e1c n\u1ec1n t\u1ea3ng tr\u1ef1c tuy\u1ebfn.<\/p>\n<h3>Ch\u00e8n logo v\u00e0o \u1ea3nh<\/h3>\n<p>T\u00ednh n\u0103ng <a href=\"https:\/\/app.mitunet.com\/home\/chen-logo-vao-anh-online\/\">ch\u00e8n logo v\u00e0o \u1ea3nh online<\/a> gi\u00fap c\u00e1 nh\u00e2n, c\u1eeda h\u00e0ng v\u00e0 doanh nghi\u1ec7p d\u1ec5 d\u00e0ng th\u00eam logo th\u01b0\u01a1ng hi\u1ec7u v\u00e0o h\u00ecnh \u1ea3nh. B\u1ea1n c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng logo \u0111\u1ec3 t\u0103ng kh\u1ea3 n\u0103ng nh\u1eadn di\u1ec7n th\u01b0\u01a1ng hi\u1ec7u, t\u1ea1o d\u1ea5u \u1ea5n ri\u00eang cho h\u00ecnh \u1ea3nh v\u00e0 h\u1ea1n ch\u1ebf vi\u1ec7c h\u00ecnh \u1ea3nh b\u1ecb s\u1eed d\u1ee5ng l\u1ea1i m\u00e0 kh\u00f4ng c\u00f3 nh\u1eadn di\u1ec7n ngu\u1ed3n.<\/p>\n<h2>C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online d\u1ec5 s\u1eed d\u1ee5ng<\/h2>\n<p>\u1ee8ng d\u1ee5ng \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf theo h\u01b0\u1edbng \u0111\u01a1n gi\u1ea3n, nhanh ch\u00f3ng v\u00e0 d\u1ec5 s\u1eed d\u1ee5ng, ph\u00f9 h\u1ee3p v\u1edbi c\u1ea3 ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u. B\u1ea1n ch\u1ec9 c\u1ea7n t\u1ea3i h\u00ecnh \u1ea3nh l\u00ean, l\u1ef1a ch\u1ecdn ch\u1ee9c n\u0103ng c\u1ea7n s\u1eed d\u1ee5ng v\u00e0 th\u1ef1c hi\u1ec7n <strong>ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c ti\u1ebfp tr\u00ean tr\u00ecnh duy\u1ec7t<\/strong>. C\u00e1c t\u00ednh n\u0103ng ch\u00ednh bao g\u1ed3m:<\/p>\n<ul>\n<li>N\u00e9n \u1ea3nh online gi\u00fap gi\u1ea3m dung l\u01b0\u1ee3ng h\u00ecnh \u1ea3nh.<\/li>\n<li>C\u1eaft \u1ea3nh online theo k\u00edch th\u01b0\u1edbc v\u00e0 t\u1ef7 l\u1ec7 mong mu\u1ed1n.<\/li>\n<li>Chuy\u1ec3n \u0111\u1ed5i h\u00ecnh \u1ea3nh online gi\u1eefa c\u00e1c \u0111\u1ecbnh d\u1ea1ng ph\u1ed5 bi\u1ebfn.<\/li>\n<li>Ch\u00e8n logo v\u00e0o \u1ea3nh \u0111\u1ec3 t\u0103ng nh\u1eadn di\u1ec7n th\u01b0\u01a1ng hi\u1ec7u.<\/li>\n<li>H\u1ed7 tr\u1ee3 thao t\u00e1c tr\u1ef1c ti\u1ebfp tr\u00ean tr\u00ecnh duy\u1ec7t.<\/li>\n<li>Kh\u00f4ng c\u1ea7n s\u1eed d\u1ee5ng ph\u1ea7n m\u1ec1m ch\u1ec9nh s\u1eeda \u1ea3nh chuy\u00ean nghi\u1ec7p.<\/li>\n<li>Ph\u00f9 h\u1ee3p v\u1edbi m\u00e1y t\u00ednh, \u0111i\u1ec7n tho\u1ea1i v\u00e0 c\u00e1c thi\u1ebft b\u1ecb c\u00f3 tr\u00ecnh duy\u1ec7t web.<\/li>\n<\/ul>\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div class=\"vc_column tdi_19  wpb_column vc_column_container tdc-column td-pb-span4 td-is-sticky\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_19{\r\n                    vertical-align: baseline;\r\n                }.tdi_19 > .wpb_wrapper,\r\n\t\t\t\t.tdi_19 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_19 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_19 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_19 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_19{\n--tdb-scroll-anim:none !important;\n}\n\n<\/style><div class=\"wpb_wrapper\" data-sticky-enabled-on=\"W3RydWUsdHJ1ZSx0cnVlLHRydWVd\" data-sticky-offset=\"20\" data-sticky-is-width-auto=\"W2ZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlXQ==\"><div class=\"vc_row_inner tdi_21  vc_row vc_inner wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_21{\r\n                    position: relative !important;\r\n                    top: 0;\r\n                    transform: none;\r\n                    -webkit-transform: none;\r\n                }.tdi_21,\r\n\t\t\t\t.tdi_21 .tdc-inner-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_21 .tdc-inner-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_21{\n--tdb-scroll-anim:none !important;\nposition:relative;\n}\n\n.tdi_21 .td_block_wrap{ text-align:left }\n\n<\/style>\n<div class=\"tdi_20_rand_style td-element-style\" ><style>\n\/* custom css - generated by TagDiv Composer *\/\n\n.tdi_20_rand_style{\nbackground-color:#f2f2f2 !important;\n}\n <\/style><\/div><div class=\"vc_column_inner tdi_23  wpb_column vc_column_container tdc-inner-column td-pb-span12 td-is-sticky\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_23{\r\n                    vertical-align: baseline;\r\n                }.tdi_23 .vc_column-inner > .wpb_wrapper,\r\n\t\t\t\t.tdi_23 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_23 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\" data-sticky-enabled-on=\"W3RydWUsdHJ1ZSx0cnVlLHRydWVd\" data-sticky-offset=\"20\" data-sticky-is-width-auto=\"W2ZhbHNlLGZhbHNlLGZhbHNlLGZhbHNlXQ==\"><div class=\"td_block_wrap td_block_title tdi_24 td-pb-border-top td_block_template_1 td-fix-index\"  data-td-block-uid=\"tdi_24\" >\n<style>\n\n\/* inline tdc_css att - generated by TagDiv Composer *\/\n\n.tdi_24{\nmargin-top:5px !important;\n--tdb-scroll-anim:none !important;\n}\n\n<\/style>\n<style>\n\/* custom css - generated by TagDiv Composer *\/\nbody .tdi_24 .td-block-title a,\r\n\t\t\t\tbody .tdi_24 .td-block-title span{\r\n\t\t\t\t\tfont-size:20px !important;text-transform:uppercase !important;\r\n\t\t\t\t}body .tdi_24 .td-block-title{\r\n\t\t\t\t\ttext-align: center;\r\n\t\t\t\t}body .tdi_24.td_block_template_4 .td-block-title > *:before,\r\n\t\t\t\tbody .tdi_24.td_block_template_17 .td-block-title:after,\r\n\t\t\t\tbody .tdi_24.td_block_template_13 .td-block-subtitle,\r\n\t\t\t\tbody .tdi_24.td_block_template_9 .td-block-title:after{\r\n\t\t\t\t    right: 0;\r\n\t\t\t\t    left: 0;\r\n\t\t\t\t}body .tdi_24.td_block_template_5 .td-block-title > *{\r\n\t\t\t\t    border-width: 0 0 0 4px;\r\n\t\t\t\t}body .tdi_24.td_block_template_8 .td-block-title > *{\r\n\t\t\t\t\tpadding-left: 20px;\r\n\t\t\t\t\tpadding-right: 20px;\r\n\t\t\t\t}body .tdi_24.td_block_template_12 .td-block-title{\r\n\t\t\t\t\tjustify-content: center;\r\n\t\t\t\t}\n<\/style><div class=\"td-block-title-wrap\"><h4 class=\"block-title td-block-title\"><span class=\"td-pulldown-size\">C\u00e1c \u1ee9ng d\u1ee5ng kh\u00e1c<\/span><\/h4><\/div><\/div><div class=\"wpb_wrapper wpb_text_column td_block_wrap td_block_wrap vc_column_text tdi_25  tagdiv-type td-pb-border-top td_block_template_1\"  data-td-block-uid=\"tdi_25\" ><div class=\"td-fix-index\">\n\n\t<div\n\t\tclass=\"pgd-public-wrapper pgd-grid-880534\"\n\t\tstyle=\"\n\t\t\t--pgd-desktop: 1;\n\t\t\t--pgd-tablet: 1;\n\t\t\t--pgd-mobile: 1;\n\t\t\"\n\t>\n\n\n\t\t<div class=\"pgd-public-grid\">\n\n\n\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t<a\n\t\t\t\t\tclass=\"pgd-public-card\"\n\t\t\t\t\thref=\"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/\"\n\t\t\t\t>\n\n\n\t\t\t\t\t<div class=\"pgd-public-image\">\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg\"\n\t\t\t\t\t\t\t\talt=\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t>\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t\t<div class=\"pgd-public-title\">\n\n\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\tC\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn\t\t\t\t\t\t<\/h3>\n\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t<\/a>\n\n\n\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t<a\n\t\t\t\t\tclass=\"pgd-public-card\"\n\t\t\t\t\thref=\"https:\/\/app.mitunet.com\/home\/lam-mo-nen-anh\/\"\n\t\t\t\t>\n\n\n\t\t\t\t\t<div class=\"pgd-public-image\">\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/lam-mo-nen-anh-online.jpg\"\n\t\t\t\t\t\t\t\talt=\"C\u00f4ng c\u1ee5 l\u00e0m m\u1edd n\u1ec1n \u1ea3nh online chuy\u00ean nghi\u1ec7p, l\u00e0m m\u1edd h\u00ecnh \u1ea3nh n\u1ec1n hi\u1ec7u qu\u1ea3\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t>\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t\t<div class=\"pgd-public-title\">\n\n\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\tC\u00f4ng c\u1ee5 l\u00e0m m\u1edd n\u1ec1n \u1ea3nh online chuy\u00ean nghi\u1ec7p, l\u00e0m m\u1edd h\u00ecnh \u1ea3nh n\u1ec1n hi\u1ec7u qu\u1ea3\t\t\t\t\t\t<\/h3>\n\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t<\/a>\n\n\n\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t<a\n\t\t\t\t\tclass=\"pgd-public-card\"\n\t\t\t\t\thref=\"https:\/\/app.mitunet.com\/home\/lam-mo-anh\/\"\n\t\t\t\t>\n\n\n\t\t\t\t\t<div class=\"pgd-public-image\">\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/lam-mo-anh-online.jpg\"\n\t\t\t\t\t\t\t\talt=\"C\u00f4ng c\u1ee5 l\u00e0m m\u1edd \u1ea3nh online mi\u1ec5n ph\u00ed, \u1ee9ng d\u1ee5ng l\u00e0m m\u1edd h\u00ecnh \u1ea3nh b\u1eb1ng AI\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t>\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t\t<div class=\"pgd-public-title\">\n\n\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\tC\u00f4ng c\u1ee5 l\u00e0m m\u1edd \u1ea3nh online mi\u1ec5n ph\u00ed, \u1ee9ng d\u1ee5ng l\u00e0m m\u1edd h\u00ecnh \u1ea3nh b\u1eb1ng AI\t\t\t\t\t\t<\/h3>\n\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t<\/a>\n\n\n\t\t\t\n\n\t\t\t\t\n\n\t\t\t\t<a\n\t\t\t\t\tclass=\"pgd-public-card\"\n\t\t\t\t\thref=\"https:\/\/app.mitunet.com\/home\/xoa-nen-anh\/\"\n\t\t\t\t>\n\n\n\t\t\t\t\t<div class=\"pgd-public-image\">\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/xoa-nen-anh-online.jpg\"\n\t\t\t\t\t\t\t\talt=\"C\u00f4ng c\u1ee5 x\u00f3a n\u1ec1n \u1ea3nh online mi\u1ec5n ph\u00ed, thay n\u1ec1n h\u00ecnh \u1ea3nh, \u0111\u1ed5i m\u00e0u ph\u00f4ng n\u1ec1n\"\n\t\t\t\t\t\t\t\tloading=\"lazy\"\n\t\t\t\t\t\t\t>\n\n\n\t\t\t\t\t\t\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t\t<div class=\"pgd-public-title\">\n\n\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t\t\tC\u00f4ng c\u1ee5 x\u00f3a n\u1ec1n \u1ea3nh online mi\u1ec5n ph\u00ed, thay n\u1ec1n h\u00ecnh \u1ea3nh, \u0111\u1ed5i m\u00e0u ph\u00f4ng n\u1ec1n\t\t\t\t\t\t<\/h3>\n\n\n\t\t\t\t\t<\/div>\n\n\n\t\t\t\t<\/a>\n\n\n\t\t\t\n\n\t\t<\/div>\n\n\n\t<\/div>\n\n\n\t<style>\n\n\t\t\/* ====================================================\n\t\t * FRONTEND\n\t\t * ==================================================== *\/\n\n\t\t.pgd-grid-880534 {\n\t\t\twidth: 100%;\n\t\t\tmargin: 20px 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\n\t\t.pgd-grid-880534 *,\n\t\t.pgd-grid-880534 *::before,\n\t\t.pgd-grid-880534 *::after {\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\n\t\t\/* GRID *\/\n\n\t\t.pgd-grid-880534\t\t.pgd-public-grid {\n\n\t\t\tdisplay: grid;\n\n\t\t\tgrid-template-columns:\n\t\t\t\trepeat(\n\t\t\t\t\tvar(--pgd-desktop),\n\t\t\t\t\tminmax(0, 1fr)\n\t\t\t\t);\n\n\t\t\tgap: 20px;\n\n\t\t\twidth: 100%;\n\t\t}\n\n\n\t\t\/* CARD *\/\n\n\t\t.pgd-grid-880534\t\t.pgd-public-card {\n\n\t\t\tdisplay: block;\n\n\t\t\twidth: 100%;\n\n\t\t\toverflow: hidden;\n\n\t\t\ttext-decoration: none !important;\n\n\t\t\tcolor: inherit !important;\n\n\t\t\tbackground: #fff;\n\n\t\t\tborder: 1px solid #e7e7e7;\n\n\t\t\tborder-radius: 14px;\n\n\t\t\tbox-shadow:\n\t\t\t\t0 3px 14px rgba(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t.06\n\t\t\t\t);\n\n\t\t\ttransition:\n\t\t\t\ttransform .25s ease,\n\t\t\t\tbox-shadow .25s ease,\n\t\t\t\tborder-color .25s ease;\n\t\t}\n\n\n\t\t.pgd-grid-880534\t\t.pgd-public-card:hover {\n\n\t\t\ttransform:\n\t\t\t\ttranslateY(-4px);\n\n\t\t\tborder-color:\n\t\t\t\t#d5d5d5;\n\n\t\t\tbox-shadow:\n\t\t\t\t0 10px 28px rgba(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t.11\n\t\t\t\t);\n\t\t}\n\n\n\t\t\/* IMAGE *\/\n\n\t\t.pgd-grid-880534\t\t.pgd-public-image {\n\n\t\t\tposition: relative;\n\n\t\t\twidth: 100%;\n\n\t\t\taspect-ratio:\n\t\t\t\t16 \/ 10;\n\n\t\t\toverflow: hidden;\n\n\t\t\tbackground:\n\t\t\t\t#f3f4f6;\n\t\t}\n\n\n\t\t.pgd-grid-880534\t\t.pgd-public-image img {\n\n\t\t\tdisplay: block;\n\n\t\t\twidth: 100%;\n\n\t\t\theight: 100%;\n\n\t\t\tobject-fit: cover;\n\n\t\t\ttransition:\n\t\t\t\ttransform .4s ease;\n\t\t}\n\n\n\t\t.pgd-grid-880534\t\t.pgd-public-card:hover img {\n\n\t\t\ttransform:\n\t\t\t\tscale(1.055);\n\t\t}\n\n\n\t\t\/* PLACEHOLDER *\/\n\n\t\t.pgd-grid-880534\t\t.pgd-placeholder {\n\n\t\t\twidth: 100%;\n\n\t\t\theight: 100%;\n\n\t\t\tdisplay: flex;\n\n\t\t\talign-items: center;\n\n\t\t\tjustify-content: center;\n\n\t\t\tfont-size: 34px;\n\n\t\t\tbackground:\n\t\t\t\t#f4f5f6;\n\n\t\t\tcolor:\n\t\t\t\t#999;\n\t\t}\n\n\n\t\t\/* TITLE *\/\n\n\t\t.pgd-grid-880534\t\t.pgd-public-title {\n\n\t\t\tpadding:\n\t\t\t\t14px 13px 16px;\n\t\t}\n\n\n\t\t.pgd-grid-880534\t\t.pgd-public-title h3 {\n\n\t\t\tmargin: 0;\n\n\t\t\tpadding: 0;\n\n\t\t\tfont-size: 16px;\n\n\t\t\tline-height: 1.4;\n\n\t\t\tfont-weight: 600;\n\n\t\t\ttext-align: center;\n\t\t}\n\n\n\t\t\/* ====================================================\n\t\t * TABLET\n\t\t * ==================================================== *\/\n\n\t\t@media (max-width: 1024px) {\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-grid {\n\n\t\t\t\tgrid-template-columns:\n\t\t\t\t\trepeat(\n\t\t\t\t\t\tvar(--pgd-tablet),\n\t\t\t\t\t\tminmax(0, 1fr)\n\t\t\t\t\t);\n\n\t\t\t\tgap: 16px;\n\t\t\t}\n\n\t\t}\n\n\n\t\t\/* ====================================================\n\t\t * MOBILE\n\t\t * ==================================================== *\/\n\n\t\t@media (max-width: 767px) {\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-grid {\n\n\t\t\t\tgrid-template-columns:\n\t\t\t\t\trepeat(\n\t\t\t\t\t\tvar(--pgd-mobile),\n\t\t\t\t\t\tminmax(0, 1fr)\n\t\t\t\t\t);\n\n\t\t\t\tgap: 12px;\n\t\t\t}\n\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-card {\n\n\t\t\t\tborder-radius:\n\t\t\t\t\t11px;\n\t\t\t}\n\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-title {\n\n\t\t\t\tpadding:\n\t\t\t\t\t10px 8px 12px;\n\t\t\t}\n\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-title h3 {\n\n\t\t\t\tfont-size:\n\t\t\t\t\t14px;\n\n\t\t\t\tline-height:\n\t\t\t\t\t1.35;\n\t\t\t}\n\n\t\t}\n\n\n\t\t\/* ====================================================\n\t\t * SMALL MOBILE\n\t\t * ==================================================== *\/\n\n\t\t@media (max-width: 380px) {\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-grid {\n\n\t\t\t\tgap:\n\t\t\t\t\t9px;\n\t\t\t}\n\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-title {\n\n\t\t\t\tpadding-left:\n\t\t\t\t\t6px;\n\n\t\t\t\tpadding-right:\n\t\t\t\t\t6px;\n\t\t\t}\n\n\n\t\t\t.pgd-grid-880534\t\t\t.pgd-public-title h3 {\n\n\t\t\t\tfont-size:\n\t\t\t\t\t13px;\n\t\t\t}\n\n\t\t}\n\n\t<\/style>\n\n\n\t\n<\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><div id=\"tdi_26\" class=\"tdc-row stretch_row_1400 td-stretch-content\"><div class=\"vc_row tdi_27  wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_27,\r\n                .tdi_27 .tdc-columns{\r\n                    min-height: 0;\r\n                }.tdi_27,\r\n\t\t\t\t.tdi_27 .tdc-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_27 .tdc-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_27:before,\r\n\t\t\t\t.tdi_27:after{\r\n\t\t\t\t    display: table;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column tdi_29  wpb_column vc_column_container tdc-column td-pb-span12\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_29{\r\n                    vertical-align: baseline;\r\n                }.tdi_29 > .wpb_wrapper,\r\n\t\t\t\t.tdi_29 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_29 > .wpb_wrapper > .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}.tdi_29 > .wpb_wrapper > .vc_row_inner{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t}.tdi_29 > .wpb_wrapper{\r\n\t\t\t\t    width: auto;\r\n\t\t\t\t    height: auto;\r\n\t\t\t\t}\n<\/style><div class=\"wpb_wrapper\" ><div class=\"vc_row_inner tdi_31  vc_row vc_inner wpb_row td-pb-row\" >\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_31{\r\n                    position: relative !important;\r\n                    top: 0;\r\n                    transform: none;\r\n                    -webkit-transform: none;\r\n                }.tdi_31,\r\n\t\t\t\t.tdi_31 .tdc-inner-columns{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_31 .tdc-inner-columns{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column_inner tdi_33  wpb_column vc_column_container tdc-inner-column td-pb-span12\">\n<style scoped>\n\/* custom css - generated by TagDiv Composer *\/\n\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_33{\r\n                    vertical-align: baseline;\r\n                }.tdi_33 .vc_column-inner > .wpb_wrapper,\r\n\t\t\t\t.tdi_33 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    display: block;\r\n\t\t\t\t}.tdi_33 .vc_column-inner > .wpb_wrapper .tdc-elements{\r\n\t\t\t\t    width: 100%;\r\n\t\t\t\t}\n<\/style><div class=\"vc_column-inner\"><div class=\"wpb_wrapper\" ><div class=\"td_block_wrap td_flex_block_4 tdi_34 td-pb-border-top td_block_template_1 td_flex_block\"  data-td-block-uid=\"tdi_34\" >\n<style>\n\/* custom css - generated by TagDiv Composer *\/\n.tdi_34.custom-tdc-no-posts .td_block_inner{\r\n                    margin-left: 0 !important;\r\n                    margin-right: 0 !important;\r\n                }.tdi_34.custom-tdc-no-posts .td_block_inner:after{\r\n                    content: \"No posts\" !important;\r\n                    display: block !important;\r\n                    font-size: 13px;\r\n                    font-weight: normal;\r\n                    text-align: left;\r\n                    padding: 20px;\r\n                    border: 1px solid rgba(190, 190, 190, 0.35);\r\n                    color: rgba(125, 125, 125, 0.8);\r\n                }.tdi_34 .td_module_wrap{\r\n\t\t\t\t\tpadding-left: 24px;\r\n\t\t\t\t\tpadding-right: 24px;\r\n\t\t\t\t}.tdi_34 .td_block_inner{\r\n\t\t\t\t\tmargin-left: -24px;\r\n\t\t\t\t\tmargin-right: -24px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1{\r\n\t\t\t\t\tpadding-bottom: 10.5px;\r\n\t\t\t\t\tmargin-bottom: 10.5px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-module-container:before{\r\n\t\t\t\t\tbottom: -10.5px;\r\n\t\t\t\t\r\n\t\t\t\t\tborder-width: 0 0 1px 0;\r\n\t\t\t\t\tborder-style: none;\r\n\t\t\t\t\tborder-color: #eaeaea;\r\n\t\t\t\t\r\n\t\t\t\t\tborder-color: #eaeaea;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4{\r\n\t\t\t\t\tpadding-bottom: 13px;\r\n\t\t\t\t\tmargin-bottom: 13px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-module-container:before{\r\n\t\t\t\t\tbottom: -13px;\r\n\t\t\t\t\r\n\t\t\t\t\tborder-width: 0 0 1px 0;\r\n\t\t\t\t\tborder-style: none;\r\n\t\t\t\t\tborder-color: #eaeaea;\r\n\t\t\t\t\r\n\t\t\t\t\tborder-color: #eaeaea;\r\n\t\t\t\t}.tdi_34 .td_module_wrap:last-child{\r\n\t\t\t\t    margin-bottom: 0 !important;\r\n\t\t\t\t\tpadding-bottom: 0 !important;\r\n\t\t\t\t}.tdi_34 .td_module_wrap:last-child .td-module-container:before{\r\n\t\t\t\t    display: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-module-container{\r\n\t\t\t\t    border-color: #eaeaea;\r\n\t\t\t\t\r\n\t\t\t\t\tflex-direction: column;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-module-container{\r\n\t\t\t\t    border-color: #eaeaea;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .entry-thumb{\r\n\t\t\t\t\tbackground-position: center 50%;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .entry-thumb{\r\n\t\t\t\t\tbackground-position: center 50%;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-image-container{\r\n\t\t\t\t \tflex: 0 0 30%;\r\n\t\t\t\t \twidth: 30%;\r\n\t\t\t    \r\n                \tdisplay: block; order: 0;\r\n                }.ie10 .tdi_34 .td_module_flex_4 .td-module-meta-info,\r\n\t\t\t\t.ie11 .tdi_34 .td_module_flex_4 .td-module-meta-info{\r\n\t\t\t\t \tflex: 1;\r\n\t\t\t    }body .tdi_34 .td_module_flex_1 .td-favorite{\r\n                    font-size: 36px;\r\n                \r\n                    box-shadow:  1px 1px 4px 0px rgba(0, 0, 0, 0.2);\r\n                }body .tdi_34 .td_module_flex_4 .td-favorite{\r\n                    font-size: 36px;\r\n                \r\n                    box-shadow:  1px 1px 4px 0px rgba(0, 0, 0, 0.2);\r\n                }.tdi_34 .td_module_flex_4 .td-video-play-ico{\r\n\t\t\t\t\twidth: 20px;\r\n\t\t\t\t\theight: 20px;\r\n\t\t\t\t\tfont-size: 20px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-video-play-ico{\r\n\t\t\t\t\ttop: 50%;\r\n                    left: 50%;\r\n                    transform: translate(-50%, -50%);\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-post-vid-time{\r\n\t\t\t\t\tdisplay: block;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-post-vid-time{\r\n\t\t\t\t\tdisplay: block;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-module-meta-info{\r\n\t\t\t\t\tposition: relative;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-category-pos-image .td-post-category:not(.td-post-extra-category){\r\n\t\t\t\t\ttop: auto;\r\n\t\t\t\t\tbottom: 0;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-audio-player{\r\n\t\t\t\t\tfont-size: 13px;\r\n\t\t\t\t\r\n\t\t\t\t\topacity: 1;\r\n\t\t\t\t\tvisibility: visible;\r\n\t\t\t\t\theight: auto;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-audio-player{\r\n\t\t\t\t\tfont-size: 12px;\r\n\t\t\t\t\r\n\t\t\t\t\topacity: 1;\r\n\t\t\t\t\tvisibility: visible;\r\n\t\t\t\t\theight: auto;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-author-photo .avatar{\r\n\t\t\t\t    width: 20px;\r\n\t\t\t\t    height: 20px;\r\n\t\t\t\t\r\n\t\t\t\t    margin-right: 6px;\r\n\t\t\t\t\r\n\t\t\t\t    border-radius: 50%;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-author-photo .avatar{\r\n\t\t\t\t    width: 20px;\r\n\t\t\t\t    height: 20px;\r\n\t\t\t\t\r\n\t\t\t\t    margin-right: 6px;\r\n\t\t\t\t\r\n\t\t\t\t    border-radius: 50%;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-post-category:not(.td-post-extra-category){\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-post-category:not(.td-post-extra-category){\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-excerpt{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-excerpt{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-author-date{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-author-date{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-post-author-name{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-post-author-name{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-post-date,\r\n\t\t\t\t.tdi_34 .td_module_flex_1 .td-post-author-name span{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-post-date,\r\n\t\t\t\t.tdi_34 .td_module_flex_4 .td-post-author-name span{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .entry-review-stars{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-icon-star,\r\n                .tdi_34 .td_module_flex_1 .td-icon-star-empty,\r\n                .tdi_34 .td_module_flex_1 .td-icon-star-half{\r\n\t\t\t\t\tfont-size: 15px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .entry-review-stars{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-icon-star,\r\n                .tdi_34 .td_module_flex_4 .td-icon-star-empty,\r\n                .tdi_34 .td_module_flex_4 .td-icon-star-half{\r\n\t\t\t\t\tfont-size: 15px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 .td-module-comments{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-module-comments{\r\n\t\t\t\t\tdisplay: none;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }.tdi_34 .td_module_flex_4 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }html:not([class*='ie']) .tdi_34 .td-module-container:hover .entry-thumb:before{\r\n                    opacity: 0;\r\n                }@media (min-width: 767px) {\r\n                    .tdi_34 .td_module_wrap {\r\n                        width: 20%;\r\n                        float: left;\r\n                    }\r\n                    .rtl .tdi_34 .td_module_wrap {\r\n                        float: right;\r\n                    }\r\n                }@media (min-width: 767px) {\r\n                    .tdi_34 .td_module_wrap:nth-child(5n+1) {\r\n                        clear: both;\r\n                    }\r\n                }@media (min-width: 767px) {\r\n                    .tdi_34 .td_module_wrap:nth-last-child(-n+5) {\r\n                        margin-bottom: 0 !important;\r\n                        padding-bottom: 0 !important;\r\n                    }\r\n                    .tdi_34 .td_module_wrap:nth-last-child(-n+5) .td-module-container:before {\r\n                        display: none;\r\n                    }\r\n                }\n\n\/* landscape *\/\n@media (min-width: 1019px) and (max-width: 1140px){\n.tdi_34 .td_module_wrap{\r\n\t\t\t\t\tpadding-left: 20px;\r\n\t\t\t\t\tpadding-right: 20px;\r\n\t\t\t\t}.tdi_34 .td_block_inner{\r\n\t\t\t\t\tmargin-left: -20px;\r\n\t\t\t\t\tmargin-right: -20px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_1 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }.tdi_34 .td_module_flex_4 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }\n}\n\n\/* portrait *\/\n@media (min-width: 768px) and (max-width: 1018px){\n.tdi_34 .td_module_wrap{\r\n\t\t\t\t\tpadding-left: 14px;\r\n\t\t\t\t\tpadding-right: 14px;\r\n\t\t\t\t}.tdi_34 .td_block_inner{\r\n\t\t\t\t\tmargin-left: -14px;\r\n\t\t\t\t\tmargin-right: -14px;\r\n\t\t\t\t}.tdi_34 .td_module_flex_4 .td-image-container{\r\n\t\t\t\t \tflex: 0 0 35%;\r\n\t\t\t\t \twidth: 35%;\r\n\t\t\t    }.tdi_34 .td_module_flex_1 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }.tdi_34 .td_module_flex_4 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }\n}\n\n\/* phone *\/\n@media (max-width: 767px){\n.tdi_34 .td_module_flex_1 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }.tdi_34 .td_module_flex_4 a{\r\n                    transition: all 0.1s ease;\r\n                    -webkit-transition: all 0.1s ease;\r\n                    box-shadow: inset 0 0 0 0 #000;\r\n                }\n}\n<\/style><script>var block_tdi_34 = new tdBlock();\nblock_tdi_34.id = \"tdi_34\";\nblock_tdi_34.atts = '{\"modules_category\":\"image\",\"modules_on_row\":\"eyJhbGwiOiI1MCUiLCJsYW5kc2NhcGUiOiIxMDAlIn0=\",\"modules_category1\":\"image\",\"show_cat2\":\"none\",\"show_com2\":\"none\",\"show_author2\":\"none\",\"columns\":\"20%\",\"columns_gap\":\"eyJsYW5kc2NhcGUiOiI0MCIsInBvcnRyYWl0IjoiMjgifQ==\",\"image_width2\":\"eyJwb3J0cmFpdCI6IjM1In0=\",\"modules_space1\":\"eyJwaG9uZSI6IjIxIiwiYWxsIjoiMjEifQ==\",\"show_excerpt1\":\"none\",\"show_excerpt2\":\"none\",\"hide_audio\":\"yes\",\"category_id\":\"1\",\"sort\":\"random_posts\",\"show_cat1\":\"none\",\"show_author1\":\"none\",\"show_date1\":\"none\",\"show_com1\":\"none\",\"show_review1\":\"none\",\"show_date2\":\"none\",\"show_review2\":\"none\",\"block_type\":\"td_flex_block_4\",\"separator\":\"\",\"custom_title\":\"\",\"custom_url\":\"\",\"block_template_id\":\"\",\"title_tag\":\"\",\"mc1_tl\":\"\",\"mc1_title_tag\":\"\",\"mc1_el\":\"\",\"mc4_tl\":\"\",\"mc4_title_tag\":\"\",\"mc4_el\":\"\",\"post_ids\":\"\",\"taxonomies\":\"\",\"category_ids\":\"\",\"in_all_terms\":\"\",\"tag_slug\":\"\",\"autors_id\":\"\",\"installed_post_types\":\"\",\"include_cf_posts\":\"\",\"exclude_cf_posts\":\"\",\"popular_by_date\":\"\",\"linked_posts\":\"\",\"favourite_only\":\"\",\"limit\":\"5\",\"offset\":\"\",\"open_in_new_window\":\"\",\"show_modified_date\":\"\",\"time_ago\":\"\",\"time_ago_add_txt\":\"ago\",\"time_ago_txt_pos\":\"\",\"review_source\":\"\",\"el_class\":\"\",\"td_query_cache\":\"\",\"td_query_cache_expiration\":\"\",\"enable_no_posts_message\":\"\",\"no_posts_message\":\"No posts\",\"td_ajax_filter_type\":\"\",\"td_ajax_filter_ids\":\"\",\"td_filter_default_txt\":\"All\",\"td_ajax_preloading\":\"\",\"h_effect\":\"\",\"modules_border_size1\":\"\",\"modules_border_style1\":\"\",\"modules_border_color1\":\"#eaeaea\",\"modules_divider1\":\"\",\"modules_divider_color1\":\"#eaeaea\",\"image_size\":\"\",\"image_alignment1\":\"50\",\"image_height1\":\"\",\"image_radius1\":\"\",\"hide_image\":\"\",\"show_favourites\":\"\",\"fav_size\":\"2\",\"fav_space\":\"\",\"fav_ico_color\":\"\",\"fav_ico_color_h\":\"\",\"fav_bg\":\"\",\"fav_bg_h\":\"\",\"fav_shadow_shadow_header\":\"\",\"fav_shadow_shadow_title\":\"Shadow\",\"fav_shadow_shadow_size\":\"\",\"fav_shadow_shadow_offset_horizontal\":\"\",\"fav_shadow_shadow_offset_vertical\":\"\",\"fav_shadow_shadow_spread\":\"\",\"fav_shadow_shadow_color\":\"\",\"video_icon1\":\"\",\"video_icon_pos1\":\"center\",\"video_popup\":\"yes\",\"video_rec\":\"\",\"spot_header\":\"\",\"video_rec_title\":\"\",\"video_rec_color\":\"\",\"video_rec_disable\":\"\",\"autoplay_vid\":\"yes\",\"show_vid_t\":\"block\",\"vid_t_margin\":\"\",\"vid_t_padding\":\"\",\"video_title_color\":\"\",\"video_title_color_h\":\"\",\"video_bg\":\"\",\"video_overlay\":\"\",\"vid_t_color\":\"\",\"vid_t_bg_color\":\"\",\"f_vid_title_font_header\":\"\",\"f_vid_title_font_title\":\"Video pop-up article title\",\"f_vid_title_font_settings\":\"\",\"f_vid_title_font_family\":\"\",\"f_vid_title_font_size\":\"\",\"f_vid_title_font_line_height\":\"\",\"f_vid_title_font_style\":\"\",\"f_vid_title_font_weight\":\"\",\"f_vid_title_font_transform\":\"\",\"f_vid_title_font_spacing\":\"\",\"f_vid_title_\":\"\",\"f_vid_time_font_title\":\"Video duration text\",\"f_vid_time_font_settings\":\"\",\"f_vid_time_font_family\":\"\",\"f_vid_time_font_size\":\"\",\"f_vid_time_font_line_height\":\"\",\"f_vid_time_font_style\":\"\",\"f_vid_time_font_weight\":\"\",\"f_vid_time_font_transform\":\"\",\"f_vid_time_font_spacing\":\"\",\"f_vid_time_\":\"\",\"meta_info_align1\":\"\",\"meta_info_horiz1\":\"content-horiz-left\",\"meta_width1\":\"\",\"meta_margin1\":\"\",\"meta_padding1\":\"\",\"meta_info_border_radius1\":\"\",\"art_title1\":\"\",\"modules_category_margin1\":\"\",\"modules_category_padding1\":\"\",\"modules_cat_border1\":\"\",\"modules_category_radius1\":\"0\",\"modules_extra_cat1\":\"\",\"author_photo\":\"\",\"author_photo_size1\":\"\",\"author_photo_space1\":\"\",\"author_photo_radius1\":\"\",\"review_space1\":\"\",\"review_size1\":\"2.5\",\"review_distance1\":\"\",\"art_excerpt1\":\"\",\"excerpt_middle\":\"\",\"show_audio1\":\"block\",\"art_audio1\":\"\",\"art_audio_size1\":\"1.5\",\"m_padding2\":\"\",\"modules_space2\":\"26\",\"modules_border_size2\":\"\",\"modules_border_style2\":\"\",\"modules_border_color2\":\"#eaeaea\",\"modules_divider2\":\"\",\"modules_divider_color2\":\"#eaeaea\",\"image_size3\":\"\",\"image_alignment2\":\"50\",\"image_height2\":\"\",\"image_floated2\":\"float_left\",\"image_radius2\":\"\",\"hide_image3\":\"\",\"show_favourites2\":\"\",\"fav_size2\":\"2\",\"fav_space2\":\"\",\"fav_ico_color2\":\"\",\"fav_ico_color_h2\":\"\",\"fav_bg2\":\"\",\"fav_bg_h2\":\"\",\"fav_shadow2_shadow_header\":\"\",\"fav_shadow2_shadow_title\":\"Shadow\",\"fav_shadow2_shadow_size\":\"\",\"fav_shadow2_shadow_offset_horizontal\":\"\",\"fav_shadow2_shadow_offset_vertical\":\"\",\"fav_shadow2_shadow_spread\":\"\",\"fav_shadow2_shadow_color\":\"\",\"video_icon2\":\"\",\"video_popup3\":\"yes\",\"video_rec3\":\"\",\"video_rec_title3\":\"\",\"video_rec_color3\":\"\",\"autoplay_vid3\":\"yes\",\"show_vid_t3\":\"block\",\"vid_t_margin3\":\"\",\"vid_t_padding3\":\"\",\"meta_info_horiz2\":\"content-horiz-left\",\"meta_width2\":\"\",\"meta_margin2\":\"\",\"meta_padding2\":\"\",\"meta_info_border_radius2\":\"\",\"art_title2\":\"\",\"modules_category3\":\"\",\"modules_category_margin2\":\"\",\"modules_category_padding2\":\"\",\"modules_cat_border2\":\"\",\"modules_category_radius2\":\"0\",\"modules_extra_cat2\":\"\",\"author_photo3\":\"\",\"author_photo_size2\":\"\",\"author_photo_space2\":\"\",\"author_photo_radius2\":\"\",\"review_space2\":\"\",\"review_size2\":\"2.5\",\"review_distance2\":\"\",\"art_excerpt2\":\"\",\"excerpt_middle3\":\"\",\"show_audio2\":\"block\",\"hide_audio3\":\"\",\"art_audio2\":\"\",\"art_audio_size2\":\"1\",\"pag_space\":\"\",\"pag_padding\":\"\",\"pag_border_width\":\"\",\"pag_border_radius\":\"\",\"prev_tdicon\":\"\",\"next_tdicon\":\"\",\"pag_icons_size\":\"\",\"f_header_font_header\":\"\",\"f_header_font_title\":\"Block header\",\"f_header_font_settings\":\"\",\"f_header_font_family\":\"\",\"f_header_font_size\":\"\",\"f_header_font_line_height\":\"\",\"f_header_font_style\":\"\",\"f_header_font_weight\":\"\",\"f_header_font_transform\":\"\",\"f_header_font_spacing\":\"\",\"f_header_\":\"\",\"f_ajax_font_title\":\"Ajax categories\",\"f_ajax_font_settings\":\"\",\"f_ajax_font_family\":\"\",\"f_ajax_font_size\":\"\",\"f_ajax_font_line_height\":\"\",\"f_ajax_font_style\":\"\",\"f_ajax_font_weight\":\"\",\"f_ajax_font_transform\":\"\",\"f_ajax_font_spacing\":\"\",\"f_ajax_\":\"\",\"f_more_font_title\":\"Load more button\",\"f_more_font_settings\":\"\",\"f_more_font_family\":\"\",\"f_more_font_size\":\"\",\"f_more_font_line_height\":\"\",\"f_more_font_style\":\"\",\"f_more_font_weight\":\"\",\"f_more_font_transform\":\"\",\"f_more_font_spacing\":\"\",\"f_more_\":\"\",\"f_title1_font_header\":\"\",\"f_title1_font_title\":\"Article title 1\",\"f_title1_font_settings\":\"\",\"f_title1_font_family\":\"\",\"f_title1_font_size\":\"\",\"f_title1_font_line_height\":\"\",\"f_title1_font_style\":\"\",\"f_title1_font_weight\":\"\",\"f_title1_font_transform\":\"\",\"f_title1_font_spacing\":\"\",\"f_title1_\":\"\",\"f_cat1_font_title\":\"Article category tag 1\",\"f_cat1_font_settings\":\"\",\"f_cat1_font_family\":\"\",\"f_cat1_font_size\":\"\",\"f_cat1_font_line_height\":\"\",\"f_cat1_font_style\":\"\",\"f_cat1_font_weight\":\"\",\"f_cat1_font_transform\":\"\",\"f_cat1_font_spacing\":\"\",\"f_cat1_\":\"\",\"f_meta1_font_title\":\"Article meta info 1\",\"f_meta1_font_settings\":\"\",\"f_meta1_font_family\":\"\",\"f_meta1_font_size\":\"\",\"f_meta1_font_line_height\":\"\",\"f_meta1_font_style\":\"\",\"f_meta1_font_weight\":\"\",\"f_meta1_font_transform\":\"\",\"f_meta1_font_spacing\":\"\",\"f_meta1_\":\"\",\"f_ex1_font_title\":\"Article excerpt 1\",\"f_ex1_font_settings\":\"\",\"f_ex1_font_family\":\"\",\"f_ex1_font_size\":\"\",\"f_ex1_font_line_height\":\"\",\"f_ex1_font_style\":\"\",\"f_ex1_font_weight\":\"\",\"f_ex1_font_transform\":\"\",\"f_ex1_font_spacing\":\"\",\"f_ex1_\":\"\",\"f_title2_font_title\":\"Article title 2\",\"f_title2_font_settings\":\"\",\"f_title2_font_family\":\"\",\"f_title2_font_size\":\"\",\"f_title2_font_line_height\":\"\",\"f_title2_font_style\":\"\",\"f_title2_font_weight\":\"\",\"f_title2_font_transform\":\"\",\"f_title2_font_spacing\":\"\",\"f_title2_\":\"\",\"f_cat2_font_title\":\"Article category tag 2\",\"f_cat2_font_settings\":\"\",\"f_cat2_font_family\":\"\",\"f_cat2_font_size\":\"\",\"f_cat2_font_line_height\":\"\",\"f_cat2_font_style\":\"\",\"f_cat2_font_weight\":\"\",\"f_cat2_font_transform\":\"\",\"f_cat2_font_spacing\":\"\",\"f_cat2_\":\"\",\"f_meta2_font_title\":\"Article meta info 2\",\"f_meta2_font_settings\":\"\",\"f_meta2_font_family\":\"\",\"f_meta2_font_size\":\"\",\"f_meta2_font_line_height\":\"\",\"f_meta2_font_style\":\"\",\"f_meta2_font_weight\":\"\",\"f_meta2_font_transform\":\"\",\"f_meta2_font_spacing\":\"\",\"f_meta2_\":\"\",\"f_ex2_font_title\":\"Article excerpt 2\",\"f_ex2_font_settings\":\"\",\"f_ex2_font_family\":\"\",\"f_ex2_font_size\":\"\",\"f_ex2_font_line_height\":\"\",\"f_ex2_font_style\":\"\",\"f_ex2_font_weight\":\"\",\"f_ex2_font_transform\":\"\",\"f_ex2_font_spacing\":\"\",\"f_ex2_\":\"\",\"mix_color\":\"\",\"mix_type\":\"\",\"fe_brightness\":\"1\",\"fe_contrast\":\"1\",\"fe_saturate\":\"1\",\"mix_color_h\":\"\",\"mix_type_h\":\"\",\"fe_brightness_h\":\"1\",\"fe_contrast_h\":\"1\",\"fe_saturate_h\":\"1\",\"shadow_shadow_header\":\"\",\"shadow_shadow_title\":\"Module Shadow\",\"shadow_shadow_size\":\"\",\"shadow_shadow_offset_horizontal\":\"\",\"shadow_shadow_offset_vertical\":\"\",\"shadow_shadow_spread\":\"\",\"shadow_shadow_color\":\"\",\"color_overlay\":\"\",\"meta_bg\":\"\",\"title_txt\":\"\",\"title_txt_hover\":\"\",\"all_underline_height1\":\"\",\"all_underline_color1\":\"#000\",\"cat_style\":\"\",\"cat_bg\":\"\",\"cat_bg_hover\":\"\",\"cat_txt\":\"\",\"cat_txt_hover\":\"\",\"cat_border1\":\"\",\"cat_border_hover1\":\"\",\"author_txt\":\"\",\"author_txt_hover\":\"\",\"date_txt\":\"\",\"ex_txt\":\"\",\"com_bg\":\"\",\"com_txt\":\"\",\"rev_txt\":\"\",\"audio_btn_color\":\"\",\"audio_time_color\":\"\",\"audio_bar_color\":\"\",\"audio_bar_curr_color\":\"\",\"meta_bg2\":\"\",\"title_txt2\":\"\",\"title_txt_hover2\":\"\",\"all_underline_height2\":\"\",\"all_underline_color2\":\"#000\",\"cat_bg2\":\"\",\"cat_bg_hover2\":\"\",\"cat_txt2\":\"\",\"cat_txt_hover2\":\"\",\"cat_border2\":\"\",\"cat_border_hover2\":\"\",\"author_txt2\":\"\",\"author_txt_hover2\":\"\",\"date_txt2\":\"\",\"ex_txt2\":\"\",\"com_bg2\":\"\",\"com_txt2\":\"\",\"rev_txt2\":\"\",\"audio_btn_color2\":\"\",\"audio_time_color2\":\"\",\"audio_bar_color2\":\"\",\"audio_bar_curr_color2\":\"\",\"pag_text\":\"\",\"pag_h_text\":\"\",\"pag_bg\":\"\",\"pag_h_bg\":\"\",\"pag_border\":\"\",\"pag_h_border\":\"\",\"btn_title\":\"\",\"ajax_pagination\":\"\",\"ajax_pagination_next_prev_swipe\":\"\",\"ajax_pagination_infinite_stop\":\"\",\"css\":\"\",\"tdc_css\":\"\",\"td_column_number\":3,\"header_color\":\"\",\"color_preset\":\"\",\"border_top\":\"\",\"class\":\"tdi_34\",\"tdc_css_class\":\"tdi_34\",\"tdc_css_class_style\":\"tdi_34_rand_style\"}';\nblock_tdi_34.td_column_number = \"3\";\nblock_tdi_34.block_type = \"td_flex_block_4\";\nblock_tdi_34.post_count = \"5\";\nblock_tdi_34.found_posts = \"23\";\nblock_tdi_34.header_color = \"\";\nblock_tdi_34.ajax_pagination_infinite_stop = \"\";\nblock_tdi_34.max_num_pages = \"5\";\ntdBlocksArray.push(block_tdi_34);\n<\/script><div class=\"td-block-title-wrap\"><\/div><div id=tdi_34 class=\"td_block_inner td-mc1-wrap\">\r\n        <div class=\"td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post\">\r\n            <div class=\"td-module-container td-category-pos-image\">\r\n                                    <div class=\"td-image-container\">\r\n                                                <div class=\"td-module-thumb\"><a href=\"https:\/\/app.mitunet.com\/home\/icon-zalo\/\"  rel=\"bookmark\" class=\"td-image-wrap \" title=\"Full b\u1ed9 icon zalo m\u1edbi nh\u1ea5t, emoji zalo \u0111\u1ea7y \u0111\u1ee7, c\u00e1c emoji icon d\u1ec5 th\u01b0\u01a1ng\" ><span class=\"entry-thumb td-thumb-css\" data-type=\"css_image\" data-img-url=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/emoji-zalo-696x522.jpg\"  ><\/span><\/a><\/div>                                                                    <\/div>\r\n                \r\n                <div class=\"td-module-meta-info\">\r\n                                        \r\n                    <h3 class=\"entry-title td-module-title\"><a href=\"https:\/\/app.mitunet.com\/home\/icon-zalo\/\"  rel=\"bookmark\" title=\"Full b\u1ed9 icon zalo m\u1edbi nh\u1ea5t, emoji zalo \u0111\u1ea7y \u0111\u1ee7, c\u00e1c emoji icon d\u1ec5 th\u01b0\u01a1ng\">Full b\u1ed9 icon zalo m\u1edbi nh\u1ea5t, emoji zalo \u0111\u1ea7y \u0111\u1ee7, c\u00e1c emoji icon d\u1ec5 th\u01b0\u01a1ng<\/a><\/h3>\r\n                    \r\n                    \r\n                    \r\n                    \r\n                                    <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        \r\n        <div class=\"td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post\">\r\n            <div class=\"td-module-container td-category-pos-image\">\r\n                                    <div class=\"td-image-container\">\r\n                                                <div class=\"td-module-thumb\"><a href=\"https:\/\/app.mitunet.com\/home\/icon-pinterest\/\"  rel=\"bookmark\" class=\"td-image-wrap \" title=\"C\u00e1c icon pinterest m\u1edbi nh\u1ea5t, b\u1ed9 emoji pinterest \u0111\u1ea7y \u0111\u1ee7, bi\u1ec3u t\u01b0\u1ee3ng c\u1ea3m x\u00fac\" ><span class=\"entry-thumb td-thumb-css\" data-type=\"css_image\" data-img-url=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/emoji-pinterest-696x522.jpg\"  ><\/span><\/a><\/div>                                                                    <\/div>\r\n                \r\n                <div class=\"td-module-meta-info\">\r\n                                        \r\n                    <h3 class=\"entry-title td-module-title\"><a href=\"https:\/\/app.mitunet.com\/home\/icon-pinterest\/\"  rel=\"bookmark\" title=\"C\u00e1c icon pinterest m\u1edbi nh\u1ea5t, b\u1ed9 emoji pinterest \u0111\u1ea7y \u0111\u1ee7, bi\u1ec3u t\u01b0\u1ee3ng c\u1ea3m x\u00fac\">C\u00e1c icon pinterest m\u1edbi nh\u1ea5t, b\u1ed9 emoji pinterest \u0111\u1ea7y \u0111\u1ee7, bi\u1ec3u t\u01b0\u1ee3ng c\u1ea3m x\u00fac<\/a><\/h3>\r\n                    \r\n                    \r\n                    \r\n                    \r\n                                    <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        \r\n        <div class=\"td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post\">\r\n            <div class=\"td-module-container td-category-pos-image\">\r\n                                    <div class=\"td-image-container\">\r\n                                                <div class=\"td-module-thumb\"><a href=\"https:\/\/app.mitunet.com\/home\/may-tinh-online\/\"  rel=\"bookmark\" class=\"td-image-wrap \" title=\"M\u00e1y t\u00ednh online t\u00ednh to\u00e1n chu\u1ea9n nh\u1ea5t, \u1ee9ng d\u1ee5ng m\u00e1y t\u00ednh casio online mi\u1ec5n ph\u00ed\" ><span class=\"entry-thumb td-thumb-css\" data-type=\"css_image\" data-img-url=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/may-tinh-online-696x522.jpg\"  ><\/span><\/a><\/div>                                                                    <\/div>\r\n                \r\n                <div class=\"td-module-meta-info\">\r\n                                        \r\n                    <h3 class=\"entry-title td-module-title\"><a href=\"https:\/\/app.mitunet.com\/home\/may-tinh-online\/\"  rel=\"bookmark\" title=\"M\u00e1y t\u00ednh online t\u00ednh to\u00e1n chu\u1ea9n nh\u1ea5t, \u1ee9ng d\u1ee5ng m\u00e1y t\u00ednh casio online mi\u1ec5n ph\u00ed\">M\u00e1y t\u00ednh online t\u00ednh to\u00e1n chu\u1ea9n nh\u1ea5t, \u1ee9ng d\u1ee5ng m\u00e1y t\u00ednh casio online mi\u1ec5n ph\u00ed<\/a><\/h3>\r\n                    \r\n                    \r\n                    \r\n                    \r\n                                    <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        \r\n        <div class=\"td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post\">\r\n            <div class=\"td-module-container td-category-pos-image\">\r\n                                    <div class=\"td-image-container\">\r\n                                                <div class=\"td-module-thumb\"><a href=\"https:\/\/app.mitunet.com\/home\/cat-anh-online\/\"  rel=\"bookmark\" class=\"td-image-wrap \" title=\"C\u00f4ng c\u1ee5 c\u1eaft \u1ea3nh online mi\u1ec5n ph\u00ed, ti\u1ec7n \u00edch c\u1eaft x\u00e9n h\u00ecnh \u1ea3nh theo \u00fd mu\u1ed1n\" ><span class=\"entry-thumb td-thumb-css\" data-type=\"css_image\" data-img-url=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/cat-anh-online-696x522.jpg\"  ><\/span><\/a><\/div>                                                                    <\/div>\r\n                \r\n                <div class=\"td-module-meta-info\">\r\n                                        \r\n                    <h3 class=\"entry-title td-module-title\"><a href=\"https:\/\/app.mitunet.com\/home\/cat-anh-online\/\"  rel=\"bookmark\" title=\"C\u00f4ng c\u1ee5 c\u1eaft \u1ea3nh online mi\u1ec5n ph\u00ed, ti\u1ec7n \u00edch c\u1eaft x\u00e9n h\u00ecnh \u1ea3nh theo \u00fd mu\u1ed1n\">C\u00f4ng c\u1ee5 c\u1eaft \u1ea3nh online mi\u1ec5n ph\u00ed, ti\u1ec7n \u00edch c\u1eaft x\u00e9n h\u00ecnh \u1ea3nh theo \u00fd mu\u1ed1n<\/a><\/h3>\r\n                    \r\n                    \r\n                    \r\n                    \r\n                                    <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        \r\n        <div class=\"td_module_flex td_module_flex_1 td_module_wrap td-animation-stack td-cpt-post\">\r\n            <div class=\"td-module-container td-category-pos-image\">\r\n                                    <div class=\"td-image-container\">\r\n                                                <div class=\"td-module-thumb\"><a href=\"https:\/\/app.mitunet.com\/home\/chen-logo-vao-anh-online\/\"  rel=\"bookmark\" class=\"td-image-wrap \" title=\"App ch\u00e8n logo v\u00e0o \u1ea3nh online, c\u00f4ng c\u1ee5 ch\u00e8n ch\u1eef v\u00e0o h\u00ecnh \u1ea3nh mi\u1ec5n ph\u00ed\" ><span class=\"entry-thumb td-thumb-css\" data-type=\"css_image\" data-img-url=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/chen-logo-vao-anh-online-696x522.jpg\"  ><\/span><\/a><\/div>                                                                    <\/div>\r\n                \r\n                <div class=\"td-module-meta-info\">\r\n                                        \r\n                    <h3 class=\"entry-title td-module-title\"><a href=\"https:\/\/app.mitunet.com\/home\/chen-logo-vao-anh-online\/\"  rel=\"bookmark\" title=\"App ch\u00e8n logo v\u00e0o \u1ea3nh online, c\u00f4ng c\u1ee5 ch\u00e8n ch\u1eef v\u00e0o h\u00ecnh \u1ea3nh mi\u1ec5n ph\u00ed\">App ch\u00e8n logo v\u00e0o \u1ea3nh online, c\u00f4ng c\u1ee5 ch\u00e8n ch\u1eef v\u00e0o h\u00ecnh \u1ea3nh mi\u1ec5n ph\u00ed<\/a><\/h3>\r\n                    \r\n                    \r\n                    \r\n                    \r\n                                    <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":693,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-526","page","type-page","status-publish","has-post-thumbnail"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet<\/title>\n<meta name=\"description\" content=\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet\" \/>\n<meta property=\"og:description\" content=\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/\" \/>\n<meta property=\"og:site_name\" content=\"App Mitunet\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-17T04:49:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"600\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 ph\u00fat\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/\",\"url\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/\",\"name\":\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/sua-anh-online.jpg\",\"datePublished\":\"2026-08-10T13:29:09+00:00\",\"dateModified\":\"2026-08-17T04:49:25+00:00\",\"description\":\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/#breadcrumb\"},\"inLanguage\":\"vi\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"vi\",\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/#primaryimage\",\"url\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/sua-anh-online.jpg\",\"contentUrl\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/wp-content\\\/uploads\\\/2026\\\/08\\\/sua-anh-online.jpg\",\"width\":800,\"height\":600,\"caption\":\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online mi\u1ec5n ph\u00ed\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/chinh-sua-anh\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Trang ch\u1ee7\",\"item\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/#website\",\"url\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/\",\"name\":\"App Mitunet\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/app.mitunet.com\\\/home\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"vi\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet","description":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/","og_locale":"vi_VN","og_type":"article","og_title":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet","og_description":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...","og_url":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/","og_site_name":"App Mitunet","article_modified_time":"2026-08-17T04:49:25+00:00","og_image":[{"width":800,"height":600,"url":"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"4 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/","url":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/","name":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn | App Mitunet","isPartOf":{"@id":"https:\/\/app.mitunet.com\/home\/#website"},"primaryImageOfPage":{"@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/#primaryimage"},"image":{"@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/#primaryimage"},"thumbnailUrl":"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg","datePublished":"2026-08-10T13:29:09+00:00","dateModified":"2026-08-17T04:49:25+00:00","description":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn hay, ph\u1ea7n m\u1ec1m ti\u1ec7n \u00edch ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh, c\u1eaft \u1ea3nh, n\u00e9n \u1ea3nh, ch\u00e8n logo v\u00e0o \u1ea3nh...","breadcrumb":{"@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/#primaryimage","url":"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg","contentUrl":"https:\/\/app.mitunet.com\/home\/wp-content\/uploads\/2026\/08\/sua-anh-online.jpg","width":800,"height":600,"caption":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online mi\u1ec5n ph\u00ed"},{"@type":"BreadcrumbList","@id":"https:\/\/app.mitunet.com\/home\/chinh-sua-anh\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Trang ch\u1ee7","item":"https:\/\/app.mitunet.com\/home\/"},{"@type":"ListItem","position":2,"name":"C\u00f4ng c\u1ee5 ch\u1ec9nh s\u1eeda \u1ea3nh online, \u1ee9ng d\u1ee5ng ch\u1ec9nh s\u1eeda h\u00ecnh \u1ea3nh tr\u1ef1c tuy\u1ebfn"}]},{"@type":"WebSite","@id":"https:\/\/app.mitunet.com\/home\/#website","url":"https:\/\/app.mitunet.com\/home\/","name":"App Mitunet","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/app.mitunet.com\/home\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"}]}},"_links":{"self":[{"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/pages\/526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/comments?post=526"}],"version-history":[{"count":22,"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/pages\/526\/revisions"}],"predecessor-version":[{"id":706,"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/pages\/526\/revisions\/706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/media\/693"}],"wp:attachment":[{"href":"https:\/\/app.mitunet.com\/home\/wp-json\/wp\/v2\/media?parent=526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}