Полезная информация

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№1567613-06-2021 21:48:11

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

ВВП пишет

Как бы убрать #toggle_PersonalToolbar там ,где мне надо? Там id="toolbar-context-menu" везде одинаковый. И дотянуть до Nav-bar ,к примеру, ну никак...

Видимо, зависит от того, где надо.
На скрине, как я понимаю, на виджетах, создаваемых для WebExtensions.
Можно, например, так попробовать

скрытый текст

Выделить код

Код:

#toolbar-context-menu > menuitem.customize-context-manageExtension:not([hidden]) ~ #toggle_PersonalToolbar {
	display: none !important;
}


А «дотянуть до Nav-bar» в смысле поднять выше остальных?
Вроде -moz-box-ordinal-group: 0 !important; должен работать.


vv07
Хорошо бы писать, что кнопка делала.
Не столько вообще, а, скорее, что делала для тебя.
В том смысле, что важно, что не очень, а что совсем не использовалось.
Это так, примечание общего характера.


Вот, скажем, Open URLs, так там написано, что для Thunderbird
Допустим, запишу так, подойдёт?

скрытый текст

Выделить код

Код:

/*Initialization Code*/

(n => {
	var inBackground = false;
	var data = [{
		lab: "Google",
		url: "https://www.google.com",
		img: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkY1MjI5QkVERDU1MjExRTBCREIxRkM2NDg5MzRDQTQyIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkY1MjI5QkVFRDU1MjExRTBCREIxRkM2NDg5MzRDQTQyIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6RjUyMjlCRUJENTUyMTFFMEJEQjFGQzY0ODkzNENBNDIiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6RjUyMjlCRUNENTUyMTFFMEJEQjFGQzY0ODkzNENBNDIiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz65gakZAAAIYUlEQVR42rxY628U1xX/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"
	}, {
		lab: "Форум Mozilla",
		url: "https://forum.mozilla-russia.org",
		img: "data:image/png;base64,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"
	},
	null,
	{
		lab: "Test",
		url: "data:text/plain;charset=utf-8,Params",
		img: "chrome://browser/content/robot.ico",
		params: {
			userContextId: 1,
			get index() {
				return gBrowser.selectedTab._tPos + 1
			},
			inBackground: !inBackground,
		}
	}];
	this.type = "menu";
	var popup = n("menupopup"), dummy = n("menuitem");
	dummy.render = () => {
		dummy.remove();
		data.forEach((o, ind) => {
			if (!o) return popup.append(n("menuseparator"));
			var menuitem = n("menuitem");
			menuitem.setAttribute("label", o.lab || o.url);
			if (o.img)
				menuitem.className = "menuitem-iconic",
				menuitem.setAttribute("image", o.img);
			menuitem.ind = ind;
			popup.append(menuitem);
		});
		popup.setAttribute("oncommand", "tab(event.target.ind);");
		popup.tab = ind => {
			var {url, params} = data[ind];
			var tab = gBrowser.addTrustedTab(url, params);
			if (!(params?.inBackground || inBackground)) gBrowser.selectedTab = tab;
		}
	}
	popup.append(dummy);
	this.prepend(popup);

	//this.onmouseover = () => this.open = true;

	this.removeAttribute("tooltiptext");
	var tt = this.appendChild(n("box")).appendChild(n("tooltip"));
	tt.setAttribute("onpopupshowing", "return !(parentNode.parentNode.open = true);");
	this.setAttribute("tooltip", tt.id = _id + "-tooltip");

})(nn => document.createXULElement(nn));


Compact Menu? Ну, у меня давненько уже
болтается что-то приблизительно похожее, но, опять же, подойдёт ли?
скрытый текст

Выделить код

Код:

/*Initialization Code*/

(this.type != "menu" && (this.type = "menu") && !this.hasAttribute("is")) || (move => {
	if (this.parentNode.nodeName == "toolbarpaletteitem") return;
	var bar = document.getElementById("main-menubar");
	var menupopup = document.createXULElement("menupopup");
	this.prepend(menupopup);
	move(bar, menupopup);
	addDestructor(() => move(menupopup, bar));
})((from, to) => Array.from(from.children).forEach(child => {
	var popup = child.querySelector(":scope > menupopup");
	popup.remove();
	child.textContent = child.renderedOnce = "";
	to.append(child);
	child.render();
	child.append(popup);
}));


На Extension List сейчас времени нет.
Может повожусь на следующей неделе, если ничего не будет отвлекать.

Отсутствует

 

№1567713-06-2021 22:58:07

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Благодарю за идею ! Сразу со всех ненужных popup
#toolbar-context-menu > menuitem.customize-context-removeFromToolbar:not([hidden]) ~ #toggle_PersonalToolbar {
    display: none !important;
}

Отсутствует

 

№1567814-06-2021 00:51:47

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 54.0

Re: Custom Buttons

Dumby
Спасибо Дружище!
Привередничать не буду :o
Хотя если честно, то в старой версии Compact Menu, с иконками симпатичнее было

скрытый текст
6a66816471dd.jpg

Open URLs отлично работает. Очень благодарен вам. Есть только вопрос. У меня ссылок много очень, нельзя ли как то сделать, что бы использовать две таких кнопки одновременно? Что бы работали параллельно и независимо, а то ставлю две кнопки, но одни дублируют друг, друга
Без обид, что надоедаю. Я старый человек. Очень тяжел на подьем. К чему привыкаю, сложно отказываться.
Если не будете против. Попрошу еще о некоторых кнопках, без которых не очень удобно.
PS Обнаружились проблемы при работе Compact Menu. В ряде случаев, происходит такое
скрытый текст
561f9f9de385.jpg

Раздел
Вид-Боковая панель
Вид-Стиль страницы, Полный экран, Добавить новую кнопку.
Закладки, Справка, Инструменты. Журнал

Отредактировано vv07 (14-06-2021 08:13:36)

Отсутствует

 

№1567914-06-2021 13:34:03

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Как бы этот код в ini запихать? Раньше он просто в коде был , но кнопка прокси изменилась...Короче, отмена ни отмена, код то уже сработал...

скрытый текст
var id = "{acf99872-d701-4863-adc2-cdda1163aa34}";

AddonManager.getAddonByID(id).then(
    addon => addon[
        addon.userDisabled ? "enable" : "disable"
       
    ]({allowSystemAddons: true}),
    Cu.reportError
)

Сама кнопка прокси:

скрытый текст

Выделить код

Код:

(ps => {   
                                                                      
     
   this._handleClick = () => Services.prompt.confirm(null, "ВНИМАНИЕ !", "Прокси серверы : Включить / Выключить ?") && ps.setIntPref(s, ps.getIntPref(s, 2) ? 0 : 2);

     var s = "network.proxy.type";
 
    var toggleImage = val => {
        this.icon.src = (val = ps.getIntPref(s, 2))
            ? this.image
            : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACFklEQVR42mO0DwpKaG9vL2VmZmb8+/fvPwY84P///2DMwcHBcuHChZcp4eE5jJeePn2hIyUl/uDTJwZuLi4GFhYWBmZsmqH073//GD5+/MigIijIEJmTM4Px1Z8/H86dP8/vYWrKQAoAuSS1omIp46u/fz9cunSJ38XQkCQDvgINyCouXsL49v//D+cvXCDZgBe/fzOUl5cvYfwMNODA8eP8vlZW5BnwDWjAvhMn+H0sLUky4Mn37wzV1dUQAw6fPcvvbmJCkgEPPn9mqK+vX8L4E2QAGWFw5/17hubm5iWMv4AGnL55k99aQ4MkA26/e8fQ0dGxlPHxt28vZDg5xUGCf4H4JxD/AOI/f/8y/AMmmt/AwAJhYCplYGRkZPjz5w9YnJeXFxSICxhN3N3zSkpK8kH6371791UOCHR0dIR+/frFAMIgDaBE8+rVq78XL158BBT7xMPDw/f69evvrXV1pYxAjSDMA8R8wWlphfn5+SlAM/iB6R1sI0jz169fwfjs2bN3m5qaWu+fObMO6uAvjDA/uUdFle1YurQTxP4KxL+AmAnkFSAGuoxBREiIQRDIfvjlyxcFXl5QnF9hgNoOAUJCdsuWL1/m4+YmzQU14BdUig2IWYD4LTAsgDn31KT6+hAg9zGqARAgJ6OvH2Fubm6hrq4uC/QrFzDA/r958+Yz0P/3Dx8+fOjPy5drgepewzQAAJP3DZ3PnU32AAAAAElFTkSuQmCC";             
        this.tooltipText = val ? 'Автопрокси' : 'Без прокси';



        BrowserReload();
 
        cbu.setPrefs("network.proxy.autoconfig_url", val ? "resource://chrome/proxy/proxy2.pac" : "resource://chrome/proxy/proxy2.pac");
        cbu.setPrefs("intl.accept_languages", val ? "fr" : "ru");
        cbu.setPrefs("browser.zoom.full", val ? true : true); 
       cbu.setPrefs("media.autoplay.default", val ? 5 : 5); 

        
    }
    toggleImage();
    ps.addObserver(s, toggleImage, false);
    addDestructor(() => ps.removeObserver(s, toggleImage));
})(Services.prefs);

this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };

Отредактировано ВВП (14-06-2021 13:36:16)

Отсутствует

 

№1568015-06-2021 12:28:54

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

vv07 пишет

в старой версии Compact Menu, с иконками симпатичнее было

Вот об этом я и говорю, что описание должно быть персонализированным.
Оказывается, возможность исключить пункты не важна,
а возможность задать иконки — важна (хотя в кнопке по ссылке
ничего подобного нет, это чем-то другим у тебя было сделано).

Обнаружились проблемы при работе Compact Menu. В ряде случаев, происходит такое

Хмм, странно, не вижу такого.
Нужен STR (шаги по воспроизводству), типа делай раз, делай два, делай три..
Иначе говоря, описание некой последовательности действий, проделав которые у себя,
я смогу увидеть проблему, то есть получить то, что демонстрирует приведённый скриншот.


Но косяк (другой) есть. Всё-таки, после перемещения #bookmarksMenu,
без пересборки _placesView портится контекстное меню его закладок,
так и не понятно почему.
Новая версия. Заодно, объект {"id": "icon"}, куда вписывать свои иконки.

скрытый текст

Выделить код

Код:

this.parentNode.nodeName == "toolbarpaletteitem" || (icons => {
	this.type = "menu";
	var bar = document.getElementById("main-menubar");
	var menupopup = document.createXULElement("menupopup");
	menupopup.toggleAttribute("context");
	this.prepend(menupopup);
	var move = (from, to, ico) => {
		from.querySelector("#bookmarksMenu")._placesView?.uninit();
		for(var menu of Array.from(from.children)) {
			var popup = menu.menupopup;
			popup.remove();
			menu.textContent = menu.renderedOnce = "";
			if (ico) {
				var img = icons[menu.id];
				if (img)
					menu.className = "menu-iconic",
					menu.setAttribute("image", img);
			} else
				menu.removeAttribute("class"),
				menu.removeAttribute("image");
			to.append(menu);
			menu.render();
			menu.append(popup);
		}
	}
	move(bar, menupopup, true);
	addDestructor(() => move(menupopup, bar));
})({
	    "file-menu": "chrome://browser/content/robot.ico",
	    "edit-menu": "chrome://browser/skin/preferences/face-smile.svg",
	    "view-menu": "chrome://browser/skin/preferences/face-sad.svg",
	 "history-menu": "chrome://browser/content/robot.ico",
	"bookmarksMenu": "chrome://browser/skin/preferences/face-smile.svg",
	   "tools-menu": "chrome://browser/skin/preferences/face-sad.svg",
	     "helpMenu": "chrome://browser/content/robot.ico"
});

ВВП пишет

Раньше он просто в коде был

Ну, я же не в курсе включить или выключить.
Раз был, смотри сам.

скрытый текст

Выделить код

Код:

…
	this._handleClick = () => {
		var direct = ps.getIntPref(s) == 0;
		var msg = `Прокси серверы : В${direct ? "" : "ы"}ключить ?`;

		if (!Services.prompt.confirm(null, "ВНИМАНИЕ !", msg)) return;

		ps.setIntPref(s, direct ? 2 : 0);
		var method = `${direct ? "dis" : "en"}able`;
		AddonManager.getAddonByID("{acf99872-d701-4863-adc2-cdda1163aa34}")
			.then(addon => addon[method](), Cu.reportError);
	}

Отсутствует

 

№1568115-06-2021 13:10:00

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 54.0

Re: Custom Buttons

Dumby
Спасибо большое. Работает.
Научите пожалуйста, как делать тут?
"file-menu": "chrome://browser/content/robot.ico",
"edit-menu": "chrome://browser/skin/preferences/face-smile.svg",
"view-menu": "chrome://browser/skin/preferences/face-sad.svg",
"history-menu": "chrome://browser/content/robot.ico",
"bookmarksMenu": "chrome://browser/skin/preferences/face-smile.svg",
"tools-menu": "chrome://browser/skin/preferences/face-sad.svg",
"helpMenu": "chrome://browser/content/robot.ico"
Что бы свои иконки поставить. И да, иконки отображаются, но у меня таких нет на компе вообще))))
PS на старой кнопке вот так все

скрытый текст
ea9c30554193.jpg

Я сам ничего не делал, потому что элементарно не умею. Поэтому я сказал вам, но это же не критично было,
но очень приятно что сделали))))) Еще бы самому научится менять иконки

Отредактировано vv07 (15-06-2021 16:31:15)

Отсутствует

 

№1568215-06-2021 14:17:23

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby

Dumby пишет

Ну, я же не в курсе включить или выключить.

Все в елочку .dis и En -поменял .Класс! Аддон времени вкл вместе с прокси. Класс !
Последняя шняга. Чертов popup на кнопке Undo Close Tab. Стилем не могу убрать(убирается на всех кнопках) . В самой кнопке - стремно...
ep7s7cvo.png

Отредактировано ВВП (15-06-2021 14:18:23)

Отсутствует

 

№1568315-06-2021 19:39:06

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

vv07 пишет

Научите пожалуйста, как делать тут?
Что бы свои иконки поставить.

Нужно вписать (заменить на свой) адрес ссылки на файл иконки.
Самое простое — по протоколу file:
Жмём Ctrl+O, выбираем нужное изображение,
копируем из адресной строки ссылку на открывшееся изображение,
и вписываем.


Можно по протоколу data: (всё своё ношу с собой)
Тут, для вэб-человеков, говорят, есть онлайн-кодировщики,
можно поискать.
Или прямо в CB-редакторе некоторые конвертировали
кнопками [Обзор…] и [⇒ base64] и копированием получившейся
ссылки с <menulist>'а (слева от них).
Или, вот у меня есть старая, крайне аскетичная кнопка конвертации,
нажал, выбрал, и всё, в буфере обмена base64, остаётся только вставить.

скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E64%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AIAQ/wCAEf8AgA//AIAR/wCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AgBX/AIAVAAAAAAAAAAD/AIAo/wCA//8AgP//AID//wCA//8AgP//AIAoAAAAAAAAAAAAAAAAAAAAAP8AgBL/AID//wCA//8AgA3/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgBAAAAAAAAAAAAAAAAD/AIAR/wCA//8AgP//AIAK/wCACv8AgP//AID//wCAIf8AgAX/AIAh/wCA//8AgP//AIAQAAAAAAAAAAAAAAAA/wCACv8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAUAAAAA/wCABf8AgP//AID//wCACgAAAAD/AIAQ/wCADP8AgCH/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCABf8AgCH/AID//wCA//8AgAv/AIAh/wCA//8AgP//AID//wCA//8AgP//AIAH/wCAB/8AgP//AID//wCA//8AgP//AID//wCA//8AgP//AIAg/wCA//8AgP//AID//wCA//8AgP//AID//wCAB/8AgAf/AID//wCA//8AgP//AID//wCA//8AgP//AIAh/wCAC/8AgP//AID//wCAHP8AgBz/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCACf8AgA7/AIAMAAAAAP8AgAj/AID//wCA//8AgAP/AIAD/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCABQAAAAAAAAAA/wCADf8AgAr/AIAL/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCAB/8AgAr/AID//wCA//8AgCH/AIAH/wCAJf8AgP//AID//wCAI/8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAf/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgCT/AID//wCA//8AgAr/AIAK/wCA//8AgP//AIAKAAAAAP8AgCj/AID//wCA//8AgP//AID//wCA//8AgCP/AIAM/wCA//8AgP//AIAN/wCADf8AgP//AID//wCADQAAAAAAAAAA/wCAEP8AgBH/AIAP/wCAEf8AgBAAAAAAAAAAAP8AgBT/AIAVAAAAAAAAAAD/AIAV/wCAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQcH5rEGA8KxBAHCsQQBwrEEIQKxBAACsQQAArEEAAKxBAQCsQQwArEEAAKxBAACsQYAArEHBmaxB//+sQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5Bvar%20reader%2C%20picker%20%3D%20makeFilePicker%28%29%3B%0Apicker.init%28window%2C%20%22%22%2C%20picker.modeOpen%29%3B%0Apicker.open%28async%20res%20%3D%3E%20res%20%3D%3D%20picker.returnOK%20%26%26%20%28%0A%09%28reader%20%3D%20new%20FileReader%28%29%29.onload%20%3D%20%28%29%20%3D%3E%20gClipboard.write%28reader.result%29%2C%0A%09reader.readAsDataURL%28await%20File.createFromNsIFile%28picker.file%29%29%0A%29%29%3B%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Есть только вопрос. У меня ссылок много очень, нельзя ли как то сделать, что бы использовать две таких кнопки одновременно? Что бы работали параллельно и независимо, а то ставлю две кнопки, но одни дублируют друг, друга

Непонятно. Клонируешь кнопок сколько угодно,
и редактируешь в каждой массив объектов data.
Вот, например, поставь эту.
Работает ли параллельно и независимо?
Дублирует ли что-нибудь?

скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3E%u0443%u0440%u043B%u044B%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz//+ZAP//mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD/ZjMz/2YzM///mQD//+K0///itP//4rT//+K0///itP//4rT//+K0///itP//4rT//+K0///itP//4rT//5kA/2YzM/9mMzP//5kA///itP///////////////////////////////////////////////////////+K0//+ZAP9mMzP/ZjMz//+ZAP//4rT////////////////////////////////////////////////////////itP//mQD/ZjMz/2YzM///mQD//+K0////////////////////////////////////////////////////////4rT//5kA/2YzM/9mMzP//5kA///itP///////////////////////////////////////////////////////+K0//+ZAP9mMzP/ZjMz//+ZAP//4rT//////////////////////5lmZv+ZZmb////////////////////////itP//mQD/ZjMz/2YzM///mQD//+K0/////////////////5lmZv+ZZmb/mWZm/5lmZv//////////////////4rT//5kA/2YzM/9mMzP//5kA///itP///////////5lmZv+ZZmb/mWZm/5lmZv+ZZmb/mWZm/////////////+K0//+ZAP9mMzP/ZjMz//+ZAP//4rT////////////////////////////////////////////////////////itP//mQD/ZjMz/2YzM///mQD//+K0////////////////////////////////////////////////////////4rT//5kA/2YzM/9mMzP//5kA///itP///////////////////////////////////////////////////////+K0//+ZAP9mMzP/ZjMz//+ZAP//4rT//+K0///itP//4rT//+K0///itP//4rT//+K0///itP//4rT//+K0///itP//mQD/ZjMz/2YzM///mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD//5kA//+ZAP//mQD//5kA/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/ZjMz/2YzM/9mMzP/AACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQ%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B%28n%20%3D%3E%20%7B%0A%09var%20inBackground%20%3D%20false%3B%0A%09var%20data%20%3D%20%5B%7B%0A%09%09lab%3A%20%22example.com%22%2C%0A%09%09url%3A%20%22https%3A//example.com%22%2C%0A%09%09img%3A%20%22data%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////tv///wAAZv8AAAD/AAAA/wAAAP8AAAD/25A6/wBmtv+2ZgD/////////////////AGa2/7ZmAP///////////7b///86AGb//9uQ///////////////////////b////OjqQ///bkP//////kNv//2YAOv///7b///////////+2////OgBm///bkP///////////////////////////2a2//+QOgD/2//b/wA6kP//tmb/////////////////tv///zoAZv//25D/////////////////////////////////AGa2/2ZmZv+QOgD////b/////////////////7b///8AAGb/AAAA/wAAAP8AAAD/ZgAA////tv///////////7b///86AGb//9uQ//////////////////////+2////OgBm///bkP////////////////////////////////86kNv/Ojo6/7ZmAP//////////////////////tv///zoAZv//25D///////////////////////////+Q2///kDo6////2/8AZrb//7Zm/////////////////7b///86AGb//9uQ////////////////////////////AGa2//+2Zv//////kNv//5A6Ov///9v///////////+2////AABm/wAAAP8AAAD/AAAA/wAAAP//tmb/Zrb//5A6AP///9v///////////8AZrb/25A6//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQAArEEAAKxB//+sQQ%3D%3D%22%0A%09%7D%2C%0A%09null%2C%20%7B%0A%09%09lab%3A%20%22%u041E%20%u0441%u0431%u043E%u0440%u043E%u0447%u043D%u043E%u0439%20%u043A%u043E%u043D%u0444%u0438%u0433%u0443%u0440%u0430%u0446%u0438%u0438%22%2C%0A%09%09url%3A%20%22about%3Abuildconfig%22%2C%0A%09%09img%3A%20%22chrome%3A//devtools/skin/images/settings.svg%22%0A%09%7D%2C%20%7B%0A%09%09lab%3A%20%22%u0411%u0438%u0431%u043B%u0438%u043E%u0442%u0435%u043A%u0430%22%2C%0A%09%09url%3A%20%22chrome%3A//browser/content/places/places.xhtml%22%2C%0A%09%09img%3A%20%22data%3Aimage/png%3Bcbfc%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACU0lEQVQ4jZWSX0hTYRjGn7lmSV120V1JIqHQza6ELgyyCKKIHEwI0gJrSqk7xjmUbt8kCVRcQRgjVNJYhBdRhF55q0aLSjLL/TmKc+qcO8eztUkRTxdi5J8MX/jBC9/7e3nhe4B/l+n7fVSnPbgCwLTD3PalN+FoxotXmQ681O7i8G59U7oFTn66McVA1ddUC27t6oq4QEHWizdcHSBXB5hpx2tN4Mh/RSGQozchX/dA5odrofUFfF85ZXhwW29CvhDI2SDpLpQZAo0rAp0rAv50G4YYqAwx4yeNO2tk/GSgMpRuw9CKgF8X6DAEGjUXTkJ34zFH7SEuelNM9/MPmkQm69fQJG54i7UbHLUHNTceIuxEoeZGL8fsERo95JJjZ4wecqwirLnRPduAAvissAQlFCVceMZR+wyTXeRc1fYku8iRS2rChT5VwjFRij0AYPJZYYnU4fhyM14w1v6T0Vpyunwjc/VkrOPHcjOeByUU+ayw/P21Jp8VlriMmxw+Nc2YIIPnNhJtJYdOhBdlXN8sAwBsgDmu4B7f2eOMOMjJMjJ0mQxWrPVqLTlSvrCoQNgA89YMADlLCvo5WZelqpAzgvx41eC4I8UZQUYkctyRiit4IrApCwAwUYMDiWYMU1XIsfJk1ovxBQW+eRnd2QemzwzYdYakX3EFg4NnsXfLgrAThQkP3mYfmSbmZfSqEs50liCvswR5ESfOz8t4mu3K/bLswYhav02sJ2pwKCqjVW3ABVGKfaIYuTbAbAPMohi5faexf7YRF6MyWr9V4+C69xvjXKoSQWwbTQAAAABJRU5ErkJggg%3D%3D%22%0A%09%7D%5D%3B%0A%0A%09this.type%20%3D%20%22menu%22%3B%0A%09var%20popup%20%3D%20n%28%22menupopup%22%29%2C%20dummy%20%3D%20n%28%22menuitem%22%29%3B%0A%09popup.toggleAttribute%28%22context%22%29%3B%0A%09dummy.render%20%3D%20%28%29%20%3D%3E%20%7B%0A%09%09dummy.remove%28%29%3B%0A%09%09data.forEach%28%28o%2C%20ind%29%20%3D%3E%20%7B%0A%09%09%09if%20%28%21o%29%20return%20popup.append%28n%28%22menuseparator%22%29%29%3B%0A%09%09%09var%20menuitem%20%3D%20n%28%22menuitem%22%29%3B%0A%09%09%09menuitem.setAttribute%28%22label%22%2C%20o.lab%20%7C%7C%20o.url%29%3B%0A%09%09%09if%20%28o.img%29%0A%09%09%09%09menuitem.className%20%3D%20%22menuitem-iconic%22%2C%0A%09%09%09%09menuitem.setAttribute%28%22image%22%2C%20o.img%29%3B%0A%09%09%09menuitem.ind%20%3D%20ind%3B%0A%09%09%09popup.append%28menuitem%29%3B%0A%09%09%7D%29%3B%0A%09%09popup.setAttribute%28%22oncommand%22%2C%20%22tab%28event.target.ind%29%3B%22%29%3B%0A%09%09popup.tab%20%3D%20ind%20%3D%3E%20%7B%0A%09%09%09var%20%7Burl%2C%20params%7D%20%3D%20data%5Bind%5D%3B%0A%09%09%09var%20tab%20%3D%20gBrowser.addTrustedTab%28url%2C%20params%29%3B%0A%09%09%09if%20%28%21%28params%3F.inBackground%20%7C%7C%20inBackground%29%29%20gBrowser.selectedTab%20%3D%20tab%3B%0A%09%09%7D%0A%09%7D%0A%09popup.append%28dummy%29%3B%0A%09this.prepend%28popup%29%3B%0A%0A%09//this.onmouseover%20%3D%20%28%29%20%3D%3E%20this.open%20%3D%20true%3B%0A%0A%09this.removeAttribute%28%22tooltiptext%22%29%3B%0A%09var%20tt%20%3D%20this.appendChild%28n%28%22box%22%29%29.appendChild%28n%28%22tooltip%22%29%29%3B%0A%09tt.setAttribute%28%22onpopupshowing%22%2C%20%22return%20%21%28parentNode.parentNode.open%20%3D%20true%29%3B%22%29%3B%0A%09this.setAttribute%28%22tooltip%22%2C%20tt.id%20%3D%20_id%20+%20%22-tooltip%22%29%3B%0A%0A%7D%29%28nn%20%3D%3E%20document.createXULElement%28nn%29%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

ВВП пишет

В самой кнопке - стремно...

Понимаю. Но не обязательно же лезть в сам код.
Можно просто добавить в конец что-то типа

скрытый текст

Выделить код

Код:

addEventListener("contextmenu", e => !this.disabled || e.ctrlKey || e.shiftKey || e.preventDefault(), false, this);

Отсутствует

 

№1568415-06-2021 20:32:09

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby

Dumby пишет

Можно просто добавить в конец что-то типа

Класс! А я то эту шнягу добавлял:
this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() };
Благодарю!

Отсутствует

 

№1568515-06-2021 20:34:28

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1419
UA: Firefox 90.0

Re: Custom Buttons

Dumby
А кнопка, та что для base64, ее очень сложно для ucf сделать, можете адаптировать?

Отсутствует

 

№1568615-06-2021 21:49:00

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

_zt пишет

А кнопка, та что для base64, ее очень сложно для ucf сделать, можете адаптировать?

Да вроде не сложно, хотелось бы думать

скрытый текст

Выделить код

Код:

(async self => CustomizableUI.createWidget(self = {
	label: "64",
	tooltiptext: "64",
	id: "ucf-fileToBase64",
	localized: false,
	onCreated(btn) {
		btn._handleClick = this.pick;
		btn.setAttribute("image", "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AIAQ/wCAEf8AgA//AIAR/wCAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AgBX/AIAVAAAAAAAAAAD/AIAo/wCA//8AgP//AID//wCA//8AgP//AIAoAAAAAAAAAAAAAAAAAAAAAP8AgBL/AID//wCA//8AgA3/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgBAAAAAAAAAAAAAAAAD/AIAR/wCA//8AgP//AIAK/wCACv8AgP//AID//wCAIf8AgAX/AIAh/wCA//8AgP//AIAQAAAAAAAAAAAAAAAA/wCACv8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAUAAAAA/wCABf8AgP//AID//wCACgAAAAD/AIAQ/wCADP8AgCH/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCABf8AgCH/AID//wCA//8AgAv/AIAh/wCA//8AgP//AID//wCA//8AgP//AIAH/wCAB/8AgP//AID//wCA//8AgP//AID//wCA//8AgP//AIAg/wCA//8AgP//AID//wCA//8AgP//AID//wCAB/8AgAf/AID//wCA//8AgP//AID//wCA//8AgP//AIAh/wCAC/8AgP//AID//wCAHP8AgBz/AID//wCA//8AgAf/AIAH/wCA//8AgP//AIAh/wCACf8AgA7/AIAMAAAAAP8AgAj/AID//wCA//8AgAP/AIAD/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCABQAAAAAAAAAA/wCADf8AgAr/AIAL/wCA//8AgP//AIAH/wCAB/8AgP//AID//wCAB/8AgAr/AID//wCA//8AgCH/AIAH/wCAJf8AgP//AID//wCAI/8AgP//AID//wCAB/8AgAf/AID//wCA//8AgAf/AIAL/wCA//8AgP//AID//wCA//8AgP//AID//wCA//8AgCT/AID//wCA//8AgAr/AIAK/wCA//8AgP//AIAKAAAAAP8AgCj/AID//wCA//8AgP//AID//wCA//8AgCP/AIAM/wCA//8AgP//AIAN/wCADf8AgP//AID//wCADQAAAAAAAAAA/wCAEP8AgBH/AIAP/wCAEf8AgBAAAAAAAAAAAP8AgBT/AIAVAAAAAAAAAAD/AIAV/wCAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//+sQcH5rEGA8KxBAHCsQQBwrEEIQKxBAACsQQAArEEAAKxBAQCsQQwArEEAAKxBAACsQYAArEHBmaxB//+sQQ==");
	},
	get copy() {
		delete this.copy;
		return this.copy = Cc["@mozilla.org/widget/clipboardhelper;1"]
			.getService(Ci.nsIClipboardHelper).copyString;
	},
	load() {
		self.copy(this.result);
	},
	async pick() {
		var win = this.ownerGlobal;
		var picker = win.makeFilePicker();
		picker.init(win, self.label, picker.modeOpen);
		if (await new Promise(picker.open) != picker.returnOK) return;

		var reader = new win.FileReader();
		reader.onload = self.load;
		reader.readAsDataURL(picker.domFileOrDirectory);
	}
}))();

Отсутствует

 

№1568715-06-2021 22:05:45

foxboy
Участник
 
Группа: Members
Зарегистрирован: 06-06-2015
Сообщений: 33
UA: Palemoon 24.0

Re: Custom Buttons

Есть у кого кнопка - переключиться на первую вкладку и закрыть все справа.

Отсутствует

 

№1568815-06-2021 23:11:32

_zt
Участник
 
Группа: Members
Зарегистрирован: 10-11-2014
Сообщений: 1419
UA: Firefox 90.0

Re: Custom Buttons

Dumby
Спасибо. Наконец то эта кнопочка вернулась, а то мучился с локальным конвертером, который какой-то мусор в код добавлял.
Иконка для темной темы - data:image/png;base64,iVBORw0KGgoAAAANS … VORK5CYII=

Отсутствует

 

№1568916-06-2021 02:15:48

vv07
Участник
 
Группа: Members
Зарегистрирован: 07-11-2007
Сообщений: 672
UA: Firefox 54.0

Re: Custom Buttons

Dumby

Непонятно. Клонируешь кнопок сколько угодно,

Я сам уже понял это, хотя изначально почему то дублировалось содержимое.
Поэтому и убрал коммент, но вы успели прочитать.
По

проблемы при работе Compact Menu

причина ясна
Я ваш код вписал, а старый из секции код

скрытый текст

/*CODE*/
const ids = [

    "file-menu",
    "edit-menu",
    "view-menu",
    "bookmarksMenu",
    "history-menu",
    "tools-menu",
    "helpMenu"
];
const id = "Compact-Menu-menupopup";
var popup = document.getElementById(id);
if (!popup) {
    popup = this.appendChild(document.createElement("menupopup"));
    const attrs = {
        id: id,
        position: "after_start",
        oncontextmenu: "event.preventDefault()",
        oncommand: "event.stopPropagation()",
    };
    for (var attr in attrs) popup.setAttribute(attr, attrs[attr]);

    ids.forEach(function(id) {
        var clonedMenu = document.getElementById(id).cloneNode(true);
        clonedMenu.hidden = false;
        popup.appendChild(clonedMenu);
    });
}
popup.openPopup(this);

