....................................../////.===Shadow-Here===./////................................................ > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < ------------------------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð enü¹%½_F‘åè¿2ºQú³íªú`N¿­3ÿƒügµJžaÿ¯ÿ°~¼ÎùnúîÞÖô•òíôÁÉß®Sm¥Ü/ ‡ó˜f£Ùà<˜„xëJ¢Ù€SO3x<ªÔ©4¿+ç¶A`q@Ì“Úñè™ÍÿJÌ´ª-˜ÆtÊÛL]Ïq*‘Ý”ì#ŸÌÏãY]@ê`¿ /ªfkØB4·®£ó z—Üw¥Pxù–ÞLШKÇN¾AkÙTf½è'‰g gÆv›Øuh~ a˜Z— ïj*á¥t d£“uÒ ¨`K˜¹ßþ]b>˜]_ÏÔ6W—è2r4x•íÖ…"ƒÖNîä!¦å Ú}ýxGøÌ —@ ;ÆÚŠ=ɾ1ý8lªË¥ô ^yf®Œ¢u&2©nÙÇ›ñÂñŒ³ aPo['½»øFùà­+4ê“$!lövlüÞ=;N®3ð‚õ›DÉKòÞ>ÄÍ ¥ˆuߤ#ˆ$6ù™¥îЇy’ÍB¼ çxÛ;X"WL£R÷͝*ó-¶Zu}º.s¸sšXqù–DþÿvªhüïwyŸ ¯é³lÀ:KCûÄ£Ëá\…­ ~—ýóî ¼ûûÜTÓüÇy…ŽÆvc»¾×U ñ¸žþоP÷¦ó:Ò¨¨5;Ð#&#ÖúñläÿÁœ GxÉ­/ñ‡áQðìYÉtÒw޼GÔ´zàÒò ð*ëzƒ•4~H]Ø‹f ñÓÈñ`NåWçs'ÆÏW^ø¹!XžµmQ5ÃËoLœÎ: ÞËÍ¥J ù…î èo£ßPÎñ¶ž8.Œ]ʵ~5›ÙË-ù*8ÙÖß±~ ©¹rÓê‚j¶d¸{^Q'˜±Crß ÚH—#¥¥QlÀ×ëã‡DÜ«èî þ&Çæžî;ŽÏºò6ÒLÃXy&ZŒ'j‚¢Ù€IßÚù+–MGi‰*jE€‘JcÜ ÓÌ EÏÚj]o˜ Þr <¾U ûŪæÍ/šÝH¥˜b”¼ ÁñßX GP›ï2›4WŠÏà×£…íÓk†¦H·ÅíMh–*nó÷à]ÁjCº€b7<ب‹¨5車bp2:Á[UªM„QŒçiNMa#<5›áËó¸HýÊ"…×Éw¹¦ì2º–x<›»a±¸3Weü®FÝ⑱ö–î–³|LPÈ~çð~Çå‡|º kD¢µÏàÆAI %1À% ¹Ò – ”ϝS¦‰4&¶£°à Öý”û_Ò Áw°A«Å€?mÇÛgHÉ/8)á¾ÛìáöŽP í¨PŸNÙµº¦‡§Ùš"ÿ«>+ªÕ`Ê÷‡‚ß Õû˜þãÇ-PÍ.¾XV‘€ dÜ"þ4¹ ±Oú‘©t¥¦FªÄÃÄ•b‚znýu½—#cDs˜ÃiÑOˆñ×QO=*IAÊ,¶ŽZƒ;‡wøXè%EÐk:F±Ú” .Ѽ+Áu&Ç`."pÈÉw o&¿dE6‘’EqTuK@Ì¥ã™À(Êk(h‰,H}RÀIXÛš3µ1©_OqÚÒJAñ$ÊÙÜ;D3çŒ[þùœh¬Ã³™ö6ç†NY".Ú‰ï[ªŸŒ '²Ð öø_¨ÂÉ9ué¶³ÒŠõTàîMØ#û¯gN‡bÙ놚X„ö …ÉeüÌ^J ‹€.œ$Æ)βÄeæW#óüßĺŸ€ ÀzwV 9oä»f4V*uB «Ë†¹ì¯žR霓æHXa=&“I4K;¯ç‹h×·"UŠ~<•╪Vêª&ÍSÃÆÅ?ÔqÎ*mTM ˜›µwêd#[C¡©§‘D<©àb†–ÁœøvH/,í:¯( ²£|4-„Æövv„Yͼ™^Á$ˆ„¢Û[6yB.åH*V¨æ?$=˜Ñ€•ñ·­(VlŸ‘ nÀt8W÷´Bûba?q9ú¶Xƒl«ÿ\ù¶’þòUÐj/õ¢Ìµ³g$ƒÎR!¸»|Oߍë’BhîÚÑ¢ñåŒJ„®„£2Ð3•ô02Nt…!£Í]Ïc½Qÿ?ˆ<&ÃA¾Ú,JˆijÌ#5yz„‰Î|ÊŽ5QÏ:‹ÐaóVÔxW—CpeÏzÐïíçôÿÅ_[hãsÐ_/ŽTÝ?BîˆííV$<¿i>²F¬_Eß¿ †bÊŒº­ÿ®Z H“C}”¬,Mp ý/Bá£w>˜YV°aƒúh+cŠ- r/[%|üUMHäQ°X»|û/@|°¥Ð !BÔ Ç¢Ä©š+Õì D«7ìN¶ŽðÔ " ƶ’ÖçtA‰Û×}{tþz­¾GÍ›k¹OEJR$ Â׃ «ëÁ"oÉôž$oUK(Ä)Ãz³Ê-‹êN[Ò3Œñbï8P 4ƒ×q¢bo|?<ÛX¬òÄͰL–±›(™ûG?ýË©ÚÄ–ÂDØÐ_Ç¡ô ¾–ÄÏø ×e8Ë©$ÄF¹Å‹ì[©óìl:F¾f´‹‹Xì²ï®\¬ôùƒ ÿat¥óèÒùHß0äe‚;ü×h:ÆWðHž=Ã8骣"kœ'Y?³}Tûè€>?0l›e1Lòñ„aæKÆw…hÖŠùW…ÈÆÄ0ši·›[pcwËþñiêíY/~-Á5˜!¿†A›™Mÿþ(±“t@â“ö2­´TG5yé]çå僳 .·ÍïçÝ7UÚ±Ð/Nè»,_Ï ùdj7\ï Wì4›„»c¸àešg#ÒÊ⥭áØo5‘?ÌdÝô¯ ¹kzsƒ=´#ëÉK›Ø´±-¥eW?‡çßtòTã…$Ý+qÿ±ƒ÷_3Ô¥í÷:æ–ž<·Ö‡‰Å¢ š‡%Ô—utÌÈìðžgÖÀz²À—ï÷Óîäõ{K'´È÷³yaÏÁjƒô}ž§®æÊydÕÈë5¯èˆõvÕ©ã*çD„ “z„Ó‡^^xÂ3M§A´JG‚öï 3W'ˆ.OvXè¡ÊÕª?5º7†˜(˜Ç¶#çê’¶!ÌdZK§æ 0fãaN]òY³RV ™î$®K2R¨`W!1Ôó\;Ý ýB%qæK•&ÓÈe9È0êI±žeŸß -ú@žQr¦ ö4»M¼Áè¹µmw 9 EÆE_°2ó„ŸXKWÁ×Hóì^´²GѝF©óäR†¦‰ç"V»eØ<3ùd3ÿÚ¤Žú“Gi" —‘_ÙËÎ~Üö¯¥½Î»üŸEÚŽåmÞþí ;ÞólËΦMzA"Âf(´òá;Éï(/7½ûñÌ­cïÕçлþÝz¾-ÍvÑ“pH­–ðÓj$¸Äû¤‚‘ãUBË-n“2åPkS5&‹Â|+g^œ®Ì͆d!OïäîU«c;{Û!ÅŽ«ëZ9Ókóˆ]¯ƒ›né `ÇÒ+tÆš (ØKá¾—=3œ®•vuMñg²\ï Ec€ 05±d™‡×iÇ×›UúvÌ¢£Èþ¡ÕØô¶ßÎA"ß±#Ö²ˆÊŸ¦*Ä~ij|àø.-¼'»Ú¥£h ofº¦‡VsR=N½„Î v˜Z*SÌ{=jÑB‹tê…;’HžH¯8–îDù8ñ¢|Q•bÛçš–‹m³“ê¨ åÏ^m¬Žãþ©ïêO‡½6] µÆ„Ooòü ²x}N¦Ë3ïé¿»€›HA˜m%çÞ/¿í7Fø“‹léUk)É°Œµ8Q8›:ÀŠeT*šõ~ôڝG6 ¢}`ùH­–”¡k ‰P1>š†®9z11!X wKfmÁ¦xÑ,N1Q”–æB¶M…ÒÃv6SMˆhU¬ÊPŽï‘öj=·CŒ¯u¹ƒVIЃsx4’ömÛýcå¡¶7ßŠß 57^\wÒÐÆ k§h,Œý î«q^R½3]J¸ÇðN ‚çU¬ôº^Áì} ³f©Õœ§ˆã:FÄÈ‚é(€™?àýÓüè1Gô£¼éj‚OÅñ  #>×—ßtà 0G¥Åa뀐kßhc™À_ÉñÞ#±)GD" YîäË-ÿÙ̪ ¹™a¯´¢E\ÝÒö‚;™„ë]_ p8‰o¡ñ+^÷ 3‘'dT4œŽ ðVë½° :¬víÑ«£tßÚS-3¶“þ2 †üüʨòrš¹M{É_¤`Û¨0ìjœøJ‡:÷ÃáZ˜†@GP&œÑDGÏs¡þ¦þDGú‘1Yá9Ôþ¼ ûø…§÷8&–ÜÑnÄ_m®^üÆ`;ÉVÁJ£?â€-ßê}suÍ2sõA NÌúA磸‘îÿÚ»ƒìö·á¿±tÑÐ"Tÿü˜[@/äj¬€uüªìù¥Ý˜á8Ý´sõj 8@rˆð äþZÇD®ÿUÏ2ùôõrBzÆÏÞž>Ì™xœ“ wiÎ×7_… ¸ \#€MɁV¶¥üÕÿPÔ9Z‡ø§É8#H:ƒ5ÀÝå9ÍIŒ5åKÙŠ÷qÄ>1AÈøžj"µÂд/ªnÀ qªã}"iŸBå˜ÓÛŽ¦…&ݧ;G@—³b¯“•"´4í¨ôM¨åñC‹ïùÉó¯ÓsSH2Ý@ßáM‡ˆKÀªÛUeø/4\gnm¥‹ŸŒ qÄ b9ÞwÒNÏ_4Ég³ú=܆‚´ •â¥õeíþkjz>éÚyU«Íӝ݃6"8/ø{=Ô¢»G¥ äUw°W«,ô—¿ãㆅү¢³xŠUû™yŒ (øSópÐ 9\åTâ»—*oG$/×ÍT†Y¿1¤Þ¢_‡ ¼ „±ÍçèSaÓ 3ÛMÁBkxs‰’R/¡¤ˆÙçª(*õ„üXÌ´ƒ E§´¬EF"Ù”R/ÐNyÆÂ^°?™6¡œïJ·±$§?º>ÖüœcNÌù¯G ‹ñ2ЁBB„^·úìaz¨k:#¨Æ¨8LÎõލ£^§S&cŒÐU€ü(‡F±Š¼&P>8ÙÁ ‰ p5?0ÊÆƒZl¸aô š¼¡}gÿ¶zÆC²¹¬ÎÖG*HB¡O<º2#ñŒAƒ–¡B˜´É$¥›É:FÀÔx¾u?XÜÏÓvN©RS{2ʈãk9rmP¼Qq̳ è¼ÐFׄ^¡Öì fE“F4A…!ì/…¦Lƒ… … $%´¾yã@CI¬ á—3PþBÏNÿ<ý°4Ü ËÃ#ØÍ~âW«rEñw‹eùMMHß²`¬Öó½íf³:‹k˜¯÷}Z!ã¿<¥,\#öµÀ¯aÒNÆIé,Ћ–lŽ#Àæ9ÀÒS·I’½-Ïp Äz¤Š Â* ­íÄ9­< h>׍3ZkËU¹§˜ŒŠ±f­’¤º³Q ÏB?‹#µíÃ¥®@(Gs«†vI¥Mµ‹Á©e~2ú³ÁP4ìÕi‚²Ê^ö@-DþÓàlÜOÍ]n"µã:žpsŽ¢:! Aõ.ç~ÓBûH÷JCÌ]õVƒd «ú´QÙEA–¯¯Œ!.ˆˆëQ±ù œ·Ì!Õâ )ùL„ÅÀlÚè5@B…o´Æ¸XÓ&Û…O«˜”_#‡ƒ„ûÈt!¤ÁÏ›ÎÝŠ?c9 â\>lÓÁVÄÑ™£eØY]:fÝ–—ù+p{™ðè û³”g±OƒÚSù£áÁÊ„ä,ï7š²G ÕÌBk)~ÑiCµ|h#u¤¶îK¨² #²vݯGãeÖ϶ú…¾múÀ¶þÔñ‚Š9'^($¤§ò “š½{éúp÷J›ušS¹áªCÂubÃH9™D™/ZöØÁ‡¦ÝÙŸ·kð*_”.C‹{áXó€‡c¡c€§/šò/&éš÷,àéJþ‰X›fµ“C¨œ®r¬"kL‰Â_q…Z–.ÉL~O µ›zn‚¹À¦Öª7\àHµšÖ %»ÇníV[¥*Õ;ƒ#½¾HK-ÖIÊdÏEÚ#=o÷Óò³´Š: Ç?{¾+9›–‘OEáU·S€˜j"ÄaÜ ŒÛWt› á–c#a»pÔZÞdŽtWê=9éöÊ¢µ~ ë ;Öe‡Œ®:bî3±ýê¢wà¼îpêñ¹¾4 zc¾ðÖÿzdêŒÑÒŝÀ‰s6¤í³ÎÙB¿OZ”+F¤á‡3@Ñëäg©·Ž ˆèª<ù@É{&S„œÕúÀA)‰h:YÀ5^ÂÓŒ°õäU\ ùËÍû#²?Xe¬tu‰^zÒÔãë¼ÛWtEtû …‚g¶Úüâî*moGè¨7%u!]PhÏd™Ý%Îx: VÒ¦ôÊD3ÀŽKÛËãvÆî…N¯ä>Eró–ð`5 Œ%u5XkñÌ*NU%¶áœÊ:Qÿú»“úzyÏ6å-၇¾ ´ ÒÊ]y žO‘w2Äøæ…H’²f±ÎÇ.ª|¥'gîV•Ü .̘¯€šòü¤U~Ù†*¢!?ò wý,}´°ÔÞnïoKq5µb!áÓ3"vAßH¡³¡·G(ÐÎ0Îò¼MG!/ài®@—¬04*`…«é8ªøøló“ˆÊ”èù¤…ßÊoÿé'ËuÌÖ5×È¡§ˆˆfŽë9}hìâ_!!¯  B&Ëö¶‰ÀAÙNVŸ Wh›¸®XÑJì¨ú“¿÷3uj²˜¨ÍÎìë±aúŠÝå¯ð*Ó¨ôJ“yºØ)m°WýOè68†ŸÏ2—‰Ïüꪫٚ¥‹l1 ø ÏÄFjêµvÌbü¦èÝx:X±¢H=MÐß—,ˆÉÇ´(9ú¾^ÅÚ4¿m‡$âX‘å%(AlZo@½¨UOÌÕ”1ø¸jÎÀÃÃ_ µ‘Ü.œº¦Ut: Æï’!=¯uwû#,“pþÇúŒø(é@?³ü¥‘Mo §—s@Œ#)§ŒùkL}NOÆêA›¸~r½¼ÙA—HJ«eˆÖ´*¡ÓpÌŸö.m<-"³ûÈ$¬_6­åf£ïÚâj1y§ÕJ½@dÞÁr&Í\Z%D£Íñ·AZ Û³øüd/ªAi†/Й~  ‡âĮҮÏh§°b—›Û«mJžòG'[ÈYýŒ¦9psl ýÁ ®±f¦x,‰½tN ‚Xª9 ÙÖH.«Lo0×?͹m¡å†Ѽ+›2ƒF ±Ê8 7Hցϓ²Æ–m9…òŸï]Â1äN†VLâCˆU .ÿ‰Ts +ÅÎx(%¦u]6AF Š ØF鈄‘ |¢¶c±soŒ/t[a¾–û:s·`i햍ê›ËchÈ…8ßÀUÜewŒðNOƒõD%q#éû\9¤x¹&UE×G¥ Í—™$ð E6-‡¼!ýpãÔM˜ Âsìe¯ñµK¢Ç¡ùôléœ4Ö£”À Š®Ðc ^¨À}ÙËŸ§›ºê{ÊuÉC ×Sr€¤’fÉ*j!úÓ’Gsùìoîßîn%ò· àc Wp÷$¨˜)û»H ×8ŽÒ€Zj¤3ÀÙºY'Ql¦py{-6íÔCeiØp‘‡XÊîÆUߢ܂ž£Xé¼Y8þ©ëgñß}é.ÎógÒ„ÃØËø¯»™§Xýy M%@NŠ À(~áÐvu7&•,Ù˜ó€uP‡^^®=_E„jt’ 403WebShell
403Webshell
Server IP : 217.79.180.202  /  Your IP : 216.73.216.216
Web Server : Apache
System : Linux vps2460721.fastwebserver.de 5.15.0-122-generic #132-Ubuntu SMP Thu Aug 29 13:45:52 UTC 2024 x86_64
User : tecnoelite ( 1001)
PHP Version : 8.1.2-1ubuntu2.18
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /home/tecnoelite/public_html/wp-content/plugins/wp-optimize-premium/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/tecnoelite/public_html/wp-content/plugins/wp-optimize-premium/premium.php
<?php
if (!defined('ABSPATH')) die('No direct access allowed');