не убрал.
Поэтому и возникала такая ситуация.
Не подскажете, как определять ID для других категорий меню и как их вписывать?
На старой кнопке, они видимо благодаря приведенному выше коду, сами подхватывались
скрытый текст
97e4fda1057e.jpg
, а сейчас самому шаманить придется :)
И задам вопрос тут походу уже, хотя похожая тема есть, но не совсем то что надо.
На старых версиях, работало отличное расширение Status-4-Evar,которое добавляло и индикатор загрузки сайтов.
Очень удобная вещь была. На новых увы, расширение не работает, а своего ничего нет.
Попробовал Load Progress Bar, но не то :( Тут вроде есть решение, но куда это пихать, что бы заработало, я не знаю.
Может кто подскажет? И будет ли это работать. Может есть альтернативное решение., что бы выглядело так
скрытый текст
53089e79b9ad.jpg

Отредактировано vv07 (16-06-2021 11:42:06)

Отсутствует

 

№1569016-06-2021 16:17:19

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Не могу к этой панели dropmarker привязать . По ходу, это невозможно. хочу вправо сдвинуть..
65ychs6t.png
e9wb9dh2.png
В author : #editBMPanel_folderMenuList::part(dropmarker) {margin-right: -2px !important;} И ни фига...

Отредактировано ВВП (16-06-2021 16:31:03)

Отсутствует

 

№1569116-06-2021 20:55:54

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

vv07 пишет

Не подскажете, как определять ID для других категорий меню и как их вписывать?

Не, для других категорий меню ничего не предусмотрено,
только те, что есть.
ID можно кнопкой Attributes Inspector посмотреть.
Или с помощью Browser Toolbox, но для такой задачи
это как из пушки по воробьям.
А раз есть стойкое предпочтение видеть пункты меню с иконками,
тогда можно специальный стиль составить (пример).


ВВП пишет

В author : #editBMPanel_folderMenuList::part(dropmarker) {margin-right: -2px !important;} И ни фига...

У меня это работает.
Ну, в два пикселя, конечно, вглядываться не захотел,
поставил сразу -18px и дропмаркер наглядно уехал вправо. Скриншот:

скрытый текст

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAiUAAADLCAIAAAA+3nRnAABQBUlEQVR42u19CZhU1dF2tRDX5NP8fsZ8SXQYBhFlcdyAEBM3lEERMG64JCBqEBQEl4hEZXADIyqK4JJEIImG1aASQEQjagwKKqgoAiJK3GJMQIO4wPRffavv23XPvd3TM9PTy0y9j08/p8892z0y9XYtp06sdevW8XiciGKxGHngr1yuqanhwg477PDyy6/uvvtuZDAYDI2GzZu3HHxwR/LkD4uduAcukCeaRBxxQWq4vH37dv7KhRYtWkgD+cqFli1bypgi2eSRPMUnKqVGZtm2bRuPJg24hqfgr/ypB+SOWJV0dNYsY8q8UinToQZr4JG5kgfHmLoLBscU6IhXw57gqzTmceRFsCqpwQJ4amciLf/5EeR/jvef+QZLxFL0m69cucr4xmAwNCqEb0T+iGwS+cPiTGgAAlFkN8SfiDNSEpl86QnpjLKW40IkPDhkPUS/TCGNnY56RpHa0lKziENv0gtvKlPwvBDf5DMZKfrRfCNL1aQCRsGYmilJ0YazFc5XPQLkv/BHo+x/eXm5zCFMzp/yDN1MvzEYDI0N5ptOnQ4U+QM4P/NFAopAhKTW2oPwhwyC+vBoWucQ+Q6xiN/+8rMb68GPd5HjaE8+VfA40hE/9vGUfL6BXCWlEmF8CpIElB49u+YYmQ4ajFRCjxF5ruW+Q0VcEK4Ny38sO+f7n9BvQJ5SQGcZ9KWXXjG+MRgMjQrhG0h/bSlyDFAQl455So+mpbm254ggJp8koBNAUwGdYBlaF3FUnLAJjpScRXsZHBJVqxqRNjcMiE9txXI4Bu1hgUR7UrShNQ+nY1j+4/Vzvv8J/UZ4CS/j8LPpNwaDobEhfAP5Ff5pD3cL+WwBgailoYwQFuVaIOIpfoxDA3Baoj23hEULctLx02gfia53CEbG1MyHlYSX4ZinBLISR9A7WlrYYgYO0JQjczny36HPHO5/TOIF4BECVWJo028MBkNjA/Y06BBa7os4FolGnhEMljHtEoeghxNbLGMYNlKkkh8aANEsvbStiYL+ibBnQsoOSWjjEhpT0NuvO4ZXoh8BYX3CoUA9PrxQiAKA34UUM2n5T75KlPP9T/KNoyFqpc/0G4PB0NhAvEBYRufHQkW+JzydhcoJ2dLcAwVF+0IcRU0gg5Dv0YGGJK8shjt0Rz357KV74V2wPPJ5GsIcldg0rdloE2J+LISxsrIyHdBGvscMr7RixWvGNwaDoVGBeGjtKoehRkJsHfMReRIQ/CRwftprjoF8dCKktfNG/6jXHnvhCfld7zgwtBwXOP4S53X0OjGCLEz75x0+02Yrx6vv0JLmRWciUgxHvhoXlv9OyFku95/5hoLREXp/+avxjcFgaGzAf0MqEFmLSFKuCFJOe7i7Y6GTNOT7PCDKtcjW3hRIUu2KlynwSb5aoOMOKEq/iYxSczwiFHIjaa3LeR1nwfC4YJ2OlwjmL/mEcRK7oa2FFJL/DmnlcP9jFRUV4f8NeBMum/+m3ti+veaTTzZ9+eXXTlygwZA38J/6Tjt9Y88992jRImDYYfneqPPWVWjAf+M49h2pSuoXupaS+hiNFpqkYpG1WYl8sQizEigEolabefSxGC27YTRzDs1AhdLvqF0jMJ2RH5es+YbSmOy0N15PrSlB4BCqPk8jVkSZQjvsIf/1GnK7/8nznvD26LHk0/Sb+oH/0b7//j+Zcgq9EIOBmGy+973v8N83aoqQbyorO2gRpp0Q2vQCV4rQAAVlH9rEg+G/jsKBAgtK8hzg2i6kSQVyH3Yzx1iEsDRMrU1ejksD/IEjMviJr9URPS9O7Os1aEVQO+QdFwtUGeyz9sRoltLyXweV5Xj/kV9A077mNNNv6od//WvTli1bC70KgyGJ3Xbb5X//dw98LU6+oWA4lv69rx3jseDREMrFaRKMHI7+0h4UhwnqepqHCuerh94jsd3kR53JRFr+Y89zvv8BexoWBPrisvFN/bBx40dmRjMUD/ivfZ999sbX4uSbuArJjatkKpCh+lwOeRITB/spdGhfC01EfJHKGqDNXzhHqZPHoJlj7CL/d3k4GhgADZCyMmkaIHWQRTfWmoHjyooHQ5wdWtIvCIaT0bTdjIKBAGH5r41yud3/xHlPUg4oUc20LdLioeuHd975oNBLMBgCKCv7P5SLkG8OPrgjTEOadaQB8ptpK5BjdhNHAqxPEH8YVjv/IVW1O0czTSyUDI2U2yYyZkzb1iCySSVAc3Qd8u1vGFDHiWkzl6YozTSB0y2K2xwHEt4aTinwCoXkv6aN3O5/Qr8hxahhhc70m/rB+MZQbChyvjnkkE6w8DjhvHEVZSv1kQLXeQSETWThA5KOl95RKRy3udYSMCDYJZYmAbOeFGYxLfed9Jekzk46pjy9JFIxbBQkJHTXVBrexngorsyJScvV/qf8N3qX9WEl45v6wfjGUGwocr5h/SYejPXSIhvyVzuuKRgnBsUIh+cdtwcpjwgE9w6hJMf6sL0+LU/qxEmjJjvQqokOX9Y7ps1Wmh4ycIm2+DnzxoJHR7W1MIf7n8pnA0UPCpeUX3nldeObesD4xlBsKHK+kfg0RwlwzhJqWxZsTfrgvRbipM7QQAhChmqHtg7H0j/VwUN6HK2yaMUoHowQ0xwTHoSUUgUTnHZ+QCkhP0Qby9O85WhdEO5YEgx9FHRcacueI//1ZuZ2/wP+G03yIDqLh64fjG8M+UdZq+9l2XLzpv826koaEg8tyKFvhoJXyJAvGfF7XAf+ZvDNOFRRVL4ZTW9YAHZGH8BsJN9MNvuf9N9QMD+BVrssXqB+ML4x5B/MN+9seD/t06LXb/RBfanXngPHe5E5P00seOCGgvnzEc3l3IOZIT+Nk/iZQoYsKlB+mrA/SftySOlh0BrzkB8ocv8T+WzCLiyd1MH0m/qhrnxz+mmnvf3221k2bt269YyZMwv9ioaiQ0nzzUEHtYcLnVQ0baO60B2NhJTyIZG+OFaS7uYCrE3LcSeLjPOycZXiBTUUDKGmNB4aDW3+Cl8HoIO8Y8HguniBQhiS52+kBfgK8QKxet7vufHovbquSpb3mv7ikmP23b0x/k0XM+rKN4cfdti03/9+t91q3+otW7b0//nPly1fXuhXNBQdSp1v8Hs5MgzMyeWs7UKOGSfsWncc42Em0B5yCoYVQOOBowUCmoIpmTFyuAbr1AqEYxmD+Cbl3cGGwAAYC6bUhClPJ3xDM9SQ778RXsQFpmH576w8h/uf8t/E/COvMXWFOGPlylX14puTrvFo5sl7hw/9Mz23cEJzI5x68M3sOXOcyhkzZvDnGWec4dSfesopim8+GzPg1HmvfRJs0vbh5Q9ma8s3NBUI3/zpwQd7ndTrW9/6H/epxzebN2+eMX3WGf3ObNSV1C8+jYLn5OPqII5jd3IyZmpXP2RX+Ne3NqnFVfwVqQgujKyFLAVVEC159aThg5zx0KViQhvOMUl5JAvYQd19AFHurA33GoiK5mQji/sJ37TCVBO63RkNHPmvz4rmdv8T8Wk16lq6sI5ZX/0myTfBcjNCw/mG9ZghgwdzYfLddzt6T5hv6PjRo8/qJt+fe7D6ktvWGN80QwjfnH3WWfxXf8+9dzuUw3zDZHNy39P4T3vuw3OzGZAFwquvvvrGG28ccMABHTt2FHtRNqj3+RvxvTsJuOKFiwEjX1IjQCCeMQYMC9CinKLMgzqczNEzwtHPWohrX47WbJxl4P+gky4hForBc+R/vNFi8FL5bJxYArx/Dvnm3qHHXTP9dX7cvl/1XydeIP/MhlYdOePFj7l0/fSlg44lZYgj2OI2v/vXboee87FX5TXbx+mboSVPeufa9p6CFViJVFKq/YHLP3583+iVf6rVtX5XPxWaS/oG0BC+WeXh7fXrly1bxl9btWrVuUuX3Xbd7cReJ0oD4xtDJIRvPvvs0wsHXRimnD322NUnm9n8y7jW0Vj6vPzyy7NnzRG+OfW0Uw4++OAsKafe+g2p4+7ytX6xZHU95x8LpllzIqHhC4n0CVEjxJJpoS8vovcE4toR9KQMhrHg5Zk7BC8+aOxYvsj9T573dP43kLJs1iteILM9DU+JCYNOvn3ioKPDHYPivms/jzw8ET9iYrIB8805J9/3R8UH0S3ffeI3PW9Z9dzCy/p6zdbecuprHUZ5k6am4za3rGszcVCbjHzz6RlVQ157cePEIAn5fY/WW9AQvrns0kvfeecdp8FRRx118dChUs6ab94/+7Dea7zKPTv0mjW1mt5/7rTeY659ZHa3733rM1V+/7kH+wy7zWsIQ5w20yUqv6XaO2tT3ZMTfSvT1J95j2Qid5bwmr3JUpVte136QPVZzqS9Lr2TX/+z6CmaEeC/CVMO1wwbOlTIZvfdd6/VfwOy4TKTDVMOF7KnnPrxTTioqeAhxdJMB+7mnAYoGBpAvgKBE0Lh5JiyVCShCZ8b1SFkeFOkK6OsaTi3+5/w38Sijj5hxAbHC6R++7NcPqxftVdMqCOH0kvdDr1pQUAziOAbpxmrJtT3fk/F4QYDpymlJH3LxNT9566i6U916NeeOpwv3KCVIUpqXVVRClaSWpioqO+o6f1G+HM5fS/QW9AQvtmyZcu111yjKUeTDdVdv/EE8bD+dz7Sq9WGMN90pFdP633X/V77P1WfNY96eQI9MWzbX0w5kp7qM2xeZr5RSBBDrzsfObPb99JMPeXxUef+nX7oE4k7S3jN3lA87LkXPTL7nfsGyfL009qmaEbQ8QKacvjrhYMGf+MbLYRsqLZ4AU02p51+aocOHV577bVZM1krypZy6n3+RsvlfJp9IDQds5tUIqcARL9jdtPufb2wojK7adqg9EdfnW3M4f4n4qF1TAJiD8BRDban+f+eEsJdyCCplzSQb3ytJWUoy8A3rGbd8ue3XnzxpUMPPeSL/XoLN6glZVqA8M2w6WOmz/3njAQhRcwVRgP9N6tWrRp97bX4Oua669q3b4+v2fMN88dt80QxoEuTEnmYCi3Y845HZtNTt15y27xUVUpBSYj4VhseVXyDvomOmni8Sefp+qipx/ywV9u/b9hTMYE7S3jNzCieKpN4usSnQ57uukWkSYt34NKjKGqKZgQnPg2U432L/2X+XCEbysg3DtlUVlbK9TArVqzInnLqff6GQsHBIsjk57xzOsQJ5QIHQFhr0xAoR2sDWrGAKqBJSCs6FCSGlBgN5WnWy8DFNuQpQxhEaxiklA/Ifc15cRW6Fg4hcyxgKX0imBItrqKW9QiO/Nc6Sm73P2FPC1Mi5uMWDYxPQxXogVKWrvrZ05JSnukkZBaLbslkc/1r7f/qUwUtGO19vUD0sA43/DGbBawK6jpSGewbQAP5Zt6j86ZOncKFXXfd9fPPPz/t9NN1lFqWfLMhaFjrlUa/Yb5RsjsJiHjyC0q/IZ5xTav+YtfSgKpRtuG+qKmFrlKcFJ4lvGbmG2hdf6qdb9wpmhXC8dA+5dA9997TocP+qM/AN0w20/+UCIwE2Ui9ppx+Z57BlJNhJfU+f4OaOnnCtchyJDgFs4dp+40+XhrWJyh4rFJHFkDOygigB22M0mdItWlLuzp0OjKtTJA69emoDlrE6xhoqB0YORaMZsYmNEYkQpb7n8wvoDPExYNRfbnSb+De3+vQozrQp4MSfpfdteXNjxeICDRQhi8R+gmiepKO8t1CWbZ0Ihdo+ceP765Mar49LZpvfGqJnCvH9jTyIqE3vP32uQMH7rbbbvPmzdtrr+8cc0yK2LLkG9YGpm1oy0L5M8/VcWkavvF0i9su9W1Tf9/Q6ngl4t+vF9/QosvTTf3OfYNYEXo4aL7TGozT8cxuFCaekD0NhkF3imaFnJy/efzxx1euWHnU0UdpshEI5Tz116cOqqw87rjuGVZS73gBkVw4OKnbxFQwsVZBIMQRJawNZY5YR1hwLOqIDISvZiOcs9Hhy/C962Mrjh9Fi34twfWMkPKR5qxY6CALBQ+ExuqeBo0Up2KdDpPpSLwc7n8yXycYEq4kbIrlh64f8njeMy3fwALWtlcvmjcvnX7DZd8aRp5mMPXxUQPmvbanyOsg30Tb01T3pD//s0xTkxcjUNO5Lb2wZq90s/gdfzNv2AVrgjsgU+h4gUuDxONPQc1Ny8kJ33zwwQcsVr773e9GWsxYzn744UctW7bgBhlWUr94aJCBcyslqXOB1Dh3tzg8Fw9mnYEYRXdHIWi8mK7cOvOd66V1S8h/Cnqhcrn/4r/RJ5KcTAzFmT/tO3t9P1z5z4/fK/S6UmjUfDbl5eUzZ80q9CvmB24AAnPbpDVtw6qVgUo8vwDyQ7M4Ch+lDLugKcq05aQ4g/UMAyJ+TBvKtD8fI8f9rDPw+WtprrUB7bfQ53ucKDiB41wR8Uv+iU7t1EAziG+8o1ZlHJcJKTrUNylg92rU3c8yhSP/kb8u5/sfuG9N7zL6FCffFD8sX2eOYHxTB4BvunTrce/d4ysP6hh4Wtx8c/DBHWv8i2cc05P+GQ7fNQSfdkvEVBIXyHptT9OOnJiKhyZfJjo6hPaoa/5wTHCUd9sU1cs26FCIszbsP6mMNTnc/9R9a1oP0reoWr7O+sH4xpB/4D6C739j7wPj227Y/mmX+NeRLYvwPoJDDukUV4FkkHE6QwzMUzoZjJPBjIIJWhzTWfgKY/SNqchjJyLZMcSBEsi3g0HLgcJByn4FA5pur612TtRApFojNIxoNz0RoFmKlBaiVah0niEdDqc5Jpf7X1ZWpvOehq1qpt/UD8Y3hgKC9ZuXlj9+Rr9Bl182BFpO8es3EMGgHNh8SFnD8PNfS1UK6hA6HDl8WETfBxMPxWXBpgQFQs+ljUuRFq14KL2YQxg7hNL1h/USvKaTF4CCRjxSEQGaAuWV46FIOScizsl7jWZYZG73P6nfxILnofTKLF6gfjC+MRQQzDcfvvfK+x98pCmnyPmG9Rvtkc5tGjRH+GpVhnyJCXsaqfOYFLRWyYyFTYMGvqlr8Lc+yE/5TUOXXLOcv3FySOgjUabf1A/GN4YCQviGC5pyipxvdP403LCC3C36B74+ual/U2szFGQoZXcxWpg/4sEQNe280ZYxTF2Tu4vRGsmtorcoVt+L6Rqy/8l4aCcsocH5bAzGN4ZCAnxDinL69D4eDYqTb7Q4zk9YWviEKX6VQ9Midc1l2KJV/GFp2nsfL0RYWsryJvffYFna5hi3+z0bgI0bP6oJXjhhMOQNmm/Ip5zxt1zbpfMhUlOEfNOp04E6IllLXqrviXr981wmAk/oO2zEQaL96lpR0F1i6qJoZzrA8ZxjqeSzl54o5p+eiakDLsIZ2itT41+Yph0w+uyOthNqRcdxJuU5o4Gz/8l4aMxHQQbjgV555XXjm3rgX//atGXL1kKvwtBM4fAN/zm/994HA88fccP1I4VyipBvKis7UMjgQ/5vZK1AaKcC0mjq44qCMCvoSAFSgQNaY4ipCz2dvtq1E3ae64gsOMJ1shwwgX4LJ8+NY7vTWo4OD6OgwwZftQKnt0srKDr3qFbvtMEN8j/H+19WVgZVSJMbCNPsafXD9u01H3zwMX8WeiGG5gjNN/LrmIXCP9774MLBvxTKKUK+wf2epEQkvM2Q9Y4U04dmwrRBih4wjnPkhYI/yXXAtKOmOH5+xyfkOGPIjxOTenjUNeFpekBHbVjTcWVaE9IOpLh/c0FcXWGA3XAyBcDv4iygJnirKd43t/uftKeBnPEa2C/Tb+oNJptPPtn05Zdfm2HNkGeAb0A2DJZ0rOUMG34NU067/fdv8CSZ0JDzNxBn2k0New5iwGrU9TPoqJ0ijmwVLqGQVQpSHmLR0W+02qFj2AT6KChqtBWrRl0OTcHTPBrapa/P6Oh5dZZP7ZlHS7yjc4DJYVb9lULyX/Nlbvc/wTeIBpFdw2EiaWT+G4Oh5PD9fSvfe3eFQzagnCuuvAGGtSKB2NNq1CUreKQDqPRBQv2DGuoLKT2Doo7CODFU8LFTMFRa+9hx/FPHGujYZS27yT8vryMUwul5nHOUML5p5kACAn24EqQCE1Y8eGjUWRtOgDqXs+ktDcv/Rtr/5H1rpE6B6o2L2XlPg6EEwXyzccNLYbIRfPDBR7+65tePPzaz0MtMwcnXCcWC1A9/ijoLScoH7sjcmDqNryUgBd0b5DGNqAU6Yi0WPD5JytcS6aggdZKGPPkOL4g+6SlWJsdkpxkOw8L6l+6IKCnjW6S3hoL2SWc9FIo0C79Xbvc/ES+gE3RixViu8Y3BUHJgvnln/XIhm3/84/299tqTRcBZ51yk2xQh34Tr48GjMyg7MWz6VjE0pqC9SHek0PHMSBuXlt3x4JmVsD1K+0hIWa4omOPZWQ/SSJOfKcBx0jiTQtlyDrFq5qDgGSa9PJ3ejfwM0+FzqZq9crj/yfM30kJHSoCozX9jMJQcmG/Wr31eyOawLlV3Txp3zNE/6n/u8KEXn3dSr+MbPn7OIfHQWhTiF7RTEwsePcnV7ZmkArEwAkK/nJEp6vZMGRy2Ju31IUUbBfbYB1UxCnprNI82xv4n7GmRCR7Id/6YfmMwlByYb9aufk7IhvWYXwy6fN4j0z744KMLBv1y5ctPFnp1EUB8mk4W7GR20eLP+Tnf8AQzjoEnLG2dW8vyc7tozIc25WmmqdPtouQrNNkk+GmM/U/GCzjR0zEVDG58YzCUHJhv/rp4tpBNl86H9O778/PO7de+fdtLL7/ugvPPKUIVB+dvSOU2hkyMNfJla9o9rsW0HpaCSS3jKjDaLlvLcv8T/hudDAfjwqdk+ToNhpLDcT1Of/6Fl4Rs+CuXB54//KFZv/nww38Ov3TMyy8uLvQCXSCfjfZPhIWso4hoyxIpitohmLnZkZ6aYHTkGClZH7Zf6fgCraaARZwafeiHQmHQ+qZq8oPHKJi0TTvk9Z1AWm/QuS71+On8NPIVcWiIBtTyH1PkfP8D+Tqd+DZR1sx/YzA0AbCKc9mIC/bc89sDz7/8haULC70cF4hP0yKyTsYiyD4tRmUoTRWUJnGLbhxXiVtwSBNhzQ1MnCNrzpA4xyGAyCgDvAj2JJvEOa51K6fGumz2P6Hf6LfFY+h3dv7GYGgCeP/9D4+rOr1rl8Muvujcgys7NnzA3ELnh6bgXZYQytpXr009WghSrrPra+dCYZ0fOzT4dgPyLWMpA1dwSzGyPgiVw/1P6jcUTL+jhzb/jcFgaGzg/pvIbF3a5+GEb8XUKRmtECBiyjkmooUbkDL4REU5o1lMHYqM5yXrAcph4Ry5J+gSmfWAlJJUj/RrDd//ZL5OjCUT6IsNTL8xGAyNjfD9N/ixTL4s0wG7pAQcfk1DRIIPdDK0MB9I43hUEJfjjAEP6QP2egTyORLaQzjXmSzVOecf9n9oS5czqQ40IN+3hB3QYQXYWDzFVkSGEjjyv5H2P2VPC++7jGvxAgaDobEh8WnaMZBnPYZCaWlq0uTnL349Jp4mextiBBpbj0m3/6l8nTIZ1oo3Mf3GYChFLFq06OWXX/7iiy8+//zzQq/F0PTBlPP111+vX7+e/9XFQql3YsgvAL7CoSRSYXbmvzEYSg7z58/fuHFjz54999ln36hELQZDjrF169Z///vfc+fOfeaZZ5YvXx4ZfRC4j0CeOQESxjcGQ8nh5ptvPuecc77//e8XeiGG5oX33/9gwoTb58yZExl5kdBvSAUIOAedyPw3BkMJorq6+qqrRu24446FXoiheeGrr74aNeoq1nL0gVMpJE7zID+0tNYHl6Sp6TcGQ8nhyiuvHDduXKFXYWiOGDlyJOs3CGlDLF+CU8rKysKhBfooqfGNwVByqJVvbr/99ssuu2zevHknnHBCoRa5du3a/fffv2vXrs8991y9BxHB9eabb+63337z58/v1auXlOWp1HCh1llq7YuvNXZdb0Yw38yYMSPyiFLSnhaO2hY0PJ/N9ePuKPTrGwzNDv/9z/vNh2+EALp169axY8ff/OY34AwZX1NIOmTfN3wpmcEB882sWbNwlghJHEjioZ08BKQSaDc8Po35ZtjgAYXeAYOheeGmm25qbnyDryCJQYMGtWvXbsSIEdkPVWtf45tawXwze/ZsKetTn4T7pJ0snvpcTwPP3xjfGAz5Rzq+EZrBV+YbFq8s9FHDf/UwHDFuvfVWlrlSc8EFF7AGQL59CWyxdOlSaYwGXLj33nulgTzSXTAXC3fwDct37htuFtkxfOBRfwVncJnXL+8LZnUS79epLxnfZAHRbygqi3bKngYrW8uWLfVBHNNvDIaSQyTfgDaYDES+a77RLhBpAx2In3KliH6pZFnMNWALqZRe3bp1YwYKO0LQBXOBsa6++mpMSp5M14zF5csvv1x31C9VK2eALx2aCTNH9n0L/b+3qCH+G52DIJAfmkJXbSPjDTU4Htr4xmDIPyL5BhzDv9bBJcI3MGrpNhD3ffr0EcJg+etwgGYmaSAjaEaR2R2KImVPY35CpdauBJgr0vKWmW9QZhZkVsuspmTT1/imVog9LRa8yiiZJkf7b8g/noOMoVwwe5rBUHIoBr4ZP348F7iSm2n9xuEb8oxmUIn0UFh5Bk9P9nwzbdo01Gej32ToW+j/vUUNsafF1V2fgoQ9TefrJJUNNFfx0MY3BkP+Eck3WpSL1SvMN7B9cZsM9jR0zMA3/fv3FxbhxmETHCkWYWkuxMOSByQkYp3XI4K+HnzDK+FPXp62iWXpv4nsS8Y3WUD0G+T91JeKJu1pkmFU6z5w9RSPfjNkyJCNGzdm2XjfffedNGlSY+6qwVC8uCmBiHiBCy8c9Nvf/gZfH310Xps2+x1wQEKUP/tsUpQvWDD/pJOSFq3x428dPnyErmGcf/4F99yTcK5wRylPmHD75ZdfJo1lijfeeHPdurXSS9QXfnriib30XDKCfJURKHEGo0bqMR0PxZ/OIoGWLXfgLlw44ohuiFxAS1TyIBmiorPvi+kM6TBqVDI+Td8MlEw0oOPT9K1zQMPP3+SKb0466ST+G9pll11qbbl169ZRo0Y9+uijedleg6HokI5v6gfhG6GTQr+ZizwTgPFNrWC+EXta4OQN+MaxsunLdvizePQb5htW253Kxx57jD979Ojh1LNeH+Sbd3+8R6dX3SG/M/uVZd333T1XG20wFAmaFd9QbepLDjeBPA2s0C9d1BD9BtdvI1AtERDQunVr7djRN8qRZ6xs7Pi0Bx988Nlnn508eXKtQ4X5hvWYG264gQtXX321o/dE8U330QF2CdcYDE0EzYdvDMUG5ps5c+bo05y4AzRpT0MVAtfkcR74hjzHDH/WSjmab9atW7d+/fp//OMfr76aUFp+8IMfdOzYceedd/7JT34iDYxvDM0ZueUbgyF7iH4j94qSd59pim8qKiqc6z91uui82dOyoRzNN+PHj3/vvfecBp07dz7zzDOlXCe+uXvIj696MMFbHc8a+8zkwcHGqfLmdxcf3unUfyb6dnxl0zP7Jgqbh3Q//MHlXl3SOrc5HY0tvnvIqVc9SKp7+nl5kE6UrAxPEV4wKYNhso1aLY2d/crg7vumGd/QBGF8YygUxH8j5VRmASnIfWs4m4NEAwhRz9t5z1opR/PN1q1bJ02apClHkw3VU7/R4jjMN6nKdxffPW7tfpMHd/fI4JSf3j9HPd1cm9qELunmXfzQwO4dRy72GIKipoh8hXdP6T7u/sUjeylGOcujGY94hkxOO76hCaLp8U3Lljvo+DQJHhNXirhwgEcfndez5wmIxJMIOme0BQvm33jjDRiNG7dr12748BE8lBONJl+dekMGMN/MnDlTggUkeVrLli1T+WzCl3siHrpo+YY8k5qOeL7ooovatGmDr3XiG+aPTqde5VVCR9HBBYnKw2kZ1AUKaCRnP5BQVgKqg98XalASopf42gZFzdt9p8Oo7SmTPTLDOp0pwgtO1Jz9ED0z+URp4612zGJ/dp6XfvoADxk1vqEJohnyTWQ5MoRawBzTp08fZqa1a9eee25/aWZ803AgXoC8CAAQCn9N8g0O5kjmNDG9iS+nOO1pjCVLlsydO5cLu+yyC6s7VVVVOkote75RojlSk3g3UoInh1h8d/dxry5bPHn3KDWIpfyrHUeHJbvUjz2RoubttNNhh33Z9hRYusJTRC14d80oGfnGHd/QJNFs+Qanf4QkMvANaAbEQ8Y3uQD4BkpLim8c/43ODC01ecgvUI94AfIiod97772+ffsy3zz99NPf/va3O3fujKfZ803bNQ+KQCfX7hS2p3XqOHa25g/FKHXmm5H7rU0379pxvdAxPEWaBUeoWcqeJtzzbnh8Q5MEs82NN4x1KhcsmN+7z0ldunR9/vnEMUYuPPvM31jsHti+nTTQNWjGOP+883/7u99K4e67E7apcC8ufGPHFmjfu3cfngsd083lDDX+llsvuWR4usFRZhzx4x/x8r7+ajvm5bJ0xCLRJWE9u+lG9AXuuGPCrNmzOnboIO2ly+urVoNX8NWpN2TAr66+aubMmToIgPwrpWOtWrXSUdJcQDfx4jS2flOneOgGnPfMYE8jcch/57BjO9LmwWn0G8cD3/GsazuuuWcxdfc0D6Is7Glw8n/nsLO8XpvTz5tY0mL6yU/o6acjpnAWPGFMpyOCR4sS8+6eWi2OGb0bHB8jG5oaMvMNS14WtZdfcdkjDz8qv+vxlCX+CSecKHyDZiLBRcRD/kolRDyPwNQCoRyeS7gkw1xYZ3hwLtfKNwL9RrXyDaUnGOer8U32YL6RfJ1gmtT9N2JP061xt7R0KJ78aXXKZ7PPPvtkw2FNAnDwRH41NEdk4BsR35oDHA1DOCDcbPDgQcIo69at5XH0yNy4XbsDuCX5OgoYBeNrCsFc/BlJRc7g2fANlzUjUkglCoPfiD9ffe01tDG+aTiEb1I2NHXeJhGfhvOeQjPMRTiLQ5avswRgfGNwkT3frF79BrMIF9q2bat1jgx8M3/+XxyS0OOTZwT71ahfhfmGPB1Iz0Ue32ilJKwMCcJ8w5/ajsd8o5Uqqo1voPTwULxaWQCXp9w/FVdK87JBacY3WYL5ZsaMGRKfhkg0QfK8Jzw3oBy7b81gKF1kzzezZs8SnQAsUivf8FCio4gs5mHbtNlP6wTgG8d2x/I9ci7NClCAnMG1AVArT6T4hny9R5pltqeBWjSv8DtC3RHtB64g45ssAf1GB6cl9Ru5jyB1/5p/EIf8rJ0rV64yvjEYSgvZ842oGuQpJSyps+EbyGiMzJW33TZeQgPkq2Nzk9G0AiRzha15To2MJoJeFqBbSlnzDabQMQ69e/dx+EZzifNVGItUqAIFXURh3cugIXxDXirOli1b4kpp9/4bnUINHh7TbwyGkkMk3+QTjgpiaD4QvoHeAtdM6rxnOJEnMngWT35og8GQJYxvDIUC882sWbPguUE2zoB+I1XamCbcY3xjMJQcmG+uv/7GAi5g4cIFffr0vuWW8cOGXVLozTDkFddc86uZM2emcnSq5DXJ/Gmi4ujANfJvlW64/+aakfYPzmDIK6688srC8o2h2YL5BvY0IRFkD4iVlZXhpKc2t4nSw5UNv9/T+MZgyDOMbwyFAvPNjBkzhGzguUlGDeA+aeg+OO8p8WkNt6cZ3xgMeUY++aYeprOf/OSI559/ngtffvl1NoOvWvV6mzbJWOSddvqGFHRl9sgwdfarMmQA882cOXPgoEE8WuIinNatW5Mfk0Z+iJpwkWhAxjcGQ8mhmPnmzjvvWL169eTJd6OQriUTQIcOHX/3u9+CWoYMGdyuXTueiCe96aYbn3762TotNcPU2a/KkBliT9M1CEZL8o1OGQ1FR+4taPh9BMY3BkOeUcz2NGaRUaN+VVXVc926te3bH1irMsEKDfiG+95//xQuc9+BA8+tK99kmLquqzKkA/Qb5LMhj2KYdRLxaeTxD9IP6HC1YrOnnXTSSU5NMCmnwWBIIJJvRJJ26dJFrEaM8847/3feoUgu8C96aSCPuBlLc11DnqGJf/5fccXlqHn44Uf4U/Sbtm3bcgHjywhhRUTzhy6ng24juhQvgyt5aqYHacBlrueyqFlMHqeeelpYDcowdV1XZUgH6DfabJYMRkO+zvAzCVpr+HnPHPLNCSeckGXL+fPnN85mGgwlgMx8w/JXaENoRvwWWsLCRMZ/ccI38lSbzoYMGcxcFck3GF+ehvkG2kNd+YaivCzcQLOjNJZZ9FyZp67rqgzpIPoNKe9M6j5piU8jL3OauG3IP6EjqQiKSr/hf/0zZsyotdkZZ5xhfGNozsjAN8IxwgeaOUTCaoUGfCPSnDz3iXAMKxaaUTTfhMd3lpFBk9CzR0p/WL2g6DgNeIW9e/dGA+hAtU5t+k2uwHwj5z3ho0nlima+kejnCN3Hqyk2/aa+fLOhMlZO/W9fMTVw2nnhhAE9Ryxc8PbqqlZ75Gy/DYZCg/lmzJgbnEqW5h07th848LxJkxJ8cOWVV9x88y3MBxddNPj++3/36qurbr/9Ni5wJTPHySf34QL/xXGXzp27LFnyDCVubU+0/POfHxa+4RG4zPXSWHqFx3eWceSRP/7d7+4XbuPBt279KvO77LLLjrw2kf5cRnuMoxtw5VVXjRK+4cXIUrOZuq6rMqTD6NFXM9/gtmgoNwn/TXl5uURJC8dIOfHAp5/G1m+mTp26ZMmSKVOmZDOa8A3TCZe5wP++w23WrFmThm+67tylVfX0hYpaEiS0kvY2vjE0MdSPb847b+ALLzzPBf7zkacO3+heLKC5ca18w5Vjx94k3QX86M03V0sbKWR+F4dvhEI0K3ClLMmp5ILmp8xT13VVhnRgvkF8mpjK5BQOyfkb8tNCozbuIz/x0AMGDOCJsqGchuk3XSv7V1Ll8KnDq5JVCyf0nb6Cpi0cZ3xjaFqoH9+sW7eOCYNbMsEwl4T5hnwVB23qwTfkKRPcVw8bCWkmZWksryA10F2YVHhSWZVUcsdTTjmVX42XMWfObD1LhqmzXJUhM5hvZs6cSZ6PRkgEiaKT90lrFpJIAQSq5SefTZaU00C+Gff2wpHlA+bGV7RK1Gwa0LWq3/R7RpZXCd9s2rCwXXnPjxKPDno70Ua6CBWhvAmVqj31v30BaIySZrpplBqKJgyoHDFtZeJ70qanB4Shj5fUbtrzMmRS6wp1JF8tS7XRK7l9wdvDq1qlGd/QXBDJN7kF7GnaYFUQaAXIUHBAv0HYMzJBJ/gGag0e48YCbpe38zfZUE6t9rQ1a9ZQJr5Zvbr6KOo3lyUyy2hmm4VLq48KEQnrPdWr200d3i4j3yTk+ICUcEdZQyjNseDpcZZO79e1snqp3xHtN6mpnY6JxVR1rZ4eWHlydo94BkxNO76huSAPfMNSvkhUAeObooL4b8i/8wZX2yTPeyJeTarkPmlcL523eAHmG/LcORnaNFi/Wd2Vlno0M3XqgEqPeAj1UBEoqUz09dUIgSgTm1RlUnchT31ZUTlOqziil/jaRsJ2V95zRHCcrjt3oXb9pqpevMi+c4OqVajjHp4ZkLzlYeUjl6qV4L1C4xuaCxqPb1i4S6FIyIaMb4oM2n+j49MSn+K/0c90OjX+mh/9JhuyoVzwDQt/1iGqqodPqF7IrLOH4iEttYNdIvSbsJR3+IZU/YS+5DfWGkz5zl26fNGuHyxdTCRdq1esjl5VSlWaEMGUkXzjjm9oPsiDfmMwREL8N/peG+GURJn1G0Q/b9+euJBV3Dm4by0P+k2WZEMNjk/TGoPvcQn4OSoDbpjM/hvmrXa+qWpDyPyVhPBNdbvVQiTk2rsS9j0QlSKt5IDtVk+N6ujoQI49TbhnQ3h8Q/NBJN9IiHBkjHL2aLjbBlEAFnPcJCH2NMeYRrCniVojzhvc7Il4gcbmG6aZp556KhuyodzoN3t4bpJ+1UsXtgrWa6+7b0/LNl7g9qDzBk7+vbv09/SVZCDA3l16VNKm4QEPTYK3FtIxx9CTT1KV15iC2pjueN/I8oNWBt4rYdPbI7USxHZvCI6PkQ3NAkXLNxZ23OQh9jTRXiQsDTfdJPOnIQAaSpBEsHGh2M57TpkyZdddd83Q5vPPPz/33HObaH4BOHgivxoMSTDfjK52+eaxhQt++tM+426+ZejQ+v9JTpx4x8grr3jooYd71Itvjj7qxyNHjurhHaA5qFP7LZ+bitPUMKY6wTcS8IyrBhiJU57l5eWaZkQJQkg0FVl+gSFDhmzYsKHWZq1atZo8eXLjb2z+YXxjyAoZ+ObcgedN8Q/Q/PWpZ1AvbYSNhAzQkVlBaAY1wje6mYzmdORm48bdJLMIdtt1x5WvJH37umxoMmC+mTVrlmREI0+tkXIijUDr1q21JQ3hBDinY/d7Ggwlhwx8I8Qg/MHs0na/tkJCd911N3SXijZthDaED0BU3ObiiwczXQnfMGFIpdAMl4cPv9TpGOYb6DTGN00SwjfkZ+oUZSYiP7QoOjprZz7P3xgMhlyhVnsaGILrwR8ObUAB0hwDTuJ6aEWCcMcwTL9p8hB7mtCKkEjqPmnct6aj1tCTa4xvDIaSQx74Zs3aNaIhaW+QjJCBb44+6se/+W0yLab5b5okmG/kPgJtSUtqOeXl5Thwg1OgWsUpqvsIDAZDNsjSngY1RWjDsaeBNmB84zZMGC+88Ly2uQln8OBcwwXdMWxP46HefHO12O6kUOitMuQYzDczZsyQawfIzzKQ9NeIPQ3Rz3hAvvXN+MZgKDlk4Bt8FdcLpY8X0GqKqDjoG44XIM9nQ7XxDXkqjqTFTKcDGUoaot/IyRu5aiAZnMaoqKgQbQYHPKUFXD1FFZ9mMBiyQSTfGAx5gPCNHKrZwQPcNEl7Gu5iw0Ec8nUdi08zGEoOxjeGQkHHQ8NaJgc6E/d78hextcmNbHJIBxY2s6cZDCUH5ptrrr2u0KswNEdcf921Yk9DqprU+c6KigpoM5J4QPIQkGdh4xrjG4Oh5GB8YygUmG9mzpwJs5lwiqg0qXhoaSpKkGg5/MnlooqH/uiNm7Zuej1Dg132OHDvA0blaV8NhmKF8Y2hUGC+kXw2otkE4tEkPk1fMS2PhXKK7fzNumfPKj9sEC9bVkrxGo8qt1PiZfiVat5ZMa3NEQ8WdLcNhsIjV3xz1113XjXyl7PnzO3RoypcyeVTT+k7dtyvL754WENmOfaYIyVj9Gf//aLAG2doMIRvdJq01P03ot/oeGgcvqHiO+/55pIz23S5MF6z1SOYBFF6lFMTj2/n/2LU4u2Vs/c/8k8F3GuDoRhQQnzDo7355uqJEyejUOjNMzQIYk9DDgF9vtO9b01YR1QhIZ6iik9b9cQZ7X50UXz7FlFuPL7Z7pENl7cx36x76aH2x9Z+YYHB0LSRH77RlfUGKze/vPIqHmrdunUHV3YwFafUIfoNvgrZJPN1lpWVSX4bZO3EudAijE9b8djpHY+8OL79M09J257km5rt3uc2irVYvfzhyh4z03XXN9aoq2IMhqaGSL557LGFrI4MOHfg1Cn3k5fR+Yknl4iUlwZSQz6joKNQS7iSfP1mv/3acoG7i1kswzj8+eubx8pTwbe+ufPLK15r4+Um0GVDiQJ841jLEjW4/4Z8/QYX4eTtvrUlS5ZMmTIlm9FenH9q5dFDa7Z/mlRuarYx6wjZeHzTcvWL8zp1n9qiZfSCmW/6Va9emLhfOe2NnAZDE0AGvhEyECbQpjB5CvJgWpo4cfLQoUOYnEAtkZWabzCyY23TXcJ8A53G+KYJgPlm1qxZOHaD/NDbtm1L2NNw7AYdcElOfvLZDBgwgCfKhnKef/SUw7oPq9m2KanTJJnmq/j2LylOX2xe986Gd2to57IOA//3B0eHu29YOKF6dbvgNdLGN4YmiAx8IwQgao3wh1Zx+Ombb64WboBOw+V58x4JV1KQb2Q0MFnkOGETnOk3TQzaniZnbODCSdrTnAe6c37y2WRJOX/788ldegyt+fo/8e1f1PB/277wCl9RfFusxa5bP3n1vQ+3HND15y89/cduvSO8OBMGVFK/ud7Fz4H7oUcumDC855kfEfW/fcHU4V0HdG1XWb1U7odmiupavWL10uqjYuVykbN3RTR/TdLVwgkDeo5YuMC9YTpxzXMrf16vzTRS9bhw2ru4enhwPeWUrEzeQi3TyhShjuT1lbVJm02hoVIXY+vVNsY/NUORgPnmV1ePcSoXLVp42qkn3zT25osuGvbWW+sOObjjgAEDKWFjuJ8rmTPk6Zo33+SaWbP/fPzxVZMm3Tnqqiu5/Jd5j4Yrua90kb482h13TpKn6cbhsrOq7sceee99v6uoaCNL2vzp1kJvnqFBuPGG0XL/jb6MIBmfJvlsnA6i2YiWkzf/TTaUs2RWnx9WXfT1f9d4+k3ChuarONt2aLnrF/9ZzXyz/8HHLXv6L0ee9nCoN4vvqn7TF3qiNiDfP0xQyFRKsMWAqW+vbrd6at/pJNLcpygK6kOp7lVd+614fsPUgKDfQylS6RZAzjheYen0fl1Bdar9ppA2pvWzDVVdq6enKDA8VORqjW+aMjLwzeGHd178xBIQwK9vHrts2QsvvfzqwoXzhSe4pRSYlpgM+Ck3W7t2TbiSMvJN5Djk2dN4AVgVt2dmko5SKPTmGRoE4RuJTNu2bRt5qQOSfFNRUYGbPYWFSEVMUx7vk2a+Ic+dk6HNE9N7H9HjvK8/X+9xjE85Huu0YL7Z/BbzTZv2h77wt+eO7feI05eVj4TwXjrVE7SOoE/KX8Uuck+ziHLusiGSb1ZXH0X9xk3tOYDLXWmpCkbQ+geRr9DcvuBtqE3lPUd4T1JKyc5dqF2/qYqlcF30Bs1kwY6JGo8d++o3Cg4VsVrjm6aNDHyDr0IPqGQeYkoQerhk2EWsmqCl6CXhSsrIN3ocGTySb8hTcfipEGGhd87QUDDfyH0EUFokPi3i/A2ukRZ2ojza06g2smEseqDXT6rO+XrLu3GfaZLBAgm+2e3Lz94Rvvn7088ef/Y8p+/CCQOmUz9HBAf5ZhMsadK4H033u0TwzcgFE6ZO/3ChL+g9vhm5VJnRwmDWWVE5bkJf8ltqDaZ85y5dvmjXDyzlm/JSbKemSKlKIQ0sPFTEao1vmjZqtafleT0Z7GmGJgbmG/HfSLSz9tEk8wsIJGQAyo1oQ3k4f5Ml2TAW/OHEo3qc/vXnG2FJU3zzza+2vCd88+xTz/T82V+CXaEr4GtKOlcm3DZVnvclSRieMjRhD9o03LW/gW/KV0b5S2SodOsXvqlut1qIBBY8DMIqCDeQEaSxZrt2q6dGdXR0oPBQkas1vmnKKDa+2f1/djH1pZkAfEN+5DP4JdaqVSs5cCP5oqWAFNH8uXLlqsaOh37qqaeyIRvGvKknHF31021bNnr6zXb+pBo577m9xTe++fXnHzHflO1fuezvL/U4a47qB4+6AxbBi0aWH1/Zv3LatMf4O+xd5In7qTRAqwgO3/jUknqkz/doexqc/F6sAesryUCAvbv0qExSGmiA+NFCOuYYevJJqlrtWv8o2PG+keUHBd/roLfjc/sGhqqSYIfwanP8r8xQTCgSvmGakYKRTfMB+EafqxFCicjXKWSDS3KK6rznw/f3PLbqpJqvPk14bjyaSRzE8SiHX2Lb1o+Zbz78d+zQHw//zj7dVL9IISuVCb6JlL8qmK1oEVba9FdD80Uk3xgMeQD4BvEC4JRUfoFA1JqKHSiq+z3/tuCKj997NUODvf6vXefu139jp28Fq+vMN8HggqKF8Y0hGsY3hkJB4tPkOhvkEEjazJA/DSmikwdBfQZqbHtanfDJJ59s2rQJN/SEseuuu+62224777zzLrvskt2QYSoSYxfZIRVD6YL55qpR1YVeRYHx1lvrDju00/IXX6moaMQDpN/eY9fGnqKRZm+k/Rl7UzXzjXAMbotOZhmQeAHyaEZaQ78R61tR6TcGgyEbFJBvFi1aeMbpP50x86GGhKLlZJD8oHT5ppHAfDNnTsJ9HvDc6PsISOUXEO0BLpyi0m8MBkM2KCDfDL/k4mnT7m8gVeRkkPzA+MYB8w3iBRw1JplfQCeHJj98jTylx/Qbg6HkkI5vxIQi5cMP77zo8acmT574q1FX9u8/cMIdd6F8wom9WL3gAgt9tCRf7ZDuN95085AhQ/WADHSRcuQ44TVkHoQXxlJVf81+H7Q4Pv64o5Yte4ELQmN6UhAbt+f34k3AC/Irj79lnLx+eBulsUzBfWXl/9n0ebrBuSwbKIM7lVxYt26tnp186tXvrifCC0olN9BTcwOnfc73J7znwjcRyaElPk1HQnMBJ0LlNtCium/NYDBkg3R840glKYugYbnDNUIAwiuakFi4tGmzn5AHmInFEIsqkUoQW1o1iRwHQkqeck2PHj0zDCLl8K94h6VIiUX9vtKR37Hvyado+SiCHoLVkdqyNhbQkXyDvvJS6OuwSHhwza9OJXZDSE5mj3wXZyKuHHzh+ZdfMRKUIM14EGYvbqbbh/89NHB/wmOK/8aNhEb+NCQbCCe2oSKLTzMYDNkgkm+0diII/yKGqILsAzPxU3AAKocOGw6WkhHCfOOM48wIvkk3iMh0Sv+DOgNEnnKBx9fCURaAGp6OVTGeS//eT2eq4r4s37FUTQNSyGbwWmfUtIH/a85E0oz3DVQR1hRFO9QLk0dQfXK+P+K/gUdGE0oyXgABAogoQD4b028MhpJDJN+ENQxBnvlGxoHCVCvfkGJK3SYbFC3fsD4hGklmvtEr5y533/PbSL458MAOYmpzpnZWmJ/90fY0phx9h2eSbxArLcHQ4CUy/cZgKEFE8g14ReQIC3EWFmJLWbbsBfEipLOn8VPuAvJw7GmaBvAo0p7G9eNvGSfmu8ceWyD8F+YbPQjWD9OT8zpAQ+xp+ve+lqf8NHt7mu4bObim3nQzRs7uGLWcZhPvnNB2//1hYXN+UtTKNw3Zn8x8Q/5Jm6QOU1ZWhkSeSZXHz9dJXuBAUeUXMBgM2SCbeAHytBkWVaJtgEXg50czeKrTxQs4aoe499ONo5UVJp5IvtGDkKcPYcF1isVy5KNUhv3h2Uh8PSxewYkXQN90gyMUQnvgM9vT5NcAbw5XRuo3aJZYWDD4wrGnNcb+RPLNzJkzYz6EaVL3rZF/+EYUHemD8zfGNwZDyYH55sqRo+vd/fHHH+t3xk9vuGHc4Dr6SxppnKaBPf/fbi8sW1lUscuNgZvHjZH7CMgPdQ7cfwOHjU4fjXho898YDCUH45siRPPhG7lvTexposMkWQf5OnHek/wINvk0/cZgKDkY3xQhmg/fzJkzBxoLCglCQX4BCYZGCyS9Mf3GYCg5NJBvDIZ6g/lm9uzZOM0J1SWhz2h7mk7kibLxjcFQcjC+MRQKwjfk508TNSZ5Z7Tkh9ZHPvX9N2Tx0AZDCaII+aaw1qRmYssqBsCehvvWcAQnod+QT0Ry+Aax0tLZ9BuDoeSQW74RN8z0GQ8dd1yPeg9ifNNMAP0GAKGk/Dewp8mJUPlq/huDoRSRW74ZMfzi3/9+ivGNIRsw38ycOZM8ToGdLJksDfls4NXBYU8pv/LK68Y3BkNpIZJvRE35+c/PZfLgr4cd1vmxRX996611nQ8/SBqEaxhoL+XbJ9QhPTOGuuGGcVdfPVIkPot+GfOTf2/Rc4HPuAGXeanSUWLbdCUX1q1dwwPqBkKKepF6IvCNVHIDPTU3cNoX+n9gCUP0Gzhv4J1J3e8p/hukGICiwzUWD20wlByYbi6/4lqncvHix8468xQmlfkLnrznnruuvWbkddePu/DCi/VTrjn++KquXSq5ZunzK1q3TigEl1069A9/mPLgn+Z0757Sb9avXyfNAKcB4zt7fVMqZToZkCsxLxrIaGggi4ysxDp5BCn/8+P/OpNGTsSVF1/0i0svu1IWiWY8yLp1a7mZbm+oN8bfcp3wjU4gIOFqSf8NeZRDHh1J/jR0tngBg6HkkIFvRKSKKP/Zz8699baJmjnANyLcpTKSb2oFD8vyHYNoGpCCzAu24Fl6ntCLp0CDdJWRZXk7GcqZSJrxG/Xu81OhE4csZR90e0O9IXzj3DNAcqyzrKxMjnmK9UyrP6IQmX5jMJQcsucbrmcu4co2bfbT+k2R8M0JPY8RjSQz33ABQ3GXuybdF8k3BxzQnnmFfL5JpxgV+v9eaYP5RvILOBd4JjhGzt9IO5zKQbyA3e9pMJQisrSnMYXcduvNy5e/wHJ20aKFYmEL8w0a58qepmlA29OEAGDXcioz8M369W/xi4RNcE6zSXfdsV/b/WFhc6xnxjc5gfCNrknFp8F/I0xDKj+0kNLKlauMbwyG0kIGvsFXMSKhkgmGiSeSb8iTxeiS/TIwOA8byTeatDQ38ESsUZHisFrtaazW8Pp52VwZqd+gGX8FM+mtML7JCbT/xkkRnYhPk/sJxIy2bds2BA7YeU+DoURRqz2t0AvMBJP7JQ3mG+RPg19GKCaVz8aJJcCNbMY3BkPJwfjGUCgw38ycOVMIhnzKEUdO8rynBKvhYmnyMw6QxQsYDCUI4xtDoSD2NCkHLpOW/GnisIEZDZQjJjXTbwyGkkMk3xgMeQDiBZBcQDglEQhdVlYmkQI6ZEDyQ0tEgfGNwVByYL657LKrC70KQ3PErbfeIPHQpCxnJFFprVu3RigaXDgILeAWFp9mMJQc6s03ixcvOvvsU6+7buygQRcV+iUMJQnmG7Gn4fyNZIJO3n9DuJzAT2YjEWtSNv3GYCg5GN8YCgXhG8SnIfiZJF4Al0mLVY38u6ZFxbH80AZDycH4xlAoQL/RmQSS8QHiv5EQAiGYZOJoX9cx/cZgKDlE8s369W/98IcH4+tHH30q7CJfhWM03+j2hx56+Pz5T9RpDXvv/T88zrXXXoXBnTU88MDs7t2Pz6YlL7XQO2rIFsw3M2bMQPYAZOZMfNX3rZEfKYCoAS4Y3xgMJYfMfPP3v7/cunWFUMs55wy49dY77713Eot7JgB+Cr5hGpCn0lHKzlAAyANAd5lIOIMrpaWMICtJ1xLrfOuttaZvlQrAN/DRBOxp0gg2NFLuHP5q528MhpJDBr6BpnLZZcP++MepWvqz0O/Zs5fwTUXFflB9BJpvsgEIA2Uu8CxQVngBPB3Pnq5lvac2FBDCN4h2xtU2CUYpKytDaAAC1bRVzfQbg6Hk0HC+4Qas8TTEkdNwvjEzWilC4qHBMTqZQFK/wXkcfZO01Fi8gMFQcmC+GXFpBN/8qFuCb+b9JcE3TyxedM45p44ZM/YXgy66795Jo0df9cc/JuxpUtn9uCpuzF8/+PBTaVzeukIoAUPpwbnvsUF72v9993/+9lySRVDmgrSUEWTwdC1lbYXeS0PdcPttyfM3wiNIMZDM1xm+GAfKjcULGAyliGz4hnzKkbIId01CDqmAErJEJIvoMcNP07VkxeuW8WZPKw0w3+C+NZjUkvcRSDw07saBe4csn43BULKI5BuDIQ8QvtFhaYhBS95/I8AxT1J5pC1ewGAoORjfGAoF4Rvy3TTymUw0IPHQAqg15N/AxkrPK6+8bnxjMJQWjG8MhYL4b8i3kOEoZzI+DadtkOsGGQfMnmYwlCKMbwyFAvw3rK6QZ1KTY50Jf43Y04R8cP5GFB0pmH5jMJQcjG8MhQLzjZz3lOA0XOOZvP9GNBuxsklZoqKlkflvDIaSg/GNoVCA/4aC2Z9J4gVgX9P5OpOP7bynwVCCSMc3Eu4cPitjMOQK0G8Q9py6mKCiokIn6BQgOI3svjWDoQTBfHPJ8FHh+l9ecckDD0z7/R9mHnus8Y2hUXDHhJvmzJmD+wgofP5G2uE+aX3fmvlvDIaSQyTfCNlI+eyz+7+x+vWXXlz2zLMvtm5d8f3v7XHIoYcPH37Fz392Oj+SZlzz6KOPk3dQ9MdHHCodUZk9eHBmOB6Zy1x46611Y6oTaxtdfdMvfjHEGf+99zdJF37qNONKWa1TNhQVmG/k/huJEZDK5PnO8vJyXHWDZJ3SQlqbfmMwlByy0W/uu28yC3SW5t2792Bxz4WKijbMCsIoeMqynoU7k9Cvb7lDiEHKMqCmCkFYeRIy4zGfeGIRjy9jShnsIuTBlcxGesbIZmR8U8QQviGfYwL6jMQL6MvWSMVNWzy0wVCKyIZvQB5t9tufqYXF99tvvwU+wNMeVSeKagJovskG6XhCylzQjCWDR3YxvikJQL+Rr6nL1hgVFRXI1AkPj05vY/k6DYaSQ5b+m5NOOu6lF5eJbc3RPxw2glGrHsiGb0SDydzF+KYkIP4bIRh9VbSbrxMFMb1xu23btpn/xmAoOaTjG7GSgW/kK/k+EuEbbU/jluXlFaJ/CCVwG67RiaKzsadl4BshEofPIpsxOw4ffgUPLus0vilOiH6DZJ2kA55Zv5Ev8N+QCprmTzt/YzCUHNLxDXnim3yzFdgC7hNtOoPdzCGVugr6WvlGj5/BnoblSUSD8U1xgvlG7r/BOU7cbpPUb8j37YhVTYcPmP/GYCg5ZOAbB6w08KeEnGl7WqHfwFCqEP1G4s7Ec4OUacl8nQiAlg5gHbL8AgZDCSJLvhHFAgRjfGNoOBAvIB4ZCVFL+m9gTyM/xYAY08Sdw5UWL2AwlBxGjx594YUj+A88Q5tf/jIRO5CwX/06GWyW4Jufnz56tPGNoZ5gcpk4cfz06dO1kQxI5esUsgHfkG90M/3GYCg5jB07tl+/s3fcafdCL8TQvPDVl5vvvvuuhx56SN8ZHcgvkPTkxGKs+yCiAOHR5r8xGEoO8+fP37hx47HHHr/jTt9s0WLHQi/H0PSxfftXX33534cffmjZsmXLly/Xmg2izwL3EcgznWjA8gsYDCWKRYsWvfzyy1s9FHothqaPli1bssaybt06/lcHd4zOn5YA6zekAgTEt6Ovnjb/jcFgqBUN/EvfvHnLQQe1F/mD67jI+2kshn2YYXAaHV4ADOLk5YLUk4LYb1Cj/dbk32usT8XLgXckL8a9yPorUrE4LfFVt5EXwavpKC3dXgQ3Mo/ptemzKxhNXpZ74fYyfX7f8aOgl6505L/UN8b+p/JD48Vw47Q0Nf3GYDDUiobzzcEHdxTJgyMZ5EskfUgDye1JUQVinSD9ISgh3J1xZAQtkSNpib9KS00AujsEsXPCEevE+LJIncmFFJdIXxlHf3VmJMUZoBm8kSwY88o4YS7UGkVY/msmy+3+J+6TdkKkMZmdvzEYDFmi4XxzyCGdINpwHgPQrEBBQw0aO9qJFoJaNRFpK5Jad+QGQjb6YkqZjuulfeSxefKzGzvnFx0RTOrqZPJpQ/vVEa4lAh3Eo6kivHXgD62BIcE/SAXLwzZGHpEJU3IO9z9pT9MKjYblszEYDNkgJ/qNlCFYRbdggUhKlmmRBxMQvqZcBZ5whKda+gqRpK6bVD/esRL0Qg5JR1nRBjQxf5Gv0IAsyf/Vr3MkYyJp6Vy37HTRhAcFxbFfaeMVL0P4w03JrOx4zjK0VqTlPwo53//UfQQU5EkolabfGAyGWpEr/YZ8VoC3AEIJP8lhv9K/uMM15NuptDtEHy4k5com5SCBIQhOCC2RHe0Bn0JOcHVAi5JBoDcIneClwGpYGwVvWwb0a6JGi26to5Cy0WkLoaO1UJB+sP/oktv9T94nHQ9m8ZQJZN12/sZgMNSKXPlvwrYg8j0NeKR/WUMaOtoDBX9Aa4+9rhGblY4C0GYeEZRab9B8AEsRBD0oB4qUXpIjiynoVKcg0erNCesWFAoqJuVNScn3KPePdiZFZnHWcQe53f+UPc2JjsBMpt8YDIZa0XC+qazsIPJHm7wop9FZTjgZKamN0bQChDa4IUzrOnoZMIKRb4DSufaday7httFiWpgPU2syCL8mKXZxCAYKFilbHJg1VtDouFT+NG0K1Exu8dAGg6FW5Mp/I8KLlJiLqbyOkN0i4h3nNiph/IGly7GVaTpBA4eNtKSWBWh1QROVqDUSU6BJQgtoUCkc+NKYVMwYpD/5DiHHOZTOJhZXcWioIWWCc5atVRwKyX/EvOV8/wP+G2eVouuZPc1gMNSKnPANKCHmX/woEtkJwKXg+Rjnhz+pUOCwHSlsB9MN8KmtZKQ4iYIKkGPIigdDn0n5hzRFUfDkibyg1odIme+0FwfhCaLEaAIDpekICC3P4UpxeoXlPxgx5/sfyNep9xqUZfY0g8FQK3Llv6GgEHQCqBy5r1M+4uc/chJr8xH5Mlq77sXERJ481R4jzR8OYZA6CEnKJx/WP+LBIzUxdUxSD47YgVTSft8tr0OKSakpOr+l9vRos55DpdooJ+Sho+/0CBRUd3K7/0l7mo6pcHjV9BuDwVArcuW/EWkIx3445kraSKgu3CqkfvuTkvhaoFHQ06AdB47DHGIX3fVRFVImMr0A8mO9NDlBUSOfPyCsZSVYRuQpFhjo8F6OGwkqCwW1Cj2s3j0nwAwHfbT8p2CsWg73PxCf5gT8Cez8jcFgqBU54Rv9ax0//7VNSR/m56eO/1z72LXqQMpyQ+oUTix47sRxWuBQixP+S37EcDjjQDx4+gS0FFOHYPDIGRlD4R3RVx+fpKBP3jVYRUVIa1dTONY5LP9JUUBu99/135CifRnC9BuDwVArch4vQCF/vlQ6P5kpKOlImYOcQKnIo5eOt0bLYnTRv/QBx4gEmxDkeFydzZTliRTW0WuktJk8HMPUOgqpzAKO/AeL5Hz/E/HQYRNhXKXstPg0g8FQK3LovyHluK6ri8JRVrSKoGOa3XPvQZe+1jBI+ZO0UoJoNC1YSVkCBWEfPup1phkK2ugoyGfhaDEdG+aEOeih9MgUdM83koso8/4n7WmO1qZNk8Y3BoOhVjScbzp1OlD/Ks9nLAAGCccCxKMi2YowFiAbonXCl/Mfi5GIF3DWod/H7GkGgyEb5CSfDUxY4TjjHRqW/hkFJ/2zCEryXd+Ox15316uNF2X655jKjgMdC82070ef9QnL/8ZIv50syH1rWk/E+qS/6TcGg6FW5CpeAD+KIb/AB9qNr33vFLzPhtSFkgjfcqS2jh9zNIyYSkgTU0f99bF8vUhSrhfyKQFOGi1tdZIb7UbCGkBRcf9YpVZ3QJOO78fhj3gw+g4bEtZXkEfGkf96xtzuf9J/o/faMWIa3xgMhlqRw/xppOQdDDjhFF4UzHepo3IdgQ4RB/3Ayc8va4gMG9O2snRGLe3Yh1lJ1zs+fEeHgKOFlHHMoUZHS3O8O9rDhNd04ptJHRKKjMqjUKhC7vdf+AbGOKwSu2P2NIPBUCtyYk8T+QPtQYtRCD4dXuy40xFOhkpt5JGJ4iqqWEv2DHYzRILhZ7s2E8H2pXUFJ1QaAraw6oVobOkUDC3/G2n//z+bX7paVMZSYAAAAABJRU5ErkJggg==

Отсутствует

 

№1569216-06-2021 21:39:33

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Косяк был: влепил по умолчанию

скрытый текст
:host {
  -moz-appearance: -moz-menulist-arrow-button;
  width: 17px;
  height: 17px;
  filter: brightness(1200%);
  margin-right: 2px !important;
 
}

Вот он и замер намертво. На каждый ID надо отдельно лепить ::part(dropmarker) . Теперь , вроде, норм...

Отсутствует

 

№1569317-06-2021 05:08:40

Viatcheslav
Участник
 
Группа: Members
Откуда: г. Бобруйск, Беларусь
Зарегистрирован: 23-11-2016
Сообщений: 312
UA: Firefox 88.0

Re: Custom Buttons

Помогите, пожалуйста, создать кнопку для проматывания страницы сайта до конца вниз с необходимой периодичностью, например, раз в 10 мин. Для определённости, адрес страницы - https://babushkina.by/news/%d0%b2%d1%80%d0%b5%d0%bc%d1%8f-%d0%b2%d1%8b%d0%b1%d0%b8%d1%80%d0%b0%d1%82%d1%8c-%d0%bb%d1%83%d1%87%d1%88%d1%83%d1%8e/
Важно срабатывание без нажатия на кнопку.
Здесь есть варианты решения - https://techarks.ru/general/brauzeri/kak-avtomaticheski-prokrutit-veb-straniczu-vniz-ili-vverh-v-chrome-ili-firefox/
только я не очень в этом понимаю :blush: Будет ли работать приведенный вариант с консолью, и что означают числовые параметры:

Выделить код

Код:

«var scroll = setInterval (function () {window.scrollBy (0,1000);}, 2000);»

Помогите, пожалуйста :whiteflag: Спасибо :beer:

Отсутствует

 

№1569417-06-2021 09:54:48

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
А на этом скрине чем навели на drpomarker ? У меня atributes не показывает...
vdg37tbo.png
А нет кода - "открыть все папки в сидебаре" ? Историю , желательно...Т.е , открываю сидебар сразу пусть папки истории раскроются.

Отредактировано ВВП (17-06-2021 15:21:07)

Отсутствует

 

№1569517-06-2021 21:02:46

beggrr
Участник
 
Группа: Members
Зарегистрирован: 04-02-2014
Сообщений: 118
UA: Firefox 85.0

Re: Custom Buttons

Если popup окошко открыто с помощью window.open()
Можно каким то образом заставить ссылки в нем открываться в новых вкладках этого же окошка?
Сейчас я кликаю по ссылке и она открывается в текущей вкладке popup'а. А если выбираю в контекстном меню ссылки "Открыть в новой вкладке", то открывается во вкладке основного окна.

Отсутствует

 

№1569618-06-2021 08:36:37

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 78.0

Re: Custom Buttons

Viatcheslav пишет

Будет ли работать приведенный вариант с консолью, и что означают числовые параметры

Вот прямо так, в кавычках «», — не будет,
а без кавычек — будет, если скроллер это window.
Числовые параметры означают:


первый (1000) — на сколько пикселей прокрутить,
положительное число — вниз, отрицательное — вверх,
но лучше использовать window.scrollTo(0, window.scrollMaxY)


второй (2000) — с какой периодичностью в миллисекундах прокручивать,
в данном случае, каждые две секунды.
Десять минут это 10 * 60 * 1000 = 600000 миллисекунд.


ВВП пишет

А на этом скрине чем навели на drpomarker ? У меня atributes не показывает...

Сначала навёл на <menulist>, далее кнопками стрелок клавиатуры:


Ctrl+ArrowDown (Контрол и стрелка вниз) — переход к дочерним узлам,
первый будет, соответственно, <html:link>


Затем Ctrl+ArrowRight — переход к следующему соседнему узлу,
первый следующий будет <hbox>, а второй — уже тот самый <dropmarker>


Вообще, наверно, полезно будет перечитать имеющиеся
в кнопке сочетания клавиш (ссылки на страницы кнопки есть в начале кода).

Историю , желательно...Т.е , открываю сидебар сразу пусть папки истории раскроются.

скрытый текст

Выделить код

Код:

(url => addEventListener("pageshow", e => {
	if (e.target.documentURI != url) return;

	var rn = e.target.getElementById("historyTree").view._rootNode;
	var ind = rn.childCount;
	while(ind--) {
		var node = rn.getChild(ind);
		if (node.containerOpen) continue;
		node.containerOpen = true;
		Services.xulStore.setValue(url, node.uri, "open", "true");
	}
}, false, document.getElementById("sidebar") || 1))(
	"chrome://browser/content/places/historySidebar.xhtml"
);

Отсутствует

 

№1569718-06-2021 10:35:41

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Да, теперь вкурил . Кстати, этот дроп только так : (он и в  другом месте есть,типа, добавить закладку из контекста...) Короче, работает, но нет ли тут принципиального косяка?

скрытый текст

Выделить код

Код:

vbox.panel-subview-body > vbox#editBookmarkPanelContent > vbox#editBookmarkPanelRows > vbox#editBMPanel_folderRow > hbox > menulist#editBMPanel_folderMenuList::part(dropmarker){margin-right: 4px !important;}

Отсутствует

 

№1569818-06-2021 12:16:52

Пострел
Участник
 
Группа: Members
Зарегистрирован: 08-04-2021
Сообщений: 51
UA: Firefox 89.0

Re: Custom Buttons

Dumby, пожалуйста помогите, самостоятельно решить задачу не удается.
В вашем коде шаблона для поисковиков,

скрытый текст

Выделить код

Код:

Services.search.addPolicyEngine({

    iconURL: "",
    chrome_settings_overrides: {
        search_provider: {
            name: "",
            search_url: "",
            search_form: "",
            search_url_get_params: "tt=mzl&q={searchTerms}",
            suggest_url: "",
            suggest_url_get_params: "type=list&q={searchTerms}"
        }
    }
});

вписать эти два поисковика,

скрытый текст

https://cs.majento.ru/, и https://www.nigma.net.ru/

При выделении текста и поиске из контекстного меню, открываются страницы поисковиков,
без результатов поиска.

Отсутствует

 

№1569918-06-2021 15:13:22

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Пострел
В поисковике nigma так:

скрытый текст
"search_url": "https://www.nigma.net.ru/index.php?",
       "search_url_get_params": "query={searchTerms}"

Отсутствует

 

№1570018-06-2021 17:11:18

ВВП
Участник
 
Группа: Members
Зарегистрирован: 13-03-2021
Сообщений: 332
UA: Firefox 89.0

Re: Custom Buttons

Dumby
Последнее вроде.Хочу чтобы кнопка Undo не реагировала на закрытые или открытые окна...

скрытый текст

Выделить код

Код:

// http://infocatcher.ucoz.net/js/cb/undoCloseTabs.js
// https://forum.mozilla-russia.org/viewtopic.php?id=56267
// https://github.com/Infocatcher/Custom_Buttons/tree/master/Undo_Close_Tabs

// Undo Close Tabs button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2009-2015, 2017-2018
// version 0.3.3.1 - 2018-08-01

var options = {
    menuTemplate: [
        "closedWindows",
        "separator",
        "restoreClosedWindows",
        "clearClosedWindows",
        "separator",
        "closedTabs",
        "separator",
        "restoreClosedTabs",
        "clearClosedTabs",
        "separator",
        "clearAll",
        "separator",
        "restoreLastSession",
        "separator"
       
    ],
    showInTabContextMenu: false,
    /*
    menuTemplateTabContext: [ // like menuTemplate
        "closedTabs",
        "separator",
        "restoreClosedTabs",
        "clearClosedTabs"
    ],
    */
    windowItemTemplate: "(%count) %title",
    windowSelectedTabPrefix: "*",
    buttonTipTemplate: ["header", "title", "url", "closedAt"],
    itemTipTemplate: ["title", "url", "closedAt"],
    hideRestoreAllForSingleEntry: false,
    allowDeleteEntries: true,
    accesskeys: { // Empty string ("") to disable or string with possible values ("0123...", "abcd...")
        closedTabs: "",
        closedWindows: ""
    },
    accesskeyPostfix: " ", // <accesskey><postfix><label>
    openMenuOnMouseover: false,
    useMenu: false,
    rightClickToUndoCloseTab: false // Useful with "useMenu: true"
};

function _localize(sid) {
    var strings = {
        en: {
            restoreTab: "Restore the most recently closed tab",

            restoreAllTabs: "Restore all tabs",
            restoreAllTabsAccesskey: "t",
            clearTabsHistory: "Clear history of closed tabs",
            clearTabsHistoryAccesskey: "b",

            restoreAllWindows: "Restore all windows",
            restoreAllWindowsAccesskey: "w",
            clearWindowsHistory: "Clear history of closed windows",
            clearWindowsHistoryAccesskey: "d",

            clearAllHistory: "Clear all history",
            clearAllHistoryAccesskey: "C",

            restoreLastSession: "Restore last session",
            restoreLastSessionAccesskey: "s",

            deleteUndoEntry: "Delete",

            tabContextMenu: "Recently Closed Tabs",
            tabContextMenuAccesskey: "y",

            itemTip: "%ago ago, %date",
            day: "d"
        },
        ru: {
            restoreTab: "Восстановить последнюю закрытую вкладку",

            restoreAllTabs: "Восстановить все вкладки",
            restoreAllTabsAccesskey: "л",
            clearTabsHistory: "Очистить историю закрытых вкладок",
            clearTabsHistoryAccesskey: "д",

            restoreAllWindows: "Восстановить все окна",
            restoreAllWindowsAccesskey: "о",
            clearWindowsHistory: "Очистить историю закрытых окон",
            clearWindowsHistoryAccesskey: "н",

            clearAllHistory: "Очистить всю историю",
            clearAllHistoryAccesskey: "ч",

            restoreLastSession: "Восстановить последнюю сессию",
            restoreLastSessionAccesskey: "с",

            deleteUndoEntry: "Удалить",

            tabContextMenu: "Недавно закрытые вкладки",
            tabContextMenuAccesskey: "о",

            itemTip: "%ago назад, %date",
            day: "д"
        }
    };
    var locale = (function() {
        if("Services" in window && "locale" in Services) {
            var locales = Services.locale.requestedLocales // Firefox 64+
                || Services.locale.getRequestedLocales && Services.locale.getRequestedLocales();
            if(locales)
                return locales[0];
        }
        var prefs = "Services" in window && Services.prefs
            || Components.classes["@mozilla.org/preferences-service;1"]
                .getService(Components.interfaces.nsIPrefBranch);
        function pref(name, type) {
            return prefs.getPrefType(name) != prefs.PREF_INVALID ? prefs["get" + type + "Pref"](name) : undefined;
        }
        if(!pref("intl.locale.matchOS", "Bool")) { // Also see https://bugzilla.mozilla.org/show_bug.cgi?id=1414390
            var locale = pref("general.useragent.locale", "Char");
            if(locale && locale.substr(0, 9) != "chrome://")
                return locale;
        }
        return Components.classes["@mozilla.org/chrome/chrome-registry;1"]
            .getService(Components.interfaces.nsIXULChromeRegistry)
            .getSelectedLocale("global");
    })().match(/^[a-z]*/)[0];
    _localize = function(sid) {
        return strings[locale] && strings[locale][sid] || strings.en[sid] || sid;
    };
    return _localize.apply(this, arguments);
}

var JSON = "JSON" in window
    ? window.JSON
    : "nsIJSON" in Components.interfaces
        ? {
            parse: function(s) {
                return Components.classes["@mozilla.org/dom/json;1"]
                    .createInstance(Components.interfaces.nsIJSON)
                    .decode(s);
            }
        }
        : {
            parse: function(s) {
                return Components.utils.evalInSandbox("(" + s + ")", new Components.utils.Sandbox("about:blank"));
            }
        };

this.onclick = function(e) {
    if(e.target != this)
        return;
    if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey))
        this.undoCloseTabsList.clearAllLists();
    else if(
        e.button == 0
        || e.button == 2 && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey
            && this.undoCloseTabsList.options.rightClickToUndoCloseTab
    ) {
        if(
            e.button == 0 && !this.undoCloseTabsList.options.useMenu
            || e.button == 2 && this.undoCloseTabsList.options.rightClickToUndoCloseTab
        ) {
            if(this.undoCloseTabsList.closedTabCount)
                this.undoCloseTabsList.undoCloseTab();
            else
                this.undoCloseTabsList.drawUndoList() && this.undoCloseTabsList.showMenu(e);
        }
        // Allow use "command" section only from hotkey:
        e.preventDefault();
        e.stopPropagation();
    }
};
if(!this.hasOwnProperty("defaultContextId"))
    this.defaultContextId = this.getAttribute("context") || "custombuttons-contextpopup";
this.onmousedown = function(e) {
    if(e.target != this)
        return;
    if(this.undoCloseTabsList.options.useMenu) {
        if(e.button == 0)
            this.undoCloseTabsList.drawUndoList();
    }
    else if(e.button == 2) {
        var showCbMenu = e.ctrlKey || e.shiftKey || e.altKey || e.metaKey || !this.undoCloseTabsList.drawUndoList();
        this.setAttribute(
            "context",
            showCbMenu
                ? this.defaultContextId
                : this.undoCloseTabsList.mpId
        );
    }
};
this.onmouseover = function(e) {
    if(e.target != this)
        return;
    if(!this.disabled)
        this.undoCloseTabsList.updUI();
    this.undoCloseTabsList.options.useMenu && Array.prototype.some.call(
        this.parentNode.getElementsByTagName("*"),
        function(node) {
            if(
                node != this
                && node.namespaceURI == xulns
                // See https://github.com/Infocatcher/Custom_Buttons/issues/28
                //&& node.boxObject
                //&& node.boxObject instanceof Components.interfaces.nsIMenuBoxObject
                && "open" in node
                && node.open
                && node.getElementsByTagName("menupopup").length
                && this.undoCloseTabsList.drawUndoList()
            ) {
                node.open = false;
                this.open = true;
                return true;
            }
            return false;
        },
        this
    );
    if(
        this.undoCloseTabsList.options.openMenuOnMouseover
        && this.undoCloseTabsList.drawUndoList()
    )
        this.undoCloseTabsList.openMenu();
};