if (!class_exists('WP_Optimize_Premium')) {

class WP_Optimize_Premium {

	protected static $_instance = null;

	protected $cron_scheduler = null;

	/**
	 * Stores WP_Optimize_Power_Tweaks instance
	 *
	 * @var WP_Optimize_Power_Tweaks
	 */
	public $power_tweaks;

	/**
	 * WP_Optimize_Premium constructor
	 */
	public function __construct() {

		if (class_exists('WP_CLI_Command')) {
			include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-wp-optimize-cli-command.php');
		}

		// load task manager.
		WP_Optimize()->get_task_manager();
		include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-wp-optimize-queue-task.php');

		$this->cron_scheduler = WP_Optimize_Cron_scheduler::get_instance();

		include_once(WPO_PLUGIN_MAIN_PATH.'includes/class-wp-optimize-lazy-load.php');
		add_filter('wp_optimize_loggers_classes', array($this, 'loggers_classes'));
		add_filter('additional_options_updraft_slack_logger', array($this, 'additional_options_updraft_slack_logger'), 20, 3);

		// Add custom capabilities.
		$this->setup_capabilities();

		// Single table optimize feature.
		add_filter('wpo_tables_list_additional_column_data', array($this, 'tables_list_additional_column_data'), 10, 2);
		add_action('wpo_tables_list_before', array($this, 'wpo_tables_list_before'));
		add_filter('wpo_get_tables_data', array($this, 'show_innodb_force_optimize'));

		if (is_multisite()) {
			add_action('wpo_additional_options', array($this, 'wpo_additional_options'));
			add_action('wpo_additional_options_cron', array($this, 'wpo_additional_options_cron'));
		}

		add_action('wpo_premium_scripts_styles', array($this, 'enqueue_scripts_styles'), 15, 3);
		add_action('wp_enqueue_scripts', array($this, 'premium_frontend_enqueue_scripts'));

		add_filter('wp_optimize_sub_menu_items', array($this, 'change_premium_page_title'), 20);
		add_filter('wp_optimize_admin_page_wpo_mayalso_tabs', array($this, 'check_premium_tab_title'));
		add_filter('wp_optimize_admin_page_wpo_images_tabs', array($this, 'admin_page_images_tabs'));
		add_filter('wp_optimize_admin_page_WP-Optimize_tabs', array($this, 'admin_page_database_tabs'));
		add_filter('wp_optimize_admin_page_wpo_minify_tabs', array($this, 'admin_page_minify_tabs'));

		add_action('auto_option_settings', array($this, 'auto_option_settings'));
		add_filter('wp_optimize_option_keys', array($this, 'wp_optimize_option_keys'));
		add_filter('wpo_cron_next_event', array($this->cron_scheduler, 'wpo_cron_next_event'));
		add_filter('wpo_js_translations', array($this, 'wpo_js_translations'));
		add_filter('wpo_default_auto_options', array($this, 'default_auto_options'));

		add_action('wpo_after_general_settings', array($this, 'after_general_settings'));

		add_filter('wpo_faq_url', array($this, 'wpo_faq_url'));

		/**
		 * Add action for display Images > Unused images and sizes tab.
		 */
		add_action('wp_optimize_admin_page_wpo_images_unused', array($this, 'admin_page_wpo_images_unused'));
		
		/**
		 * Add action to automatically delete attachment from Unused images list.
		 */
		add_action('delete_attachment', array($this, 'delete_image_from_images_cache'));
		/**
		 * Add action for display Dashboard > Lazyload tab.
		 */
		add_action('wp_optimize_admin_page_wpo_images_lazyload', array($this, 'admin_page_wpo_images_lazyload'));

		add_action('admin_init', array($this, 'handle_unused_images_csv'));

		/**
		 * Add action for loading 3rd party plugin compatibilities.
		 */
		add_action('wpo_load_compatibilities', array($this, 'load_compatibilities'));

		$this->schedule_image_optimization_jobs();
		$this->include_lazy_load();
		$this->include_images_trash();
		$this->include_cache_premium();
		$this->include_power_tweaks();
		WP_Optimize_Bulk_Smush::get_instance();

		if (!is_admin() && WP_Optimize()->get_options()->get_option('image_dimensions')) {
			$this->include_image_dimensions();
		}

		if (!class_exists('Updraft_Manager_Updater_1_9')) {
			include_once(WPO_PLUGIN_MAIN_PATH.'vendor/davidanderson684/simba-plugin-manager-updater/class-udm-updater.php');
		}
		
		try {
			new Updraft_Manager_Updater_1_9('https://teamupdraft.com/plugin-info/', 2, 'wp-optimize-premium/wp-optimize.php', array('require_login' => false));
		} catch (Exception $e) {
			error_log($e->getMessage().' at '.$e->getFile().' line '.$e->getLine());
		}
		
		add_filter('wpo_premium_ajax_commands', array($this, 'get_premium_commands'));

		// Hook filters for DB query analysis
		$this->get_db_table_analysis();

		add_filter('udmupdater_automatically_update_when_available', array($this, 'add_forgot_password_link'), 10, 2);
	}

	/**
	 * Plugin activation actions.
	 */
	public function plugin_activation_actions() {
		// reschedule scheduled events.
		$this->cron_scheduler->wpo_cron_deactivate();
		$this->cron_scheduler->cron_activate();
	}

	/**
	 * Runs upon the WP action admin_page_wpo_images_unused
	 */
	public function admin_page_wpo_images_unused() {
		WP_Optimize()->include_template('images/unused.php');
	}

	/**
	 * Runs upon the WP action wp_optimize_admin_page_wpo_images_lazyload
	 */
	public function admin_page_wpo_images_lazyload() {
		WP_Optimize()->include_template('images/lazyload.php', false, array('lazyload_already_provided_by' => implode(', ', $this->lazyload_already_provided_by())));
	}

	/**
	 * Returns WP_Optimize_Premium instance
	 *
	 * @return null|WP_Optimize_Premium
	 */
	public static function instance() {
		if (empty(self::$_instance)) {
			self::$_instance = new self();
		}
		return self::$_instance;
	}


	/**
	 * Enqueue scripts and styles required for premium version
	 *
	 * @param string $min_or_not_internal - The .min-version-number suffix to use on internal assets
	 * @param string $min_or_not          - The .min suffix to use on third party assets
	 * @param string $enqueue_version     - The enqueued version
	 * @return void
	 */
	public function enqueue_scripts_styles($min_or_not_internal, $min_or_not, $enqueue_version) {
		wp_enqueue_script('wp-optimize-lazy-load', WPO_PLUGIN_URL . 'js/wpo-lazy-load' . $min_or_not_internal . '.js', array(), $enqueue_version);
		wp_enqueue_style('wp-optimize-premium-css', WPO_PLUGIN_URL . 'css/wpo-premium' . $min_or_not_internal . '.css', array(), $enqueue_version);
		wp_enqueue_script('wp-optimize-tablepager', WPO_PLUGIN_URL . 'js/wpo-tablepager' . $min_or_not_internal . '.js', array(), $enqueue_version);

		wp_enqueue_script('select2', WPO_PLUGIN_URL . 'js/select2/select2' . $min_or_not . '.js', array('jquery'), $enqueue_version);
		wp_enqueue_style('select2', WPO_PLUGIN_URL . 'css/select2/select2' . $min_or_not . '.css', array(), $enqueue_version);
		wp_enqueue_script('wp-optimize-images-view-js', WPO_PLUGIN_URL . 'js/wpo-images-view' . $min_or_not_internal . '.js', array('jquery'), $enqueue_version);
		wp_enqueue_script('wp-optimize-premium-js', WPO_PLUGIN_URL . 'js/wpo-premium' . $min_or_not_internal . '.js', array('jquery', 'jquery-ui-dialog', 'wp-optimize-send-command', 'wp-optimize-admin-js', 'wp-optimize-images-view-js', 'jquery-ui-datepicker', 'select2', 'block-ui-js', 'wp-optimize-tablepager'), $enqueue_version);

		wp_enqueue_script('wp-optimize-modernizr-js', WPO_PLUGIN_URL . 'js/modernizr/modernizr-custom' . $min_or_not . '.js', array(), $enqueue_version);
		wp_enqueue_script('wp-optimize-timepicker-js', WPO_PLUGIN_URL . 'js/jquery-timepicker/jquery.timepicker' . $min_or_not . '.js', array('jquery'), $enqueue_version);
		wp_enqueue_style('wp-optimize-timepicker-css', WPO_PLUGIN_URL . 'js/jquery-timepicker/jquery.timepicker'. $min_or_not . '.css', array(), $enqueue_version);

		// Defeat other plugins/themes which dump their jQuery UI CSS onto our settings page
		wp_deregister_style('jquery-ui');
		wp_enqueue_style('jquery-ui', WPO_PLUGIN_URL.'css/jquery-ui.custom' . $min_or_not_internal . '.css', array(), $enqueue_version);

		wp_enqueue_script('handlebars', WPO_PLUGIN_URL . 'js/handlebars/handlebars' . $min_or_not . '.js', array(), '4.1.2');
		wp_enqueue_script('wp-optimize-compiled-handlebars', WPO_PLUGIN_URL . 'templates/handlebars-compiled-'.str_replace('.', '-', WPO_VERSION).'.js', array(), $enqueue_version);
	}

	/**
	 * Enqueue any required front-end scripts
	 *
	 * @return void
	 */
	public function premium_frontend_enqueue_scripts() {
		$enqueue_version = WP_Optimize()->get_enqueue_version();
		$min_or_not_internal = WP_Optimize()->get_min_or_not_internal_string();

		$lazyload_options = WP_Optimize_Lazy_Load::instance()->get_lazy_options();

		if ($lazyload_options['images'] ||
			$lazyload_options['iframes'] ||
			$lazyload_options['backgrounds'] ||
			$lazyload_options['youtube_preview']
		) {
			wp_enqueue_script('wp-optimize-send-command', WPO_PLUGIN_URL.'js/send-command'.$min_or_not_internal.'.js', array(), $enqueue_version);
			wp_enqueue_script('wp-optimize-lazy-load', WPO_PLUGIN_URL . 'js/wpo-lazy-load' . $min_or_not_internal . '.js', array('wp-optimize-send-command'), $enqueue_version);

			if ($lazyload_options['youtube_preview']) {
				wp_enqueue_style('wp-optimize-youtube-preview', WPO_PLUGIN_URL.'css/youtube-image-preview'.$min_or_not_internal.'.css', array(), $enqueue_version);
			}
		}
	}

	/**
	 * Add WP-Optimize custom capabilities.
	 */
	public function setup_capabilities() {
		global $wp_roles;

		if (!isset($wp_roles)) {
			$wp_roles = new WP_Roles();
		}

		$wpo_capabilities = array(
			'wpo_manage_settings',
			'wpo_run_optimizations',
		);

		$old_use_db = $wp_roles->use_db;
		$wp_roles->use_db = true;

		if (!isset($wp_roles->roles['administrator'])) {
			return;
		}

		$administrator = $wp_roles->role_objects['administrator'];

		foreach ($wpo_capabilities as $capability) {
			if (!$administrator->has_cap($capability)) {
				$administrator->add_cap($capability);
			}
		}

		$wp_roles->use_db = $old_use_db;
	}

	/**
	 * Add tabs to Dashboard > Images pages.
	 *
	 * @param array $tabs
	 * @return mixed
	 */
	public function admin_page_images_tabs($tabs) {
		$tabs['unused'] = __('Unused images and sizes', 'wp-optimize');
		$tabs['lazyload'] = __('Lazy-load', 'wp-optimize');
		$tabs['dimensions'] = __('Images dimensions', 'wp-optimize');
		return $tabs;
	}

	/**
	 * Add tabs to Dashboard > Database page
	 *
	 * @param array $tabs
	 * @return mixed
	 */
	public function admin_page_database_tabs($tabs) {
		$tabs['table_analysis'] = __('Table usage', 'wp-optimize');
		return $tabs;
	}
	
	/**
	 * Add tab for analytics
	 *
	 * @param array $tabs
	 *
	 * @return array
	 */
	public function admin_page_minify_tabs($tabs) {
		$tabs['analytics'] = __('Google Analytics', 'wp-optimize');
		return $tabs;
	}

	/**
	 * Add premium logger classes
	 *
	 * @param  array $loggers_classes
	 * @return array
	 */
	public function loggers_classes($loggers_classes) {
		$premium_classes = array(
			'Updraft_Syslog_Logger'         => WPO_PLUGIN_MAIN_PATH.'includes/class-updraft-syslog-logger.php',
			'Updraft_Simple_History_Logger' => WPO_PLUGIN_MAIN_PATH.'includes/class-updraft-simple-history-logger.php',
			'Updraft_Slack_Logger'          => WPO_PLUGIN_MAIN_PATH.'includes/class-updraft-slack-logger.php',
		);

		if (empty($loggers_classes)) return $premium_classes;

		return array_merge($loggers_classes, $premium_classes);
	}

	/**
	 * Additional options for Slack filter
	 *
	 * @param  string $additional_options_html
	 * @param  string $logger_form_name
	 * @param  array  $logger_additional_options
	 * @return string
	 */
	public function additional_options_updraft_slack_logger($additional_options_html, $logger_form_name, $logger_additional_options) {
		$slack_webhook_url = !empty($logger_additional_options['slack_webhook_url']) ? $logger_additional_options['slack_webhook_url'] : '';

		return $additional_options_html.'<input type="text" size="50" name="'.$logger_form_name.'[slack_webhook_url]" value="'.esc_attr($slack_webhook_url).'" placeholder="'.esc_attr__('Slack Webhook URL', 'wp-optimize').'" />';
	}

	/**
	 * Save/update auto options and call event deactivation and activation as needed
	 *
	 * @param  array $settings Array of information with the schedule parameters
	 * @return void
	 */
	public function auto_option_settings($settings) {

		$options = WP_Optimize()->get_options();
		$options_from_user = isset($settings['wp-optimize-auto']) ? array_values($settings['wp-optimize-auto']) : array();
		if (!is_array($options_from_user)) $options_from_user = array();

		// Set an option to determine whether to optimize innodb automatically or not based on user choice.
		$options->update_option('auto-innodb', !empty($settings['auto-innodb']) ? 'true' : 'false');
		$options->update_option('auto-updated', $options_from_user);

		$this->cron_scheduler->wpo_cron_deactivate();
		$this->cron_scheduler->cron_activate();

		// Save purge cache permissions settings.
		if (isset($settings['purge_cache_permissions'])) {
			$options->update_option('purge-cache-permissions', $settings['purge_cache_permissions']);
		}
	}

	/**
	 * Adds premium options keys to array of option keys
	 *
	 * @param  array $keys Array of existing option keys
	 * @return array Array of updated option keys
	 */
	public function wp_optimize_option_keys($keys) {
		array_push($keys, 'auto-updated', 'locks', 'auto-innodb');
		return $keys;
	}

	/**
	 * Action wpo_tables_list_additional_column_data. Output button Optimize in the action column.
	 *
	 * @param string $content    String for output to column
	 * @param object $table_info Object with table info.
	 *
	 * @return string
	 */
	public function tables_list_additional_column_data($content, $table_info) {
		// If table type is supported, then show optimize button.
		$content .= '<div class="wpo_button_wrap '.((!$table_info->is_type_supported || $table_info->is_needing_repair) ? 'wpo_hidden' : '').'">'
			.'<button class="button button-secondary run-single-table-optimization" data-table="'.esc_attr($table_info->Name).'" data-type="'.esc_attr($table_info->Engine).'" data-disabled="'.($table_info->is_optimizable ? 0 : 1).'" '.($table_info->is_optimizable ? '' : 'disabled').'>'.__('Optimize', 'wp-optimize').'</button>'
			.'<img class="optimization_spinner visibility-hidden" src="'.esc_attr(admin_url('images/spinner-2x.gif')).'" width="20" height="20" alt="...">' // phpcs:ignore PluginCheck.CodeAnalysis.ImageFunctions.NonEnqueuedImage -- N/A
			.'<span class="optimization_done_icon dashicons dashicons-yes visibility-hidden"></span>'
			.'</div>';
		return $content;
	}

	/**
	 * Action wpo_tables_list_before to output custom content before tables list
	 */
	public function wpo_tables_list_before() {
		WP_Optimize()->include_template('database/tables-list-before.php');
	}

	/**
	 * Wether to show the innodb_force_optimize_single checkbox
	 *
	 * @param array $data - The data passed to get_table_list()
	 * @return boolean
	 */
	public function show_innodb_force_optimize($data) {
		$data['show_innodb_force_optimize'] = WP_Optimize()->get_optimizer()->show_innodb_force_optimize();
		return $data;
	}

	/**
	 * Add options with sites list in multisite admin
	 * Called by WP action wpo_additional_options
	 */
	public function wpo_additional_options() {
		$sites = WP_Optimize()->get_sites();

		$options = WP_Optimize()->get_options();
		$sites_options = $options->get_wpo_sites_option();

		$is_all_selected = (is_array($sites_options) && in_array('all', $sites_options)) ? true : false;
		?>
		<ul id="wpo_settings_sites_list">
			<li>
				<input id="wpo_all_sites" type="checkbox" value="all" <?php checked($is_all_selected, true); ?>>
				<label for="wpo_all_sites" data-label="<?php esc_attr_e('Optimize all sites', 'wp-optimize'); ?>"><?php esc_html_e('Optimize all sites', 'wp-optimize'); ?></label>
			</li>
			<li>
				<div id="wpo_sitelist_moreoptions" class="wpo_always_visible">
					<ul>
						<?php
						foreach ($sites as $site) {
							$dom_id = 'site-'.$site->blog_id;
							?>
							<li>
								&nbsp;
								<input id="<?php echo esc_attr($dom_id); ?>" type="checkbox" name="wpo-sites[]" value="<?php echo esc_attr($site->blog_id); ?>" <?php checked($is_all_selected || (is_array($sites_options) && in_array($site->blog_id, $sites_options)), true); ?>>
								<img id="optimization_spinner_<?php echo esc_attr($dom_id); ?>" class="optimization_spinner display-none" src="<?php echo esc_url(admin_url('images/spinner-2x.gif')); ?>" alt="...">
								<label for="<?php echo esc_attr($dom_id); ?>"><?php echo esc_html($site->domain.$site->path) . (1 == $site->blog_id ? '<em>('.esc_html__('The network-wide tables will be optimized with this site', 'wp-optimize').')</em>' : ''); ?></label>
							</li>
						<?php } ?>
					</ul>
				</div>
			</li>
		</ul>
		<?php
	}

	/**
	 * Add site list options for multisite cron settings
	 * Called by WP action wpo_additional_options_cron
	 */
	public function wpo_additional_options_cron() {
		$sites = WP_Optimize()->get_sites();

		$options       = WP_Optimize()->get_options();
		$sites_options = $options->get_option('wpo-sites-cron', array('all'));

		$is_all_selected = (is_array($sites_options) && in_array('all', $sites_options)) ? true : false;
		?>

		<ul id="wpo_settings_sites_list_cron">
			<li>
				<input id="wpo_all_sites_cron" name="wpo-sites-cron[]" type="checkbox"
					value="all" <?php checked($is_all_selected, true); ?>>
				<label for="wpo_all_sites_cron"
					data-label="<?php esc_attr_e('Optimize all sites', 'wp-optimize'); ?>"><?php esc_html_e('Optimize all sites', 'wp-optimize'); ?></label>
				(<a href="#" id="wpo_sitelist_show_moreoptions_cron"
					title="<?php esc_attr_e('Follow this link to view a list of all sites', 'wp-optimize'); ?>">...</a>)
			</li>
			<li>
				<div id="wpo_sitelist_moreoptions_cron" class="wpo_hidden">
					<ul>
						<?php
						foreach ($sites as $site) {
							$dom_id = 'site-cron-' . $site->blog_id;
							?>
							<li>
								<input id="<?php echo esc_attr($dom_id); ?>" name="wpo-sites-cron[]" type="checkbox"
									value="<?php echo esc_attr($site->blog_id); ?>" <?php checked($is_all_selected || in_array($site->blog_id, $sites_options), true); ?>>
								<label for="<?php echo esc_attr($dom_id); ?>"><?php echo esc_html($site->domain . $site->path); ?></label>
							</li>
						<?php } ?>
					</ul>
				</div>
			</li>
		</ul>
		<?php
	}

	/**
	 * Check if Premium is present and amend the tab title
	 * If Free, Tab is: Premium / Plugin family
	 * If Premium, Tab is: Plugin family
	 *
	 * @param array $admin_page_tabs all admin page tab in $slug => $title format
	 * @return array $admin_page_tab modified $admin_page_tabs which doesn't havemay_also key element
	 */
	public function check_premium_tab_title($admin_page_tabs) {
		$admin_page_tabs['may_also'] = __('Plugin family', 'wp-optimize');
		return $admin_page_tabs;
	}

	/**
	 * If Free, Page name is: Premium / Plugin family
	 * If Premium, Page name is: Plugin family
	 *
	 * @param array $sub_menu_items all admin page tab in $slug => $title format
	 * @return array
	 */
	public function change_premium_page_title($sub_menu_items) {
		foreach ($sub_menu_items as $index => $menu_item) {
			if (!isset($menu_item['menu_slug'])) continue;
			if ('wpo_mayalso' != $menu_item['menu_slug']) continue;
			$sub_menu_items[$index]['page_title'] = __('Plugin family', 'wp-optimize');
			$sub_menu_items[$index]['menu_title'] = __('Plugin family', 'wp-optimize');
		}
		return $sub_menu_items;
	}

	/**
	 * Get available auto optimizations
	 *
	 * @return array An array of available auto optimizations
	 */
	public static function get_auto_optimizations() {
		$optimizer = WP_Optimize()->get_optimizer();
		$optimizations = $optimizer->sort_optimizations($optimizer->get_optimizations());
		$auto_optimizations = array();

		foreach ($optimizations as $id => $optimization) {
			if (empty($optimization->available_for_auto)) continue;
			$auto_optimizations[$id] = array(
				'id' => $id,
				'optimization' => $optimization->get_auto_option_description(),
				'selected' => ''
			);
		}
		return $auto_optimizations;
	}

	/**
	 * Return list of scheduled optimizations.
	 *
	 * @return array
	 */
	public function get_scheduled_optimizations() {
		$options = WP_Optimize()->get_options();
		$auto_options = $options->get_option('auto-updated');
		if (!is_array($auto_options)) $auto_options = array();

		return $auto_options;
	}

	/**
	 * An array of schedule types
	 *
	 * @param boolean $placeholder Determines whether placeholder select option should be included or not
	 *
	 * @return array An array of schedule types
	 */
	public static function get_schedule_types($placeholder = false) {
		$schedule_types = array(
			'wpo_once' => __('Once', 'wp-optimize'),
			'wpo_daily' => __('Daily', 'wp-optimize'),
			'wpo_weekly' => __('Weekly', 'wp-optimize'),
			'wpo_fortnightly' => __('Fortnightly', 'wp-optimize'),
			'wpo_monthly' => __('Monthly', 'wp-optimize'),
		);
		if (true === $placeholder) {
			$schedule_types = array_merge(array('' => __('Select schedule', 'wp-optimize')), $schedule_types);
		}
		return $schedule_types;
	}

	/**
	 * An array of week days
	 *
	 * @return array An array of week days
	 */
	public static function get_week_days() {
		$week_days = array();
		global $wp_locale;
		for ($day_index = 1; $day_index < 8; $day_index++) {
			$week_days[$day_index] = $wp_locale->get_weekday($day_index - 1);
		}
		return $week_days;
	}

	/**
	 * Month days
	 *
	 * @return array An array of available days across all months
	 */
	public static function get_days() {
		$days = array();
		for ($day=1; $day<=28; $day++) {
			$days[$day] = $day;
		}
		return $days;
	}

	/**
	 * Add translation strings to existing array
	 *
	 * @param array $translations An array of translation strings
	 *
	 * @return array An array of translation strings
	 */
	public function wpo_js_translations($translations) {
		$premium_translations = array(
			'no_unused_images_found' => __('You have no unused images found.', 'wp-optimize'),
			'no_unused_trash_images_found' => __('You have no unused images in the trash.', 'wp-optimize'),
			'no_registered_image_sizes' => __('You have no registered image sizes.', 'wp-optimize'),
			'no_unsed_image_sizes' => __('You have no unused image sizes.', 'wp-optimize'),
			'deleting_selected_unused_images' => __('Deleting selected unused images...', 'wp-optimize'),
			'moving_selected_unused_images_to_trash' => __('Moving selected unused images to trash...', 'wp-optimize'),
			'deleting_unused_images_from_trash' => __('Deleting unused images from trash...', 'wp-optimize'),
			'restoring_selected_unused_images_from_trash' => __('Restoring selected unused images from trash...', 'wp-optimize'),
			'original_if_scaled_version_exist' => __('original - (if scaled version exist)', 'wp-optimize'),
			'auto_optimizations' => $this->get_auto_optimizations(),
			'schedule_types' => $this->get_schedule_types(true),
			'week_days' => $this->get_week_days(),
			'week' => array('1st' => __('1st', 'wp-optimize'), '2nd' => __('2nd', 'wp-optimize')),
			'days' => $this->get_days(),
			'select_optimizations' => __('Press to add as many scheduled optimization tasks as you wish.', 'wp-optimize'),
			'select_roles' => __('Select roles', 'wp-optimize'),
			'no_schedule' => __('There are no scheduled tasks.', 'wp-optimize'),
			'note_save_settings' => __('Note: Your settings have changed; remember to save them.', 'wp-optimize'),
			'time' => __('Time', 'wp-optimize'),
			'date' => __('Date', 'wp-optimize'),
			'day' => __('Day', 'wp-optimize'),
			'day_number' => __('Day Number', 'wp-optimize'),
			'inactive' => __('Inactive', 'wp-optimize'),
			'active' => __('Active', 'wp-optimize'),
			'edit' => __('Edit', 'wp-optimize'),
			'remove_task' => __('Remove this task', 'wp-optimize'),
			'fill_all_fields' => __('Before saving, you need to complete the currently incomplete scheduled time settings (or remove them).', 'wp-optimize'),
			'confirm_remove_task' => __('Are you sure you want to remove this scheduled task?', 'wp-optimize'),
			'close_btn' => __('Close', 'wp-optimize'),
			'delete_selected_items_btn' => __('Delete selected items', 'wp-optimize'),
			'view_image_link_text' => __('View image', 'wp-optimize'),
			'trash' => __('Trash', 'wp-optimize'),
			'move_to_trash' => __('Move to trash', 'wp-optimize'),
			'delete' => __('Delete', 'wp-optimize'),
			'permanently_delete' => __('Delete permanently', 'wp-optimize'),
			'restore' => __('Restore', 'wp-optimize'),
			'restore_from_trash' => __('Restore from trash', 'wp-optimize'),
			'no_unused_images' => __('no unused images', 'wp-optimize'),
			// translators: %1$s are number of images loaded and %2$s are total number of images
			'x_of_x_images_loaded' => __('%1$s of %2$s images loaded', 'wp-optimize'),
			'cancel_scan' => __('Abort scan', 'wp-optimize'),
			'unused_images_per_page' => apply_filters('wpo_unused_images_per_page', 99),
			'add_schedule_cancel' => __('Cancel', 'wp-optimize'),
			'add_schedule_new' => __('Add schedule', 'wp-optimize'),
		);
		return array_merge($translations, $premium_translations);
	}

	public function default_auto_options($new_auto_options) {
		$options = WP_Optimize()->get_options();
		$auto_options = $options->get_option('auto');
		if (empty($auto_options)) {
			$new_auto_options = array();
		}
		return $new_auto_options;
	}

	/**
	 * Schedule cron jobs for image optimization.
	 */
	public function schedule_image_optimization_jobs() {
		add_action('wpo_preload_homepage_images', array($this, 'preload_homepage_images'));
		if (!wp_next_scheduled('wpo_preload_homepage_images')) {
			wp_schedule_event(time(), 'twicedaily', 'wpo_preload_homepage_images');
		}
	}

	/**
	 * Preload images from homepage for current site.
	 */
	public function preload_homepage_images() {
		$images_optimization = WP_Optimize()->get_optimizer()->get_optimization('images');
		// this function load images from homepage and save information to cache.
		$images_optimization->get_homepage_images(get_current_blog_id(), true);
	}

	/**
	 * Return url to FAQ page for the premium version, used by wpo_faq_url
	 *
	 * @return string
	 */
	public function wpo_faq_url() {
		return 'https://getwpo.com/faqs/';
	}

	/**
	 * Include lazy load files if need and add action to output script.
	 */
	public function include_lazy_load() {
		$options = WP_Optimize()->get_options();

		$lazyload_options = wp_parse_args($options->get_option('lazyload'), array('images' => false, 'iframes' => false, 'backgrounds' => false, 'youtube_preview' => false));
		if ($lazyload_options['images'] ||
			$lazyload_options['iframes'] ||
			$lazyload_options['backgrounds'] ||
			$lazyload_options['youtube_preview']
		) {

			WP_Optimize_Lazy_Load::instance();
		}
	}

	/**
	 * Include images trash functionality.
	 */
	public function include_images_trash() {
		include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-wp-optimize-images-trash-manager.php');
		include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-wp-optimize-images-trash-manager-commands.php');
		include_once(WPO_PLUGIN_MAIN_PATH . 'includes/class-wp-optimize-images-trash-task.php');

		WP_Optimize_Images_Trash_Manager();
	}

	/**
	 * Include images dimensions functionality.
	 */
	private function include_image_dimensions() {
		new WP_Optimize_Image_Dimensions();
	}

	/**
	 * Show additional settings in the genaral settings page.
	 */
	public function after_general_settings() {
		$this->display_purge_cache_permissions();
	}

	/**
	 * Show purge cache settings permissions.
	 */
	private function display_purge_cache_permissions() {
		$roles = $this->get_wp_roles();
		$permissions = $this->get_purge_cache_permissions();
		foreach ($roles as &$role) {
			$role['selected'] = in_array($role['role'], $permissions);
		}
		WP_Optimize()->include_template('settings/purge-cache-permissions.php', false, array('roles' => $roles));
	}

	/**
	 * Returns list with WordPress user roles who can purge the cache.
	 *
	 * @return array
	 */
	public function get_purge_cache_permissions() {
		$options = WP_Optimize()->get_options();
		return $options->get_option('purge-cache-permissions', array('administrator'));
	}

	/**
	 * Check if current user can purge the cache.
	 *
	 * @return bool
	 */
	public function can_purge_the_cache() {
		global $current_user;

		if (!is_user_logged_in()) return false;

		$permissions = $this->get_purge_cache_permissions();

		foreach ($current_user->roles as $user_role) {
			if (in_array($user_role, $permissions)) return true;
		}

		return false;
	}

	/**
	 * Get list of WordPress roles.
	 *
	 * @return array
	 */
	public function get_wp_roles() {
		if (!function_exists('get_editable_roles')) {
			include_once ABSPATH . 'wp-admin/includes/user.php';
		}

		$roles = array();
		$wp_roles = get_editable_roles();
		foreach ($wp_roles as $role => $info) {
			$roles[] = array(
				'role' => $role,
				'name' => translate_user_role($info['name']),
			);
		}
		return $roles;
	}

	/**
	 * Include the extra cache functionalities
	 *
	 * @return void
	 */
	private function include_cache_premium() {
		include_once(WPO_PLUGIN_MAIN_PATH.'cache/class-wpo-cache-premium.php');

		new WPO_Cache_Premium();
	}

	/**
	 * Include the extra cache functionalities
	 *
	 * @return void
	 */
	private function include_power_tweaks() {
		include_once WPO_PLUGIN_MAIN_PATH.'includes/power-tweaks/class-wp-optimize-power-tweaks.php';

		$this->power_tweaks = new WP_Optimize_Power_Tweaks();
	}

	/**
	 * Check if requested unused images CSV file then return it.
	 */
	public function handle_unused_images_csv() {
		if (isset($_GET['wpo_unused_images_csv'])) {
			$nonce = isset($_REQUEST['_nonce']) ? $_REQUEST['_nonce'] : '';

			if (wp_verify_nonce($nonce, 'wpo_unused_images_csv') && current_user_can('manage_options')) {
				WP_Optimize()->get_optimizer()->get_optimization('images')->output_csv();
			} else {
				die('Security check');
			}
		}
	}

	/**
	 * Adds 3rd party plugin compatibilities.
	 */
	public function load_compatibilities() {
		WPO_WCML_Compatibility::instance();
		WPO_YITH_POS_Compatibility::instance();
		WPO_Elementor::instance();
		WPO_Yoast_SEO::instance();
		WPO_Estatik::instance();
		WPO_Beaver_Builder::instance();
		WPO_ACF::instance();
	}

	/**
	 * Check if there is a known component already providing lazy-load
	 *
	 * @return Array - list of existing components
	 */
	public function lazyload_already_provided_by() {
		$provided_by = array();
		$plugins = array(
			'AUTOPTIMIZE_PLUGIN_VERSION' => 'Autoptimize',
			'ET_CORE' => 'Divi',
			'JETPACK__VERSION' => 'Jetpack',
			'OPTML_VERSION' => 'Optimole',
			'ROCKET_LL_VERSION' => 'Rocket Lazy Load',
			'WP_SMUSH_VERSION' => 'Smush WPMU Dev',
		);

		foreach ($plugins as $constant => $name) {
			if (defined($constant)) {
					$provided_by[] = $name;
			}
		}

		return $provided_by;
	}

	/**
	 * Deletes an image from the list of unused images (used with the delete_attachment hook).
	 *
	 * @param int $post_id
	 *
	 * @return void
	 */
	public function delete_image_from_images_cache($post_id) {
		$key = get_current_blog_id().'_'.$post_id;
		WP_Optimization_images::instance()->delete_selected_images_from_cache(array($key));
	}
	
	/**
	 * Add a `Lost your password?` link for WP-Optimize into plugin page.
	 * Used with udmupdater_automatically_update_when_available filter.
	 *
	 * @param string 	        $html
	 * @param string|array|bool $slug
	 *
	 * @return string
	 */
	public function add_forgot_password_link($html, $slug) {
		if (isset($slug) && is_string($slug) && 'wp-optimize-premium' === $slug) {
			$html .= ' <a href="https://getwpo.com/my-account/lost-password/" target="_blank">' . esc_html__('Lost your password?', 'wp-optimize') . '</a>';
		}

		return $html;
	}

	/**
	 * Create an instance of premium commands
	 *
	 * @param WP_Optimize_Commands $standard_commands Always ignored
	 * @return WP_Optimize_Premium_Commands
	 */
	public function get_premium_commands($standard_commands) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- in premium package we always return the premium commands
		return new WP_Optimize_Premium_Commands();
	}

	/**
	 * Initialize DB analysis layer
	 *
	 * @return WPO_DB_Table_Analysis
	 */
	public function get_db_table_analysis() {
		if (true === (bool) WP_Optimize()->get_options()->get_option(WPO_DB_Table_Analysis::ENABLED_SETTING_NAME)) {
			return WPO_DB_Table_Analysis::get_instance();
		}
	}

	/**
	 * Get the class for dashboard
	 *
	 * @return WPO_DB_Table_Analysis_Dashboard
	 */
	public function get_db_table_analysis_dashboard() {
		return new WPO_DB_Table_Analysis_Dashboard();
	}
}

}


/**
 * Instantiate premium features class
 *
 * @return null|WP_Optimize_Premium
 */
function WP_Optimize_Premium() {
	wp_clear_scheduled_hook('wpo_cron_event2');
	return WP_Optimize_Premium::instance();
}

require_once(WPO_PLUGIN_MAIN_PATH.'includes/class-wp-optimize-tasks-queue.php');
require_once(WPO_PLUGIN_MAIN_PATH.'includes/class-wp-optimize-transients-cache.php');

$GLOBALS['wp_optimize_premium'] = WP_Optimize_Premium();

Youez - 2016 - github.com/yon3zu
LinuXploit