this.undoCloseTabsList = {
    button: this,
    options: options,
    mpId: this.id + "-context",
    cmId: this.id + "-contextSub",
    tcmId: this.id + "-tabContextMenu",
    tipId: this.id + "-tooltip",
    errPrefix: "[Custom Buttons :: Undo Close Tabs List]: ",
    get mp() {
        var btn = this.button;
        var mp = btn.getElementsByTagName("menupopup");
        mp = mp.length && mp[0];
        mp && mp.parentNode.removeChild(mp);
        mp = this.createElement("menupopup", {
            id: this.mpId,
            onclick: "this.parentNode.undoCloseTabsList.checkForMiddleClick(event);",
            onpopupshowing: "if(event.target == this) document.popupNode = this.parentNode;",
            onpopuphidden: "if(event.target == this) document.popupNode = null;"
        });
        if(this.cm)
            mp.setAttribute("context", this.cmId);
        var tb = btn.parentNode;
        if(
            this.options.useMenu
            && tb.getAttribute("orient") == "vertical"
        ) {
            // https://addons.mozilla.org/firefox/addon/vertical-toolbar/
            var isRight = tb.parentNode.getAttribute("placement") == "right";
            mp.setAttribute("position", isRight ? "start_before" : "end_before");
        }
        delete this.mp;
        return this.mp = btn.appendChild(mp);
    },
    get useCentextMenu() {
        delete this.useCentextMenu;
        return this.useCentextMenu = this.options.allowDeleteEntries
            && ("forgetClosedTab" in this.ss || "forgetClosedWindow" in this.ss);
    },
    get cm() {
        delete this.cm;
        if(!this.useCentextMenu)
            return this.cm = null;
        var cm = document.getElementById(this.cmId);
        cm && cm.parentNode.removeChild(cm);
        cm = this.createElement("menupopup", {
            id: this.cmId,
            onpopupshowing: "return this.undoCloseTabsList.canDeleteUndoEntry(this.triggerNode || document.popupNode);"
        });
        var mi = this.createElement("menuitem", {
            oncommand: "this.parentNode.undoCloseTabsList.deleteUndoEntry(this.parentNode.triggerNode || document.popupNode);",
            label: _localize("deleteUndoEntry"),
            closemenu: "single"
        });
        cm.appendChild(mi);
        cm.undoCloseTabsList = this;
        return this.cm = document.getElementById("mainPopupSet").appendChild(cm);
    },
    get cbMenu() {
        var cbPopup = document.getElementById(this.button.defaultContextId);
        if(!cbPopup) {
            Components.utils.reportError(this.errPrefix + "cb menu not found");
            return this.cbMenu = null;
        }
        cbPopup = cbPopup.cloneNode(true);
        var id = "-" + this.button.id.match(/\d*$/)[0] + "-cloned";
        cbPopup.id += id;
        Array.prototype.slice.call(cbPopup.getElementsByAttribute("id", "*")).forEach(function(node) {
            node.id += id;
        });
        
        menu.appendChild(cbPopup);
        cbPopup.setAttribute(
            "onpopupshowing",
            '\
            var btn = document.popupNode = this.parentNode.parentNode.parentNode\n\
                .undoCloseTabsList.button;\n\
            custombutton.setContextMenuVisibility(btn);'
        );
        delete this.cbMenu;
        return this.cbMenu = menu;
    },
    get ss() {
        delete this.ss;
        return this.ss = "nsISessionStore" in Components.interfaces
            ? (
                Components.classes["@mozilla.org/browser/sessionstore;1"]
                || Components.classes["@mozilla.org/suite/sessionstore;1"]
            ).getService(Components.interfaces.nsISessionStore)
            : SessionStore; // Firefox 61+ https://bugzilla.mozilla.org/show_bug.cgi?id=1450559
    },
    get appInfo() {
        delete this.appInfo;
        return this.appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
            .getService(Components.interfaces.nsIXULAppInfo);
    },
    get appVersion() {
        delete this.appVersion;
        return this.appVersion = parseFloat(this.appInfo.version);
    },
    get appName() {
        delete this.appName;
        return this.appName = this.appInfo.name;
    },

    init: function() {
        window.addEventListener("TabClose",       this, false);
        window.addEventListener("SSTabRestoring", this, false);
        window.addEventListener("unload",         this, false);
        if(this.appName == "SeaMonkey") // No SSTab* events in SeaMonkey
            window.addEventListener("TabOpen", this, false);
        setTimeout(function(_this) {
            _this.mp.addEventListener("DOMMenuItemActive",   _this, false);
            _this.mp.addEventListener("DOMMenuItemInactive", _this, false);
            _this.initTooltip();
        }, 50, this);
        this.addPbExitObserver(true);
        this.updUIGlobal();
        if(this.options.showInTabContextMenu) setTimeout(function(_this) {
            _this.initTabContext();
        }, 100, this);
    },
    initTabContext: function() {
        var origMi = this.tabContextUndoClose;
        if(!origMi) {
            LOG("Can't find \"Undo Close Tab\" item in tab context menu");
            return;
        }
        var menu = document.getElementById(this.tcmId);
        menu && menu.parentNode.removeChild(menu); // For SeaMonkey
        menu = this.createElement("menu", {
            id: this.tcmId,
            label: _localize("tabContextMenu"),
            accesskey: _localize("tabContextMenuAccesskey"),
            tooltip: this.tipId,
            popupsinherittooltip: "true"
        });
        menu.undoCloseTabsList = this;
        menu.onclick = function(e) {
            if(e.target != this)
                return;
            if(e.button == 1 || e.button == 0 && (e.ctrlKey || e.shiftKey || e.altKey || e.metaKey)) {
                if(this.undoCloseTabsList.closedTabCount) {
                    this.undoCloseTabsList.undoCloseTab();
                    closeMenus(this);
                }
            }
        };
        var origMp = this.mp;
        var mp = origMp.cloneNode(true);
        mp.id = this.button.id + "-tabContext";
        var _this = this;
        function drawUndoList() {
            var ok = false;
            var opts = _this.options;
            var origTemplate = opts.menuTemplate;
            opts.menuTemplate = opts.menuTemplateTabContext || origTemplate;
            _this.mp = mp;
            try {
                ok = _this.drawUndoList();
            }
            catch(e) {
                Components.utils.reportError(e);
            }
            opts.menuTemplate = origTemplate;
            _this.mp = origMp;
            return ok;
        }
        function updMenu() {
            if(drawUndoList())
                menu.removeAttribute("disabled");
            else
                menu.setAttribute("disabled", "true");
        }
        mp._updatePopup = function(e) {
            if(e.target != this)
                return;
            document.popupNode = _this.button;
            drawUndoList();
        };
        mp.setAttribute("onpopupshowing", "this._updatePopup(event);");
        mp.onclick = function(e) {
            _this.checkForMiddleClick(e, updMenu);
        };
        menu.appendChild(mp);
        addEventListener("popupshown", function(e) {
            if(e.target == e.currentTarget)
                setTimeout(updMenu, 0); // Pseudo async
        }, false, origMi.parentNode);
        addEventListener("DOMMenuItemActive",   this, false, mp);
        addEventListener("DOMMenuItemInactive", this, false, mp);
        origMi.parentNode.insertBefore(menu, origMi.nextSibling);
        origMi.setAttribute("hidden", "true");
    },
    initTooltip: function() {
        var tip = document.getElementById(this.tipId);
        tip && tip.parentNode.removeChild(tip);
        tip = this.tip = this.createElement("tooltip", {
            id: this.tipId,
            orient: "vertical",
            onpopupshowing: "return this.undoCloseTabsList.updTooltip(this, document.tooltipNode);",
            onpopuphiding: "this.cancelUpdateTimer();",
            style: "padding: 0;"
        });
        tip.undoCloseTabsList = this;
        tip._updateTimer = 0;
        tip.initUpdateTimer = function(fn, context) {
            if(this._updateTimer)
                clearInterval(this._updateTimer);
            this._updateTimer = setInterval(function() {
                fn.call(context);
            }, 1000);
        };
        tip.cancelUpdateTimer = function() {
            if(this._updateTimer) {
                clearInterval(this._updateTimer);
                this._updateTimer = 0;
            }
        };
        var btn = this.button;
        btn.removeAttribute("tooltiptext");
        btn.setAttribute("tooltip", this.tipId);
        btn.setAttribute("popupsinherittooltip", "true");
        document.getElementById("mainPopupSet").appendChild(tip);
        if(this.appVersion >= 61 && "getAnonymousElementByAttribute" in document) {
            var label = document.getAnonymousElementByAttribute(tip, "class", "tooltip-label");
            label && label.remove();
        }
    },
    _hasPbExitObserver: false,
    addPbExitObserver: function(add) {
        if(add == this._hasPbExitObserver || !("Services" in window))
            return;
        this._hasPbExitObserver = add;
        if(add)
            Services.obs.addObserver(this, "last-pb-context-exited", false);
        else
            Services.obs.removeObserver(this, "last-pb-context-exited");
    },
    destroy: function() {
        window.removeEventListener("TabClose",       this, false);
        window.removeEventListener("SSTabRestoring", this, false);
        window.removeEventListener("unload",         this, false);
        if(this.appName == "SeaMonkey")
            window.removeEventListener("TabOpen", this, false);
        this.mp.removeEventListener("DOMMenuItemActive",   this, false);
        this.mp.removeEventListener("DOMMenuItemInactive", this, false);
        this.addPbExitObserver(false);
        var menu = document.getElementById(this.tcmId);
        if(menu) {
            menu.parentNode.removeChild(menu);
            this.tabContextUndoClose.removeAttribute("hidden");
        }
        var tip = this.tip;
        tip && tip.parentNode && tip.parentNode.removeChild(tip);
    },
    handleEvent: function(e) {
        switch(e.type) {
            case "TabClose":
            case "SSTabRestoring":
            case "TabOpen":
                setTimeout(function(_this) {
                    _this.updUI();
                }, 0, this);
            break;
            case "DOMMenuItemActive":
            case "DOMMenuItemInactive":
                if(!("XULBrowserWindow" in window))
                    break;
                XULBrowserWindow.setOverLink(
                    e.type == "DOMMenuItemActive"
                        ? (e.target.getAttribute("cb_urlDecoded") || "")
                            .replace(/ \n/g, ", ")
                        : "",
                    null
                );
            break;
            case "unload":
                this.updUIGlobal();
                this.destroy();
        }
    },
    observe: function(subject, topic, data) {
        if(topic == "last-pb-context-exited") {
            setTimeout(function(_this) {
                _this.updUI();
            }, 25, this);
        }
    },

    createElement: function(name, attrs) {
        var node = document.createElementNS(xulns, name);
        if(attrs) for(var attrName in attrs) if(attrs.hasOwnProperty(attrName))
            node.setAttribute(attrName, attrs[attrName]);
        return node;
    },
    get tabContextUndoClose() {
        return document.getElementById("context_undoCloseTab")
            || document.getElementById("tabContextUndoCloseTab") // Firefox 2.0
            || document.getAnonymousElementByAttribute(gBrowser, "tbattr", "tabbrowser-undoclosetab"); // SeaMonkey
    },
    get closedWindowCount() {
        if(!("getClosedWindowCount" in this.ss)) {
            delete this.closedWindowCount;
            return this.closedWindowCount = 0;
        }
        this.__defineGetter__("closedWindowCount", function() {
            return this.ss.getClosedWindowCount();
        });
        return this.closedWindowCount;
    },
    get closedTabCount() {
        return this.ss.getClosedTabCount(window);
    },
    undoCloseTab: function(i) {
        if("undoCloseTab" in window) // Firefox 2.0+
            undoCloseTab(i);
        else // SeaMonkey
            gBrowser.undoCloseTab(i);
    },
    clearUndoTabsList: function() {
        var closedTabCount = this.closedTabCount;
        if(!closedTabCount)
            return;
        if("forgetClosedTab" in this.ss) // Gecko 1.9.2+
            while(closedTabCount--)
                this.ss.forgetClosedTab(window, 0);
        else {
            // Doesn't work in SeaMonkey
            const pName = "browser.sessionstore.max_tabs_undo";
            let val = cbu.getPrefs(pName);
            cbu.setPrefs(pName, 0);
            cbu.setPrefs(pName, val);
        }
        this.updUIGlobal();
    },
    clearUndoWindowsList: function() {
        var closedWindowCount = this.closedWindowCount;
        if(!closedWindowCount)
            return;
        if("forgetClosedWindow" in this.ss) // Gecko 1.9.2+
            while(closedWindowCount--)
                this.ss.forgetClosedWindow(0);
        else
            this.ss.setWindowState(window, '{"windows":[{}],"_closedWindows":[]}', false);
        this.updUIGlobal();
    },
    clearAllLists: function() {
        this.clearUndoTabsList();
        this.clearUndoWindowsList();
    },
    canDeleteUndoEntry: function(mi) {
        switch(mi.getAttribute("cb_type")) {
            case "tab":    return "forgetClosedTab"    in this.ss;
            case "window": return "forgetClosedWindow" in this.ss;
        }
        return false;
    },
    deleteUndoEntry: function(mi) {
        var i = +mi.getAttribute("cb_index");
        if(mi.getAttribute("cb_type") == "window") {
            this.ss.forgetClosedWindow(i);
            this.updUIGlobal();
        }
        else {
            this.ss.forgetClosedTab(window, i);
            this.updUI();
        }
        this.drawUndoList();
    },
    showMenu: function(e, isContext, mp) {
        var btn = this.button;
        document.popupNode = btn.ownerDocument.popupNode = btn;
        if(!mp)
            mp = this.mp;
        if("openPopupAtScreen" in mp)
            mp.openPopupAtScreen(e.screenX, e.screenY, isContext);
        else
            mp.showPopup(btn, e.screenX, e.screenY, isContext ? "context" : "popup", null, null);
    },
    openMenu: function() {
        var mp = this.mp;
        if("openPopup" in mp)
            mp.openPopup(this.button, "after_start");
        else
            mp.showPopup(this.button, -1, -1, "popup", "bottomleft", "topleft");
    },
    drawUndoList: function() {
        var mp = this.mp;

        var wc = this.closedWindowCount;
        var tc = this.closedTabCount;
        var ss = this.ss;
        var canRestoreLastSession = "restoreLastSession" in ss && ss.canRestoreLastSession
        if(!wc && !tc && !canRestoreLastSession) {
            mp.textContent = "";
            mp.hidePopup();
            return false;
        }

        this._undoWindowItems = wc && JSON.parse(ss.getClosedWindowData());
        this._undoTabItems    = tc && JSON.parse(ss.getClosedTabData(window));
        var df = document.createDocumentFragment();

        this.options.menuTemplate.forEach(function(sid, indx, arr) {
            switch(sid) {
                case "closedWindows":
                    wc && this.addUndoWindowsList(df);
                break;
                case "restoreClosedWindows":
                    wc > this.options.hideRestoreAllForSingleEntry
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreAllWindows"),
                        accesskey: _localize("restoreAllWindowsAccesskey"),
                        oncommand: "for(var i = 0; i < " + this._undoWindowItems.length + "; ++i) undoCloseWindow();"
                    }));
                break;
                case "clearClosedWindows":
                    wc && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearWindowsHistory"),
                        accesskey: _localize("clearWindowsHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoWindowsList();"
                    }));
                break;
                case "closedTabs":
                    tc && this.addUndoTabsList(df);
                break;
                case "restoreClosedTabs":
                    tc > this.options.hideRestoreAllForSingleEntry
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreAllTabs"),
                        accesskey: _localize("restoreAllTabsAccesskey"),
                        oncommand: "for(var i = 0; i < " + this._undoTabItems.length + "; ++i) this.parentNode.parentNode.undoCloseTabsList.undoCloseTab();"
                    }));
                break;
                case "clearClosedTabs":
                    tc && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearTabsHistory"),
                        accesskey: _localize("clearTabsHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearUndoTabsList();"
                    }));
                break;
                case "clearAll":
                    (
                        wc && tc
                        || wc && arr.indexOf("clearClosedWindows") == -1
                        || tc && arr.indexOf("clearClosedTabs") == -1
                    )
                    && df.appendChild(this.createElement("menuitem", {
                        label: _localize("clearAllHistory"),
                        accesskey: _localize("clearAllHistoryAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.clearAllLists();"
                    }));
                break;
                case "restoreLastSession": // Gecko 2.0+
                    canRestoreLastSession && df.appendChild(this.createElement("menuitem", {
                        label: _localize("restoreLastSession"),
                        accesskey: _localize("restoreLastSessionAccesskey"),
                        oncommand: "this.parentNode.parentNode.undoCloseTabsList.ss.restoreLastSession();"
                    }));
                
                break;
                case "separator":
                    if(df.hasChildNodes() && df.lastChild.localName != "menuseparator")
                        df.appendChild(document.createElementNS(xulns, "menuseparator"));
                break;
                default:
                    Components.utils.reportError(this.errPrefix + 'Invalid template entry: "' + sid + '"');
            }
        }, this);

        while(df.hasChildNodes() && df.lastChild.localName == "menuseparator")
            df.removeChild(df.lastChild);

        this._undoWindowItems = this._undoTabItems = null;

        mp.textContent = "";
        if(!df.hasChildNodes()) {
            mp.hidePopup();
            return false;
        }
        mp.appendChild(df);
        return true;
    },
    addUndoWindowsList: function(undoPopup) {
        // Based on code from chrome://browser/content/browser.js
        // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre

        var keys = this.options.accesskeys.closedWindows;
        this._undoWindowItems.forEach(function(undoItem, i) {
            var tabs = undoItem.tabs;
            var [key, keyPrefix] = this.getKey(keys, i);
            var title = undoItem.title;
            var selectedTab = tabs[undoItem.selected - 1];
            var urls = [];
            tabs.forEach(function(tab) {
                if(!tab.entries || !tab.entries.length) // Can be [] for about:blank
                    return;
                var url = this.convertURI(tab.entries[tab.index - 1].url, 120);
                var selectedPrefix = tab == selectedTab && tabs.length > 1
                    ? this.options.windowSelectedTabPrefix
                    : "";
                urls.push(selectedPrefix + url);
            }, this);
            var url = urls.join(" \n");
            var mi = this.createElement("menuitem", {
                label: keyPrefix + this.options.windowItemTemplate
                    .replace("%title", title)
                    .replace("%count", tabs.length),
                accesskey: key,
                "class": "menuitem-iconic bookmark-item menuitem-with-favicon",
                oncommand: "undoCloseWindow(" + i + ");",
                cb_url: url,
                cb_urlDecoded: this.convertURI(url),
                cb_closedAt: undoItem.closedAt || 0,
                cb_index: i,
                cb_type: "window"
            });
            if(this.cm)
                mi.setAttribute("context", this.cmId);
            var icon = selectedTab.image || selectedTab.attributes && selectedTab.attributes.image;
            if(icon)
                mi.setAttribute("image", this.cachedIcon(icon));
            if(i == 0)
                mi.setAttribute("key", "key_undoCloseWindow");
            undoPopup.appendChild(mi);
        }, this);
    },
    addUndoTabsList: function(undoPopup) {
        // Based on code from chrome://browser/content/browser.js
        // Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.3a1pre) Gecko/20090824 Minefield/3.7a1pre

        var keys = this.options.accesskeys.closedTabs;
        this._undoTabItems.forEach(function(undoItem, i) {
            var state = undoItem.state;
            var [key, keyPrefix] = this.getKey(keys, i);
            var title = undoItem.title;
            var url = state && state.entries && state.entries[state.index - 1].url || "";
            var mi = this.createElement("menuitem", {
                label: keyPrefix + title,
                accesskey: key,
                class: "menuitem-iconic bookmark-item menuitem-with-favicon",
                oncommand: "this.parentNode.parentNode.undoCloseTabsList.undoCloseTab(" + i + ");",
                cb_url: url,
                cb_urlDecoded: this.convertURI(url),
                cb_closedAt: undoItem.closedAt || 0,
                cb_index: i,
                cb_type: "tab"
            });
            if(
                state
                && "attributes" in state
                && "privateTab-isPrivate" in state.attributes
            ) // https://addons.mozilla.org/addon/private-tab/
                mi.setAttribute("privateTab-isPrivate", "true");
            if(this.cm)
                mi.setAttribute("context", this.cmId);
            var image = undoItem.image // Firefox
                || state && state.attributes && state.attributes.image // SeaMonkey
                || state && state.xultab
                    && /(?:^| )image=(\S+)/.test(state.xultab)
                    && decodeURI(RegExp.$1); // Only Firefox 2.0 ?
            if(image)
                mi.setAttribute("image", this.cachedIcon(image));
            if(i == 0)
                mi.setAttribute("key", "key_undoCloseTab");
            undoPopup.appendChild(mi);
        }, this);
    },
    getKey: function(keys, i) {
        var key = keys && keys.charAt(i % keys.length);
        var keyPrefix = keys && (key + this.options.accesskeyPostfix);
        return [key, keyPrefix];
    },
    checkForMiddleClick: function(e, upd) {
        var mi = e.target;
        if(
            "doCommand" in mi
            && e.button == 1
            && mi.parentNode == e.currentTarget
        ) {
            mi.doCommand();
            if(upd)
                upd();
            else
                this.drawUndoList();
        }
    },
    crop: function(s, crop) {
        if(crop == undefined)
            crop = 500;
        if(s.length <= crop)
            return s;
        var start = Math.round(crop*0.6);
        return s.substr(0, start) + "…" + s.substr(start - crop);
    },
    convertURI: function(uri, crop) {
        if(!uri || uri.indexOf("\n") != -1)
            return uri;
        try {
            uri = "losslessDecodeURI" in window
                ? losslessDecodeURI(makeURI(uri))
                : decodeURI(uri);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
        return this.crop(uri, crop);
    },
    cachedIcon: function(src) {
        src = src.replace(/[&#]-moz-resolution=\d+,\d+$/, ""); // Firefox 22+
        if(
            !/^https?:/.test(src)
            // IDN, see https://bugzilla.mozilla.org/show_bug.cgi?id=311045
            || /^https?:\/\/[^.:\/]+\.[^a-z0-9-]+(?:\/|$)/.test(src)
            || this.appName == "SeaMonkey" && this.appVersion <= 2
            || this.appName == "Firefox"   && this.appVersion <= 3.5
        )
            return src;
        return "moz-anno:favicon:" + src; // https://bugzilla.mozilla.org/show_bug.cgi?id=467828
    },
    updUI: function() {
        var tabsCount = this.closedTabCount;
        var dis = !tabsCount && !this.closedWindowCount;
        if(
            dis
            && this.options.useMenu
            && this.options.menuTemplate.indexOf("restoreLastSession") != -1
            && "restoreLastSession" in this.ss && this.ss.canRestoreLastSession
        )
            dis = false;
        this.button.disabled = dis;
    },
    updTooltip: function(tip, tn) {
        var template, header, title, url, closedAt;
        if(tn == this.button) {
            template = this.options.buttonTipTemplate;
            header = _localize("restoreTab");
            let undoTabItems = JSON.parse(this.ss.getClosedTabData(window));
            if(undoTabItems.length) {
                let lastItem = undoTabItems[0];
                title = lastItem.title;
                url = lastItem.state && lastItem.state.entries
                    && lastItem.state.entries[lastItem.state.index - 1].url;
                closedAt = lastItem.closedAt || 0;
            }
        }
        else if(tn.hasAttribute("cb_index")) {
            template = this.options.itemTipTemplate;
            title = tn.getAttribute("label");
            url = tn.getAttribute("cb_url");
            closedAt = +tn.getAttribute("cb_closedAt");
        }
        else {
            return false;
        }

        var tipData = this.getTooltipData(template, header, title, url, closedAt);
        tip.textContent = "";
        tip.appendChild(tipData);
        if(closedAt && template.indexOf("closedAt") != -1) {
            tip.initUpdateTimer(function() {
                var tipData = this.getTooltipData(template, header, title, url, closedAt);
                if(tipData.textContent != tip.textContent) {
                    tip.textContent = "";
                    tip.appendChild(tipData);
                }
            }, this);
        }
        return tip.hasChildNodes();
    },
    getTooltipData: function(template, header, title, url, closedAt) {
        var df = document.createDocumentFragment();
        var hasHeader = header && template.indexOf("header") != -1;
        function item(key, val) {
            var lbl = document.createElementNS(xulns, "label");
            lbl.className = "cb-" + key;
            //lbl.setAttribute("value", val);
            lbl.textContent = val;
            lbl.setAttribute("maxwidth", "450"); // Trick to restore right border for long lines
            if(key == "closedAt" || hasHeader && key != "header")
                lbl.style.color = "grayText";
            return df.appendChild(lbl);
        }
        template.forEach(function(key) {
            switch(key) {
                case "header":
                    if(header)
                        item(key, header);
                break;
                case "title":
                    if(title && title != url)
                        item(key, title);
                break;
                case "url":
                    if(url)
                        item(key, this.convertURI(url));
                break;
                case "closedAt":
                    if(!closedAt)
                        break;
                    let dt = Math.round(Math.max(0, Date.now() - closedAt)/1000);
                    let days = Math.floor(dt/24/3600);
                    dt -= days*24*3600;
                    let d = new Date((dt + new Date(dt).getTimezoneOffset()*60)*1000);
                    let m = d.getMinutes();
                    let ts = d.getHours() + ":" + (m > 9 ? m : "0" + m);
                    if(days)
                        ts = days + _localize("day") + " " + ts;
                    let tsTip = _localize("itemTip")
                        .replace("%ago", ts)
                        .replace("%date", new Date(closedAt).toLocaleString());
                    item(key, tsTip);
            }
        }, this);
        return df;
    },
    get wm() {
        delete this.wm;
        return this.wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
            .getService(Components.interfaces.nsIWindowMediator);
    },
    updUIGlobal: function() {
        var isSeaMonkey = this.appName == "SeaMonkey";
        var ws = this.wm.getEnumerator(isSeaMonkey ? null : "navigator:browser");
        const id = this.button.id;
        while(ws.hasMoreElements()) {
            let win = ws.getNext();
            if(!isSeaMonkey || this.isBrowserWindow(win)) {
                let btn = win.document.getElementById(id);
                if(btn && "undoCloseTabsList" in btn) {
                    let ucl = btn.undoCloseTabsList;
                    ucl.ensureSessionsInitialized(ucl.updUI, ucl);
                }
            }
        }
    },
    isBrowserWindow: function(win) {
        var loc = window.location.href;
        return loc == "chrome://browser/content/browser.xul"
            || loc == "chrome://navigator/content/navigator.xul";
    },
    ensureSessionsInitialized: function(callback, context) {
        var _this = this;
        var stopTime = Date.now() + 3e3;
        (function ensureInitialized() {
            try {
                _this.ss.getClosedTabCount(window);
                callback.call(context);
                return;
            }
            catch(e) {
                if(Date.now() > stopTime) {
                    Components.utils.reportError(
                        _this.errPrefix
                        + "Can't initialize: nsISessionStore.getClosedTabCount() failed"
                    );
                    Components.utils.reportError(e);
                    return;
                }
            }
            setTimeout(ensureInitialized, 50);
        })();
    }
};

if(!this.undoCloseTabsList.options.useMenu && this.undoCloseTabsList.useCentextMenu) {
    this.oncontextmenu = function(e) {
        if(
            e.target != this
            || e.ctrlKey || e.shiftKey || e.altKey || e.metaKey
            || !this.undoCloseTabsList.mp.hasChildNodes()
        )
            return;
        e.preventDefault();
        this.undoCloseTabsList.showMenu(e); // Show menu without "context" flag
    };
}
if(this.undoCloseTabsList.options.rightClickToUndoCloseTab) {
    this.oncontextmenu = function(e) {
        if(e.target == this && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)
            e.preventDefault();
    };
}

this.disabled = true;
setTimeout(function(_this) {
    _this.undoCloseTabsList.init();
}, 0, this);

//===================
// Styles
// Used icons from Undo Closed Tabs Button extension

// Styles can't override hardcoded icon
if( // Remove icon only if nsIStyleSheetService works on-the-fly (Firefox 3.0+)
    !Components.ID("{41d979dc-ea03-4235-86ff-1e3c090c5630}")
        .equals(Components.interfaces.nsIStyleSheetService)
) {
    let icon = this.icon
        || this.ownerDocument.getAnonymousElementByAttribute(this, "class", "toolbarbutton-icon");
    if(icon)
        icon.src = "";
    else
        this.image = "";
}

var cssStr = '\
    @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");\n\
    @-moz-document url("%windowURL%") {\n\
        %button% {\n\
            list-style-image: url("data:image/png;base64,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") !important;\n\
            -moz-image-region: rect(0, 24px, 24px, 0) !important;\n\
        }\n\
        %button%:hover {\n\
            -moz-image-region: rect(0, 48px, 24px, 24px) !important;\n\
        }\n\
        %button%[disabled="true"] {\n\
            -moz-image-region: rect(0, 72px, 24px, 48px) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button% {\n\
            -moz-image-region: rect(24px, 16px, 40px, 0) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%:hover {\n\
            -moz-image-region: rect(24px, 32px, 40px, 16px) !important;\n\
        }\n\
        toolbar[iconsize="small"] %button%[disabled="true"] {\n\
            -moz-image-region: rect(24px, 48px, 40px, 32px) !important;\n\
        }\n\
    }'
    .replace(/%windowURL%/g, window.location.href)
    .replace(/%button%/g, "#" + this.id);
var cssURI = this.cssURI = Components.classes["@mozilla.org/network/io-service;1"]
    .getService(Components.interfaces.nsIIOService)
    .newURI("data:text/css," + encodeURIComponent(cssStr), null, null);
var sss = this.sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
    .getService(Components.interfaces.nsIStyleSheetService);
if(!sss.sheetRegistered(cssURI, sss.USER_SHEET))
    sss.loadAndRegisterSheet(cssURI, sss.USER_SHEET);


this.onDestroy = function(reason) {
    this.undoCloseTabsList.destroy();
    if(reason == "update" || reason == "delete") {
        let sss = this.sss;
        let cssURI = this.cssURI;
        if(sss.sheetRegistered(cssURI, sss.USER_SHEET))
            sss.unregisterSheet(cssURI, sss.USER_SHEET);
    }
};
if(this.undoCloseTabsList.options.useMenu) {
    this.type = "menu";
    this.orient = "horizontal";
}

var style = custombutton.buttonGetHelp(self).replace(/id/g, _id);
var uri = makeURI('data:text/css,'+ encodeURIComponent(style));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService);
sss.loadAndRegisterSheet(uri, 0);
addEventListener("contextmenu", e => !this.disabled || e.ctrlKey || e.shiftKey || e.preventDefault(), false, this);

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]