--- a/browser/extensions/screenshots/bootstrap.js
+++ b/browser/extensions/screenshots/bootstrap.js
@@ -1,16 +1,17 @@
-/* globals ADDON_DISABLE */
+/* globals ADDON_DISABLE Services CustomizableUI LegacyExtensionsUtils AppConstants PageActions */
const ADDON_ID = "screenshots@mozilla.org";
const TELEMETRY_ENABLED_PREF = "datareporting.healthreport.uploadEnabled";
const PREF_BRANCH = "extensions.screenshots.";
const USER_DISABLE_PREF = "extensions.screenshots.disabled";
const UPLOAD_DISABLED_PREF = "extensions.screenshots.upload-disabled";
const HISTORY_ENABLED_PREF = "places.history.enabled";
+const { interfaces: Ci, utils: Cu } = Components;
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
ChromeUtils.defineModuleGetter(this, "AddonManager",
"resource://gre/modules/AddonManager.jsm");
ChromeUtils.defineModuleGetter(this, "AppConstants",
"resource://gre/modules/AppConstants.jsm");
ChromeUtils.defineModuleGetter(this, "Console",
"resource://gre/modules/Console.jsm");
ChromeUtils.defineModuleGetter(this, "CustomizableUI",
@@ -36,17 +37,17 @@ const prefObserver = {
unregister() {
prefs.removeObserver(PREF_BRANCH, this, false); // eslint-disable-line mozilla/no-useless-parameters
},
observe(aSubject, aTopic, aData) {
// aSubject is the nsIPrefBranch we're observing (after appropriate QI)
// aData is the name of the pref that's been changed (relative to aSubject)
- if (aData == USER_DISABLE_PREF) {
+ if (aData === USER_DISABLE_PREF) {
// eslint-disable-next-line promise/catch-or-return
appStartupPromise = appStartupPromise.then(handleStartup);
}
}
};
const appStartupObserver = {
@@ -64,59 +65,58 @@ const appStartupObserver = {
}
}
const LibraryButton = {
ITEM_ID: "appMenu-library-screenshots",
init(webExtension) {
this._initialized = true;
- let permissionPages = [...webExtension.extension.permissions].filter(p => (/^https?:\/\//i).test(p));
+ const permissionPages = [...webExtension.extension.permissions].filter(p => (/^https?:\/\//i).test(p));
if (permissionPages.length > 1) {
Cu.reportError(new Error("Should not have more than 1 permission page, but got: " + JSON.stringify(permissionPages)));
}
- this.PAGE_TO_OPEN = permissionPages.length == 1 ? permissionPages[0].replace(/\*$/, "") : "https://screenshots.firefox.com/";
+ this.PAGE_TO_OPEN = permissionPages.length === 1 ? permissionPages[0].replace(/\*$/, "") : "https://screenshots.firefox.com/";
this.PAGE_TO_OPEN += "shots";
- this.ICON_URL = webExtension.extension.getURL("icons/icon-16-v2.svg");
- this.ICON_URL_2X = webExtension.extension.getURL("icons/icon-32-v2.svg");
+ this.ICON_URL = webExtension.extension.getURL("icons/icon-v2.svg");
this.LABEL = webExtension.extension.localizeMessage("libraryLabel");
CustomizableUI.addListener(this);
- for (let win of CustomizableUI.windows) {
+ for (const win of CustomizableUI.windows) {
this.onWindowOpened(win);
}
},
uninit() {
if (!this._initialized) {
return;
}
- for (let win of CustomizableUI.windows) {
- let item = win.document.getElementById(this.ITEM_ID);
+ for (const win of CustomizableUI.windows) {
+ const item = win.document.getElementById(this.ITEM_ID);
if (item) {
item.remove();
}
}
CustomizableUI.removeListener(this);
this._initialized = false;
},
onWindowOpened(win) {
- let libraryViewInsertionPoint = win.document.getElementById("appMenu-library-remotetabs-button");
+ const libraryViewInsertionPoint = win.document.getElementById("appMenu-library-remotetabs-button");
// If the library view doesn't exist (on non-photon builds, for instance),
// this will be null, and we bail out early.
if (!libraryViewInsertionPoint) {
return;
}
- let parent = libraryViewInsertionPoint.parentNode;
- let {nextSibling} = libraryViewInsertionPoint;
- let item = win.document.createElement("toolbarbutton");
+ const parent = libraryViewInsertionPoint.parentNode;
+ const {nextSibling} = libraryViewInsertionPoint;
+ const item = win.document.createElement("toolbarbutton");
item.className = "subviewbutton subviewbutton-iconic";
item.addEventListener("command", () => win.openUILinkIn(this.PAGE_TO_OPEN, "tab"));
item.id = this.ITEM_ID;
- let iconURL = win.devicePixelRatio >= 1.1 ? this.ICON_URL_2X : this.ICON_URL;
+ const iconURL = this.ICON_URL;
item.setAttribute("image", iconURL);
item.setAttribute("label", this.LABEL);
parent.insertBefore(item, nextSibling);
},
};
const APP_STARTUP = 1;
@@ -165,19 +165,19 @@ function shouldDisable() {
function handleStartup() {
const webExtension = LegacyExtensionsUtils.getEmbeddedExtensionFor({
id: ADDON_ID,
resourceURI: addonResourceURI
});
if (!shouldDisable() && !webExtension.started) {
- return start(webExtension);
+ start(webExtension);
} else if (shouldDisable()) {
- return stop(webExtension, ADDON_DISABLE);
+ stop(webExtension, ADDON_DISABLE);
}
}
function start(webExtension) {
return webExtension.startup(startupReason).then((api) => {
api.browser.runtime.onMessage.addListener(handleMessage);
LibraryButton.init(webExtension);
initPhotonPageAction(api, webExtension);
@@ -188,86 +188,86 @@ function start(webExtension) {
console.error(err);
if (err.message !== "This embedded extension has already been started") {
// TODO: Should we send these errors to Sentry? #2420
}
});
}
function stop(webExtension, reason) {
- if (reason != APP_SHUTDOWN) {
+ if (reason !== APP_SHUTDOWN) {
LibraryButton.uninit();
if (photonPageAction) {
photonPageAction.remove();
photonPageAction = null;
}
}
return Promise.resolve(webExtension.shutdown(reason));
}
function handleMessage(msg, sender, sendReply) {
if (!msg) {
return;
}
if (msg.funcName === "isTelemetryEnabled") {
- let telemetryEnabled = getBoolPref(TELEMETRY_ENABLED_PREF);
+ const telemetryEnabled = getBoolPref(TELEMETRY_ENABLED_PREF);
sendReply({type: "success", value: telemetryEnabled});
} else if (msg.funcName === "isUploadDisabled") {
- let isESR = AppConstants.MOZ_UPDATE_CHANNEL === 'esr';
- let uploadDisabled = getBoolPref(UPLOAD_DISABLED_PREF);
+ const isESR = AppConstants.MOZ_UPDATE_CHANNEL === "esr";
+ const uploadDisabled = getBoolPref(UPLOAD_DISABLED_PREF);
sendReply({type: "success", value: uploadDisabled || isESR});
} else if (msg.funcName === "isHistoryEnabled") {
- let historyEnabled = getBoolPref(HISTORY_ENABLED_PREF);
+ const historyEnabled = getBoolPref(HISTORY_ENABLED_PREF);
sendReply({type: "success", value: historyEnabled});
} else if (msg.funcName === "incrementCount") {
- let allowedScalars = ["download", "upload", "copy"];
- let scalar = msg.args && msg.args[0] && msg.args[0].scalar;
+ const allowedScalars = ["download", "upload", "copy"];
+ const scalar = msg.args && msg.args[0] && msg.args[0].scalar;
if (!allowedScalars.includes(scalar)) {
sendReply({type: "error", name: `incrementCount passed an unrecognized scalar ${scalar}`});
} else {
Services.telemetry.scalarAdd(`screenshots.${scalar}`, 1);
sendReply({type: "success", value: true});
}
}
}
let photonPageAction;
// If the current Firefox version supports Photon (57 and later), this sets up
// a Photon page action and removes the UI for the WebExtension browser action.
// Does nothing otherwise. Ideally, in the future, WebExtension page actions
// and Photon page actions would be one in the same, but they aren't right now.
function initPhotonPageAction(api, webExtension) {
- let id = "screenshots";
+ const id = "screenshots";
let port = null;
- let {tabManager} = webExtension.extension;
+ const {tabManager} = webExtension.extension;
// Make the page action.
photonPageAction = PageActions.actionForID(id) || PageActions.addAction(new PageActions.Action({
id,
title: "Take a Screenshot",
- iconURL: webExtension.extension.getURL("icons/icon-32-v2.svg"),
+ iconURL: webExtension.extension.getURL("icons/icon-v2.svg"),
_insertBeforeActionID: null,
onCommand(event, buttonNode) {
if (port) {
- let browserWin = buttonNode.ownerGlobal;
- let tab = tabManager.getWrapper(browserWin.gBrowser.selectedTab);
+ const browserWin = buttonNode.ownerGlobal;
+ const tab = tabManager.getWrapper(browserWin.gBrowser.selectedTab);
port.postMessage({
type: "click",
tab: {id: tab.id, url: tab.url}
});
}
},
}));
// Establish a port to the WebExtension side.
api.browser.runtime.onConnect.addListener((listenerPort) => {
- if (listenerPort.name != "photonPageActionPort") {
+ if (listenerPort.name !== "photonPageActionPort") {
return;
}
port = listenerPort;
port.onMessage.addListener((message) => {
switch (message.type) {
case "setProperties":
if (message.title) {
photonPageAction.setTitle(message.title);
--- a/browser/extensions/screenshots/install.rdf
+++ b/browser/extensions/screenshots/install.rdf
@@ -7,14 +7,14 @@
<em:targetApplication>
<Description>
<em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!--Firefox-->
<em:minVersion>57.0a1</em:minVersion>
<em:maxVersion>*</em:maxVersion>
</Description>
</em:targetApplication>
<em:type>2</em:type>
- <em:version>29.0.0</em:version>
+ <em:version>30.0.0</em:version>
<em:bootstrap>true</em:bootstrap>
<em:homepageURL>https://screenshots.firefox.com/</em:homepageURL>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
</Description>
</RDF>
--- a/browser/extensions/screenshots/moz.build
+++ b/browser/extensions/screenshots/moz.build
@@ -388,19 +388,18 @@ FINAL_TARGET_FILES.features['screenshots
'webextension/icons/back.svg',
'webextension/icons/cancel.svg',
'webextension/icons/cloud.svg',
'webextension/icons/copy.png',
'webextension/icons/copy.svg',
'webextension/icons/done.svg',
'webextension/icons/download.svg',
'webextension/icons/help-16.svg',
- 'webextension/icons/icon-16-v2.svg',
- 'webextension/icons/icon-32-v2.svg',
'webextension/icons/icon-highlight-32-v2.svg',
+ 'webextension/icons/icon-v2.svg',
'webextension/icons/icon-welcome-face-without-eyes.svg',
'webextension/icons/menu-fullpage.svg',
'webextension/icons/menu-myshot-white.svg',
'webextension/icons/menu-myshot.svg',
'webextension/icons/menu-visible.svg',
'webextension/icons/onboarding-1.png',
'webextension/icons/onboarding-2.png',
'webextension/icons/onboarding-3.png',
--- a/browser/extensions/screenshots/test/browser/browser.ini
+++ b/browser/extensions/screenshots/test/browser/browser.ini
@@ -1,6 +1,6 @@
[DEFAULT]
support-files =
head.js
[browser_screenshots_ui_check.js]
-skip-if = os == 'win' && debug # Bug 1394967
\ No newline at end of file
+skip-if = os == 'win' && debug # Bug 1394967
--- a/browser/extensions/screenshots/test/browser/browser_screenshots_ui_check.js
+++ b/browser/extensions/screenshots/test/browser/browser_screenshots_ui_check.js
@@ -1,14 +1,14 @@
"use strict";
const BUTTON_ID = "pageAction-panel-screenshots";
function checkElements(expectPresent, l) {
- for (let id of l) {
+ for (const id of l) {
is(!!document.getElementById(id), expectPresent, "element " + id + (expectPresent ? " is" : " is not") + " present");
}
}
add_task(async function() {
await promiseScreenshotsEnabled();
registerCleanupFunction(async function() {
--- a/browser/extensions/screenshots/test/browser/head.js
+++ b/browser/extensions/screenshots/test/browser/head.js
@@ -10,18 +10,18 @@ let enabledOnStartup = false;
function promiseScreenshotsEnabled() {
if (!Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
info("Screenshots was already enabled, assuming enabled by default for tests");
enabledOnStartup = true;
return Promise.resolve(true);
}
info("Screenshots is not enabled");
return new Promise((resolve, reject) => {
- let interval = setInterval(() => {
- let action = PageActions.actionForID("screenshots");
+ const interval = setInterval(() => {
+ const action = PageActions.actionForID("screenshots");
if (action) {
info("screenshots page action created");
clearInterval(interval);
resolve(false);
}
}, 100);
info("Set Screenshots disabled pref to false.");
Services.prefs.setBoolPref("extensions.screenshots.disabled", false);
@@ -29,18 +29,18 @@ function promiseScreenshotsEnabled() {
}
function promiseScreenshotsDisabled() {
if (Services.prefs.getBoolPref("extensions.screenshots.disabled", false)) {
info("Screenshots already disabled");
return Promise.resolve(true);
}
return new Promise((resolve, reject) => {
- let interval = setInterval(() => {
- let action = PageActions.actionForID("screenshots");
+ const interval = setInterval(() => {
+ const action = PageActions.actionForID("screenshots");
if (!action) {
info("screenshots page action removed");
clearInterval(interval);
resolve(false);
}
}, 100);
info("Set Screenshots disabled pref to true.");
Services.prefs.setBoolPref("extensions.screenshots.disabled", true);
--- a/browser/extensions/screenshots/webextension/assertIsBlankDocument.js
+++ b/browser/extensions/screenshots/webextension/assertIsBlankDocument.js
@@ -1,12 +1,12 @@
/** For use inside an iframe onload function, throws an Error if iframe src is not blank.html
Should be applied *inside* catcher.watchFunction
*/
this.assertIsBlankDocument = function assertIsBlankDocument(doc) {
if (doc.documentURI !== browser.extension.getURL("blank.html")) {
- let exc = new Error('iframe URL does not match expected blank.html');
+ const exc = new Error("iframe URL does not match expected blank.html");
exc.foundURL = doc.documentURI;
throw exc;
}
}
null;
--- a/browser/extensions/screenshots/webextension/assertIsTrusted.js
+++ b/browser/extensions/screenshots/webextension/assertIsTrusted.js
@@ -1,20 +1,20 @@
/** For use with addEventListener, assures that any events have event.isTrusted set to true
https://developer.mozilla.org/en-US/docs/Web/API/Event/isTrusted
Should be applied *inside* catcher.watchFunction
*/
this.assertIsTrusted = function assertIsTrusted(handlerFunction) {
return function(event) {
if (!event) {
- let exc = new Error("assertIsTrusted did not get an event");
+ const exc = new Error("assertIsTrusted did not get an event");
exc.noPopup = true;
throw exc;
}
if (!event.isTrusted) {
- let exc = new Error(`Received untrusted event (type: ${event.type})`);
+ const exc = new Error(`Received untrusted event (type: ${event.type})`);
exc.noPopup = true;
throw exc;
}
return handlerFunction.call(this, event);
};
}
null;
--- a/browser/extensions/screenshots/webextension/background/analytics.js
+++ b/browser/extensions/screenshots/webextension/background/analytics.js
@@ -1,14 +1,14 @@
/* globals main, auth, catcher, deviceInfo, communication, log */
"use strict";
this.analytics = (function() {
- let exports = {};
+ const exports = {};
let telemetryPrefKnown = false;
let telemetryEnabled;
const EVENT_BATCH_DURATION = 1000; // ms for setTimeout
let pendingEvents = [];
let pendingTimings = [];
let eventsTimeoutHandle, timingsTimeoutHandle;
@@ -19,100 +19,100 @@ this.analytics = (function() {
credentials: "include"
};
function flushEvents() {
if (pendingEvents.length === 0) {
return;
}
- let eventsUrl = `${main.getBackend()}/event`;
- let deviceId = auth.getDeviceId();
- let sendTime = Date.now();
+ const eventsUrl = `${main.getBackend()}/event`;
+ const deviceId = auth.getDeviceId();
+ const sendTime = Date.now();
pendingEvents.forEach(event => {
event.queueTime = sendTime - event.eventTime
- log.info(`sendEvent ${event.event}/${event.action}/${event.label || 'none'} ${JSON.stringify(event.options)}`);
+ log.info(`sendEvent ${event.event}/${event.action}/${event.label || "none"} ${JSON.stringify(event.options)}`);
});
- let body = JSON.stringify({deviceId, events: pendingEvents});
- let fetchRequest = fetch(eventsUrl, Object.assign({body}, fetchOptions));
+ const body = JSON.stringify({deviceId, events: pendingEvents});
+ const fetchRequest = fetch(eventsUrl, Object.assign({body}, fetchOptions));
fetchWatcher(fetchRequest);
pendingEvents = [];
}
function flushTimings() {
if (pendingTimings.length === 0) {
return;
}
- let timingsUrl = `${main.getBackend()}/timing`;
- let deviceId = auth.getDeviceId();
- let body = JSON.stringify({deviceId, timings: pendingTimings});
- let fetchRequest = fetch(timingsUrl, Object.assign({body}, fetchOptions));
+ const timingsUrl = `${main.getBackend()}/timing`;
+ const deviceId = auth.getDeviceId();
+ const body = JSON.stringify({deviceId, timings: pendingTimings});
+ const fetchRequest = fetch(timingsUrl, Object.assign({body}, fetchOptions));
fetchWatcher(fetchRequest);
pendingTimings.forEach(t => {
log.info(`sendTiming ${t.timingCategory}/${t.timingLabel}/${t.timingVar}: ${t.timingValue}`);
});
pendingTimings = [];
}
function sendTiming(timingLabel, timingVar, timingValue) {
// sendTiming is only called in response to sendEvent, so no need to check
// the telemetry pref again here.
- let timingCategory = "addon";
+ const timingCategory = "addon";
pendingTimings.push({
timingCategory,
timingLabel,
timingVar,
timingValue
});
if (!timingsTimeoutHandle) {
timingsTimeoutHandle = setTimeout(() => {
timingsTimeoutHandle = null;
flushTimings();
}, EVENT_BATCH_DURATION);
}
}
exports.sendEvent = function(action, label, options) {
- let eventCategory = "addon";
+ const eventCategory = "addon";
if (!telemetryPrefKnown) {
log.warn("sendEvent called before we were able to refresh");
return Promise.resolve();
}
if (!telemetryEnabled) {
- log.info(`Cancelled sendEvent ${eventCategory}/${action}/${label || 'none'} ${JSON.stringify(options)}`);
+ log.info(`Cancelled sendEvent ${eventCategory}/${action}/${label || "none"} ${JSON.stringify(options)}`);
return Promise.resolve();
}
measureTiming(action, label);
// Internal-only events are used for measuring time between events,
// but aren't submitted to GA.
- if (action === 'internal') {
+ if (action === "internal") {
return Promise.resolve();
}
- if (typeof label == "object" && (!options)) {
+ if (typeof label === "object" && (!options)) {
options = label;
label = undefined;
}
options = options || {};
// Don't send events if in private browsing.
if (options.incognito) {
return Promise.resolve();
}
// Don't include in event data.
delete options.incognito;
- let di = deviceInfo();
+ const di = deviceInfo();
options.applicationName = di.appName;
options.applicationVersion = di.addonVersion;
- let abTests = auth.getAbTests();
- for (let [gaField, value] of Object.entries(abTests)) {
+ const abTests = auth.getAbTests();
+ for (const [gaField, value] of Object.entries(abTests)) {
options[gaField] = value;
}
pendingEvents.push({
eventTime: Date.now(),
event: eventCategory,
action,
label,
options
@@ -144,90 +144,137 @@ this.analytics = (function() {
});
};
exports.isTelemetryEnabled = function() {
catcher.watchPromise(exports.refreshTelemetryPref());
return telemetryEnabled;
};
- let timingData = new Map();
+ const timingData = new Map();
// Configuration for filtering the sendEvent stream on start/end events.
// When start or end events occur, the time is recorded.
// When end events occur, the elapsed time is calculated and submitted
// via `sendEvent`, where action = "perf-response-time", label = name of rule,
// and cd1 value is the elapsed time in milliseconds.
// If a cancel event happens between the start and end events, the start time
// is deleted.
- let rules = [{
- name: 'page-action',
- start: { action: 'start-shot', label: 'toolbar-button' },
- end: { action: 'internal', label: 'unhide-preselection-frame' },
- cancel: [{ action: 'cancel-shot' }]
+ const rules = [{
+ name: "page-action",
+ start: { action: "start-shot", label: "toolbar-button" },
+ end: { action: "internal", label: "unhide-preselection-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" },
+ { action: "internal", label: "unhide-onboarding-frame" }
+ ]
}, {
- name: 'context-menu',
- start: { action: 'start-shot', label: 'context-menu' },
- end: { action: 'internal', label: 'unhide-preselection-frame' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "context-menu",
+ start: { action: "start-shot", label: "context-menu" },
+ end: { action: "internal", label: "unhide-preselection-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" },
+ { action: "internal", label: "unhide-onboarding-frame" }
+ ]
}, {
- name: 'capture-full-page',
- start: { action: 'capture-full-page' },
- end: { action: 'internal', label: 'unhide-preview-frame' },
- cancel: [{ action: 'cancel-shot' }]
- }, {
- name: 'capture-visible',
- start: { action: 'capture-visible' },
- end: { action: 'internal', label: 'unhide-preview-frame' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "page-action-onboarding",
+ start: { action: "start-shot", label: "toolbar-button" },
+ end: { action: "internal", label: "unhide-onboarding-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" },
+ { action: "internal", label: "unhide-preselection-frame" }
+ ]
}, {
- name: 'make-selection',
- start: { action: 'make-selection' },
- end: { action: 'internal', label: 'unhide-selection-frame' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "context-menu-onboarding",
+ start: { action: "start-shot", label: "context-menu" },
+ end: { action: "internal", label: "unhide-onboarding-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" },
+ { action: "internal", label: "unhide-preselection-frame" }
+ ]
}, {
- name: 'save-shot',
- start: { action: 'save-shot' },
- end: { action: 'internal', label: 'open-shot-tab' },
- cancel: [{ action: 'cancel-shot' }, { action: 'upload-failed' }]
+ name: "capture-full-page",
+ start: { action: "capture-full-page" },
+ end: { action: "internal", label: "unhide-preview-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
+ }, {
+ name: "capture-visible",
+ start: { action: "capture-visible" },
+ end: { action: "internal", label: "unhide-preview-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
}, {
- name: 'save-visible',
- start: { action: 'save-visible' },
- end: { action: 'internal', label: 'open-shot-tab' },
- cancel: [{ action: 'cancel-shot' }, { action: 'upload-failed' }]
+ name: "make-selection",
+ start: { action: "make-selection" },
+ end: { action: "internal", label: "unhide-selection-frame" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
+ }, {
+ name: "save-shot",
+ start: { action: "save-shot" },
+ end: { action: "internal", label: "open-shot-tab" },
+ cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
}, {
- name: 'save-full-page',
- start: { action: 'save-full-page' },
- end: { action: 'internal', label: 'open-shot-tab' },
- cancel: [{ action: 'cancel-shot' }, { action: 'upload-failed' }]
+ name: "save-visible",
+ start: { action: "save-visible" },
+ end: { action: "internal", label: "open-shot-tab" },
+ cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
}, {
- name: 'save-full-page-truncated',
- start: { action: 'save-full-page-truncated' },
- end: { action: 'internal', label: 'open-shot-tab' },
- cancel: [{ action: 'cancel-shot' }, { action: 'upload-failed' }]
+ name: "save-full-page",
+ start: { action: "save-full-page" },
+ end: { action: "internal", label: "open-shot-tab" },
+ cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
+ }, {
+ name: "save-full-page-truncated",
+ start: { action: "save-full-page-truncated" },
+ end: { action: "internal", label: "open-shot-tab" },
+ cancel: [{ action: "cancel-shot" }, { action: "upload-failed" }]
}, {
- name: 'download-shot',
- start: { action: 'download-shot' },
- end: { action: 'internal', label: 'deactivate' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "download-shot",
+ start: { action: "download-shot" },
+ end: { action: "internal", label: "deactivate" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
}, {
- name: 'download-full-page',
- start: { action: 'download-full-page' },
- end: { action: 'internal', label: 'deactivate' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "download-full-page",
+ start: { action: "download-full-page" },
+ end: { action: "internal", label: "deactivate" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
}, {
- name: 'download-full-page-truncated',
- start: { action: 'download-full-page-truncated' },
- end: { action: 'internal', label: 'deactivate' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "download-full-page-truncated",
+ start: { action: "download-full-page-truncated" },
+ end: { action: "internal", label: "deactivate" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
}, {
- name: 'download-visible',
- start: { action: 'download-visible' },
- end: { action: 'internal', label: 'deactivate' },
- cancel: [{ action: 'cancel-shot' }]
+ name: "download-visible",
+ start: { action: "download-visible" },
+ end: { action: "internal", label: "deactivate" },
+ cancel: [
+ { action: "cancel-shot" },
+ { action: "internal", label: "document-hidden" }
+ ]
}];
// Match a filter (action and optional label) against an action and label.
function match(filter, action, label) {
return filter.label ?
filter.action === action && filter.label === label :
filter.action === action;
}
@@ -236,20 +283,20 @@ this.analytics = (function() {
return filters.some(filter => match(filter, action, label));
}
function measureTiming(action, label) {
rules.forEach(r => {
if (anyMatches(r.cancel, action, label)) {
delete timingData[r.name];
} else if (match(r.start, action, label)) {
- timingData[r.name] = Date.now();
+ timingData[r.name] = Math.round(performance.now());
} else if (timingData[r.name] && match(r.end, action, label)) {
- let endTime = Date.now();
- let elapsed = endTime - timingData[r.name];
+ const endTime = Math.round(performance.now());
+ const elapsed = endTime - timingData[r.name];
sendTiming("perf-response-time", r.name, elapsed);
delete timingData[r.name];
}
});
}
function fetchWatcher(request) {
catcher.watchPromise(
--- a/browser/extensions/screenshots/webextension/background/auth.js
+++ b/browser/extensions/screenshots/webextension/background/auth.js
@@ -1,125 +1,125 @@
/* globals log */
/* globals main, makeUuid, deviceInfo, analytics, catcher, buildSettings, communication */
"use strict";
this.auth = (function() {
- let exports = {};
+ const exports = {};
let registrationInfo;
let initialized = false;
let authHeader = null;
let sentryPublicDSN = null;
let abTests = {};
- let registrationInfoFetched = catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
+ const registrationInfoFetched = catcher.watchPromise(browser.storage.local.get(["registrationInfo", "abTests"]).then((result) => {
if (result.abTests) {
abTests = result.abTests;
}
if (result.registrationInfo) {
registrationInfo = result.registrationInfo;
} else {
registrationInfo = generateRegistrationInfo();
log.info("Generating new device authentication ID", registrationInfo);
- return browser.storage.local.set({registrationInfo});
+ browser.storage.local.set({registrationInfo});
}
}));
exports.getDeviceId = function() {
return registrationInfo && registrationInfo.deviceId;
};
function generateRegistrationInfo() {
- let info = {
+ const info = {
deviceId: `anon${makeUuid()}`,
secret: makeUuid(),
registered: false
};
return info;
}
function register() {
return new Promise((resolve, reject) => {
- let registerUrl = main.getBackend() + "/api/register";
+ const registerUrl = main.getBackend() + "/api/register";
// TODO: replace xhr with Fetch #2261
- let req = new XMLHttpRequest();
+ const req = new XMLHttpRequest();
req.open("POST", registerUrl);
req.setRequestHeader("content-type", "application/json");
req.onload = catcher.watchFunction(() => {
- if (req.status == 200) {
+ if (req.status === 200) {
log.info("Registered login");
initialized = true;
saveAuthInfo(JSON.parse(req.responseText));
resolve(true);
analytics.sendEvent("registered");
} else {
analytics.sendEvent("register-failed", `bad-response-${req.status}`);
log.warn("Error in response:", req.responseText);
- let exc = new Error("Bad response: " + req.status);
+ const exc = new Error("Bad response: " + req.status);
exc.popupMessage = "LOGIN_ERROR";
reject(exc);
}
});
req.onerror = catcher.watchFunction(() => {
analytics.sendEvent("register-failed", "connection-error");
- let exc = new Error("Error contacting server");
+ const exc = new Error("Error contacting server");
exc.popupMessage = "LOGIN_CONNECTION_ERROR";
reject(exc);
});
req.send(JSON.stringify({
deviceId: registrationInfo.deviceId,
secret: registrationInfo.secret,
deviceInfo: JSON.stringify(deviceInfo())
}));
});
}
function login(options) {
- let { ownershipCheck, noRegister } = options || {};
+ const { ownershipCheck, noRegister } = options || {};
return new Promise((resolve, reject) => {
- let loginUrl = main.getBackend() + "/api/login";
+ const loginUrl = main.getBackend() + "/api/login";
// TODO: replace xhr with Fetch #2261
- let req = new XMLHttpRequest();
+ const req = new XMLHttpRequest();
req.open("POST", loginUrl);
req.onload = catcher.watchFunction(() => {
- if (req.status == 404) {
+ if (req.status === 404) {
if (noRegister) {
resolve(false);
} else {
resolve(register());
}
} else if (req.status >= 300) {
log.warn("Error in response:", req.responseText);
- let exc = new Error("Could not log in: " + req.status);
+ const exc = new Error("Could not log in: " + req.status);
exc.popupMessage = "LOGIN_ERROR";
analytics.sendEvent("login-failed", `bad-response-${req.status}`);
reject(exc);
} else if (req.status === 0) {
- let error = new Error("Could not log in, server unavailable");
+ const error = new Error("Could not log in, server unavailable");
error.popupMessage = "LOGIN_CONNECTION_ERROR";
analytics.sendEvent("login-failed", "connection-error");
reject(error);
} else {
initialized = true;
- let jsonResponse = JSON.parse(req.responseText);
+ const jsonResponse = JSON.parse(req.responseText);
log.info("Screenshots logged in");
analytics.sendEvent("login");
saveAuthInfo(jsonResponse);
if (ownershipCheck) {
resolve({isOwner: jsonResponse.isOwner});
} else {
resolve(true);
}
}
});
req.onerror = catcher.watchFunction(() => {
analytics.sendEvent("login-failed", "connection-error");
- let exc = new Error("Connection failed");
+ const exc = new Error("Connection failed");
exc.url = loginUrl;
exc.popupMessage = "CONNECTION_ERROR";
reject(exc);
});
req.setRequestHeader("content-type", "application/json");
req.send(JSON.stringify({
deviceId: registrationInfo.deviceId,
secret: registrationInfo.secret,
--- a/browser/extensions/screenshots/webextension/background/communication.js
+++ b/browser/extensions/screenshots/webextension/background/communication.js
@@ -1,29 +1,29 @@
/* globals catcher, log */
"use strict";
this.communication = (function() {
- let exports = {};
+ const exports = {};
- let registeredFunctions = {};
+ const registeredFunctions = {};
exports.onMessage = catcher.watchFunction((req, sender, sendResponse) => {
if (!(req.funcName in registeredFunctions)) {
log.error(`Received unknown internal message type ${req.funcName}`);
sendResponse({type: "error", name: "Unknown message type"});
return;
}
if (!Array.isArray(req.args)) {
log.error("Received message with no .args list");
sendResponse({type: "error", name: "No .args"});
return;
}
- let func = registeredFunctions[req.funcName];
+ const func = registeredFunctions[req.funcName];
let result;
try {
req.args.unshift(sender);
result = func.apply(null, req.args);
} catch (e) {
log.error(`Error in ${req.funcName}:`, e, e.stack);
// FIXME: should consider using makeError from catcher here:
sendResponse({type: "error", message: e + "", errorCode: e.errorCode, popupMessage: e.popupMessage});
@@ -31,47 +31,47 @@ this.communication = (function() {
}
if (result && result.then) {
result.then((concreteResult) => {
sendResponse({type: "success", value: concreteResult});
}).catch((errorResult) => {
log.error(`Promise error in ${req.funcName}:`, errorResult, errorResult && errorResult.stack);
sendResponse({type: "error", message: errorResult + "", errorCode: errorResult.errorCode, popupMessage: errorResult.popupMessage});
});
- return true;
+ return;
}
sendResponse({type: "success", value: result});
});
exports.register = function(name, func) {
registeredFunctions[name] = func;
};
/** Send a message to bootstrap.js
Technically any worker can listen to this. If the bootstrap wrapper is not in place, then this
will *not* fail, and will return a value of exports.NO_BOOTSTRAP */
exports.sendToBootstrap = function(funcName, ...args) {
return browser.runtime.sendMessage({funcName, args}).then((result) => {
if (result.type === "success") {
return result.value;
}
- throw new Error(`Error in ${funcName}: ${result.name || 'unknown'}`);
+ throw new Error(`Error in ${funcName}: ${result.name || "unknown"}`);
}, (error) => {
if (isBootstrapMissingError(error)) {
return exports.NO_BOOTSTRAP;
}
throw error;
});
};
function isBootstrapMissingError(error) {
if (!error) {
return false;
}
- return ('errorCode' in error && error.errorCode === "NO_RECEIVING_END") ||
+ return ("errorCode" in error && error.errorCode === "NO_RECEIVING_END") ||
(!error.errorCode && error.message === "Could not establish connection. Receiving end does not exist.");
}
// A singleton/sentinel (with a name):
exports.NO_BOOTSTRAP = {name: "communication.NO_BOOTSTRAP"};
return exports;
--- a/browser/extensions/screenshots/webextension/background/deviceInfo.js
+++ b/browser/extensions/screenshots/webextension/background/deviceInfo.js
@@ -1,26 +1,26 @@
/* globals catcher */
"use strict";
this.deviceInfo = (function() {
- let manifest = browser.runtime.getManifest();
+ const manifest = browser.runtime.getManifest();
let platformInfo = {};
catcher.watchPromise(browser.runtime.getPlatformInfo().then((info) => {
platformInfo = info;
}));
return function deviceInfo() {
let match = navigator.userAgent.match(/Chrom(?:e|ium)\/([0-9.]{1,1000})/);
- let chromeVersion = match ? match[1] : null;
+ const chromeVersion = match ? match[1] : null;
match = navigator.userAgent.match(/Firefox\/([0-9.]{1,1000})/);
- let firefoxVersion = match ? match[1] : null;
- let appName = chromeVersion ? "chrome" : "firefox";
+ const firefoxVersion = match ? match[1] : null;
+ const appName = chromeVersion ? "chrome" : "firefox";
return {
addonVersion: manifest.version,
platform: platformInfo.os,
architecture: platformInfo.arch,
version: firefoxVersion || chromeVersion,
// These don't seem to apply to Chrome:
// build: system.build,
--- a/browser/extensions/screenshots/webextension/background/main.js
+++ b/browser/extensions/screenshots/webextension/background/main.js
@@ -1,19 +1,19 @@
-/* globals selectorLoader, analytics, communication, catcher, log, makeUuid, auth, senderror, startBackground, blobConverters */
+/* globals selectorLoader, analytics, communication, catcher, log, makeUuid, auth, senderror, startBackground, blobConverters buildSettings */
"use strict";
this.main = (function() {
- let exports = {};
+ const exports = {};
const pasteSymbol = (window.navigator.platform.match(/Mac/i)) ? "\u2318" : "Ctrl";
const { sendEvent } = analytics;
- let manifest = browser.runtime.getManifest();
+ const manifest = browser.runtime.getManifest();
let backend;
let hasSeenOnboarding;
browser.storage.local.get(["hasSeenOnboarding"]).then((result) => {
hasSeenOnboarding = !!result.hasSeenOnboarding;
if (!hasSeenOnboarding) {
setIconActive(false, null);
@@ -39,25 +39,25 @@ this.main = (function() {
communication.register("getBackend", () => {
return backend;
});
function getOnboardingUrl() {
return backend + "/#hello";
}
- for (let permission of manifest.permissions) {
+ for (const permission of manifest.permissions) {
if (/^https?:\/\//.test(permission)) {
exports.setBackend(permission);
break;
}
}
function setIconActive(active, tabId) {
- let path = active ? "icons/icon-highlight-32-v2.svg" : "icons/icon-32-v2.svg";
+ const path = active ? "icons/icon-highlight-32-v2.svg" : "icons/icon-v2.svg";
startBackground.photonPageActionPort.postMessage({
type: "setProperties",
iconPath: path
});
}
function toggleSelector(tab) {
return analytics.refreshTelemetryPref()
@@ -109,17 +109,17 @@ this.main = (function() {
.then(() => browser.tabs.update({url: backend + "/shots"})));
} else {
catcher.watchPromise(
toggleSelector(tab)
.then(active => {
const event = active ? "start-shot" : "cancel-shot";
sendEvent(event, "toolbar-button", {incognito: tab.incognito});
}, (error) => {
- if ((!hasSeenOnboarding) && error.popupMessage == "UNSHOOTABLE_PAGE") {
+ if ((!hasSeenOnboarding) && error.popupMessage === "UNSHOOTABLE_PAGE") {
sendEvent("goto-onboarding", "selection-button", {incognito: tab.incognito});
return forceOnboarding();
}
throw error;
}));
}
});
@@ -153,18 +153,18 @@ this.main = (function() {
return true;
}
function isShotOrMyShotPage(url) {
// It's okay to take a shot of any pages except shot pages and My Shots
if (!url.startsWith(backend)) {
return false;
}
- let path = url.substr(backend.length).replace(/^\/*/, "").replace(/[?#].*/, "");
- if (path == "shots") {
+ const path = url.substr(backend.length).replace(/^\/*/, "").replace(/[?#].*/, "");
+ if (path === "shots") {
return true;
}
if (/^[^/]{1,4000}\/[^/]{1,4000}$/.test(path)) {
// Blocks {:id}/{:domain}, but not /, /privacy, etc
return true;
}
return false;
}
@@ -198,16 +198,36 @@ this.main = (function() {
const id = makeUuid();
return browser.notifications.create(id, {
type: "basic",
iconUrl: "../icons/copy.png",
title: browser.i18n.getMessage("notificationLinkCopiedTitle"),
message: browser.i18n.getMessage("notificationLinkCopiedDetails", pasteSymbol)
});
}
+ return null;
+ });
+
+ // This is used for truncated full page downloads and copy to clipboards.
+ // Those longer operations need to display an animated spinner/loader, so
+ // it's preferable to perform toDataURL() in the background.
+ communication.register("canvasToDataURL", (sender, imageData) => {
+ const canvas = document.createElement("canvas");
+ canvas.width = imageData.width;
+ canvas.height = imageData.height;
+ canvas.getContext("2d").putImageData(imageData, 0, 0);
+ let dataUrl = canvas.toDataURL();
+ if (buildSettings.pngToJpegCutoff && dataUrl.length > buildSettings.pngToJpegCutoff) {
+ const jpegDataUrl = canvas.toDataURL("image/jpeg");
+ if (jpegDataUrl.length < dataUrl.length) {
+ // Only use the JPEG if it is actually smaller
+ dataUrl = jpegDataUrl;
+ }
+ }
+ return dataUrl;
});
communication.register("copyShotToClipboard", (sender, blob) => {
return blobConverters.blobToArray(blob).then(buffer => {
return browser.clipboard.setImageData(
buffer, blob.type.split("/", 2)[1]).then(() => {
catcher.watchPromise(communication.sendToBootstrap("incrementCount", {scalar: "copy"}));
return browser.notifications.create({
@@ -219,23 +239,23 @@ this.main = (function() {
});
})
});
communication.register("downloadShot", (sender, info) => {
// 'data:' urls don't work directly, let's use a Blob
// see http://stackoverflow.com/questions/40269862/save-data-uri-as-file-using-downloads-download-api
const blob = blobConverters.dataUrlToBlob(info.url);
- let url = URL.createObjectURL(blob);
+ const url = URL.createObjectURL(blob);
let downloadId;
- let onChangedCallback = catcher.watchFunction(function(change) {
- if (!downloadId || downloadId != change.id) {
+ const onChangedCallback = catcher.watchFunction(function(change) {
+ if (!downloadId || downloadId !== change.id) {
return;
}
- if (change.state && change.state.current != "in_progress") {
+ if (change.state && change.state.current !== "in_progress") {
URL.revokeObjectURL(url);
browser.downloads.onChanged.removeListener(onChangedCallback);
}
});
browser.downloads.onChanged.addListener(onChangedCallback)
catcher.watchPromise(communication.sendToBootstrap("incrementCount", {scalar: "download"}));
return browser.windows.getLastFocused().then(windowInfo => {
return browser.downloads.download({
--- a/browser/extensions/screenshots/webextension/background/selectorLoader.js
+++ b/browser/extensions/screenshots/webextension/background/selectorLoader.js
@@ -1,12 +1,13 @@
/* globals catcher, communication, log */
"use strict";
+// eslint-disable-next-line no-var
var global = this;
this.selectorLoader = (function() {
const exports = {};
// These modules are loaded in order, first standardScripts, then optionally onboardingScripts, and then selectorScripts
// The order is important due to dependencies
const standardScripts = [
@@ -57,17 +58,17 @@ this.selectorLoader = (function() {
return browser.tabs.executeScript(tabId, {
code: "!!this.selectorLoader",
runAt: "document_start"
}).then(result => {
return result && result[0];
});
};
- let loadingTabs = new Set();
+ const loadingTabs = new Set();
exports.loadModules = function(tabId, hasSeenOnboarding) {
loadingTabs.add(tabId);
let promise = downloadOnlyCheck(tabId);
if (hasSeenOnboarding) {
promise = promise.then(() => {
return executeModules(tabId, standardScripts.concat(selectorScripts));
});
@@ -86,17 +87,17 @@ this.selectorLoader = (function() {
};
// TODO: since bootstrap communication is now required, would this function
// make more sense inside background/main?
function downloadOnlyCheck(tabId) {
return communication.sendToBootstrap("isHistoryEnabled").then((historyEnabled) => {
return communication.sendToBootstrap("isUploadDisabled").then((uploadDisabled) => {
return browser.tabs.get(tabId).then(tab => {
- let downloadOnly = !historyEnabled || uploadDisabled || tab.incognito;
+ const downloadOnly = !historyEnabled || uploadDisabled || tab.incognito;
return browser.tabs.executeScript(tabId, {
// Note: `window` here refers to a global accessible to content
// scripts, but not the scripts in the underlying page. For more
// details, see https://mdn.io/WebExtensions/Content_scripts#Content_script_environment
code: `window.downloadOnly = ${downloadOnly}`,
runAt: "document_start"
});
});
@@ -125,22 +126,22 @@ this.selectorLoader = (function() {
exports.unloadIfLoaded(tabId);
catcher.unhandled(error);
throw error;
});
}
exports.unloadModules = function() {
const watchFunction = catcher.watchFunction;
- let allScripts = standardScripts.concat(onboardingScripts).concat(selectorScripts);
+ const allScripts = standardScripts.concat(onboardingScripts).concat(selectorScripts);
const moduleNames = allScripts.map((filename) =>
filename.replace(/^.*\//, "").replace(/\.js$/, ""));
moduleNames.reverse();
- for (let moduleName of moduleNames) {
- let moduleObj = global[moduleName];
+ for (const moduleName of moduleNames) {
+ const moduleObj = global[moduleName];
if (moduleObj && moduleObj.unload) {
try {
watchFunction(moduleObj.unload)();
} catch (e) {
// ignore (watchFunction handles it)
}
}
delete global[moduleName];
--- a/browser/extensions/screenshots/webextension/background/senderror.js
+++ b/browser/extensions/screenshots/webextension/background/senderror.js
@@ -1,21 +1,21 @@
/* globals startBackground, analytics, communication, makeUuid, Raven, catcher, auth, log */
"use strict";
this.senderror = (function() {
- let exports = {};
+ const exports = {};
- let manifest = browser.runtime.getManifest();
+ const manifest = browser.runtime.getManifest();
// Do not show an error more than every ERROR_TIME_LIMIT milliseconds:
const ERROR_TIME_LIMIT = 3000;
- let messages = {
+ const messages = {
REQUEST_ERROR: {
title: browser.i18n.getMessage("requestErrorTitle"),
info: browser.i18n.getMessage("requestErrorDetails")
},
CONNECTION_ERROR: {
title: browser.i18n.getMessage("connectionErrorTitle"),
info: browser.i18n.getMessage("connectionErrorDetails")
},
@@ -57,24 +57,24 @@ this.senderror = (function() {
let lastErrorTime;
exports.showError = function(error) {
if (lastErrorTime && (Date.now() - lastErrorTime) < ERROR_TIME_LIMIT) {
return;
}
lastErrorTime = Date.now();
- let id = makeUuid();
+ const id = makeUuid();
let popupMessage = error.popupMessage || "generic";
if (!messages[popupMessage]) {
popupMessage = "generic";
}
- let title = messages[popupMessage].title;
- let message = messages[popupMessage].info || '';
- let showMessage = messages[popupMessage].showMessage;
+ const title = messages[popupMessage].title;
+ let message = messages[popupMessage].info || "";
+ const showMessage = messages[popupMessage].showMessage;
if (error.message && showMessage) {
if (message) {
message += "\n" + error.message;
} else {
message = error.message;
}
}
if (Date.now() - startBackground.startTime > 5 * 1000) {
@@ -87,44 +87,44 @@ this.senderror = (function() {
}
};
exports.reportError = function(e) {
if (!analytics.isTelemetryEnabled()) {
log.error("Telemetry disabled. Not sending critical error:", e);
return;
}
- let dsn = auth.getSentryPublicDSN();
+ const dsn = auth.getSentryPublicDSN();
if (!dsn) {
log.warn("Screenshots error:", e);
return;
}
if (!Raven.isSetup()) {
Raven.config(dsn, {allowSecretKey: true}).install();
}
- let exception = new Error(e.message);
+ const exception = new Error(e.message);
exception.stack = e.multilineStack || e.stack || undefined;
// To improve Sentry reporting & grouping, replace the
// moz-extension://$uuid base URL with a generic resource:// URL.
if (exception.stack) {
exception.stack = exception.stack.replace(
/moz-extension:\/\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g,
"resource://screenshots-addon"
);
}
- let rest = {};
- for (let attr in e) {
+ const rest = {};
+ for (const attr in e) {
if (!["name", "message", "stack", "multilineStack", "popupMessage", "version", "sentryPublicDSN", "help", "fromMakeError"].includes(attr)) {
rest[attr] = e[attr];
}
}
rest.stack = exception.stack;
Raven.captureException(exception, {
- logger: 'addon',
+ logger: "addon",
tags: {category: e.popupMessage},
release: manifest.version,
message: exception.message,
extra: rest
});
};
catcher.registerHandler((errorObj) => {
--- a/browser/extensions/screenshots/webextension/background/startBackground.js
+++ b/browser/extensions/screenshots/webextension/background/startBackground.js
@@ -4,17 +4,17 @@
browser.contextMenus.onClicked
browser.runtime.onMessage
and loads the rest of the background page in response to those events, forwarding
the events to main.onClicked, main.onClickedContextMenu, or communication.onMessage
*/
const startTime = Date.now();
this.startBackground = (function() {
- let exports = {startTime};
+ const exports = {startTime};
const backgroundScripts = [
"log.js",
"makeUuid.js",
"catcher.js",
"blobConverters.js",
"background/selectorLoader.js",
"background/communication.js",
@@ -61,23 +61,23 @@ this.startBackground = (function() {
function loadIfNecessary() {
if (loadedPromise) {
return loadedPromise;
}
loadedPromise = Promise.resolve();
backgroundScripts.forEach((script) => {
loadedPromise = loadedPromise.then(() => {
return new Promise((resolve, reject) => {
- let tag = document.createElement("script");
+ const tag = document.createElement("script");
tag.src = browser.extension.getURL(script);
tag.onload = () => {
resolve();
};
tag.onerror = (error) => {
- let exc = new Error(`Error loading script: ${error.message}`);
+ const exc = new Error(`Error loading script: ${error.message}`);
exc.scriptName = script;
reject(exc);
};
document.head.appendChild(tag);
});
});
});
return loadedPromise;
--- a/browser/extensions/screenshots/webextension/background/takeshot.js
+++ b/browser/extensions/screenshots/webextension/background/takeshot.js
@@ -1,82 +1,71 @@
/* globals communication, shot, main, auth, catcher, analytics, buildSettings, blobConverters, thumbnailGenerator */
"use strict";
this.takeshot = (function() {
- let exports = {};
+ const exports = {};
const Shot = shot.AbstractShot;
const { sendEvent } = analytics;
communication.register("takeShot", catcher.watchFunction((sender, options) => {
- let { captureType, captureText, scroll, selectedPos, shotId, shot, imageBlob } = options;
- shot = new Shot(main.getBackend(), shotId, shot);
+ const { captureType, captureText, scroll, selectedPos, shotId } = options;
+ const shot = new Shot(main.getBackend(), shotId, options.shot);
shot.favicon = sender.tab.favIconUrl;
+ let imageBlob = options.imageBlob;
let capturePromise = Promise.resolve();
let openedTab;
let thumbnailBlob;
if (!shot.clipNames().length) {
// canvas.drawWindow isn't available, so we fall back to captureVisibleTab
capturePromise = screenshotPage(selectedPos, scroll).then((dataUrl) => {
+ imageBlob = buildSettings.uploadBinary ? blobConverters.dataUrlToBlob(dataUrl) : null;
shot.addClip({
createdDate: Date.now(),
image: {
- url: "data:",
+ url: buildSettings.uploadBinary ? "" : dataUrl,
captureType,
text: captureText,
location: selectedPos,
dimensions: {
x: selectedPos.right - selectedPos.left,
y: selectedPos.bottom - selectedPos.top
}
}
});
});
}
- let convertBlobPromise = Promise.resolve();
- if (buildSettings.uploadBinary && !imageBlob) {
- let clipImage = shot.getClip(shot.clipNames()[0]).image;
- imageBlob = blobConverters.dataUrlToBlob(clipImage.url);
- clipImage.url = "";
- } else if (!buildSettings.uploadBinary && imageBlob) {
- convertBlobPromise = blobConverters.blobToDataUrl(imageBlob).then((dataUrl) => {
- shot.getClip(shot.clipNames()[0]).image.url = dataUrl;
- });
- imageBlob = null;
- }
- let shotAbTests = {};
- let abTests = auth.getAbTests();
- for (let testName of Object.keys(abTests)) {
+ const shotAbTests = {};
+ const abTests = auth.getAbTests();
+ for (const testName of Object.keys(abTests)) {
if (abTests[testName].shotField) {
shotAbTests[testName] = abTests[testName].value;
}
}
if (Object.keys(shotAbTests).length) {
shot.abTests = shotAbTests;
}
return catcher.watchPromise(capturePromise.then(() => {
- return convertBlobPromise;
- }).then(() => {
if (buildSettings.uploadBinary) {
- let blobToUrlPromise = blobConverters.blobToDataUrl(imageBlob);
+ const blobToUrlPromise = blobConverters.blobToDataUrl(imageBlob);
return thumbnailGenerator.createThumbnailBlobFromPromise(shot, blobToUrlPromise);
}
return thumbnailGenerator.createThumbnailUrl(shot);
}).then((thumbnailImage) => {
if (buildSettings.uploadBinary) {
thumbnailBlob = thumbnailImage;
} else {
shot.thumbnail = thumbnailImage;
}
}).then(() => {
return browser.tabs.create({url: shot.creatingUrl})
}).then((tab) => {
openedTab = tab;
- sendEvent('internal', 'open-shot-tab');
+ sendEvent("internal", "open-shot-tab");
return uploadShot(shot, imageBlob, thumbnailBlob);
}).then(() => {
return browser.tabs.update(openedTab.id, {url: shot.viewUrl, loadReplace: true}).then(
null,
(error) => {
// FIXME: If https://bugzilla.mozilla.org/show_bug.cgi?id=1365718 is resolved,
// use the errorCode added as an additional check:
if ((/invalid tab id/i).test(error)) {
@@ -107,69 +96,69 @@ this.takeshot = (function() {
right: pos.right - scroll.scrollX
};
pos.width = pos.right - pos.left;
pos.height = pos.bottom - pos.top;
return catcher.watchPromise(browser.tabs.captureVisibleTab(
null,
{format: "png"}
).then((dataUrl) => {
- let image = new Image();
+ const image = new Image();
image.src = dataUrl;
return new Promise((resolve, reject) => {
image.onload = catcher.watchFunction(() => {
- let xScale = image.width / scroll.innerWidth;
- let yScale = image.height / scroll.innerHeight;
- let canvas = document.createElement("canvas");
+ const xScale = image.width / scroll.innerWidth;
+ const yScale = image.height / scroll.innerHeight;
+ const canvas = document.createElement("canvas");
canvas.height = pos.height * yScale;
canvas.width = pos.width * xScale;
- let context = canvas.getContext("2d");
+ const context = canvas.getContext("2d");
context.drawImage(
image,
pos.left * xScale, pos.top * yScale,
pos.width * xScale, pos.height * yScale,
0, 0,
pos.width * xScale, pos.height * yScale
);
- let result = canvas.toDataURL();
+ const result = canvas.toDataURL();
resolve(result);
});
});
}));
}
/** Combines two buffers or Uint8Array's */
function concatBuffers(buffer1, buffer2) {
- var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
+ const tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
tmp.set(new Uint8Array(buffer1), 0);
tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
return tmp.buffer;
}
/** Creates a multipart TypedArray, given {name: value} fields
and a files array in the format of
[{fieldName: "NAME", filename: "NAME.png", blob: fileBlob}, {...}, ...]
Returns {body, "content-type"}
*/
function createMultipart(fields, files) {
- let boundary = "---------------------------ScreenshotBoundary" + Date.now();
+ const boundary = "---------------------------ScreenshotBoundary" + Date.now();
let body = [];
- for (let name in fields) {
+ for (const name in fields) {
body.push("--" + boundary);
body.push(`Content-Disposition: form-data; name="${name}"`);
body.push("");
body.push(fields[name]);
}
body.push("");
body = body.join("\r\n");
- let enc = new TextEncoder("utf-8");
+ const enc = new TextEncoder("utf-8");
body = enc.encode(body).buffer;
- let blobToArrayPromises = files.map(f => {
+ const blobToArrayPromises = files.map(f => {
return blobConverters.blobToArray(f.blob);
});
return Promise.all(blobToArrayPromises).then(buffers => {
for (let i = 0; i < buffers.length; i++) {
let filePart = [];
filePart.push("--" + boundary);
filePart.push(`Content-Disposition: form-data; name="${files[i].fieldName}"; filename="${files[i].filename}"`);
@@ -192,17 +181,17 @@ this.takeshot = (function() {
});
}
function uploadShot(shot, blob, thumbnail) {
let headers;
return auth.authHeaders().then((_headers) => {
headers = _headers;
if (blob) {
- let files = [ {fieldName: "blob", filename: "screenshot.png", blob} ];
+ const files = [ {fieldName: "blob", filename: "screenshot.png", blob} ];
if (thumbnail) {
files.push({fieldName: "thumbnail", filename: "thumbnail.png", blob: thumbnail});
}
return createMultipart(
{shot: JSON.stringify(shot.asJson())},
files
);
}
@@ -218,17 +207,17 @@ this.takeshot = (function() {
method: "PUT",
mode: "cors",
headers,
body: submission.body
});
}).then((resp) => {
if (!resp.ok) {
sendEvent("upload-failed", `status-${resp.status}`);
- let exc = new Error(`Response failed with status ${resp.status}`);
+ const exc = new Error(`Response failed with status ${resp.status}`);
exc.popupMessage = "REQUEST_ERROR";
throw exc;
} else {
sendEvent("upload", "success");
}
}, (error) => {
// FIXME: I'm not sure what exceptions we can expect
sendEvent("upload-failed", "connection");
--- a/browser/extensions/screenshots/webextension/blobConverters.js
+++ b/browser/extensions/screenshots/webextension/blobConverters.js
@@ -1,42 +1,42 @@
this.blobConverters = (function() {
- let exports = {};
+ const exports = {};
exports.dataUrlToBlob = function(url) {
- const binary = atob(url.split(',', 2)[1]);
+ const binary = atob(url.split(",", 2)[1]);
let contentType = exports.getTypeFromDataUrl(url);
- if (contentType != "image/png" && contentType != "image/jpeg") {
+ if (contentType !== "image/png" && contentType !== "image/jpeg") {
contentType = "image/png";
}
const data = Uint8Array.from(binary, char => char.charCodeAt(0));
const blob = new Blob([data], {type: contentType});
return blob;
};
exports.getTypeFromDataUrl = function(url) {
- let contentType = url.split(',', 1)[0];
- contentType = contentType.split(';', 1)[0];
- contentType = contentType.split(':', 2)[1];
+ let contentType = url.split(",", 1)[0];
+ contentType = contentType.split(";", 1)[0];
+ contentType = contentType.split(":", 2)[1];
return contentType;
};
exports.blobToArray = function(blob) {
return new Promise((resolve, reject) => {
- let reader = new FileReader();
+ const reader = new FileReader();
reader.addEventListener("loadend", function() {
resolve(reader.result);
});
reader.readAsArrayBuffer(blob);
});
};
exports.blobToDataUrl = function(blob) {
return new Promise((resolve, reject) => {
- let reader = new FileReader();
+ const reader = new FileReader();
reader.addEventListener("loadend", function() {
resolve(reader.result);
});
reader.readAsDataURL(blob);
});
};
return exports;
--- a/browser/extensions/screenshots/webextension/build/raven.js
+++ b/browser/extensions/screenshots/webextension/build/raven.js
@@ -1257,17 +1257,17 @@
fill(
xhrproto,
'open',
function(origOpen) {
return function(method, url) {
// preserve arity
// if Sentry key appears in URL, don't capture
- if (isString(url) && !url.includes(self._globalKey)) {
+ if (isString(url) && url.indexOf(self._globalKey) === -1) {
this.__raven_xhr = {
method: method,
url: url,
status_code: null
};
}
return origOpen.apply(this, arguments);
--- a/browser/extensions/screenshots/webextension/build/shot.js
+++ b/browser/extensions/screenshots/webextension/build/shot.js
@@ -28,103 +28,103 @@ function isUrl(url) {
}
if ((/^view-source:/i).test(url)) {
return isUrl(url.substr("view-source:".length));
}
return (/^https?:\/\/[a-z0-9._-]{1,8000}[a-z0-9](:[0-9]{1,8000})?\/?/i).test(url);
}
function isValidClipImageUrl(url) {
- return isUrl(url) && !(url.indexOf(')') > -1);
+ return isUrl(url) && !(url.indexOf(")") > -1);
}
function assertUrl(url) {
if (!url) {
throw new Error("Empty value is not URL");
}
if (!isUrl(url)) {
- let exc = new Error("Not a URL");
+ const exc = new Error("Not a URL");
exc.scheme = url.split(":")[0];
throw exc;
}
}
function isSecureWebUri(url) {
return (/^https?:\/\/[a-z0-9._-]{1,8000}[a-z0-9](:[0-9]{1,8000})?\/?/i).test(url);
}
function assertOrigin(url) {
assertUrl(url);
- if (url.search(/^https?:/i) != -1) {
- let match = (/^https?:\/\/[^/:]{1,4000}\/?$/i).exec(url);
+ if (url.search(/^https?:/i) !== -1) {
+ const match = (/^https?:\/\/[^/:]{1,4000}\/?$/i).exec(url);
if (!match) {
throw new Error("Bad origin, might include path");
}
}
}
function originFromUrl(url) {
if (!url) {
return null;
}
- if (url.search(/^https?:/i) == -1) {
+ if (url.search(/^https?:/i) === -1) {
// Non-HTTP URLs don't have an origin
return null;
}
- let match = (/^https?:\/\/[^/:]{1,4000}/i).exec(url);
+ const match = (/^https?:\/\/[^/:]{1,4000}/i).exec(url);
if (match) {
return match[0];
}
return null;
}
/** Check if the given object has all of the required attributes, and no extra
attributes exception those in optional */
function checkObject(obj, required, optional) {
- if (typeof obj != "object" || obj === null) {
+ if (typeof obj !== "object" || obj === null) {
throw new Error("Cannot check non-object: " + (typeof obj) + " that is " + JSON.stringify(obj));
}
required = required || [];
- for (let attr of required) {
+ for (const attr of required) {
if (!(attr in obj)) {
return false;
}
}
optional = optional || [];
- for (let attr in obj) {
+ for (const attr in obj) {
if (!required.includes(attr) && !optional.includes(attr)) {
return false;
}
}
return true;
}
/** Create a JSON object from a normal object, given the required and optional
attributes (filtering out any other attributes). Optional attributes are
only kept when they are truthy. */
function jsonify(obj, required, optional) {
required = required || [];
- let result = {};
- for (let attr of required) {
+ const result = {};
+ for (const attr of required) {
result[attr] = obj[attr];
}
optional = optional || [];
- for (let attr of optional) {
+ for (const attr of optional) {
if (obj[attr]) {
result[attr] = obj[attr];
}
}
return result;
}
/** Resolve url relative to base */
function resolveUrl(base, url) {
// FIXME: totally ad hoc and probably incorrect, but we can't
// use any libraries in this file
- if (url.search(/^https?:/) != -1) {
+ if (url.search(/^https?:/) !== -1) {
// Absolute url
return url;
}
if (url.indexOf("//") === 0) {
// Protocol-relative URL
return (/^https?:/i).exec(base)[0] + url;
}
if (url.indexOf("/") === 0) {
@@ -149,43 +149,43 @@ function resolveUrl(base, url) {
}
/** True if the two objects look alike. Null, undefined, and absent properties
are all treated as equivalent. Traverses objects and arrays */
function deepEqual(a, b) {
if ((a === null || a === undefined) && (b === null || b === undefined)) {
return true;
}
- if (typeof a != "object" || typeof b != "object") {
+ if (typeof a !== "object" || typeof b !== "object") {
return a === b;
}
if (Array.isArray(a)) {
if (!Array.isArray(b)) {
return false;
}
- if (a.length != b.length) {
+ if (a.length !== b.length) {
return false;
}
for (let i = 0; i < a.length; i++) {
if (!deepEqual(a[i], b[i])) {
return false;
}
}
}
if (Array.isArray(b)) {
return false;
}
- let seen = new Set();
- for (let attr of Object.keys(a)) {
+ const seen = new Set();
+ for (const attr of Object.keys(a)) {
if (!deepEqual(a[attr], b[attr])) {
return false;
}
seen.add(attr);
}
- for (let attr of Object.keys(b)) {
+ for (const attr of Object.keys(b)) {
if (!seen.has(attr)) {
if (!deepEqual(a[attr], b[attr])) {
return false;
}
}
}
return true;
}
@@ -236,25 +236,25 @@ class AbstractShot {
}
this.openGraph = attrs.openGraph || null;
this.twitterCard = attrs.twitterCard || null;
this.documentSize = attrs.documentSize || null;
this.thumbnail = attrs.thumbnail || null;
this.abTests = attrs.abTests || null;
this._clips = {};
if (attrs.clips) {
- for (let clipId in attrs.clips) {
- let clip = attrs.clips[clipId];
+ for (const clipId in attrs.clips) {
+ const clip = attrs.clips[clipId];
this._clips[clipId] = new this.Clip(this, clipId, clip);
}
}
- let isProd = typeof process !== "undefined" && process.env.NODE_ENV === "production";
+ const isProd = typeof process !== "undefined" && process.env.NODE_ENV === "production";
- for (let attr in attrs) {
+ for (const attr in attrs) {
if (attr !== "clips" && attr !== "id" && !this.REGULAR_ATTRS.includes(attr) && !this.DEPRECATED_ATTRS.includes(attr)) {
if (isProd) {
console.warn("Unexpected attribute: " + attr);
} else {
throw new Error("Unexpected attribute: " + attr);
}
} else if (attr === "id") {
console.warn("passing id in attrs in AbstractShot constructor");
@@ -262,77 +262,77 @@ class AbstractShot {
assert(attrs.id === this.id);
}
}
}
/** Update any and all attributes in the json object, with deep updating
of `json.clips` */
update(json) {
- let ALL_ATTRS = ["clips"].concat(this.REGULAR_ATTRS);
+ const ALL_ATTRS = ["clips"].concat(this.REGULAR_ATTRS);
assert(checkObject(json, [], ALL_ATTRS), "Bad attr to new Shot():", Object.keys(json));
- for (let attr in json) {
- if (attr == "clips") {
+ for (const attr in json) {
+ if (attr === "clips") {
continue;
}
- if (typeof json[attr] == "object" && typeof this[attr] == "object" && this[attr] !== null) {
+ if (typeof json[attr] === "object" && typeof this[attr] === "object" && this[attr] !== null) {
let val = this[attr];
if (val.asJson) {
val = val.asJson();
}
if (!deepEqual(json[attr], val)) {
this[attr] = json[attr];
}
} else if (json[attr] !== this[attr] &&
(json[attr] || this[attr])) {
this[attr] = json[attr];
}
}
if (json.clips) {
- for (let clipId in json.clips) {
+ for (const clipId in json.clips) {
if (!json.clips[clipId]) {
this.delClip(clipId);
} else if (!this.getClip(clipId)) {
this.setClip(clipId, json.clips[clipId]);
} else if (!deepEqual(this.getClip(clipId).asJson(), json.clips[clipId])) {
this.setClip(clipId, json.clips[clipId]);
}
}
}
}
/** Returns a JSON version of this shot */
asJson() {
- let result = {};
- for (let attr of this.REGULAR_ATTRS) {
- var val = this[attr];
+ const result = {};
+ for (const attr of this.REGULAR_ATTRS) {
+ let val = this[attr];
if (val && val.asJson) {
val = val.asJson();
}
result[attr] = val;
}
result.clips = {};
- for (let attr in this._clips) {
+ for (const attr in this._clips) {
result.clips[attr] = this._clips[attr].asJson();
}
return result;
}
/** A more minimal JSON representation for creating indexes of shots */
asRecallJson() {
- let result = {clips: {}};
- for (let attr of this.RECALL_ATTRS) {
- var val = this[attr];
+ const result = {clips: {}};
+ for (const attr of this.RECALL_ATTRS) {
+ let val = this[attr];
if (val && val.asJson) {
val = val.asJson();
}
result[attr] = val;
}
- for (let name of this.clipNames()) {
+ for (const name of this.clipNames()) {
result.clips[name] = this.getClip(name).asJson();
}
return result;
}
get backend() {
return this._backend;
}
@@ -365,31 +365,31 @@ class AbstractShot {
if (val) {
assertOrigin(val);
}
this._origin = val || undefined;
}
get filename() {
let filenameTitle = this.title;
- let date = new Date(this.createdDate);
+ const date = new Date(this.createdDate);
// eslint-disable-next-line no-control-regex
filenameTitle = filenameTitle.replace(/[:\\<>/!@&?"*.|\x00-\x1F]/g, " ");
filenameTitle = filenameTitle.replace(/\s{1,4000}/g, " ");
let clipFilename = `Screenshot-${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${filenameTitle}`;
const clipFilenameBytesSize = clipFilename.length * 2; // JS STrings are UTF-16
if (clipFilenameBytesSize > 251) { // 255 bytes (Usual filesystems max) - 4 for the ".png" file extension string
const excedingchars = (clipFilenameBytesSize - 246) / 2; // 251 - 5 for ellipsis "[...]"
clipFilename = clipFilename.substring(0, clipFilename.length - excedingchars);
- clipFilename = clipFilename + '[...]';
+ clipFilename = clipFilename + "[...]";
}
- let clip = this.getClip(this.clipNames()[0]);
+ const clip = this.getClip(this.clipNames()[0]);
let extension = ".png";
if (clip && clip.image && clip.image.type) {
- if (clip.image.type == "jpeg") {
+ if (clip.image.type === "jpeg") {
extension = ".jpg";
}
}
return clipFilename + extension;
}
get urlDisplay() {
if (!this.url) {
@@ -405,17 +405,17 @@ class AbstractShot {
return "data:url";
}
let txt = this.url;
txt = txt.replace(/\?.{0,4000}/, "");
return txt;
}
get viewUrl() {
- let url = this.backend + "/" + this.id;
+ const url = this.backend + "/" + this.id;
return url;
}
get creatingUrl() {
let url = `${this.backend}/creating/${this.id}`;
url += `?title=${encodeURIComponent(this.title || "")}`;
url += `&url=${encodeURIComponent(this.url)}`;
return url;
@@ -428,73 +428,73 @@ class AbstractShot {
get oembedUrl() {
return this.backend + "/oembed?url=" + encodeURIComponent(this.viewUrl);
}
get docTitle() {
return this._title;
}
set docTitle(val) {
- assert(val === null || typeof val == "string", "Bad docTitle:", val);
+ assert(val === null || typeof val === "string", "Bad docTitle:", val);
this._title = val;
}
get openGraph() {
return this._openGraph || null;
}
set openGraph(val) {
- assert(val === null || typeof val == "object", "Bad openGraph:", val);
+ assert(val === null || typeof val === "object", "Bad openGraph:", val);
if (val) {
assert(checkObject(val, [], this._OPENGRAPH_PROPERTIES), "Bad attr to openGraph:", Object.keys(val));
this._openGraph = val;
} else {
this._openGraph = null;
}
}
get twitterCard() {
return this._twitterCard || null;
}
set twitterCard(val) {
- assert(val === null || typeof val == "object", "Bad twitterCard:", val);
+ assert(val === null || typeof val === "object", "Bad twitterCard:", val);
if (val) {
assert(checkObject(val, [], this._TWITTERCARD_PROPERTIES), "Bad attr to twitterCard:", Object.keys(val));
this._twitterCard = val;
} else {
this._twitterCard = null;
}
}
get userTitle() {
return this._userTitle;
}
set userTitle(val) {
- assert(val === null || typeof val == "string", "Bad userTitle:", val);
+ assert(val === null || typeof val === "string", "Bad userTitle:", val);
this._userTitle = val;
}
get title() {
// FIXME: we shouldn't support both openGraph.title and ogTitle
- let ogTitle = this.openGraph && this.openGraph.title;
- let twitterTitle = this.twitterCard && this.twitterCard.title;
+ const ogTitle = this.openGraph && this.openGraph.title;
+ const twitterTitle = this.twitterCard && this.twitterCard.title;
let title = this.userTitle || ogTitle || twitterTitle || this.docTitle || this.url;
if (Array.isArray(title)) {
title = title[0];
}
if (!title) {
title = "Screenshot";
}
return title;
}
get createdDate() {
return this._createdDate;
}
set createdDate(val) {
- assert(val === null || typeof val == "number", "Bad createdDate:", val);
+ assert(val === null || typeof val === "number", "Bad createdDate:", val);
this._createdDate = val;
}
get favicon() {
return this._favicon;
}
set favicon(val) {
// We allow but ignore bad favicon URLs, as they seem somewhat common
@@ -504,107 +504,107 @@ class AbstractShot {
}
if (val) {
val = resolveUrl(this.url, val);
}
this._favicon = val;
}
clipNames() {
- let names = Object.getOwnPropertyNames(this._clips);
+ const names = Object.getOwnPropertyNames(this._clips);
names.sort(function(a, b) {
return a.sortOrder < b.sortOrder ? 1 : 0;
});
return names;
}
getClip(name) {
return this._clips[name];
}
addClip(val) {
- let name = makeRandomId();
+ const name = makeRandomId();
this.setClip(name, val);
return name;
}
setClip(name, val) {
- let clip = new this.Clip(this, name, val);
+ const clip = new this.Clip(this, name, val);
this._clips[name] = clip;
}
delClip(name) {
if (!this._clips[name]) {
throw new Error("No existing clip with id: " + name);
}
delete this._clips[name];
}
delAllClips() {
this._clips = {};
}
biggestClipSortOrder() {
let biggest = 0;
- for (let clipId in this._clips) {
+ for (const clipId in this._clips) {
biggest = Math.max(biggest, this._clips[clipId].sortOrder);
}
return biggest;
}
updateClipUrl(clipId, clipUrl) {
- let clip = this.getClip(clipId);
+ const clip = this.getClip(clipId);
if ( clip && clip.image ) {
clip.image.url = clipUrl;
} else {
console.warn("Tried to update the url of a clip with no image:", clip);
}
}
get siteName() {
return this._siteName || null;
}
set siteName(val) {
- assert(typeof val == "string" || !val);
+ assert(typeof val === "string" || !val);
this._siteName = val;
}
get documentSize() {
return this._documentSize;
}
set documentSize(val) {
- assert(typeof val == "object" || !val);
+ assert(typeof val === "object" || !val);
if (val) {
assert(checkObject(val, ["height", "width"], "Bad attr to documentSize:", Object.keys(val)));
- assert(typeof val.height == "number");
- assert(typeof val.width == "number");
+ assert(typeof val.height === "number");
+ assert(typeof val.width === "number");
this._documentSize = val;
} else {
this._documentSize = null;
}
}
get thumbnail() {
return this._thumbnail;
}
set thumbnail(val) {
- assert(typeof val == "string" || !val);
+ assert(typeof val === "string" || !val);
if (val) {
assert(isUrl(val));
this._thumbnail = val;
} else {
this._thumbnail = null;
}
}
get abTests() {
return this._abTests;
}
set abTests(val) {
if (val === null || val === undefined) {
this._abTests = null;
return;
}
- assert(typeof val == "object", "abTests should be an object, not:", typeof val);
+ assert(typeof val === "object", "abTests should be an object, not:", typeof val);
assert(!Array.isArray(val), "abTests should not be an Array");
- for (let name in val) {
- assert(val[name] && typeof val[name] == "string", `abTests.${name} should be a string:`, typeof val[name]);
+ for (const name in val) {
+ assert(val[name] && typeof val[name] === "string", `abTests.${name} should be a string:`, typeof val[name]);
}
this._abTests = val;
}
}
AbstractShot.prototype.REGULAR_ATTRS = (`
origin fullUrl docTitle userTitle createdDate favicon images
@@ -644,47 +644,47 @@ class _Image {
// FIXME: either we have to notify the shot of updates, or make
// this read-only
constructor(json) {
assert(typeof json === "object", "Clip Image given a non-object", json);
assert(checkObject(json, ["url"], ["dimensions", "title", "alt"]), "Bad attrs for Image:", Object.keys(json));
assert(isUrl(json.url), "Bad Image url:", json.url);
this.url = json.url;
assert((!json.dimensions) ||
- (typeof json.dimensions.x == "number" && typeof json.dimensions.y == "number"),
+ (typeof json.dimensions.x === "number" && typeof json.dimensions.y === "number"),
"Bad Image dimensions:", json.dimensions);
this.dimensions = json.dimensions;
- assert(typeof json.title == "string" || !json.title, "Bad Image title:", json.title);
+ assert(typeof json.title === "string" || !json.title, "Bad Image title:", json.title);
this.title = json.title;
- assert(typeof json.alt == "string" || !json.alt, "Bad Image alt:", json.alt);
+ assert(typeof json.alt === "string" || !json.alt, "Bad Image alt:", json.alt);
this.alt = json.alt;
}
asJson() {
return jsonify(this, ["url"], ["dimensions"]);
}
}
AbstractShot.prototype.Image = _Image;
/** Represents a clip, either a text or image clip */
class _Clip {
constructor(shot, id, json) {
this._shot = shot;
assert(checkObject(json, ["createdDate", "image"], ["sortOrder"]), "Bad attrs for Clip:", Object.keys(json));
- assert(typeof id == "string" && id, "Bad Clip id:", id);
+ assert(typeof id === "string" && id, "Bad Clip id:", id);
this._id = id;
this.createdDate = json.createdDate;
- if ('sortOrder' in json) {
- assert(typeof json.sortOrder == "number" || !json.sortOrder, "Bad Clip sortOrder:", json.sortOrder);
+ if ("sortOrder" in json) {
+ assert(typeof json.sortOrder === "number" || !json.sortOrder, "Bad Clip sortOrder:", json.sortOrder);
}
- if ('sortOrder' in json) {
+ if ("sortOrder" in json) {
this.sortOrder = json.sortOrder;
} else {
- let biggestOrder = shot.biggestClipSortOrder();
+ const biggestOrder = shot.biggestClipSortOrder();
this.sortOrder = biggestOrder + 100;
}
this.image = json.image;
}
toString() {
return `[Shot Clip id=${this.id} sortOrder=${this.sortOrder} image ${this.image.dimensions.x}x${this.image.dimensions.y}]`;
}
@@ -696,85 +696,85 @@ class _Clip {
get id() {
return this._id;
}
get createdDate() {
return this._createdDate;
}
set createdDate(val) {
- assert(typeof val == "number" || !val, "Bad Clip createdDate:", val);
+ assert(typeof val === "number" || !val, "Bad Clip createdDate:", val);
this._createdDate = val;
}
get image() {
return this._image;
}
set image(image) {
if (!image) {
this._image = undefined;
return;
}
assert(checkObject(image, ["url"], ["dimensions", "text", "location", "captureType", "type"]), "Bad attrs for Clip Image:", Object.keys(image));
assert(isValidClipImageUrl(image.url), "Bad Clip image URL:", image.url);
assert(
- image.captureType == "madeSelection" ||
- image.captureType == "selection" ||
- image.captureType == "visible" ||
- image.captureType == "auto" ||
- image.captureType == "fullPage" ||
- image.captureType == "fullPageTruncated" ||
+ image.captureType === "madeSelection" ||
+ image.captureType === "selection" ||
+ image.captureType === "visible" ||
+ image.captureType === "auto" ||
+ image.captureType === "fullPage" ||
+ image.captureType === "fullPageTruncated" ||
!image.captureType, "Bad image.captureType:", image.captureType);
- assert(typeof image.text == "string" || !image.text, "Bad Clip image text:", image.text);
+ assert(typeof image.text === "string" || !image.text, "Bad Clip image text:", image.text);
if (image.dimensions) {
- assert(typeof image.dimensions.x == "number" && typeof image.dimensions.y == "number", "Bad Clip image dimensions:", image.dimensions);
+ assert(typeof image.dimensions.x === "number" && typeof image.dimensions.y === "number", "Bad Clip image dimensions:", image.dimensions);
}
if (image.type) {
- assert(image.type == "png" || image.type == "jpeg", "Unexpected image type:", image.type);
+ assert(image.type === "png" || image.type === "jpeg", "Unexpected image type:", image.type);
}
assert(image.location &&
- typeof image.location.left == "number" &&
- typeof image.location.right == "number" &&
- typeof image.location.top == "number" &&
- typeof image.location.bottom == "number", "Bad Clip image pixel location:", image.location);
+ typeof image.location.left === "number" &&
+ typeof image.location.right === "number" &&
+ typeof image.location.top === "number" &&
+ typeof image.location.bottom === "number", "Bad Clip image pixel location:", image.location);
if (image.location.topLeftElement || image.location.topLeftOffset ||
image.location.bottomRightElement || image.location.bottomRightOffset) {
- assert(typeof image.location.topLeftElement == "string" &&
+ assert(typeof image.location.topLeftElement === "string" &&
image.location.topLeftOffset &&
- typeof image.location.topLeftOffset.x == "number" &&
- typeof image.location.topLeftOffset.y == "number" &&
- typeof image.location.bottomRightElement == "string" &&
+ typeof image.location.topLeftOffset.x === "number" &&
+ typeof image.location.topLeftOffset.y === "number" &&
+ typeof image.location.bottomRightElement === "string" &&
image.location.bottomRightOffset &&
- typeof image.location.bottomRightOffset.x == "number" &&
- typeof image.location.bottomRightOffset.y == "number",
+ typeof image.location.bottomRightOffset.x === "number" &&
+ typeof image.location.bottomRightOffset.y === "number",
"Bad Clip image element location:", image.location);
}
this._image = image;
}
isDataUrl() {
if (this.image) {
return this.image.url.startsWith("data:");
}
return false;
}
get sortOrder() {
return this._sortOrder || null;
}
set sortOrder(val) {
- assert(typeof val == "number" || !val, "Bad Clip sortOrder:", val);
+ assert(typeof val === "number" || !val, "Bad Clip sortOrder:", val);
this._sortOrder = val;
}
}
AbstractShot.prototype.Clip = _Clip;
-if (typeof exports != "undefined") {
+if (typeof exports !== "undefined") {
exports.AbstractShot = AbstractShot;
exports.originFromUrl = originFromUrl;
exports.isValidClipImageUrl = isValidClipImageUrl;
}
return exports;
})();
null;
--- a/browser/extensions/screenshots/webextension/build/thumbnailGenerator.js
+++ b/browser/extensions/screenshots/webextension/build/thumbnailGenerator.js
@@ -17,31 +17,31 @@ const maxThumbnailHeight = 280;
/**
* @param {int} imageHeight Height in pixels of the original image.
* @param {int} imageWidth Width in pixels of the original image.
* @returns {width, height, scaledX, scaledY}
*/
function getThumbnailDimensions(imageWidth, imageHeight) {
const displayAspectRatio = 3 / 4;
- let imageAspectRatio = imageWidth / imageHeight;
+ const imageAspectRatio = imageWidth / imageHeight;
let thumbnailImageWidth, thumbnailImageHeight;
let scaledX, scaledY;
if (imageAspectRatio > displayAspectRatio) {
// "Landscape" mode
// Scale on y, crop on x
- let yScaleFactor = (imageHeight > maxThumbnailHeight) ? (maxThumbnailHeight / imageHeight) : 1.0;
+ const yScaleFactor = (imageHeight > maxThumbnailHeight) ? (maxThumbnailHeight / imageHeight) : 1.0;
thumbnailImageHeight = scaledY = Math.round(imageHeight * yScaleFactor);
scaledX = Math.round(imageWidth * yScaleFactor);
thumbnailImageWidth = Math.min(scaledX, maxThumbnailWidth);
} else {
// "Portrait" mode
// Scale on x, crop on y
- let xScaleFactor = (imageWidth > maxThumbnailWidth) ? (maxThumbnailWidth / imageWidth) : 1.0;
+ const xScaleFactor = (imageWidth > maxThumbnailWidth) ? (maxThumbnailWidth / imageWidth) : 1.0;
thumbnailImageWidth = scaledX = Math.round(imageWidth * xScaleFactor);
scaledY = Math.round(imageHeight * xScaleFactor);
// The CSS could widen the image, in which case we crop more off of y.
thumbnailImageHeight = Math.min(scaledY, maxThumbnailHeight,
maxThumbnailHeight / (maxThumbnailWidth / imageWidth));
}
return {
@@ -67,35 +67,35 @@ function createThumbnail(dataUrl, imageW
const thumbnailHeightThreshold = maxThumbnailHeight * thumbnailThresholdFactor;
if (imageWidth <= thumbnailWidthThreshold &&
imageHeight <= thumbnailHeightThreshold) {
// Do not create a thumbnail.
return Promise.resolve(null);
}
- let thumbnailDimensions = getThumbnailDimensions(imageWidth, imageHeight);
+ const thumbnailDimensions = getThumbnailDimensions(imageWidth, imageHeight);
return new Promise((resolve, reject) => {
- let thumbnailImage = new Image();
+ const thumbnailImage = new Image();
let srcWidth = imageWidth;
let srcHeight = imageHeight;
let destWidth, destHeight;
thumbnailImage.onload = function() {
destWidth = Math.round(srcWidth * maxResizeScaleFactor);
destHeight = Math.round(srcHeight * maxResizeScaleFactor);
if (destWidth <= thumbnailDimensions.scaledX || destHeight <= thumbnailDimensions.scaledY) {
srcWidth = Math.round(srcWidth * (thumbnailDimensions.width / thumbnailDimensions.scaledX));
srcHeight = Math.round(srcHeight * (thumbnailDimensions.height / thumbnailDimensions.scaledY));
destWidth = thumbnailDimensions.width;
destHeight = thumbnailDimensions.height;
}
- const thumbnailCanvas = document.createElement('canvas');
+ const thumbnailCanvas = document.createElement("canvas");
thumbnailCanvas.width = destWidth;
thumbnailCanvas.height = destHeight;
const ctx = thumbnailCanvas.getContext("2d");
ctx.imageSmoothingEnabled = false;
ctx.drawImage(
thumbnailImage,
0, 0, srcWidth, srcHeight,
@@ -133,17 +133,17 @@ function createThumbnailUrl(shot) {
function createThumbnailBlobFromPromise(shot, blobToUrlPromise) {
return blobToUrlPromise.then(dataUrl => {
const image = shot.getClip(shot.clipNames()[0]).image;
return createThumbnail(
dataUrl, image.dimensions.x, image.dimensions.y, "blob");
});
}
-if (typeof exports != "undefined") {
+if (typeof exports !== "undefined") {
exports.getThumbnailDimensions = getThumbnailDimensions;
exports.createThumbnailUrl = createThumbnailUrl;
exports.createThumbnailBlobFromPromise = createThumbnailBlobFromPromise;
}
return exports;
})();
null;
--- a/browser/extensions/screenshots/webextension/catcher.js
+++ b/browser/extensions/screenshots/webextension/catcher.js
@@ -1,26 +1,27 @@
"use strict";
+// eslint-disable-next-line no-var
var global = this;
this.catcher = (function() {
- let exports = {};
+ const exports = {};
let handler;
let queue = [];
- let log = global.log;
+ const log = global.log;
exports.unhandled = function(error, info) {
if (!error.noReport) {
log.error("Unhandled error:", error, info);
}
- let e = makeError(error, info);
+ const e = makeError(error, info);
if (!handler) {
queue.push(e);
} else {
handler(e);
}
};
/** Turn an exception into an error object */
@@ -30,22 +31,22 @@ this.catcher = (function() {
result = exc;
} else {
result = {
fromMakeError: true,
name: exc.name || "ERROR",
message: String(exc),
stack: exc.stack
};
- for (let attr in exc) {
+ for (const attr in exc) {
result[attr] = exc[attr];
}
}
if (info) {
- for (let attr of Object.keys(info)) {
+ for (const attr of Object.keys(info)) {
result[attr] = info[attr];
}
}
return result;
}
/** Wrap the function, and if it raises any exceptions then call unhandled() */
exports.watchFunction = function watchFunction(func, quiet) {
@@ -80,17 +81,17 @@ this.catcher = (function() {
};
exports.registerHandler = function(h) {
if (handler) {
log.error("registerHandler called after handler was already registered");
return;
}
handler = h;
- for (let error of queue) {
+ for (const error of queue) {
handler(error);
}
queue = [];
};
return exports;
})();
null;
--- a/browser/extensions/screenshots/webextension/clipboard.js
+++ b/browser/extensions/screenshots/webextension/clipboard.js
@@ -1,40 +1,40 @@
/* globals catcher, assertIsBlankDocument */
"use strict";
this.clipboard = (function() {
- let exports = {};
+ const exports = {};
exports.copy = function(text) {
return new Promise((resolve, reject) => {
- let element = document.createElement("iframe");
+ const element = document.createElement("iframe");
element.src = browser.extension.getURL("blank.html");
// We can't actually hide the iframe while copying, but we can make
// it close to invisible:
element.style.opacity = "0";
element.style.width = "1px";
element.style.height = "1px";
element.addEventListener("load", catcher.watchFunction(() => {
try {
- let doc = element.contentDocument;
+ const doc = element.contentDocument;
assertIsBlankDocument(doc);
- let el = doc.createElement("textarea");
+ const el = doc.createElement("textarea");
doc.body.appendChild(el);
el.value = text;
if (!text) {
- let exc = new Error("Clipboard copy given empty text");
+ const exc = new Error("Clipboard copy given empty text");
exc.noPopup = true;
catcher.unhandled(exc);
}
el.select();
if (doc.activeElement !== el) {
- let unhandledTag = doc.activeElement ? doc.activeElement.tagName : "No active element";
- let exc = new Error("Clipboard el.select failed");
+ const unhandledTag = doc.activeElement ? doc.activeElement.tagName : "No active element";
+ const exc = new Error("Clipboard el.select failed");
exc.activeElement = unhandledTag;
exc.noPopup = true;
catcher.unhandled(exc);
}
const copied = doc.execCommand("copy");
if (!copied) {
catcher.unhandled(new Error("Clipboard copy failed"));
}
--- a/browser/extensions/screenshots/webextension/icons/back-highlight.svg
+++ b/browser/extensions/screenshots/webextension/icons/back-highlight.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><style>.st0{fill:#009ec0}</style><path id="path-1_1_" class="st0" fill="#3D3D40" d="M18.8 8.5H4.2l5.4-5.4c.5-.5.5-1.2 0-1.8s-1.2-.5-1.8 0L.4 8.9c-.5.5-.5 1.2 0 1.8l7.5 7.5c.2.2.5.4.9.4s.6-.1.9-.4c.5-.5.5-1.2 0-1.8L4.2 11h14.5c.8 0 1.2-.5 1.2-1.2s-.4-1.3-1.1-1.3z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="#009ec0" d="M18.8 8.5H4.2l5.4-5.4c.5-.5.5-1.2 0-1.8s-1.2-.5-1.8 0L.4 8.9c-.5.5-.5 1.2 0 1.8l7.5 7.5c.2.2.5.4.9.4s.6-.1.9-.4c.5-.5.5-1.2 0-1.8L4.2 11h14.5c.8 0 1.2-.5 1.2-1.2s-.4-1.3-1.1-1.3z"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/back.svg
+++ b/browser/extensions/screenshots/webextension/icons/back.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><style>.st0{fill:#3d3d40}</style><path id="path-1_1_" class="st0" fill="#3D3D40" d="M18.8 8.5H4.2l5.4-5.4c.5-.5.5-1.2 0-1.8s-1.2-.5-1.8 0L.4 8.9c-.5.5-.5 1.2 0 1.8l7.5 7.5c.2.2.5.4.9.4s.6-.1.9-.4c.5-.5.5-1.2 0-1.8L4.2 11h14.5c.8 0 1.2-.5 1.2-1.2s-.4-1.3-1.1-1.3z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path fill="#3d3d40" d="M18.8 8.5H4.2l5.4-5.4c.5-.5.5-1.2 0-1.8s-1.2-.5-1.8 0L.4 8.9c-.5.5-.5 1.2 0 1.8l7.5 7.5c.2.2.5.4.9.4s.6-.1.9-.4c.5-.5.5-1.2 0-1.8L4.2 11h14.5c.8 0 1.2-.5 1.2-1.2s-.4-1.3-1.1-1.3z"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/cancel.svg
+++ b/browser/extensions/screenshots/webextension/icons/cancel.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><style>.st0{fill:#3e3d40}</style><path id="Combined-Shape" class="st0" d="M10.5 8.7L5.2 3.3c-.5-.5-1.3-.5-1.8 0s-.5 1.3 0 1.8l5.3 5.3-5.3 5.3c-.5.5-.5 1.3 0 1.8s1.3.5 1.8 0l5.3-5.3 5.3 5.3c.5.5 1.3.5 1.8 0s.5-1.3 0-1.8l-5.3-5.3 5.3-5.3c.5-.5.5-1.3 0-1.8s-1.3-.5-1.8 0l-5.3 5.4z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M10.5 8.7L5.2 3.3c-.5-.5-1.3-.5-1.8 0s-.5 1.3 0 1.8l5.3 5.3-5.3 5.3c-.5.5-.5 1.3 0 1.8s1.3.5 1.8 0l5.3-5.3 5.3 5.3c.5.5 1.3.5 1.8 0s.5-1.3 0-1.8l-5.3-5.3 5.3-5.3c.5-.5.5-1.3 0-1.8s-1.3-.5-1.8 0l-5.3 5.4z" fill="#3e3d40"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/cloud.svg
+++ b/browser/extensions/screenshots/webextension/icons/cloud.svg
@@ -1,1 +1,1 @@
-<svg width="20" height="18" viewBox="0 0 20 18" xmlns="http://www.w3.org/2000/svg"><title>cloud</title><g fill="#FFF" fill-rule="evenodd"><path d="M15 5.6h-.3C14.5 2.7 12 .5 9.2.5c-3 0-5.4 2.4-5.5 5.3C1.5 6.4 0 8.3 0 10.6c0 2.8 2.2 5 5 5a1 1 0 0 0 1-1v-.1a1 1 0 0 0-1-1c-1.7 0-3-1.3-3-3 0-1.3.8-2.5 2.2-2.9l1.4-.4.1-1.4c.1-1.9 1.6-3.3 3.5-3.3 1.8 0 3.4 1.4 3.5 3.2l.1 1.8h2.1c1.7 0 3 1.3 3 3s-1.3 3-3 3h-1.85a1.05 1.05 0 1 0 0 2.1H15c2.8 0 5-2.2 5-5s-2.2-5-5-5z" fill-rule="nonzero"/><path d="M10 11.414V17c0 .667-.333 1-1 1s-1-.333-1-1v-5.586l-.293.293a1 1 0 1 1-1.414-1.414L9 7.586l2.707 2.707a1 1 0 0 1-1.414 1.414L10 11.414z"/></g></svg>
\ No newline at end of file
+<svg width="20" height="18" xmlns="http://www.w3.org/2000/svg"><g fill="#FFF" fill-rule="evenodd"><path d="M15 5.6h-.3C14.5 2.7 12 .5 9.2.5c-3 0-5.4 2.4-5.5 5.3C1.5 6.4 0 8.3 0 10.6c0 2.8 2.2 5 5 5a1 1 0 0 0 1-1v-.1a1 1 0 0 0-1-1c-1.7 0-3-1.3-3-3 0-1.3.8-2.5 2.2-2.9l1.4-.4.1-1.4c.1-1.9 1.6-3.3 3.5-3.3 1.8 0 3.4 1.4 3.5 3.2l.1 1.8h2.1c1.7 0 3 1.3 3 3s-1.3 3-3 3h-1.85a1.05 1.05 0 1 0 0 2.1H15c2.8 0 5-2.2 5-5s-2.2-5-5-5z" fill-rule="nonzero"/><path d="M10 11.414V17c0 .667-.333 1-1 1s-1-.333-1-1v-5.586l-.293.293a1 1 0 1 1-1.414-1.414L9 7.586l2.707 2.707a1 1 0 0 1-1.414 1.414L10 11.414z"/></g></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/copy.svg
+++ b/browser/extensions/screenshots/webextension/icons/copy.svg
@@ -1,7 +1,1 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <style>.st0{fill:#3e3d40}</style>
- <path class="st0" fill="context-fill" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"></path>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="#3e3d40" d="M14.707 8.293l-3-3A1 1 0 0 0 11 5h-1V4a1 1 0 0 0-.293-.707l-3-3A1 1 0 0 0 6 0H3a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3v3a2 2 0 0 0 2 2h5a2 2 0 0 0 2-2V9a1 1 0 0 0-.293-.707zM12.586 9H11V7.414zm-5-5H6V2.414zM6 7v2H3V2h2v2.5a.5.5 0 0 0 .5.5H8a2 2 0 0 0-2 2zm2 7V7h2v2.5a.5.5 0 0 0 .5.5H13v4z"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/done.svg
+++ b/browser/extensions/screenshots/webextension/icons/done.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><style>.st0{fill:#009ec0}</style><path class="st0" d="M19.5 4c-.6-.6-1.6-.6-2.2 0l-10 10-4.6-4.6c-.6-.6-1.6-.6-2.2 0-.6.6-.6 1.6 0 2.2l5.8 5.8c.3.3.7.5 1.1.5.4 0 .8-.2 1.1-.5l11-11.1c.7-.6.7-1.6 0-2.3z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M19.5 4c-.6-.6-1.6-.6-2.2 0l-10 10-4.6-4.6c-.6-.6-1.6-.6-2.2 0-.6.6-.6 1.6 0 2.2l5.8 5.8c.3.3.7.5 1.1.5.4 0 .8-.2 1.1-.5l11-11.1c.7-.6.7-1.6 0-2.3z" fill="#009ec0"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/download.svg
+++ b/browser/extensions/screenshots/webextension/icons/download.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><style>.st0{fill:#3e3d40}</style><path id="Combined-Shape" class="st0" d="M9.1 12L4.9 7.9c-.5-.5-1.3-.5-1.8 0s-.5 1.3 0 1.8l6.2 6.2c.5.5 1.3.5 1.8 0l6.2-6.2c.5-.5.5-1.3 0-1.8s-1.3-.5-1.8 0L11.6 12V1.2C11.6.6 11 0 10.3 0c-.7 0-1.2.6-1.2 1.2V12zM4 20c-.7 0-1.2-.6-1.2-1.2s.6-1.2 1.2-1.2h12.5c.7 0 1.2.6 1.2 1.2s-.5 1.2-1.2 1.2H4z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M9.1 12L4.9 7.9c-.5-.5-1.3-.5-1.8 0s-.5 1.3 0 1.8l6.2 6.2c.5.5 1.3.5 1.8 0l6.2-6.2c.5-.5.5-1.3 0-1.8s-1.3-.5-1.8 0L11.6 12V1.2C11.6.6 11 0 10.3 0c-.7 0-1.2.6-1.2 1.2V12zM4 20c-.7 0-1.2-.6-1.2-1.2s.6-1.2 1.2-1.2h12.5c.7 0 1.2.6 1.2 1.2s-.5 1.2-1.2 1.2H4z" fill="#3e3d40"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/help-16.svg
+++ b/browser/extensions/screenshots/webextension/icons/help-16.svg
@@ -1,6 +1,1 @@
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
- - License, v. 2.0. If a copy of the MPL was not distributed with this
- - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
- <path fill="rgba(249, 249, 250, .8)" d="M8 1a7 7 0 1 0 7 7 7.008 7.008 0 0 0-7-7zm0 13a6 6 0 1 1 6-6 6.007 6.007 0 0 1-6 6zM8 3.125A2.7 2.7 0 0 0 5.125 6a.875.875 0 0 0 1.75 0c0-1 .6-1.125 1.125-1.125a1.105 1.105 0 0 1 1.13.744.894.894 0 0 1-.53 1.016A2.738 2.738 0 0 0 7.125 9v.337a.875.875 0 0 0 1.75 0v-.37a1.041 1.041 0 0 1 .609-.824A2.637 2.637 0 0 0 10.82 5.16 2.838 2.838 0 0 0 8 3.125zm0 7.625A1.25 1.25 0 1 0 9.25 12 1.25 1.25 0 0 0 8 10.75z"></path>
-</svg>
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill="rgba(249, 249, 250, .8)" d="M8 1a7 7 0 1 0 7 7 7.008 7.008 0 0 0-7-7zm0 13a6 6 0 1 1 6-6 6.007 6.007 0 0 1-6 6zM8 3.125A2.7 2.7 0 0 0 5.125 6a.875.875 0 0 0 1.75 0c0-1 .6-1.125 1.125-1.125a1.105 1.105 0 0 1 1.13.744.894.894 0 0 1-.53 1.016A2.738 2.738 0 0 0 7.125 9v.337a.875.875 0 0 0 1.75 0v-.37a1.041 1.041 0 0 1 .609-.824A2.637 2.637 0 0 0 10.82 5.16 2.838 2.838 0 0 0 8 3.125zm0 7.625A1.25 1.25 0 1 0 9.25 12 1.25 1.25 0 0 0 8 10.75z"/></svg>
\ No newline at end of file
deleted file mode 100644
--- a/browser/extensions/screenshots/webextension/icons/icon-16-v2.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity"><title>icon-16</title><path d="M8 2a4 4 0 0 0-4 4h4V2zm12 0h-4v4h4V2zm8 0v4h4a4 4 0 0 0-4-4zM14 2h-4v4h4V2zm12 0h-4v4h4V2zm2 10h4V8h-4v4zm0 12a4 4 0 0 0 4-4h-4v4zm0-6h4v-4h-4v4zm-.882-4.334a4 4 0 0 0-5.57-.984l-7.67 5.662-3.936-2.76c.031-.193.05-.388.058-.584a4.976 4.976 0 0 0-2-3.978V8H4v2.1a5 5 0 1 0 3.916 8.948l2.484 1.738-2.8 1.964a4.988 4.988 0 1 0 2.3 3.266l17.218-12.35zM5 17.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 12a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm10.8-4.858l6.034 4.6a4 4 0 0 0 5.57-.984L19.28 22.2l-3.48 2.442z"/></svg>
\ No newline at end of file
deleted file mode 100644
--- a/browser/extensions/screenshots/webextension/icons/icon-32-v2.svg
+++ /dev/null
@@ -1,1 +0,0 @@
-<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity"><title>icon-32</title><path d="M8 2a4 4 0 0 0-4 4h4V2zm12 0h-4v4h4V2zm8 0v4h4a4 4 0 0 0-4-4zM14 2h-4v4h4V2zm12 0h-4v4h4V2zm2 10h4V8h-4v4zm0 12a4 4 0 0 0 4-4h-4v4zm0-6h4v-4h-4v4zm-.882-4.334a4 4 0 0 0-5.57-.984l-7.67 5.662-3.936-2.76c.031-.193.05-.388.058-.584a4.976 4.976 0 0 0-2-3.978V8H4v2.1a5 5 0 1 0 3.916 8.948l2.484 1.738-2.8 1.964a4.988 4.988 0 1 0 2.3 3.266l17.218-12.35zM5 17.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 12a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm10.8-4.858l6.034 4.6a4 4 0 0 0 5.57-.984L19.28 22.2l-3.48 2.442z"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/icon-highlight-32-v2.svg
+++ b/browser/extensions/screenshots/webextension/icons/icon-highlight-32-v2.svg
@@ -1,1 +1,1 @@
-<svg width="32" height="32" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><title>icon-32</title><path d="M8 2a4 4 0 0 0-4 4h4V2zm12 0h-4v4h4V2zm8 0v4h4a4 4 0 0 0-4-4zM14 2h-4v4h4V2zm12 0h-4v4h4V2zm2 10h4V8h-4v4zm0 12a4 4 0 0 0 4-4h-4v4zm0-6h4v-4h-4v4zm-.882-4.334a4 4 0 0 0-5.57-.984l-7.67 5.662-3.936-2.76c.031-.193.05-.388.058-.584a4.976 4.976 0 0 0-2-3.978V8H4v2.1a5 5 0 1 0 3.916 8.948l2.484 1.738-2.8 1.964a4.988 4.988 0 1 0 2.3 3.266l17.218-12.35zM5 17.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 12a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm10.8-4.858l6.034 4.6a4 4 0 0 0 5.57-.984L19.28 22.2l-3.48 2.442z" fill="#989898"/></svg>
\ No newline at end of file
+<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg"><path d="M8 2a4 4 0 0 0-4 4h4V2zm12 0h-4v4h4V2zm8 0v4h4a4 4 0 0 0-4-4zM14 2h-4v4h4V2zm12 0h-4v4h4V2zm2 10h4V8h-4v4zm0 12a4 4 0 0 0 4-4h-4v4zm0-6h4v-4h-4v4zm-.882-4.334a4 4 0 0 0-5.57-.984l-7.67 5.662-3.936-2.76c.031-.193.05-.388.058-.584a4.976 4.976 0 0 0-2-3.978V8H4v2.1a5 5 0 1 0 3.916 8.948l2.484 1.738-2.8 1.964a4.988 4.988 0 1 0 2.3 3.266l17.218-12.35zM5 17.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 12a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm10.8-4.858l6.034 4.6a4 4 0 0 0 5.57-.984L19.28 22.2l-3.48 2.442z" fill="#989898"/></svg>
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/browser/extensions/screenshots/webextension/icons/icon-v2.svg
@@ -0,0 +1,1 @@
+<svg width="32" height="32" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity"><path d="M8 2a4 4 0 0 0-4 4h4V2zm12 0h-4v4h4V2zm8 0v4h4a4 4 0 0 0-4-4zM14 2h-4v4h4V2zm12 0h-4v4h4V2zm2 10h4V8h-4v4zm0 12a4 4 0 0 0 4-4h-4v4zm0-6h4v-4h-4v4zm-.882-4.334a4 4 0 0 0-5.57-.984l-7.67 5.662-3.936-2.76c.031-.193.05-.388.058-.584a4.976 4.976 0 0 0-2-3.978V8H4v2.1a5 5 0 1 0 3.916 8.948l2.484 1.738-2.8 1.964a4.988 4.988 0 1 0 2.3 3.266l17.218-12.35zM5 17.5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm0 12a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5zm10.8-4.858l6.034 4.6a4 4 0 0 0 5.57-.984L19.28 22.2l-3.48 2.442z"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/menu-fullpage.svg
+++ b/browser/extensions/screenshots/webextension/icons/menu-fullpage.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 46"><style>.st0{fill:#00fdff}.st1{fill:#3e3d40}.st2{fill:#004c66}.st3{fill:#00d1e6}</style><path id="bg" class="st0" d="M7 42h32V5.1H7z"/><g id="frame" transform="translate(0 6)"><path class="st1" d="M40 5c.5 0 1 .4 1 1v24c0 .5-.5 1-1 1H6c-.6 0-1-.5-1-1V6c0-.6.4-1 1-1h34zM7 29h32V7H7v22z"/><path id="Fill-4" class="st2" d="M7 7h32V5H7z"/><path id="Fill-6" class="st2" d="M7 31h32v-2H7z"/></g><path id="dash" class="st3" d="M38 11h1V9h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm-1 1h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-2-3H7v3h2v-1H8v-2zm-1-1h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1V9H7v2zm2-6H7v3h1V6h1V5zm1 1h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm5-1h-2v1h1v2h1V5z"/></svg>
\ No newline at end of file
+<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 46"><style>.st2{fill:#004c66}</style><path id="bg" d="M7 42h32V5.1H7z" fill="#00fdff"/><g id="frame" transform="translate(0 6)"><path d="M40 5c.5 0 1 .4 1 1v24c0 .5-.5 1-1 1H6c-.6 0-1-.5-1-1V6c0-.6.4-1 1-1h34zM7 29h32V7H7v22z" fill="#3e3d40"/><path id="Fill-4" class="st2" d="M7 7h32V5H7z"/><path id="Fill-6" class="st2" d="M7 31h32v-2H7z"/></g><path id="dash" d="M38 11h1V9h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm-1 1h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-2-3H7v3h2v-1H8v-2zm-1-1h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1V9H7v2zm2-6H7v3h1V6h1V5zm1 1h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm3 0h2V5h-2v1zm5-1h-2v1h1v2h1V5z" fill="#00d1e6"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/menu-myshot-white.svg
+++ b/browser/extensions/screenshots/webextension/icons/menu-myshot-white.svg
@@ -1,1 +1,1 @@
-<svg width="40" height="40" viewBox="0 0 46 46" xmlns="http://www.w3.org/2000/svg"><title>Screenshots</title><path d="M11 11.995a1 1 0 0 1 .995-.995h23.01a1 1 0 0 1 .995.995v23.01a1 1 0 0 1-.995.995h-23.01a1 1 0 0 1-.995-.995v-23.01zM11 25v-2h7v2h-7zm9-5h7v-2h-7v2zm9 5h7v-2h-7v2zm-9 4h7v-2h-7v2zm-2-18h2v25h-2V11zm9 0h2v25h-2V11z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="40" height="40" viewBox="0 0 46 46" xmlns="http://www.w3.org/2000/svg"><path d="M11 11.995a1 1 0 0 1 .995-.995h23.01a1 1 0 0 1 .995.995v23.01a1 1 0 0 1-.995.995h-23.01a1 1 0 0 1-.995-.995v-23.01zM11 25v-2h7v2h-7zm9-5h7v-2h-7v2zm9 5h7v-2h-7v2zm-9 4h7v-2h-7v2zm-2-18h2v25h-2V11zm9 0h2v25h-2V11z" fill="#FFF" fill-rule="evenodd"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/menu-myshot.svg
+++ b/browser/extensions/screenshots/webextension/icons/menu-myshot.svg
@@ -1,1 +1,1 @@
-<svg width="46" height="46" viewBox="0 0 46 46" xmlns="http://www.w3.org/2000/svg"><title>Screenshots</title><path d="M11 11.995a1 1 0 0 1 .995-.995h23.01a1 1 0 0 1 .995.995v23.01a1 1 0 0 1-.995.995h-23.01a1 1 0 0 1-.995-.995v-23.01zM11 25v-2h7v2h-7zm9-5h7v-2h-7v2zm9 5h7v-2h-7v2zm-9 4h7v-2h-7v2zm-2-18h2v25h-2V11zm9 0h2v25h-2V11z" fill="#3E3D40" fill-rule="evenodd"/></svg>
\ No newline at end of file
+<svg width="46" height="46" xmlns="http://www.w3.org/2000/svg"><path d="M11 11.995a1 1 0 0 1 .995-.995h23.01a1 1 0 0 1 .995.995v23.01a1 1 0 0 1-.995.995h-23.01a1 1 0 0 1-.995-.995v-23.01zM11 25v-2h7v2h-7zm9-5h7v-2h-7v2zm9 5h7v-2h-7v2zm-9 4h7v-2h-7v2zm-2-18h2v25h-2V11zm9 0h2v25h-2V11z" fill="#3E3D40" fill-rule="evenodd"/></svg>
\ No newline at end of file
--- a/browser/extensions/screenshots/webextension/icons/menu-visible.svg
+++ b/browser/extensions/screenshots/webextension/icons/menu-visible.svg
@@ -1,1 +1,1 @@
-<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 46"><style>.st0{fill:#3e3d40}.st1{fill:#00fdff}.st2{fill:#00d1e6}</style><path id="Fill-1" class="st0" d="M5 12c0-.6.5-1 1-1h34c.6 0 1 .5 1 1v24c0 .6-.5 1-1 1H6c-.6 0-1-.5-1-1V12zm2 23V13h32v22H7z"/><path id="bg" class="st1" d="M7 35h32V13H7z"/><path id="dash" class="st2" d="M38 19h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm-1 1h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-2-3H7v3h2v-1H8v-2zm-1-1h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm2-6H7v3h1v-2h1v-1zm1 1h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm5-1h-2v1h1v2h1v-3z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 46 46"><path d="M5 12c0-.6.5-1 1-1h34c.6 0 1 .5 1 1v24c0 .6-.5 1-1 1H6c-.6 0-1-.5-1-1V12zm2 23V13h32v22H7z" fill="#3e3d40"/><path d="M7 35h32V13H7z" fill="#00fdff"/><path d="M38 19h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm0 3h1v-2h-1v2zm-1 1h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-3 0h2v-1h-2v1zm-2-3H7v3h2v-1H8v-2zm-1-1h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm0-3h1v-2H7v2zm2-6H7v3h1v-2h1v-1zm1 1h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm3 0h2v-1h-2v1zm5-1h-2v1h1v2h1v-3z" fill="#00d1e6"/></svg>
\ No newline at end of file
index 22bab1da8d2386f0f88e817649f1eea5db54ea40..541f5e01c200c595b9f122468d295c8bd5f6ca25
GIT binary patch
literal 27607
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
YHNQQv9r>z){Nsb3mf`J64TtFe0SR&I`~Uy|
index 10e86053f25768091018c6d394a0d8430c6a2688..f29292be45ce4cb28c03a08e5cd2309faf78932a
GIT binary patch
literal 68904
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�{UXI_T5QK+i_X^D
z@dzC@&CTpixb-_`e5*C!tq29Sf5|f#O#V6+V=KR*w*z7se^sHPJ8=eWE7nZg_zRec
z#QXMsB`pmTf)a`@ON1T-La8>i3oS!B7`?xlq_i6Lv7_YRF@10S`_xx%KfkzbrY7(*
z8JmAq6v^Ba<!-Mz%JR)IT#sR^a;HF;Xz7`ltk;{R3hia(<fNRQwsMQl<tbBZUy)24
z+BQDmoM)M5olkZW@?5SbTE=}PJ7LvGA{dpL!mXqG*5BI{m%I)}L8Wo7ul~4?o_bdb
z)R;uxDiS4fiW#n{tz3^f+GGsGp2-n9_@EnV4PB;IGpkgzZ;q}WyVjYRKoGz-92FY+
z{4NQH;NZ6D-Pa<4qhT)KwCwYox{2j-z|`@}*fX-LleGd(z08jtOj|ZLK3)eo1D(S?
z2Ui-9QD@!4=&JF9&}EU*Q=Uh3wa10jL~ewWyQdq<pK{BiotxM_ZnUASNr>doHg;tj
zbeJ_j6H8U-Wsa)U$-Zk0ou$ELQ~^V6OvHcQfLEQ?Qqv=H>~{-E&krbLy9K|4{K?5%
zp<G+b!^9Ucw8q7DCe?iorj&KC{?44nXl$BajwYPxBW-nSFB0~ld3R&)Qsi($)XCbd
z=Ck{6nvRv_AH-iTq2@$Tvm}s;yq0&9z~|oi{)HoImZUoDHo#Vc8$9AGcL_S1Pk6-8
z<zwDy31|_(ig}A2;`wRlRm<;2=tBueqnc-mPR!I()7Y4Z$H#)&hT875D;sy*uylL0
z+&-L*R<)wfTxhR-E#NEFwRbC<w45heh)gKjj^~@Egrxbf?8(U%-s9wM!HML7g(JOq
zuA5t#R(#VndUk=Yo_vg{WErj`8+jff-)_moU#Hg~B}K(+rORd`#LTA1W)Q;$EUn{_
zO~e6GZq=sPaFvtIG0A>5imr~S5h^=aCCs+N&2{bt)9MtK4`&XQR)UnhTRDzmBTSwV
z{9d$YY%P|x@N<~0s8Pj;9^dmYv2^gi&efCUq)jYS=!q5)Ls)9wF~Z0}%Vxl4&xWF^
z3+M*nv{;@$-tQ(+{wF~W2>EDhggAr%+9j_WUBR0=I#<|uNM0ZLr;KJ8s{m0y)eiOO
zDIf1d`kLG5`lM#rQ&qLh(-t>#kJ6*&VItS%+sSXEiS(ndWjO7cY}FHwnXIFz3ABC5
z8T5^9>>nPc^*A2%U|e?|teknz))A!4FgN#uQ_s|(!(gqUPWjH+{6<Hsk+FP29f9Yd
z9Xb^`kQ=0yJ3^Uv{ELD$rh`+jL0UR_MggDo1rh6=K-&u4r@pRRn{2aO=59|4@L2Da
z?tYu8R5FcB_bI?2{ejxXQaF5M8hu@0>~nTv^dSxo8h|y!jIN))!Hs$+MBTD;JGp;%
zQoa3Dt990TGgGNrO!Ih2N&FFUiF`m)D{DiY-qifozRFGJPM`ck(4Tq?ghc<nKXph<
zn*EHW)pNv7{q2~oAN5A;{a^XA-8O4X|5(puN*q+F>5yBs*THAqncu80TJlP0Gav^x
z+dH2?cWma$r-eL|k8bm&vTULD)U8*7Mc0}&S8#&KtI95yZcsGdlX#5~0cVB-lMrx{
zLY@{uYsx4h=kRan{$~v~k@XsbJyWXn`Xnp0gSd4)4bjmf@eeTEq47yd2UyVFNpRWG
zUN9PW)HCsS2219>JI?K0VkT<?3yTBe?a~A7=q*RMWAUY&Hmo+wtE*wpykYL03B4Ab
z>SXR}vU6bQQU<QsWxy-=QpxcxyP}p(Eti0**)-`U|3gvJMYiNGP4t5~pHuS49dsbo
zbAnq5p8Mr%>Xw6|8I|G@#!R7H_vjUE+fNu=nj5PaDe87)k$wN%TUf$RKMBCJOYpmt
zLXE>-7`RnQ1mG01#}1*d%+ePRBIJ}>wX^#(e%O#A@=~*KNB70NKS5vXV15&w6iuJQ
ziI5vOQZ;neG&hkGz_Z0p`RAH5br&8Ku$?p?cONjWX{IYCrMzqH;}7>oZ<Z>9sgI3H
zDDQ_J)i9@8>8)=^ZR+iD#{FoPZu0ZrH2)MfAOYZ`bo$wOS^x)<cSrpm=4s3R=E<rM
zc7LVDU{43pLPUak^*h4+;>3K5L`2r;I0<P(2!|n?3Y#IDgQ^oi;U>T9nVr-Qgqlrm
zta4LVUj$c=7`lkef;&y{*Lp1~WOB#LW$knO2xIicxZ-jWJbqB7wQA&zGR9VvmB-Y#
zeqZFhuWizU%pKa_Hh!ne@1~`jr5kQ7>zNrIVy=@MSm8=J@0L_o453m!RGK&Y;3lEB
zwb^B)jzP%==#rT4z$%GRV2hJ84$IPNg+1EcsCS6iZ;f**)hxT;#F6+#S3X==^5b^V
z35@e!_Fk^1h@`6rU^E%n8STq`R;2R@{5+eNs!b*H!iBhz;dM8oc!~rW+CSU=@E3G(
z$r9ei6fOz{Oq~tBIvI5yn&!PTXO}1}L}9o1k2c4yv_TT7ZrsfDp<i{%38|<hKR+`5
zLJzW37R(${iq~E`10$ajM+l9NZq{?-=AsW}#cz1UNnN*-|66S8KzZfM<NrvZ{`r*}
z0xNbTGvlApAD-R_bwc|9L@)3LU{z-C>8mfdQuo9}YV-fzG@()Rx#2+*S6nQ?kAtX4
z<)gNp{2^}#@PTn)idFm+flI5v+Q_-arAS|0G=$1ELGR|IE!XfGly$f>AV&lAO}{Ra
zgLMaP8#7Xwf=@(r`<9pn$xv9t4;+wocR+}Dh<Yx{me0&#-54)@0yCm^>OiWIsh4XZ
z2Ov~~l3jU$n>=Tt)kh74p8Ns<m)lmuJyB&`N;jXN4AV5(<hkm%t-@uCU#x&JZyyy_
zhMB|eKbu^8(FV28d2|0FG$7GSBJZpo5l2iiNg1owVu}n^GcSK?UVCiMZ8_zc{DRg2
zb7-#nyUxSAgoGjD%+>Os8+$8^nlmgR;ed}=cH?sH<ZJ=r+6E#IV%w2mJ@^K&_wN;G
z^nPe#l6~Eg9sh~6bC538NaW)0@86upze77*YLUQ&Jmx7I<GK5R&&7bObiz4H-DS17
zXK--PldYQ)(hr{4PWbU%#GWR&QE_o$WJgmd)}4HNO+V^=4FgGuiNkI(SIKDZRSZ4{
zVoQI%ffARlPOVscmq;9zyRf1q#P<s9gxMY@)^73+W>M8%j&AaK(`$U~BS?H@m9{<-
ziK9`jo1qC0LLF!^)=BVC2R!UZQf4o3?PsL5sx7JVwTk5j(GpBvj%(%f-*{_IkJnod
zCr{nWXF|mB-OLAL6B8zxL=U2Irshogwa^;q2y@&$1Xh}NWRK~Pe;uT2HjcZ*6x<T*
z7-KBvY4|pz?zYpPV*m0n1f5`t3WiQShj>2W2BL&zzg`go`WjOhOG30;TaA4wFuJ+)
z0nR;7rDFvw;Vklw@&kIEUmuhicQ<+}AFq|wi`U!PW)D4TX>axeB%RUgE7b+hmm#SP
zUd?0i51-P~vlj*q4-)Gt-8|So_1Imz4h<-9J^EefQabp82`@w@r0aS56B>xu8`L*%
z4uo)xAzs>|NWy{$f_^_IrI>Y|BAR->K}tbNer|zA8FZ~#gK2hYV(rvzj@6~mrqIpa
z!C?OIr@_eM^{Vyx_)41uw>^?tVp?i7&qVnW(V83@)u;LG`)hF5#?LKjI4in&)w`;n
z>6IHtUdoBOGMNF<@vO)tMN@#zkF|4I54t^U&zk=o{>k0#Y%ub0G5vLI`ZOqR&ZnWd
zI4&ssx-#CipI{d{8Ss3Dwd>KvC2I20y01PrZOGcJgvq|nDfu1j99t*HnZo5WH{NWo
zuzjk;dzwX4Qa<*WILmr=$z!5{$U^;846z7#2(d`_zC0tO>h_Xp%y}6|-xKZO0)0v?
zgT<Z{%7oD6SLs>;kv9+NfuL8dO8bnUpX+Z{;*|AWUKzrG_1%!xhpEe%n%wG`1x*l%
z&{vGh#so^P<|*qtOuAq4$q4T|=X@o~CP_VAg4E~0RUlYpbyyqIRw}?KmcuE&cTYwd
zG#Y*LBj=KG{YG0Hcj1g;xQ$fqyD&LL?s>$WgYu>Ce;Rxt(&0T?&MrjV<iX-7%c6RK
zxWovUj|slIo%3$o$T&m#ks4y=vfT4C70<Z!fq`W560$T`@+8Pf0~HjZuQ~!gDd3K(
zuQB>7lv{s!WHDA|W!+2}+4PqB0}Ws<Qi@7TQId2xvVBTaMstx(KAug}rM?aT?F$pt
zfc@zAl=p0)$5GPu?k;}+=YRl=Zkr=9+1eVdfUs%&u4~LTz7+~prAc>g&7W-45LE4o
z{5sjNMxC#*<zZ~rd$Bv|;laI8cb$?nP@DljhhM>4o{qA<zCPmVBbN|Wt{8ypBFnNP
z=h@gk744tj-fsFZy9zQ@Z9M7b65J1|q3x@34$z`q8r*9Qwk|-j?fd8?AWip#+>e62
zT)?mF;eh_zpU1LQQjXRpK}uQ=&QAN}*b$S+($Bl2cga91*J~={tQziqO0uz`<V$s8
z&zl5?91Y$4Mws$i$O^*qiP?nK&y1-wFrQ8-U<+LT807s_yIKA1iygUv$lk=`apJna
zm2k>%lYl8qzcoT7W$}8uZHHRC*q6@W%C$_9;{$Wd5_%jX6F<$a0`>ee?HMDRy<tfT
zdb(Pu1gQtb>E7H?twE8vdVfOyiD*MkQHjHtRb%$C>18j33>PJH>&r~#w@eL|^Ege+
zR_PsVlHATQn{F%>S5tduG3)b@d@b;&3+;_PQ6(iM{H8Ekxq^~mD7ggW9RYJmW~F55
zvYHCc=-0mYuk+~1gt%M@dZCx)I9=ZJcFgyiBHeVr%1;8CI^HUjps0Z^lngv%kx9OF
z`Dr5~_?&@3DSe4|5-9ZqE&^p+FK6*zf^Z>S9f*u(Ux!`t)7K#AOjz&UKEOtFx@lKP
zn4!>zy(enLN7{dw^oYb7#2d4KuV9=EV7vSx3Gye9x59F-RMj-)l1y=DO9)&_wdJ#M
z_rdM&0qbGro|<1K>P<RST>SngM&_DfSx!Ie(RbBCEOd%~;E@E>7+8e()_tza-cDFP
zvAq1bBUFB^Ly3sP&*bMx)8v+Ht-$88B`&xQ31A)i?s5NkF~)6dBQt$mi`=ya5kzlw
z2Nce7{YT&#hCCCXnbtyL(94ef4Qf$wv2b!q3KtH59;_$1hGt5BfDTtC1CVzyByO_H
ze*HcLR$!x#lW?PbX-v9gAI_fd9!cHtkJYc5AcSK^IDs5eKIi@iI6;F41PnYYDhw0R
zVa@dUp6*lq`Yq!Zu%s(J0GMH^>;>I9?NBIU&teg-Gg5M<JjDaZ0SlwZuK@c9RpI>~
zCP~;7uradX`@la^Q;;3~SVp-bAHy#CF?&LD5ZN8ojOpY>81S>UvEwGSAw2i3EG^T&
zs48gM+==HN@ITb;dj<US0-NC`ssb956TvWh0oUZ8*6|UR(h*qUE!7x&^!&VR%Sj{y
z6*b=MN)Pt+d+6-2g5GibQ0J2X#Tc3HI_56;BlnvuUV|30Ef*C_8ye(q5ELq<-mmRc
zR|?5Zm06h?;99(Rks)uiv|{*l2d-lR-Nc_dnF6d3+t*sIXo(gLhjGfi370$ul>*^|
zgM+V=>Da1W6BA5C=4BsO@*7DDCfyICF(0Dlgx84<(4kopD56E^Tsm;Q{rP&vN!XkR
zt^G0T_JIY_Hg<7mW1vN(Le>Csb*4f_LP`7~KNsU3%AV+2B}J8JMP=pe*PF~?N}5iT
zRsQLp=LoypfA|n&4+@;_OLI@ZXVcr9X~v6aSwxkms>4MO-?zGW1qw7Ak=@b+MLNqC
zP3s-HoQ9j3<F}hIW8;7sdGv#R7qiE-wb%AU-N^!8i$g`%MEJ^<*B+wVX1yH=!b(pA
zSnj-JV|F2cud&ISMrFoTY;|oPz{2M4_LrE%KL3tp>47^hoI7=Mq3D(@X?bjxZ=bN)
zGt@pXqrtaRenE_9+BNtKX?%NRWxyC?ylvD)$o(jw(93C}_B;g`By8^Kn)Zz`he@|D
z*~-^Ud?c^&-216OUPttc$aC)ectH>+UC~mh)vh+Pd)K7Dme4Lm;uLWku8Tt*09)WT
zwv$pZODYMMj{%lttT}^`S_e2?{5C(NM8zS*M4bDYNK}%3ztN#v=Pr*N?Kd9r4xK2O
zU(e*E1(MU~$cS))S3JGK!4yrkdy4){CeficeWDzJ(KXxtOpZDJo92A28PRW7Rn2-i
zLt1dAPG~y)3(xlG#?6gx*h>oQ3!UnN*3r|bwdn7-9?tSx%(jGol0GT%uBsUC@7JGo
znC~~Mj1yauZ!Xug)6sf_h>eE68DNoq?X;<B{MRQl3I(dVW7%jj!$BqOX@9O<3nYlE
zohf9D`*sE)!o(X}_V)8b4lf27bC#kg=*m)mR!V8960&c|=145PUb7l~a;XOt85vpl
zdbLl8oBxyjs({E*ro4h70#XF@pLX_3^2k3DLX}1n&F+;gPaZcO|45*u>{rwVpi1T{
zl8`Nj>61PcbX5gN75Yd%`}qN*ku6-uD~(6Tp+8e0L@Z@yXLh_`^l?e3hQpYYGfGI0
zp;r~*@BZoU$=27azxNeJEr(L8Lk{eYo`*JwN2ReFz2ZdN$u&kC6)_T$Sr1GcfYl!F
zhL+pRBNsc{WktrMqocu{Z?K^JEkH8*2wpc7kW(E2Q}hn{anfw}*OxDXFjeH7nNa4M
z`zSRoof2-P38g+`$946r4g<E`w`<zl+f{5f=VAqvT00$hZEiREX;3%jzE&w7HDDGu
zR?Y}W2_tz`b)e0NzL~3%v?YLv{88-b;K!VtrwxIfeA0H^NWl-&05Osx#6VP@$}a2(
z+3I*KjnAw}Jf%92YeG1tfP)R$0lVX^lTICg%7y{Ao}ihh@f!y}2%*j#Rxj{#^76(-
z>+ZdsCuoHq1{|v{PE@Wwa2RvTGc8;+rN<iU>wCb+$QTh`$eTy5_i-8>LDO605lL%x
zoYHBSnqqNBFVt9E{OgVFC8JGpYIL4}zQ|I);w9>}K-K3qBm#&H{zTM~>eg?^oaW=L
z_r@Jsv+`<8+AY>ahhNePk@aNStgTh=O%$A-9KJj8zz{h3;FEIP#})-S>c=psl>vh7
zH&NG4eaUr5q-<_O6Cc1`YbmM&7Hjb66_qW@@EKL;4%f<I9m^!2_eiZ91=fT2W7|tQ
zqWRq_IAR8!yxjcN;oqJ##_Q*=)q1Y3GjJ<uac}iGSEr<?P)U<A!v=Rz?Ah}IMo74F
zb7pQY6_=QPTek9G*U95Fh~0KDXN@j`#G;ToCPu?}Ny{hink1497;7srK0`$m1dIok
zGn@z5$OlMO6G0-_ULv3kAcgq2i#n5(?%AE4o(5G_e^M)%&|x#y;G!FxW*x}gTPcqn
zE8M6p7+yioCSNZy?#<@PcJ8`MQ`G9PUV7u<=}=?*{7|FvfMVU+&1#dN1EJ+lNgNzO
zBcqSWy}gBseVVN}NHoT}y9t-}y=>SS<txhtp7d)3=Vc>vqM3`Fa9$&a0?z+>-(7hi
zs36p;+kaj7OHKSHm{a(P<hOquMIUHW+mV)qsi-zOO1(Nw-Q+BnhMO&Xznfvyf=yae
zy-3+WBGy!LkVU@*m!8Eaauox6ZX}NYh{Fi%6JYCxDntl|9*8N-+dt%SsO_Vsnk+T0
zS0mcPY%n97@zw%gd~Z5Sm_j`xUCxkJu;&)Kfj<*BRg+BCvNZ|l-KF8`wF2XZE-o(m
zfPM}PQbp!1h4T@t$k=kEO2p8}rAdV=z!cTyx3{;S85$ZIY^QChc94Ipo-FTllYJcM
z;*n%Jx>^{SQbeDiMmvietF)}V44cb}C28u-J6IALLPmbwrsSUWSkyvJPF+<EXMjfM
z*o1?&3^GRcWtGSTJZwgk1UT5`{OSOFy9rv@*6UK`S0)h}rX)>ZCPH4kZrMRS*Num=
zz9pPKCzH3(@h$Q1H9qm&fz(2-FyE8Cup$+$SS?ul_bklN?wMORM(j35<~v~VZ35g#
zrmgCC;~L60!zw0g3^-btika-)(TnVDi&U6N`m^M?ZlR;cMhe(GUZU9%enNIXN}CXw
zh)-C2EfC8NUjZzYTY3P%E2#~2d<4W#_q1!@Zf6y{N6sr%)1aI|*Tk-MuDt18ez&H#
z{PL2bg8YTQ6>!GJvsRWEhRkcm?AD(QyVl=TtSigNXnt>N+Ik@JisVjFo`uCILGj+`
z=-TwIdxQ^Crg4ToO1_0{Uuq3|G@YuA`ck^)ValEpoj%4J{u$9oow@e`(H^=3FTCMA
zVuS7+TwJmCs>8q25D?1*2orIPA)wtu0zy0mXbPB&gd&Yuh_xzY6vc^kGM7%oo$Vvt
z)XrgRwY0Ye;aETU`p?10=E})(SW0C0@$Qhq$>v_Aer)^PGbN?S1))Lgx589+j0V48
zV2q49zjR3`#O|2xIQB0vFYVOCA7x_BdNR+GC)=^Vwpq+8&|($2JXnHkASyC>pm2Yd
zJp{0X6gyOA;9(CPj&@H<%h4kco^Rk<)*$S($$XPyOd7IYsnTq{&-4^*drr;*>6p~*
z5F0*Rb=xhGYGrx!h^Dntu|+Y~f+~lR(LTa20%i4($;r7pYam_wv8Sn4FVj$U4)}CW
zN2_(Vr`b#~ajeS<>0wpAsMu)IY|uFlVF6$qS6j8{_-!b85G1@tmSOHlXS2+zg}YG$
zc@#9hj7U}P7TkM_*Za4>m{eE0_3*oUwMFswmo6=)cevSWkz?|2mbHB-uHg_<7TsJL
zoQ${Ya$Pesq>O8fJ0vn5H&3c&=qu3?X{%^$aR`X#()#eku7{P5yH;kO_`IGZlNOMo
zn2InE(T9<1*9x}V`5ij4MzdpT-7T1#BZ>~ptB@Y=P+;B#EtflLnMWgct1VftncL3J
zj{p158oksms|CedxLO0F?PHZ{<~11%PG)Z<;>V1Uob34J9&=y!>aaU3t8Q~>>%f_t
z1$=wX(kNzmRuLni@L;6sa^IZ_+llMtysNzB0ZOXO9p{vJ(Xkwy%6O{^ErI<hUp=dH
zw^0!b--@5+Plb;KcbilzT9!sFm$lN&5pSMdhQPNxU27>m9;3I2^37aTDPHP`;+L#&
zQ53h(s<rcn!x3PMx9;-{uKGEy76x+kyf|etPSglJaigQegCz@2?C#nxE-Y*i3$E6r
zy5-@j)wtDsP+H>NEoV4~S<W}GrgGBw2Su*In{EzSJgFuhYuxs?k(LhRP?g-;!@y`R
z=oey*3wUliZbY4DU9kJGT^k>Ts2G=Key-PMyL;VW@sXRYoh@T8HcsN*=LY5G{i@1`
ztGdojPBP373-~IuN>_Q8BUC>Z^AyDI-)&cC3w>!@^l~6Wg~<M;ioOXNMe~fEp2G?W
zpZWUxF>BmZ%I+8aQ@N6rI|eqh-Dw}#D4ZfkDhC*MPTp&_j2)&f8skinypMJYY?sG-
zH{n=`_`ch{NXptYwXHJ@IUqJhht+0D@2(;10+-@Iwh9FfwNw$Lde^6jsobkzKVW#i
z@En^Fg1(Gm`@R{l3sBTYlN<PQAJzBA4|gQZ9UMxx_X6LOx|r!Fe8X8S=$$LnZ%s|r
zVR}mXCo6ztA6KjILy5R<yEhp-)i0yhg=oL-G2;=!j@dKn*udUxOm6#aW2QMYr@Knk
zu#!X*uE{r7ETE(&-ky*}ynBwCi*W&%B5sxoibFQe=gIdKf@6oizP>r!WOg$zPP;x=
z>FZRvm{$56vX}f}*&T|hlUP<NAyoUKsKvXx6L!>DsUEcsAF~I!Cseiab$leES--#E
zBsorGQ?le7Ji%g5pgRxFo}ztw*Yfl%;|Q;Uq*T4#ZOJ+uJG7fI2Q1M}aUUKG`RNE%
z6Y196Ob!alp9ziR;d?9jS?t9nt($8K1Ct`h_U}$|Y^m~U)11eSxdxm9T&lyW)@+8)
z)7MM)>QE<~(`_UH6qD^a7%Q^J@1m9<#&1*;Qjsb^E0-!6>Ypmfu!wG=7i|3KEF7x8
z(KhOeqjEGt)KmS_ELvMN!-L*VQ&X}d<Ic84hK*XF%WCiOgY%5R3J`UoyI{WXK*T~V
z_9SU5CVFYH9Cqs<m4iDj<is%xZ>)Ih^It8$S|B!DF_c0*51MB_?@VzV$7VF25SfgY
zm98FNXn_b0dEKZHpO_2qgU=A32_v4sJk{bBlg6KG2*WQ!qv2*acz=S^L{doQ+Gqc&
z?E}{3o&$J#e4K~)s#}Nt$LWr$>~p@pysho`+H<=vDUhEqC`JYy5sOA4F^cP*rc>Nu
z+;X#CPmGJhBgO*ly=t)>jQu}kym?jkxFnugqji$gY?Uj?DYR#dcXL4GG<Bqx?a`na
zZl2rjLl+eZ(#Oo==S5EwVEFBT3Fh$LBzx9a6@|LEX=~T<^i8q~4kYky7Fk|Aedl&m
z@rkX|YI|u;#$6ylE=V=9JT?1%>pXPOLlD^*D0fg(Rm~=Bi+^0&!SQ1gaCNz!Taw92
zch{yn%<^_}bD0*`*CR_qC~C>7TJ-+D9P);pT9pymjV6QYxN?cZd9ZvkzLO`|<J>b~
zfu7-8yl6iFW~~rcpm|I?FCSLKaXZaqO!@bUss8l_u389Dhx+6}tnuk;U(af7#);<J
z^Bb=4DZo;pn@`HH0i<3-*o&2zFR3<XUY*0h#8k^-i~8_|>g8YUn$zl#*#-)CM?D^|
zO6*Q5x?~*2FKdoowtAn@Se^<EIln)+56a#Gk@P%Fok)(I-PEv`<!n2&5UJiTHzAs@
zUd!cs>dj1$h;=S}h@kKZQp-LC=(vS&=$}^7py|LI-{|N)a_3lz{*Mcy);`TCI{mN|
zzGAo6<CN{p@#(xGI&l}ksW6KUJitrdhwKuGJJ`G%PM{C0WcW+P-&A;RS)|&GFTPlE
zpD(`<DnSAu=-wv%<c><-^%=4oE9sJfZkNktT5o*k&jSirmM7@NgRA;@OrpW(sRnIC
z)D7fR`gBwXDtiI+BUcoFE_OsXKmOIf>Nn-o(deT39$jshRi4ezc?~9_3Sb_CTzo6;
zc|whltgD@h_9`PsWL&h2h$O%NAvC=ZAT*<TO|v4)h|FQ#@ca}J_1!guiO<`(JHmiz
zz47~3YM07u8@?d))E9q^Enm0K)mN@*Zg)(RGzPOFJ+H3t1Ah3Ts0qBg8Fnvd8U2$@
zt&Ilrj|ryfg1A3I0)2ou=D`*}+F?g6l6&02ds*p#{fYSS=>sY`mNUX(dvbLja`|BV
z=tm0{^uM<LHROP+Z{ML0HeR0hT4DOd`6ekK#bl}S_?(Ru#xUjXt!j-B_t$r?5K%`&
z(hH6MPO>@PVDTCZ^@%?#rb2YoRecQ0J-Y~rg^qAiB9fF~O!?Q7@4?sVN}Zjl;?vAY
zrT`Frbe>L@_|MnDw=GX4?JQgbaYGxId3Vn%XaunU<3YX+u>(^(cujk+yWJ#8SC#6$
zy3S-1E`ypZB-`38#&hc4pp)N*Fup$4LCiwGAHcnpA8^h-4bR(Eg6sE|0EVJdCR$Lv
zd;WcnK9ynfuLOA$<oiiG1E&^+S~ut420#KZ0GtN3J#+vEqoBE5;pMxqop(2pP_jSD
zqx^k{xiG1m*Iik@i;_Gd|99&(EE*MHHp);d5F1bBL2JnKYL!0y)k^r&y}HQ(qiwdF
zzwhFJHv-1cE@wC|{eeD1Lfv>>G@Z@~03@Y4n0#<`r{?QYyFTK-YQ#{7JcL$L3h^}$
z;~G`Yk=0iQsOMkMGw~zh3Rgl!(I8PKoc&MXE}Rba(W&|7Ug3>8+`p5Za8R3mGkx;<
zAB1><HwG*Sc0uQ<fT#URR>6t(FB;xo^RQvV%|0(Q1q_o}S3ru&e~;Al8$AE64K%*@
zAG3gEkLiHSBd;pQ_<*;=rszL?S;jH>BTtM7C-|aSwZ?xnppXRxJp4my{QsE964H)7
zc%SgkZ|@+G&~mV_Jn;7R4j~q6335t#LAxcUX7|2P7dx<#GT11>V9UhVICx;-)i<5|
zx+1vW)$y?O07eO}kt~66<16{ZS`VnR%VA1q)g~qScIu1z5DAQT+vri*u$+}u60@F{
znr3D>`%?3Fu2L2Z?)1LeHL#$(P5@q0<E~O|lEd+$G~@+G@KYT8zk30&WHXZtKYsc1
zk+FqER`R2cf4tln)ZUliYsX9ndq6cvw1@CON)2b}7T3wPcRul?2o3s?vW1jN^H58M
z&COA1wWhKB<JX{&FabhB&R6F6>!)YmD-(cqv=B|{Y5TRpK|A9-*#2%s^`z!fe(8jB
zD^Ja;{pg~>RA@la>Y8S_u^b0oHhdb+rPMUjjPo?j0#%1_gS$*)nX{y%Sl+hzb7}3T
z1{>=sq?YR1^1RmN5$o#K%9y4QO7ZOSQM(!kNuI#UE&cUE44wd&)zYmY@wr!}l*;!(
z0^;N2Rfe5v6TW{z2I58#lj6zHg1P-Sesy$gB=t)QFq0m2bT0?HohC#!RmV@!CGc05
z^aTsa+1c4knQ;mDPjpZV$m1WoE$<^_p!EZy`T}t!xU9n_?r_CUV@|D;m}@@-hlkB6
zeiqrxZMLPqz+Td#Ju3xaR-TSBlu9yvzqp+Iue0q`(~5Eq9fy%@6&_bE*mf=-WRSEw
ztJooLl(ArIWYk`Bo^$!H0~X1tRl^T{s-Z%|6OJ@6$&@qiutb+g;jnyrte7ZgaDXT1
z3M&97ca6d^$sMK39WXYZp$tKGz1$8k4n`sVYdJ!n%DF$=Y|dr5ummD)x!+91E54C%
zZO_5%@Yec>vkk|83;|6<geOOzmQ+4|WaDS7Q6%-?D)T?l0eh3lCtV3<gjf-s6?YL$
z+_mE?m6wH|ToE+#Oh99kMz)GThejitn3tz@aEKz#n{_Z;ETzhYeO16^akVifXm)wb
zM9z%!b;VZlw#wLd!pj2#6A{ZShwrdZM~)SR!<)UJ-H@@#r*iutw=J~p&?26jPq1RM
zTV4;ekR}XRiH3c*wlSN!WC|Lteb<s&=44?Z&oRsSo*>*|3cogPF^s2s6M+n|tkw<6
z@Da62yzV~zxdSb~CdV#s{tWF5Ro~psUA^f_R4>z5NAW`NpF0BYLId!WMx^XZaQ8|e
z2jqn{6H}d5S$2IDA^+l52w<aVb~w#IoovCnLwtvBI{P3FJGEj!^i9_ND+cZIG4F2%
z7NfZmbnzQ<8udD2e7FBOuool1l%ZpxRgj>Hn~3{AOw8k0`ujB;O0K?Zo(8-c%54${
z4l4YNoIC86B&=S3uq*L}?3IN<ZvqRm-IL)47j^>4kk32`rzt>wnF$M)yiatMc}{>)
znVbFbN9^gsG0>kxEfEsR)A?O7hDKmpi8WF>-~X_@;GY?M^19g3*A!=;M94`4eH!jb
z*rB7-;a#y~s71i`Kpil{!GL0k87t6tUixX&lIrP)6yz&|`jcaQa9H(Elq5O>(Kpzs
zV}#_ES^7EH)8%om$ZQvw{T%0$2QSH`*Fx_LBTTUL7oYHnqhDd>rMMRWsx)0aBdXtf
zjv09*>~>0L!(LxmwgRwh*;S_zFqwi&+tm|8!)kb3=#!DVGx+J><U&15Z#xH{wQW(r
zee+$XXQEs2JN<9Dq5;`uv45$V7^r4_qebAY1RA+SU3Hge!-2ITmcD#@LUpt&57U7U
z_w*Kl*Ll*RiN!ezUPss1a$*O9UtM7av=2bMA~}u5%%DP~*1hWZrT;<YxYtX)bgA?M
z{T03mgE%+LC7}ewew3(1#ih}*1&ow&va#8!)Hy^~$hZclxxp@)-(7SU<fJcjgY?b-
zw^K+}wP|^BZw3^rLC30_=PhC<9Tt>Q0a71Q)<n#Tu(m#8e`lh2XU^pBU9|&{mdG(i
z;xR}r8l=5llGRwu5Y14YD{J8C|IHxDB~~X%Qc1+g%nhH!r`mN@{M)z|fa<!(ZwBI{
z7Thl17=I#x+_pk`0m-~}?|wRmWW+10+5mONgRBPv>I@SkK9qVu|3O~BSU)WE>fli5
zE8lD@g0q!`F(xJ%#p1LV6lA3>VQTiGWG=>4O0>$@J6PSn!j$VEN~)7edHyF4$UYTg
z^!%B$Lm*)3<Y#*T^JdV;gejkOgURQLIe7&d$Mnj;7LY+-u#C*jLo#~Po_T21X0NGG
z2nh+*$TI{#Q?^+xDc)k?(1Ko=)xTiF4?r9^)gybz!4K{b!Z-bq0W+%_qttHI$EmD~
z*z~xCsV^7q3^MUpb1`I4{uEqDFBM?equpVU^gOI!XSTk$ZrleNA-Az|Fcj$Of)Gaa
z4<^$Z-zC1onuoxa$wm8oODyHZ90&Hc{~5~4adO2mV492=P}~xG#()nqA|t$NK0LL+
zx{HwHvzPk7A3_Mz&CFo=nz|ST*RMz(0wNv$8zprJ(tqPskh-S;bs9tEH2?iI=o}Cx
zTF_|`{x$Mn#UWtWR`J<J_P@V|CR&3Xmx*3L{@3^f!1s19=Rf@~Y(EREm7eRW@Li10
z1bn~zwd3hk+yA$ewg9$T@sD%+&+#<?P7nCRzq|iGb|@SyRU8Y#{_p7l4+O+(IX52@
zTt%Me3;>X<TKPT7|HT12@cowr_Dp{NgF*jQK63fb(tY52rWJME|HYvHs=4|91>pZn
z0bn1T&HS_f<k*l!TUBI~*KIK9>(?P6?0NEZ`kKaB$G;pUe*P*0d@<!qO~#y@x$q!m
z27EL!!naqcNdZ@jH{<%3YF|IT-cwm3ec*i9o*%5e7A0Zei|ouX6)QoNQY&qf{V*@8
z$f4+YW0}3N8LU74UjP=X3GDEOa;x%ebHoT1)|Vsu`Cx5E;~#sZJK};l;V;oK_M&C0
z(W1M!HAhB9Sw+1oSdB)cGOMBD(R;|p3Wqg4^bw<4_Ga}H7U3n6_S%;y_5}N@$$8tI
z(OQ5Q()@C9aqTuq`LbaT)M{|k9QMFsen!gJ+<ddpvE^U>X&b_;$GENW?D|=Veq(|C
zmIbrgnv3P&FdaJaGKWa2t0n16lB>II1aQOO{<PN_Wc_`F_<)ZtPfGze>eoU$r&s-2
zQ#|ka)tUa0J<vznw#^Ia&r*!EGpD3p<k%Vc_oiXpt83NxBb)`E0iQG~4a}P7_wBqi
zV}q;QjbC6~VObQIeJI~c2RksypdiGfl#)_7j7#?Ouu$iz`IudyB^`j!{;Gk!VChyO
z1g>YTtZ2U@FXL64X7c|Mf>gMeY(k55vQh!h$rJo9C!Pr?WBM-dDwtRo!v)z5KY?R+
zX1d$wgbw)s3-#avq>JPa8iN;VWnM#r$V~8OD#8WZX|E~*E?8b_M8^s$NjF}XYysdy
z;YeK-NLIF1+F#PI#P860up&PyH~Aj;VF%H9a91JEGC>SOh{Vl=?)z0G3j$1F>__dh
z!rnS@@^~q6EsKr$vVI;DjptVh5q=IrFXz}2kP>~=TNn#{w_c*grRpc=>a&N)UEL5=
zu$(T)p12>}5EDw4M=UZ~;tH<u0L=Z_@Zw*(F5-EOxfJ1S37YVaAN3}t1$pkIRv<U~
zS6rdvl@dUQ<6%Gy=;%3aKYLA6M+8JR$y;TpSN8&J&-R-s6}&49)dxe10*HyDJ%HYY
z@R@x6NkUg0nD;5OF$Q0@JLL<d!+VXA?O((W;Ory|ntyqBK&r3*FSB+jCq^zq4|n8M
z{C{4!BQLK9-B<a+ss&=<E4q~U48BnXV=fTXJ3HFgP)g+PUa^2HFfdBk<=nsil;R4v
zo&me`iYGP|<kl?egD1FC=yDpZi#Iz2uMAuV_AX)kdRAcujev^7U<39+TmTW|k6&<I
z1)gB*AZaaGxj*KgF$c|NoQ2njk&41D=O)g-Jn>}@0sQux&O_sMqnoZi#Q~~H|BlPS
zw`!zJq~?HhL_<iXM_PFc?bCcd1{C*BiCum8QgRK71OWhP$g>4`^e+;sTsai~iUR(j
z`4Vun_-SD1gEXXa^L`6HrL)kM0!z)RcH!NHp2|E1Z$uT&fipwXkpK$~;TBUAT{9Vf
zcJ{;$!JBHQwEy{w1tcD7hZvM-q<LxI^B@6;^s?uz-sZUuIWO{DP?^XH`Qj9*8M|wZ
zcSi0F#F*Gvy`HcsMEPPSRqC^yg2p2qL_R;-7iSCqJkZX6v3t-R(92FnokdFMlwA|u
zR5(;p=`OKF7^(z+e(Hu~TV&pglO}GO{#fp|M(OUu5H8)XH_qv1gwL7aNtB;`^ruh6
z<PcAJQDEObQo(LL_S@>KcmL9p&NCLi_uPSUuubMlwN8a+ldsDeJ~!!+3eoiNcrHCY
zPET}r347scBU<=)#(^1bVTDAS&2JU&XZnLHoz1ZSB3j2_1j+4^8TF#CL!Fq~Mdtv;
z8^U}ZsfhM0$}22qVaoS%J48o(%xuF2$J9gnMxbS8hG}7CGT=Vmb-R2(oGdpLuHA@>
zKJe?C-t*|Kp7_x~?nsggkvRdI-FJq7*%J7(8%A{;-626A)=2Lzkfr+x!ql?v789+Y
zWEK~(ky$G6)Qb7^XeoH*Sm$r6g~K(zH)__Z=wv07>^5lDKJ6iLZ3@@ble=D4KdKqV
zfoU;<=wO#n)V{&%8-IB|mZ#nx5n-T!2rGhB&8boe_vKP0BZTk&i1m(0(Ki`(M*p)N
z{)n%gADsMFVkLMdaH1bPli9W#g@@DB-(6u}Fo3o;LVR%;mU)B4t2DFfY!`&Z6WibG
zTndno$u;gjX^VONQCGckp-JPf!I66Eu{{=)-|jGVs4EXnW0KNmjC)XHZ=KXhif%4l
z?`MC=DD*l2?_3<00IkiEYC{62TR=0?R@4ejP1d*6ZmL4oGotywgiY^A2^m3???oO&
z81~yEF!VQ3X+VbLk-wU-#1vQY6d}&c&Pj=g^YL+GT;s*94fqmR+K|hf0@|@){4S^&
zOzqu{A3LHy7!`jd|7@Sn&Up0dTg6(Z%INQ`+MuD4r>s@2%)$-rB%#t|6(SedBR%Ju
z&Bnk$Y}Q3r2k_P7a4yP|nZcCBysb@ShgGpg#WBO#ew$>E=;~O?3vG%=yz@nk+L7tq
zC4<g~q{FO5pFe03JXBCC#=xiiLP00P{Vksh{M(1a++@QQ=0z1>G3T{kl;MH~7pBJp
z7-~6?BIT0h!jeT`vv7W2ig$a}HRkUcb_6UySFZ8E=`Le)7<@ZU+OI}9&B*bGFSg6c
zi|*j^@5#1Rl09m1bQ$de%smzE57V9<g)is0W(+sth9^i|h~9U!4Otf}shLZ7Eb$?d
zgePZl`#$SYO&TR%%7#!6d*EEZjUW1&Uoz$HfIxO+?xp0x5e|9Xasnmg<t@~NTiNJ4
zCU`tInU<b0^(O7*)!B>)Q{-dJ|7gBUX%K(ujl2oh5HwF2XfGLJxaG}nY7dI1oS#Sg
zrk01U_3G+uhQ<7BHE)f>*0Ogoh{wBl^grST_5f&hGop1~sBPl{jfTdcn@&J@+<|7~
z(54Gp+V_Y_ik?#ugV@Vs0I`MQT;uTNF+M;)$-Nl$;Ob?9jjzyCf7hxO)Cp;c%Uu4Y
zWZq<2c+rbXCK`;q{*-3@J>YBHXBHbTpG!w^ZL%)UCJ*@?J}}o@!_~6NTX=ZM8qY%7
z!wCfc5%P4sfn=07MowmbnZ@>4H016KWUi2SO>Iis!^&Yuig5|*;RAy3kIH9qtmp7;
z{4~EBF{%3Mp6zXJZ1LS0UJlNpo)!u!=1U&L6>vSXqgGUxooX2pd)Z-IDdoVS-(geK
zs`7fPqNZ1suF=r>edx>B@_YrF@Gp2h+u!bDtL^Abn09!_lrFyQecBd=ae<KGJphLy
z%p2}rUgi|`o18MO7}C>_yXA)k%g=sDlB|wyM{!4@<l!~kN4a=x>K=><i}UtbC&FZJ
zx$xKN&$I8T3Q~Xr*P(6K-UHYX^xMycJ~O6caCCdjCnV-T>baR~*t0`qyzs{6b4umG
z%wbBJG4-WY*PumV-c#aZ{H0$iZo1Eh9U5jq+1O4qG31BxfX@u`dHbVhdOvyPILUhU
zktGEG=8z=_{&K~Qu`Z3&kMpM1y87G1f$z816<PMT(eE@yoQnRO3zw3J*mgb?GueHp
zP)Uk(aiEP4K$5wMq(A*pC{br(H@$*iQbI%U{s~7eSH7NaXyQ#}3S&dEYIDEWqixSd
zUEJb7363U2ltq7fDb4n@9xl<1wN2!8@OR(5aqw1b_09A@pN^5LMD|!SOHYoUpabKV
zLFOE0zU_ywG7m4HzOBu~RH^KYTuM!iDR(f8_02AB-%R1XagG8Bfq2UzX^&;~QUlt=
z7|1HoGm}=f2WF6}Uy<%q`FheSO5)U1&rL!@Df#U73OeR5>U%OFztTD5?Eh>;kQP*Q
zr$TGLa|%prVCloR`y5&}FeW2y8&^W^_K?`<Il9;|eHjl~eRQ7JAg^oX`v<x^K`oL9
z{b9x&vi;4>k4buKiMxljc)_OW&G|ztKyc>p=T^&w-Iq_y5PDsD^7?M`<23E(JR?e5
zVsb8Ds`M@%*#LO7{O9rx@R1jBg_ejHBmb-(Ut1pPUA0w1%adoG8)m*%wE3o4{8Af5
zEnt`S?c@HDH7G}H3%hyHRisW^oWX67YD<1$E#;{I&0-bkI4iSylYEWBiDGz_oe&5O
z@w<FeQ&QI+&Q*muk;n3fT?!5VGvQ;6nruKuX?)jh^y6}de_%^+?Dz!*DL2?7ogw?T
z0RsU4IP>||Ep&Z6taop}Z3`5B%KKfR&p;ZQsyw#R+S2hl5HfJ5O<wG^obgse?@?Oo
zc12`)KrW1MUnv=YCL`ErFfGQD{5-XHFpd_E-&V$9ACgJVuI8B)0*WL3mhrT-KYN><
z?Nh0n_iK~;{^tU;1Qu|9I8c9V4WallzVbP~0gIz7>h1jsd5JelKP9c`herGQ9$4Z0
zrVOVJVjZflr+prsXx>u=;JW8Xl%da`b8z&ch?q6G%KREi3T$qDN6`Ax*Moif_ZBR#
zGyAbpz{$+RXvx~mqqS15mbh{oeP0rXAYt_D>(Q^3={ph(-8l=*hCoh<AiZG22>V@e
z&BCNXFbPHZLZH)?0q%W&h3g6Z1(Ez!c9)Sy{RoXJ4NXYQ#8Ej!r$Zb=CCN2bGEqrO
zm6W#D6WK0w$xuW(P3+b}g?NdGDvoxf$MJN+W-r;PaD}3+im(d8#Ihgi#zENpW`d@H
zhR0H0hV|w=KgD5{3z<V?{+VOP!iB%xdJrGQ`+}%Y>Ozn<q``g|04jtE!gmMoyNwCQ
zDD3S<KM;}^n^$<M`xw{UV+)bjvSRb`mLdvbNfL{0c_}Z^C~pGg;x_&I(;(U0>Ur8X
z777;0YlAUN^>NAKBr0b9t?bK^1`mphHPzwh(aRB&lMDj;KLW4!m*CMWHkH=e<=Q&f
zHT&{!{_wKP(j*&6a>{b>@$#ntFUn&n!=sW1M;$a)fAifPGXJFWx91T9T*}84PC60;
z_$#y~{7_p><#;iuXuN9g4afKV{kq;l2V$xe&T279d~Tjn4iAmIDxOcjMC!JI!lp`S
z`B@>VX;p7xgS)Ew+u*Z9)kfVq`@?}AOG7x>3OS>@kJo5oO<B2=@sc>tCX9dr_Vn3>
zJGnSp7eI`Wn3DAlx<9A?VL64uA=KbRIsT_$<Z$Tj(nFjfcINoB(iHBO9sW{HJvUZj
z7U^wmZA)5>q`&#=e?_#Orm8dd?<3*+rWy?4I-V;X@Wps)kmtmC3>98>9EmpUI~ozJ
z(ROesRd<^WS5e^ITu9Pycz;*ra0p=6DPooTn$)9T!qM!;Asz%DFXxB`z<bq-Q1S;5
zo+WwF)0nQD4#FUt8(uHjCQTEZ7Ky7F=f22U#Tz6FhVtBs@pYTMv7#!cyx{u1At#u`
zq`x|l_vl#;lfteYsavuo$xcnT{GxP2tVIoNC;wL4vzIET5lWk{&~Ro*9<PQegpd)r
zxw%<SR`2QI*)90ql-3WngAl1e@~U@Z7+j|ioR0Dv+tmB$^=4bb2Ykswsih-~d(+g8
z%a+Y6o7<w<3OjTucp#br4x%LW3;hdY2u0^fYXB`HOq`w5yWZ~F2*z9CfQ!fLD$Y;a
z1uhknG8l*)m{|74RDApbspet)o@iV;_(p?dKbxO$hH9UB1CB|mlX|oHG^j2qkde49
z-GG$ji)L2xmvJ)J)597K^TKw{JTcF~(i<;=7_@4}2+^xI;D>x15sYed2hN*sPn$dQ
zDy4SaI$dTKbOXcR;!r!!8D4hhU@iv0k^;E2*Wo-j*rSb6VpLVLX^D~9yJ9&c;n5W@
z$7}F$HYB2MSI_!0X6s(ph#csy;4vA51!$nJlst%O-^R5XRJk`^<Qs#We30;H>DhYB
zqorszM>T)m1O{S>-Q0~PP0{dz0-s~U2U!nIe^YJze8=3vRr?Elae0}spsna=dflO!
z0#krtUc(Y@`uPj;(+{GYh)dL#KYum0jugY#@E)DWB^2<dH?3%2x*;C~LB~cyOJ)pz
zl9&qN@ezteo3bw|&Lt{ex+RyA)13=DJjl_{ty7ewSO58){qyLk0Qq$xZ(XlS!Y(rl
zGmgB72DG(^1tEKYLmxb)8m%TuYr-kYh(dP;)Fu%vx!B1*6~E8;))GFhsI8o4MSc&<
z7Ctedxy(O^$-13FhJ6XkdohEN_1<j`;lu|B@vxHi_Y0CKJydsi^!UQeimu@-a2(n?
zUng0NF*1oD?;J~n8<7NO%gH479B7xXB-^Yk@z%FXx+;b<%Ejj-XgO3He&H5fb)MU`
znD5MMmm`~>C!*BsIk}cBbDPM#D42Nj3+5cdaWnOYpr`Nf^#dB)jt}5M7|o`YN~uz@
za}(d~p@{B#qmwO5{aFPjY;J%UEXqj*=ghZ<mXwsV<@=r<YVGeZdl(;_q_oxK=Hh+Q
zcU?*jWj$2>XX5Gz8*t^34`#`+Sm2Jl2L48pG2G4^>9MS>-Ry)5lG!e(DnY3n&r*6>
z_2!%<W1vNY^0#<Y%K=N#Uif%~Y9NyltL&OZ{Pm7l^NNfGdZmiprL00o6_3D1ej`aF
z{o}*ybf2AfOv(?nPFpg^<G5{dj0qb2i6V=&xa>!q42KOy&1TgM<0(7&_Dtt~Pp(zT
z1w7h(_KSx)^ex^$@Lu9Az>w-ETHS!W#5UsWC18(Tyt#ePR56hY_8=SiMd*OIX#LXl
z;h1*b5<=o!yPm|g&l$QseWGN<^Wi!M$Uj~M@S1Z{1Xi<t#)Ko|IUcT-&K4_ag)6ng
ze4M%l8Q2n*L8sUe$K5kAu?EZ95!7+!GmK%?_sgz5Iq1+(S>`dE*A3*S;|YfkNG~T-
zgcJv;SybC8Y6@_f{Ma0U<wZ|Q4r|Fx8cw=xA)BbRuaD_Uu$;E_O1H9eMH7ca5->;X
zkD7)KN5a1Ex-RFGCd0np*m}&(6dy{Za$G&WI~qILUw*nCi<}(Epb|n`@!d74{)GIA
zz(Q~Nt71}%*aGS(-`eWaDR0WjdbHJw-@~Qh5z%@6BbH{<a?<>?t?h2vdp|{pEKJAW
z5k<@HeWxmRp7!U`%fIWBr#XVcW1`hMVp)&=RD=FG58hWHOn#%|w(aPh<~c)&!;GlI
zdbe>n9KmTjSd>-3BVSn}RWiZ+xNYt8bO6%wNPmAgEvwlH{^Q;l4%jy*b-v@1_~|Or
z<qP{Vi#Fr#E2HTY=L7cV?J~X<6DtC#7NY8!!uYg=i|Q>jM=6BO^`o~8*+sI8%e<r4
znCwXEfXaGEg5qHuVF{#CQ;ub5urIHKdi$OgqP<y246~NwiBF7H;isDhjWi;Do2Q()
z>3-kij_Qv0T4x0gqqnzbVrn_42#a`@qIC7<k#73YvRZsd5s!>XoLN*E?9D)BDqFbU
zxy8P*6{~eDcH*`-&id%lRJ7=P>T#DS|IcOb7?Z_Mf=?VqOt;#{D;rELiu)C<dz#bq
z++3b`7wv~2%l2>8xU7fYW1B2fT3Wb6?dx$g&7F4GRX6vYz@6GAvjfw0I9#cPKCkLN
zfD$kzH`oph_xTQ2=kI3cg7=gRayd;Bw~n?tLa7seYo#7{gu6`^CJ;M(MeFJA{xKF`
zoC_b<ny~afn(g%HaFSl0OcoN@zPJCInm?Fp=!3#W1^V%5nw;a&FHDaO29LQml}&#O
zcR7QOxJ5hXftn8=KD2de<@%ob6LD$oI_*`?>WUKo817V^dfxEu_}*)`k6K4Z&fSsm
z7>5f#6f0NFA}+Y~1qc<0-n%E_qxMPEVQeqO4hgcA<^-(ZvEBA!OKGzg3ta5D_wa}2
zR>Ix>tR&Z*6m!_;wxgueoWlerR!aX{5Z2k4)5Qh#W9dj9F3S=1QP>hvbsXFGcB7y8
z|A(q8kB7SZ{v}d8MF~Yxk4h0LAv-OUEXlqO+1DwIvCSZ%5{m3=*|H7UnHgJ)eXL_J
z#?D~O48|CY;fKCY&-3$_dHI;nz4x5+KIeV!J?EUblTuO@yD0QxT#?oumjJjV_wJ*<
z{9%DfpV`@jl*WYyHuF1fTXP1r6IgswX2(a5A$4Wbi-Dx?Tb!kyT2^i6G)YUTm&X-o
z=1Fp(#Y8TE&m>Fj@-`(0?(elWo~UWxLMV~=D7d@Ky1FFU-TF3T$E)q|Er%rPizEf#
zvU0Y;Ev{%~aZ2YXJhYE~@^0qS_|BCUL4VD9aNCtK`>w@KrINU@u}Tjj+Q>wxPDgHY
z29X6MQb3oN7XX{@98`Ky)8>X*z(U>JaunZP#tyAML9(XMcXx#bFZzhwC95l+7O*2~
z<8ZiDWQ0U~UIw%sa?M5FO^FjZJ2xJ&KAiBLaMb<*<lDlog<t+QejJSNtoK^r_dpFh
zm<bllw{Dt0R+QL5fo*@jo2@M~rek0hHm}fuF}q4@A5x)nNw*zPsfbP4e>obb_ThBR
zGbm`*;4%FhnE)Ad__s(GV5}i!h8EztY}#bP^$ESe71kM0f5hI_WH-|{srMP=2%`@(
zE`gk@^u|5I6f^ur-!JxW%PGEAij=ogTbg4hjc{o5J6tdw=pDKDqIxP_ydkJV0<MYL
z`DMZq0#BAW^H{m1b?1f<u<}V~dUeq=4$FYaP}vZ8m;H`Y$r=H$)690)S3tC)q@+X#
zMIWs0G(sfUl`TH%E$^09x9>`h8+Is}e>7gMS=uUEBX8aOfC5_oCfGhot(Kn+Ba~D}
zTyrsT;VsUFijAj1!PAi*Sinw<lpH24?~@zk?6~i*x~DHNCb@pl4rV4Q&AI-LBh&~0
z`pNx}6<pX`jlR}DY%f)_GvYGa6v}ZI><=R-LOaNT%5#ZwPMo6xqv%tmW<bSmW;J}W
z=W`SMLdcr<O`$M$YA~cPaEC!gG+D@x@1gg8YTJV{qcTNy7H}Hg8BTTZ4ozAO`Ik!e
z_%OYna6>5NJUsU4awgD7Jy+TBv;ZjO4u?#6o>nXG8?lAIeQy(vS)C9kJjn}nd}r4X
zjPeu-FSxdh1?;LpX({{>b+6`9MrBQuwpPAJv;#D+rm=cYGB{fM?4ES7o^mTg51O^f
zdylmxv-T_P?nQ6kjQE}NJ%^Q68d}OnDyHSVV?xGup}qNs<>cibs$<8f)eR<q?m-T%
zB`<<lb?dtPk`<7ra$sTr-1%tqX9Ta^YIQ|Ld(zw`YfrrMQ&IVaM{R<;6RakO?=#x#
zpcW7sxW1pS>+4|~fp3MX)kXlw6}`rc-8JFiu9@o&mSd*yp}4_Qh!oedd|#`vC+p&b
zkb**3jroobp|}i7f}3#|V*51Po}v&%i@V>+f#V{Qo`=hC1IGenH$L3A?eCH<_a>N^
z$|N<GdA<wHOAolW<JTfEs8EOUOe2UId8hQIaG1hJu<}LzjvZpvpI&bU>ELNvm(`SS
zepMSc%+hqAdm#&5_QWt@C@H6Ki9F&Dbh&^%Xa6oF$NnTvKC+wAt(*XQx04z$5hB=`
zT&5!UsybkE-s`-UR@dPDQ&hY*z5<;s)JnauLo5l5yRM@?y7-CD4|i|DsG+8*y$rW5
zZ%m7f+D2#0s$YN(DYTL^O!5e=+xT>dp%==|p$|Ad&zMR-ZMPS5CvYS?39W&Dly1uJ
zd^tBsr;jsGe3QV8k}Tgq*W87T+|8R!NlNt1ZU?2Jp6k}Bb`AdHG-Hkv6_oCD$reky
zf44a}FYZ@wU;L}!l?sw&O|gi3Dehx0SV&JKdr+(RW|=1847=e&^&PQ#l-$n{-{O=-
zYg-&Mh_I|uJw-4lr{?g{^#EzCYjrNLE)mx#U%kNj@RM;#<#!y*^xcuOhQ6D#36j1r
z<Q(6y|2UGO^hPvRw)>sb$Z~t(42R6PGt2c<6VT-aBc0s>S2)9akW_XAp>62d&8y+P
z{&yLVNWs@>zO(4wa_?kC|EkoT$`U&k4&kI)^IdZ3_sdRdzs5JP<3lD|RvUqanQH3u
zys?P-L0E8cKkBX!{tWY$0oftlcSJWpQ;AaBZP)d!ki&XpMS%RFHpTUCfQ+3Jr)Dg)
z(jw%`EVGZx!jxlb<<>%Xz%M>rJ{5dbz$riYAtWDrH5X}?lFwg3+$t>!;J9Dj(L0eT
zc??FUjp1=$RAunryK_^*?H7)eD}mdu&t38X4(D}bbehAqGAr&mVTn}<B@hOo&%R#Z
zqo~0Fej72U_roLt7M_%~r2E^SBtUX0-HWVeId*BEJE1467DMLm^tk2WGdfN(k?XMT
zHs&pnk`%$fC7Z#uvpULBa*-iQhrSJY4cuyJ4_DfrEL!qM5-bKGp2IqUF_i#89{kDW
z0=#FpVoDqkgY!<%>zcRO?|B6fAF|`EU4F%0rgYP9`<r^#9UdK97B||MLx!fWQOag=
z+F?t^#1wAs^Q-^t1Y7N2MfBc%3g<j-OzBLX$m2dErF!T@>iipHm;Bh%iJ%jl!%cs?
zB@5gvQ)5j!0jWuP`^q%<slc!^%YCiPUnnD&lcL8`Y<A2F-3TLgmF?)8#hxR~UZ8wp
zp%Fh@lHFF<`*&sbN7v_Nz~_>x61|<Ul@Mn;Mjj*2#XhMGFMe?X8(2f-7}P)SEycT3
zrh-!3MHEdm(ND^$pmw%Q=B_UbsdA;&-S3uP$>t*VYgjJc&#Y$@dv-nQOHk}a3y%cO
z4oGyc%pHCvFE%tRsUx&B5PoT)FmWv^4UA%2UUalfQy*|anU}13rH|9ea2d}>A+{O2
zQ@peL#C#ZUSxZazFY_jr5nv`w7I@VY4+J4g-#mK3;;l>2y{Pm-gC9wX)%j{{i-wrR
zXu^2s`!9;a%)S&YP$oyd-()DhIN@l3nHjcdV(L<OGKbo#!p#n1ewM4w-IX6j6EF)w
zflC3~c}jM#yzyB0gOE<SDac5LQxb#}w@In~Sl+qa9?FCw)omR37Mv1JY2%1sD;sIV
zckO$WP?W-L(Z<4-_#`K_)Wc&^E`vjP#!m!7(?ub(75yFp?QlSz-wReSk!wA0oIWE>
zv668p1*lKf^(*df>I{ktR2F&Ok`IA<A7x}d#3OeQwcs>CZO3z1S9oz+<bMv$j_hAL
z3DV9!PCa#2`mib_r}KV$jD3<o9TgTUd9*-w$?XIaAxuj8hJR3^!3WfnLg2IF{J)Yr
z>$r{A>eY(Zow<uRbGd*1rE^VBP$W;a)b==szh}w_BUjhIkgOTjE76t$8`!xcCzSQ6
z>&zL$-O!f#&#XN5$wf3=f=<VUbGfWiiJA21jrkTy0Fgm%X6-n+JO;%Q=UjG`%a{U_
zBK(Wy9S8IK)tO9`8%Tc9=btmZYw;lgf246;)jZo@1eIj<zP0dce8-Sf!>B4M%8*;Q
z+}r!QHf9XVp?G%{6eu4ZW!RN4*Oie0GFE3*qOA1~It~;aQF7OxiYeryBWcJlS?46^
zZ93*ciOBA=Hz~2Z)F^Cm{+&CmjKh++SMm!OqSORYlZ*@8Ey_QV+Tvvq0voU0h$%Wn
z5)cp|xtd`8Q*?_$U%}DySm#ek=$kES^+B_vwVuTb{4tLy13jR}4fzwA`_+*aBElu%
zUW^2p(TimH<wiskrStg1q9p?>zHqV5H_sh{XtO^f$~CB~1E<=zR5f7P{VGcctKiLA
z0S0nsqB(TcN%C~+e<Fpu`)40{5>AifSnk;7QASKW2a+#-R@7CElW^hAxGnUmSfxzu
zR2N-Ozz*ZegzU2Sa;p!|LVs~rZ3tU8yIl(#fA`l9dVlW6-qG)E72ZkQYv>@Ka+IWb
zi|+8x3b*01URF1^x`nH<A^dXBpGG$<H%AzL+nUID78?~q-vLWV=~VBkH|Z&FOx~Zp
zEXh}#V`qzc3SdI`g*X;G-p17rwO)C$X>=r*??a!g9_YeT2z7nEJteAMBu9Z^x*NCy
z0S{hRKkxhLywxj{&1X6~(Q8zyy`3-mJ)*v?lbR&4@Kqo0YhhurS;h<L1SZ_$9cxv1
zK@6ZAQXsMmByBZ9Xi2rcye5KtvvNl2>z4jhgE<#+$m+*kdP9+`+-`y7{8v_@EV%r3
zoph>@jzzeFOf}Bk)|9I|gy4M;aPRS@`O)&tm?&qk(u13JJL&TM;`SP0%8V5bl*KAN
z1u86)!dkZA#ZT!R;5SRUE_mmd*|p4cgEuz!Ly9;1)~JIWaz(WFlKFYi7ZaL4M<tx6
z|5{!|bZ!;1m*_U2%Kpup<2)99=<wL`8n;w&Y|v58uulG_OI(-F3wWC4wHLvQplFY4
z`6b!hOInF4z%RAKMVM+!)w;T<0j=c5cj6&^K)$bn=lPQA@2k_KQ)K0(o@R)~37+gU
zc)mcdJh{0zsgNsp?`}1_1u+z#kwEE|)v*kO*g^-*H$h$_MyR`5-dH!I!T_Y&8F#8d
zp<$a~=l9GDflIe2nb{akm8<eYu^okp4AKNFJ(euG<DJC!!7C37q(}H0HMym!eHqo)
zN_bAF*x4d<ge$L}BINXI%_Fxf&c$ti^)()(*yA=qKJZS!?rMU)I}TEoid4u;s`X}Q
z|I{3wG)T~(SMk}+m96kq5<ATtnJEF1ecM4tIQS$BEa<Ck!aEMg3WN{hv6p_G($lAc
zMY)t!o|F;x_Z8x2UQoBJ9^mc8KOt5fP5cD^voXeZKj;w9W=*L0>#Lxs0ra5)?eCm3
z*+3;$tx|B$0Q%&b+Gdj--y00H-^%$zf9n~+klR+zy$2t;a?OKS#c<e4=kE9CByUqD
z#QmH;7Pa1L$V1WdTZnh8)KVbR?<HqN=TseIg>|aH{^G#;1)9fCJEO$jh{xU2>)L6%
zw2G3n^y?*eW0%8&b{*A*oK<=hO}oAGf32=&Ff^sdpR>2gw7)2JN$>L@^g5^sCd4jI
zKKq(3mr$zBky#Rb0b1kulrop%9)ktKy8;L{YdeGa)?UtR_%mlMPtHc26w~j%*K$BP
z%Ad-M$igUSRFb?AtYLkm=oB7xyHb!CMAniSbKG}Cl7$af>j1y}HT$Pv9UCjtICv58
z(EH)G|6I@L+0W;8!|1L!AAfyC<!%+jUgQv$W>12WFY>2?PfnY{yr_uNi`EJpGrNl{
zC``F3cf1qvA;kVd_*JeM^hIQv#<>$N8PhEu!RM~KD9>xEmj;rj$nCPQ@S+8bKd9jX
zI5*UOXN)UK(NdeSm@u2>PnuM)Ehfx&kS%?_`IcfBHc_(R`A1dLItr>v9z(50BLut2
zBE8~4YT+)%!n2a#ajUnH-f2>9JN4u3;8)cXBaT7abK~PP?PjC7{v*sMt_IS+M9h34
zLou2my;CM{jBYM`;J6?naOM5;fmhYi0FZ<fx;<yWua-i1Lz&jT+q5OJn=_8QOjs`O
zR*2=ENVD4NOB?fHfO>0lUD65;R(3>ut5h-#vp%`IV?=_}EV()%_x${RMVVv#yujcj
z)?-k0@tevrW{Di?1!)LU0_pEu`4zrf<HN%y#KmVy|9a39`v<z5DNk6;RPat{-BR?q
zP1)0qXo=~(Vgp9Y>!QJj#oH$}7R{R=b2-6dhFtS*1E-MfGWzI781<}dOTeKlhIAi@
zAlH*%Chx{Vs89^KI)QbqKWbj$)%scRlbL(naB`L|VYw%SqpdAttK$6D=lfbgFLQ4|
zZ1P9_I*M1@J0$!Kb@6Yv=VVavM>v!oX-n$>_kPM(6;~RBXXNn^voWZDE#7w>HC!$e
zFWJ2l=32IpyAEr;A!W4_E6BK3h%|GrjSHBgWbi_ceUeA6{NlG`@yXLl5#Qf9PvT#9
z_I)vVB<VT8ch;_U@tx?*r*5cpd3WuU)NOydfcJ-c9HyS}x+uS5^Y(l*nCJSai-gOW
z^}d`ey$?717IKP~EYsx#T1Y0f&gK8$!Qj37$`d`;&#vV>#`9u&F<URnc9qti4yJa<
zeWBs)e~_!SGOI`0I`kSI>s}KJq`Mi#8;`M;*WNDw55ZyDBRH4lFBceF98Svu^}JUr
zx>H)nq11n>{3Yd(7^4i*S=7?0P&iol=Bne@n|A3>fji&gO*1~32qyjg1)=igsGq+U
z-HR<K{z3UXq9iiLE4%XOJ!<~ctZ+Zz*N;U>q9{=r-tA@bplL+il$9t?l(aCSS(htw
zHA#F)?Y$xQ1*0kX5d}TeGrzJ}vVeHsavoe{4%&=Mig3C~V;$cOOd>uvbl;`8t!@ZK
zw>deai$^ErD4pq2oWfY3=p36t$Hmj9WM6q%_~7IoVxpDS&(ap6-01b!a(TO)uGoXk
zTQTT8wrsFPr<b*FuR7(~bzv73YJM;u>39s-=u0Ttlu@RIO0*_4)EJNX5xO*Qff+>Y
z-f$1uywjx|i}RB!)55LEQiVhd!->L?!(*nkwtTb3o1@qB5=#it>u*t6{sXr*Nyy$<
zoX}^SP#S1#2!(oVBJ==YiSVfiI`2YD35PF`&&j)0Gu8)N-TmRIc2Zk=(u?n}(&$c-
z^~{}j8K)uC4HH=f(mmIQ%WT``yT_iu8X-BD4p2RY@x{}tVRs_LGwnHXcYHe9K_J7f
z{&;2}?cL)zMx@vr+swZQ1Izmjp9J51I;C;=MCu}DE4*ty#Umzc_s$DG89*VXH~#7c
zW8J>~l!_0ziSOUz&TksA3k*(tKE8EDEA0u#M)JqcgWrFJb%hMw=}EaJ^1?*drohJ|
z=kR9D@gG=7uHN7JLvDr*E}Vhc*&k&(ohXg+T6~=YtZPmea|gnan~DYS0dd*wX+cTV
zybGH+p!*H#K+(2b^IAj(<KCcBNhAvO*4{L{#7CQ8g|D_Ltt%#|3;0(+T1}k+aui#E
zzuJBkmLOsb`t2o|0^2`bH=(EU%O#hl4va|OE-)43%sD(GsiUmuQa{uI-O?L&rF0c%
z#>2O9-s2W`j=2gKe^*ytztu+L6g_cM7H>9K3uRY4(;*H>sPuSg*>8!-zq#kn-y*LE
zZc;L4@6R1}v7{v1-%g6V@+AIE)En=sCE=#TJwEAy2asEB%{Cg33|1VH%PTS3!lr@S
zyP>PoMfWkd<%lAphs<yE8(p83(-HiXm*th_locsmR?jj$nn&1btPA0geIQO>(77G%
z<rk|e$yzI)nb9^e{VqzRetI2y`^sW>2J}$b9zZy(%NnKoEnfE})jFiXXVU!Nrzy3d
zG6TC)7jk$3UhZX4|Jv!(;3=hg4#(Mi9;Vr2^KUw!6t$vm#Ai{(8kbjfSA8(<7YZa%
z0YpUQ73;2~ML%VI?aI~ktl;t2=Yp|gBY#hKfv~5=>?=x-29=M$nHBr-y51{lq!Kb0
z`BlouZD&+fUd~nRZ(6bvLGXO3T6_F6Wytpe&(qZ@nTG0Sg)2`ICjw@haQ8qxr=E$e
zGoHhWo2bv#wYWv#JS{rgYmYrp)!p1DynL?UcDp?5uc%+})PG3q>&-|2cp8jNz%W!$
z27_zDGHMR<p@hMQGead?Xh?;$k}@6o-aiYRnG9Df^v45sMRqsn<BHL7WuBf~t%_Si
zHs#t21VZK9H0Y=u@h>@QkR)<@^?B_;CpN{!YaN6!7aEtN-`HHQ#T%Do>}<63Rf#t)
z-4Gu4Q#4=NTB_;SUN5LTf2Sd&9)gnnqIZ2pgKv~kf9s`iNn<irPcSt<eXCR&+y~iX
zMRi3u&$-TGpEa08CR`l4<|fr%K_FntFbZqr0f_)50*D%yHE#6+(4wf=_366a-;Y`h
z|EUGwa(Wc)w^T_RgDqyy_B|2*C^LRuAQb4(Ltk!D-Uvq4x}S?x9H)w7>U+DWgJwXl
z??q0BhGk6^2p9SP-Q5p9WyK7%s(bZL-%Lfl-Z@BeVZ+qr8)iT^<2ct>7il3YqRO*x
zctfF#!TSI?v7oBQ4Sj&^p`R5}S3;vK2c7s&Yjtr)E5X$GiMK&Bg-WkoZD-1m)irjb
z%uQxm4GWKOe!>h+l@R1spA|JIiN|)vvdF%sbk&d$vKNC-Q6v&|t-9L^(hY9+zOTZ0
zbcorNi%D0Dm*U6#-zq)a`9f(Bl6zh~l<oN-aP{@{19kR<Soazd-bTCs(AGzFL8nl!
zkmYi@+*d5#^IuH_Dhq=x<ef@^(TcQBY2ITd_K78L8#bERzW_SwY3aK|CL)&5#`li~
z!XGQHO*CtoMDR+)xWMW(w71vtB<Wrc^NtvocEC)01#5PdHs?$n-bSgRKj!f*K_)lx
z#eR#o9ORakzjv`39>>F85vU%$@AA6<J8QxwNI!$z^ls(d)TEKAh{5kQ_T5P~kYjz%
zl{Wf6{*wFo>gbph=aOcMTUD*yzOgP=VoBsPdHwBiIFI(n!X|_A62?|qr&i{LqFeQJ
zl$_>%UFZ~<5(*cHue4}WJAiG&KD820kUO^4Q|1;&g83)eqAXj`1K1YfjVIC}LCoxG
zb<(L(@F>*(Y6fin{;+f0+Tl=t5>>nwue^&gU)}RXAN%XK?R*oC?<{t|J8Da%{lM*R
zCDelbBsaZg8$(XE%Z?aD6E?M3k-X80i`NJaW`e6<1&=vp{3p@<cS~i4s#^e0Pft>P
zZ|_A%-^2F=f@N=y^y3RQpQWOBvCd;&i%*VJji9C)MwI#H(N^D%`hiYPUc5|{p??O;
zB^M852j3@FXI8XW1VZL5QqD2bw1qV@!B1my$?wQAV5iFAK`WR*54COzu}PUJD=hgW
zsUweLX3JP>kEzrVJnKC-45(%jHeuBm>XC)uoVM1S41;9Og3I9Eq1B-5Mf%CRjhaW6
z^EB<#VrgVBqs!0E8)i1V3t_c|AjctyPsHw&pxJzT?Xl`{sHkW1(b_wQ7B2V}aCG+{
zf*lQ9S{sPfNjx;ewVsRj*u&R&#u(kQ+h)^yus;Whw5a!4%wJ8Tba%5MTsX&M4Ib8S
z5ftEnt#%_1d)bAV*x6c#j5rbrrg?z~h8#+#T=Gc@AsC*#yL?e}gFFUk^Zr+w%D&qx
z_Su`mbKj3M8oe&>5!dQ>^=senF|M|jCXrgx1_6O#=eH&~;9w(=nX;GfdXj_f=4x+v
z-U2HpYMkGayC<W;MrreL$^9e<U*`@sEwIa#&^}V>(izSJHlgp3OQQ|XPoSgCiQ~On
zv@xg&?}XsL)S`@eQMstN$l3EW(<aNE#6qFVAUUSAsLulvu&5z77pJ(Bl7ByGXcr92
z&Uy(NId;M|svabgJ7*td$#s?_>3M8@ox?czIl&tEGj-APg23>I!`2hJ){%^yqhP7h
zJ?Otmv>z~d8Uok8Er2d;@=cSwr~W2k5QvIdY*4y;_cF!;qNUq}J91L)DbyQ1%gqAz
ztn^`(#D!cvarU*8z;3=yl5UpZ4P%Cll5gt%DJTntJ4F>gtw=2dNC}OVE7Q@}xkmxJ
z>35uB%(s!`w%inVL)(>Gy;j-jS;~2{*?zT-79hTl``f(sV-s($7(qf#NPhyR`@`@7
zzr3x}($YNIauSkzKbj4}SH&x%wdFQH-O4JYr0dT#Iq&1}jWXGX4*eXr_Ya1Xq+CL7
z;T?N0qBZjV>*r<3uh`j8Eeg4fY~cCr?yd4Wz_INwPez>ZEQWNpF0LYunEnj3^W_tZ
zi#iR^_@cnwwH(4+?-Bb8{{OkOe1&P4JSB4dt>>w)SwX16LRIrLz3PE*6WPMzU<(Et
zGRpCUOIfbP&8D$Sk|O%}5wR-+aksPVSYx;NZUgJ41_zF6&54q?D!~F`OAdX9QlXJ%
zA$3BKJRwjAdxw(%2x?{#cI$faAV6?L#)>IND0po3Mge*!K<~~C%Zf+hcgX=1^jZSN
z(lX>UV5<NcxnW_lxpr86i;CC43lCB_<hQd-?7~6!)wvcipLeOzfvtZ}yXXw}jE!9~
zOI)~h=U90{lDeMY(u_l2zD$(DmSgSCh|BGt>+7&MvPHl*?(-f>kK9HooCfO~#z6_A
zzAXY@D3x{n8!KE7@^0Q8Rd}s+#4#>+PfkdwR(iQ8>_dt>LU+e$D<{uk>3l6}y(?Ar
z$r!z!W}>HXhHGFjd?77xGIVh5<Q~JzM{Z29qo#^L0*~vc2;bFjLQx+!DG?l`$m?Gl
zqkfC8=Y0$Z&|0m;(s{0kftG+;cPSR?-M*{7<{T`?=Z_k#{lX#N-#Z_-GbU0SL(uNY
z+^n_N-)z{~)aj+q4m)J5TobWpj1qyQ`)P9z)i3dCj9d`7qyUc9nh~6Hpywo5wr}tB
zF4&C7%dv5Pq}1$$q6}C>=UsM|BBL@;CV#R13!4he&sR72o8JBHqhI#fyLhqN85J9=
zKBtya52B8JwX?YSfPekkGs01+U1NZ?j3+92_pwH`=8LCC;6j@s@JO4vj#qqEPhQ_G
zC7>&vLZqx-A>?qXwM}|(bE$VpGEg~W&{6;5T`#9GiN(4d3DIK0U7|#BczqF6vctL`
zSZCpsRuqKbK3fd10%r@DhygHFA0g{6|5xi~%y_kKq59IWXNvDI3&xsI?@x*=6mRIG
z1V7vQQ0a^9lu-?8NZ~l6hJQ~j$VCnN{K7O`?Z>2~gEo@#GH!X&EHCP5mM#+<0>As+
zgBXS>@RM<PMH6+M%~6M$`+}RLAkjtKZ2cAFx-EAmzl{!GY|d-f3wR#i!!1d2&6Xhu
zKJzq52W=daMwEyzOdL>ezDI||7EHf2`^{s1l{-Wn{ag^YNL-zYkTC5RSxaQiC^oHZ
z=Sv!O8Yy&3Z|IUPYdUJ9{wn@?FB)y<3%d#9OH8qydyCGHr5(X*TrVF*9Bl5IxYIq-
z@@PYSIZtM(SDrk`TkPQwE%4RB7pUK&!{KmATEtPOyyWrxt;Rb70+vpF95Dl5vYIDg
zM_;mEVKf|_W%d;eSeGT>ZNoOLG<T!l?sVP-_*wX4U2w33xxLU1LQ-)3eHpu_l?kX!
z`GiKe)maFxX}h}2*oVX1n0;JucFaEP?+9P@1R&1M)+`jm^d@F+t)2(!NNJD0iyN8L
zrzNZEZAaVGkHF<}R5_Vey?X{1rbiu09GGgZW?}s7GZqT%=2Y$Kkd$~Kj$5Ab79CVk
zak%;Zxv^+nw$cRYt4;Jrp{VWG)VUFHO?CI(#V|mt1QZ$~6=Ozoxj5y;#cWyH!6a`s
zmLo8cCI>1=-5%DnC4<Q}vzTgp<e7=Ch(=ZBgZh12$ZHNuYig3GcOFxE8ihI?*NUq~
zL<(8<*5UZF{i(9w*$hD?`+eMJi%hK}1<(b2{47RKtZYq#w}lQfYO12{Y9(gEjvjA`
zLN8CVHHq9;AFWFAbqeo-UlnjNX}iNibv60G1gCm^{aG1ECyeW#A5F7Udj=sEN!p20
z2EYz}464jbGZ0{<c)7K<Auq2*A)ENu=8&+Gc*_NFs?@_blp24=k64`;Sx<cXNqLf$
z*2;tu>UT=zP3F`l+|CZPc5^PJn1hCrqUZ&pI~mC7D0zF40^gMO^KB{DU;nu?cJcY%
zM1%$>Re_|57qWm((RzbhE$897$Cm2sk~`tKSGnfVr;zvMo{fa(^N(V_{;ERBJ9R~#
zk6|4%_?{VWw|Jy-C(xh9=Y}=GfVYSJEofuHvb;>kb-9i;9Xfq3<jFma*PI_u&VGUD
z#u*u7HIfZ~#$Te|V|o8B>g#p8V?X*-1-u8QB1DKU?w+;cy!APlS?=khS8s1c9#61A
zU2y;mf@r(`bI`$b7ZRueC5r)HC3JQqyTBZv=^)eyp*n+_u}f_Ts32UYqGtrRgq3YU
z))~a~fT_nc^<7Hz=(ysRBSvW@j!bVU0V{8=XRHETqJRxAtg*=Hyue?u9jIJ=t;;6I
z4mJ=B*l7T)U*V6rA}}RCmow(Rooc*)p?+07b5*FIspN5v;C^2%8VX$B521kr!T5pW
zzVc^o{9zPA$8VIpn0?e`lV`xygXwcnF5Vo8<BxlXEil~1Y#H4ejf6Wt0RD8wT)=)E
zLAde?Qvm7j$z^M^Abzvrr{MBum1e`@D!-JCA{IYI@Ae9U(E|o;uQ_%|;iLS4%UUG6
z5}(=(7o^ek(Bfh-8il;YLMvCMp@b%3BY{gp@$@|?42N%R8gVG3HB^<5##SYu%@9(0
z_lePH`GbVMvMZUV5G#+zZ)}}_f0zdBg7n8FM)CK@N}JFBxj$%?dFXAM$_0{ng-Vn7
zU$-M3Upf0O^ozukQoBp`=;lrn0e>Film1)!E#BXm2DI24K%Z;v!jPYtzpK?wNf(a~
zT(B63bo$0bgOYZ=(x37YHmjBCQ9@TZH3nryE;PIfKwI7y+-fD)VW8x$v=*AF&w6<V
zacoy!@CDGPpWh#c8_s1nLK5)MCfsHd2YfJ9od!<-bkN5xxR!1Hi(A`c>=><{R=Zz=
zo**8IDBo-=C6pHZn<l|E;gCBDa;nmK6rA2Xypk&=czc13!WUU^Dnn^NEaAqC*n3FD
zO1iwVzl(l}TBpbo6)HVdYySQ(Zp6r}u6;n6p?GuieX5xO!?5yW9S^6o?KknxpA`zh
zzyJmzO}Jsv*QoZ%lJgSssvCx3-52*u0>0E&D)#~wv_ae@IgB<`M-&(olUcO_H<Xp;
z#&&?vk$f*^t^@0=VvbQ(ysW+)R-TV`CK&}%jd1rl6wgR+)<U~GbXY7d|2q$L<_+J4
zW5@a9uRkr#n34%N7y2bMfF)4xQDKVso7_XsK4&pC6|j6@V==I|>W`PwFv`+Bw;~JS
zSp06>+l(o*c%#khptoGm1OAREl&&*Wt!wt7zGX6{>f|*PjfTW$K_kR%^KR<Ujh2jc
z^WUEs2bvl-aHD~Ix!)^1n8xXl5>LU6Wpa&Z3F7%gt@1Luq|R(FM5t-lUILu_N1^(}
zdR&-+j^COAp$HD;?H5Bc_}2)F^Z%X1F`wuUrPjktpOu!vnpNP}tp>D&<hf6ac<EpK
zdMM`Ui<iip4Fg^$Ju!2Z1vV^Nn9UKboVHVTsxh2l{~3k@tTZ7)k!-Ju$IIep7oU6a
zdeiFMvFn$-97^WAT|m`Fz#2cHI!B9s@$-@i&-x+=&fo>R1W-EhW4Pdgzv>-}Yg)AM
zh1;UYn{8gRaYm-CbX72gP!FE?E@56XF~*44ZGtQxX|VZ4`HE3oUZ_222yb<iiJ`U}
zcAvboRD*SgcPS><d=S0_<b3{Tf9O2-#R)~{=KY%KnNKq9d4pbR2Tx6E9k%grAes{6
zU8<5{W3Dx(-<vJz?-tg_VAyXeKHbi2(l<8Ts>`|6ENSfod3=dz+U_85bPUuhh0Bka
za`dk`T~~#i+9KRZaeS5(mO=lS0aj*60+pYUWqehJ3(x;giPo8qMoye?C`TfRWArgv
zUCRak8?LLK_r}Ce8vda<QHKr#!(Z*&O=fkFnn1Mt@LfxGs2R+@iLC9`eQ#WmJ&2#@
zSaplyKr=0n!ojdIYTerOS0?YE8xTJkWaS+IslGd~sk;(Jw0?H(q@w%CLZtG>)xg75
zy!G>;>L)?l8$U_H<2!n!!HjK;I?3js4Wf!PbJ+gaJ_FsZ%|NzSTE1UZ7M>wa{d-k?
znd#yAgWry_&o_ID^p}>LLVRngF~uA+R8GdIEo{;0=QZeel0~L_)_6}3gwAM$dhKup
zEaW8ARqt#>*Y0jljuTV6#)pmUcBg^ky(T*1+e6X2l6fs%&+GQUkN$xM6x=kU^@MQ9
zMXuLvuXf-nC4AqCVt;Za9lW<p^k)09u@~O>?hM)`GJKrjzN^GpB|3wqzuXG6<1_92
zgN2DDDsugyo9UA3`$wX`c%I@WEn{C{HwMZwtL=oqkj=38xEDjfpXBw9oqDwn3=utV
zg}$n7_A^+}w<EgF6OXD@-VTWta0>MJuFU8a^j6-E7kuoV?#HM#Qp7C$Iye>oU=eJq
znx?x436e_w>#o8x$Qy=2=^tc{-THG5o65iI-}3b!+iQ*c+K{kzXj5IysD0&BRZ*2|
zj($}{|MiR7&`yK1qZRCx52=3rhJ`d?ci$BMZZ|S$d_`cqml9BEL33%iqxllI;lVee
z#((g=e+R!*TRvKzm+sddju_vbli3qip80)VR?+`awbEv$_Y)SADEz=F6{{Vly0eK)
z<6q)zuO$?Tm&Exw8e3SR@sT=wRBXlS3BF$J;KLtNVDXomg18NlJnXo_niMTF?#bOi
z5&}NtJZb6KB}G~!2ke|S^IprJw#lzNe-5SX;jJz=;$5}>zQVt6l8%i{cx<gX(b8#%
zmT~dgnV8by>oX8iPPa!ilwy|V_OG)oysFX&cUDAg{vFiV$9#q}tkmdm$>NI0awP9M
zdL3tq<7QiU$HhIDE7oJ6uCZ{l6CLlUkznb_?Rj7xkN0L?34{>L(mv1z^7X9C{nztj
zcaWKb!_9vR7?qkbeR4D|-kEbfrE>8K6JNfWSOVl+_;cL`mk9Nk-bdq~?nt4#j%9hr
zQoiwv?fCG%hXh%3B+|M5aydlX4~g?R6TSA}aa*Q-<pcnxTIoC8Kg+Y4UJ>!-_MhCn
z!fSi;c!xyE3I(Y+GwV02QvGC#EP-S>WWJNL2><EZ!!rtTkvX~t54$IyLIjiF3a2k$
zB5zXgd-77YK1_b=k?+F)kIaG^MUHVU!|q9VM(rt=UoeOT$=7R^zafXn2QJ6(pJlR;
z5~@ec*srV|{KN6!nTFo}sEHHdfqT{pX{E3A>x64TVY-NxC;FcW_pJXhTn`DA#uU2v
z9P{2<JYgbuSDuY?e>&7L0J!+cw&%ji?05BR&mR3^3#XMGsCDW2V3YR~C&U7mzO{@>
z?5;|{*?GlZ?|tzH+Vef2;`#@uE{-!XBQ{9@)XBrlw?&>-@F6uns=RT!Z_A(I68%E?
zcX!_f-bD1C$>v5YZGD9ktFWUel=hyh5iZvM{_y8LjP$>#hhY0~ai-EiR$~9Fg_*2h
z!{#P)_1LjlZ)7geqfTvxh0p$Y*MH!;#BX+-LQI+q`p%r9i8ic?x`V+odng);XkiN&
zUHH$$uQ%!_)Girnv+b8zidK2!a-WAE(A{m~adm&SosV_;F$15{M=<qsP$CA}btSsw
z132P?%*}rcI5?G!b9t`9MpkU^|Lav0ddz3-sJ6#I3B83)&~x2gp8NUGzFdhd$HuJI
z8jo<)(2!(^_~v=x;tS-fmw;A(ypHUdixXYec^(>jg5?N)8fAsXFLot;vT1GUcvZeX
z)Z14|dFUrB3eg^2_MR}}Zo5(a6qJDpM2gN>l&hsy_#ybcFX{bhDta+`Z|!}T3{c1S
zW_gKIEef_}p4O(mYL3X3J<iN&{4&_IxQa7aB5<>Vw2lRm*<z3T^4{x?{YTMa_MCeH
zb9ev#_`kClDvl6AJKxb^q*KaEJ!yHkOA5mkEt4w;9*c#Cds$=g31BOR-Zj46m3|2*
zrBrm6UX*(HPvX@vAKz2|t-8`U%EEJQdC`^xCo6$l1i*LW!j9?Pi2>sb*61?-&Ovx@
z4zdf6v=3_LSiLzE;uL=9<$jO9n}FbltO&Uje=-t-++~o#L~ppKhtf=C1nktR_aozf
zROUT9=dwNGh||IGcw+!_YY2Y2U3U-gKrHd6mNn?<{-l?J8;z`fVF)|5RTzmqM)J2{
zFRJgqdQnsRznRq)$1a!m+p!>4H<lcf2}*09IcgaU#>r^GHhBHqF<<%1{~(x(8p|;s
z$&r_L4zm8Of>h2z`7=0%6rn~wj{^8R4pyO`{f6X(0YRCupaYjDBg!3G&60Q4?*0o<
zcMda+<@8d1{3nC0D5|mSh~?wJMZF9U!Od3nx}L0LgbQq_GVWi_C%-rF;RR9CgHm*y
zVVILC5(Xk;H969+h4-iS?8=9*Aft;J8$X0c)s?q;#Z#!2Qs7h_HH)i%>RNj<Z``^n
z4|(|HKh@Y;i&RXRED!IrWo*BtGsbrr;vHW?5&T;M0$l%$_`|Ke5x)nW?K-I4lNhNI
zkm?rTE3J;dcJRRC;5#e`XKah|&P!UG4z#Q=$$)80oZ}Bz@b3?NUfA^QK5laA2$*<B
zao`F!s)Ib$4h8?ketCCT+pJO4G!(It&k3+T_h(>l_JScbxp(&esXXw(F8Iz-#LvGI
z3_Dg`-c|iCuU_SHqs|?~?-FqKS4$fj$cvR>IA_?f<CYm5=S^I%4~(KxrK;=eN$+yL
zG{lK=8^J!M!mR4QIzhYdGzdwwhvE0nhv%+;s0ylnPFCG_F>vkL;mTis3gCP=v9|`U
zYg`94&!34s#TM4$h!)lGa+%UJHb3lM^eAnHA`ZHayEW|ovPZkQy47e@-d<iAefz(7
zp@JFF?KfCHswIP)*>9O#%O$Ms6-;{A5WO_=pVxTry{3Z3d5~%U>_%xd950><pWu@=
z1t&jlDs{iYKkUD>amxtzRok-$)`9|?69b~hKz|>I_#CgXeWRI3+$a?TAiLLZ+S4q?
zsTPV2vd^l4pZDx#`=Q$Zy73w7?!AVa=%c-_$BAkxLNB^AWbw}aRHu`kGvC<Wb*C!1
z2>Eu9rea$xzO~M}M_v53pK#v#wedF7SRt&gJ-n{O4_!DqIA{o{4GV=kU?JqWKR1Cc
zqW2`8Pr7hW8Z%o*MaZpN5roPgBO$J`wB$8FM+B5Xqxk{%lk@5#pWB-vRD9cY$JVe@
z^!E<uEv!Z`wE6Bk<BGB4FOBsZ{d*ts)}~m}O=-zS4I>sWe{vtuDRU#+VGWfWv15Ha
zCLB<!tQxL=l;*5nP!L%2ruV)@7@ABtiMG6$+zt)pyr!Z==Wrn2b88uWXjpYgv#s%>
zD_}`MpxAgxmg2gPAzn-o$9#Z@6*VxSxOzlJ<!E4MzS&o}jf_D^#(0Tn9%ZWc56FFG
z3JF|2N4<8?>-*vd|6orC6g-Vxo?TgorJd-F6;SqFY0gLyKB&)?nAZ3=(^$A5v<6s%
zEd!h<RgAb}Uf~8!*COQ9h$vW~>_5BgH*~BZzB*l!2WtJ-=^pj&iczmim3FV;P3qmn
z(l-J}UFSdc+@3plI*aYb-xHA4Hep-{hvEP_JB$&t?1h}Hw*=Nvc$T%nCOxqG|CTGs
zz84fE!;MopD4?;%_H~Zb&o0t&^O36CQ?tb15%%@cH$g_XGqz@g;X!vaz};%Zf8!nB
zJ?7Nq((SSD*&F|2PVS1Acj484(ve;DRVyN``73TVTF`RI_xDP=vRpmxBT>KcJTD?Q
zQWEFct>_LUFY~^7$nH}}*ydM?x<vn<N$)Z1V?O0*Kn2gfPJV5ymBgotd&kE=cGFGy
zJ*qy57f<H~W%PHU7y|VpA9BxxEw}m->Hu3gU^qwM#&;4cbb?jQ&wS{y>M9OAE?~$A
zD1SO{>hK5NTVoILnsn#^J;V>j&a&=JGj{`4a7;@EjC>A%mNHPas0Ny^U;1r+CxdmN
zCO*S<3ALE|^-7XdiEpGlXi-0JvLui}z_lo?fBOcV+;9k7cOcEB07>U<zN;-SVnT>0
z9-cqmWP2}^o6D1s-ETK<mCK}qec06}m+wa5@Y$3Dn$k18FYPm~HI@%I-x+0jl+;YI
z(S~fIK~nY4@@x3rYnoW$5&@I!a1y(yNbhn?0^$c`;R%2(B@884#$L?WgJ>kZ3P_i3
zC|O)~KQoA{vapT(Q{|;K<<J$r)xoS(j(ul(BzVNKONws+iK-dNmHsWxY@>@N6Zm*D
z_m>F(XsxJm?Q34d1PjRx=$`_opyYAI)nkiWq43G2J7wU}1sI&P=+_z_+WDt)kje#?
zvrQ>2mb0n*bG^>uT?NilXx<itNgEc#ol`uO1#)0+vpyiRDz_()TZ@G_0q|&VZD7y6
zfVGl!|DU3klTiZlbK>S_8Q3d<JNQ7-*lK+BhKfncHIt;Un8+C|a)|`GeNF2GyvC`x
zciuTs&Awzo*{sKnVO4McE3}e|Y9+#0zuo3K%s`F+t1SwV<n6#@EZ}TlKV+*Tt9G})
z_W8Gof}Fl4KFR;Zm&-0oi1i!z{d#_y*D^Vd!sWw_1T&UzdIlzroK^bK$!POoI(YOO
z%bA-d>vsmTT?=wj6c;b%twu}mM3B%WP^xi@9GH|!pW<y8q9%4RHS`de&RJh!1EW8N
z%OH2FXxz7}%*)YURQvDutO`E@d26s^SdhG-XkfQ^K^}0lq6Kp5eNV2zNRHc}l5L4h
z=U@Q13zIr)Q9XgQ-q9k2$5X?%W-hK1*Nn;^3l{YeLOmZI3P$f4o&~NR-??83C!L9E
zO1qYpE}vs-6F-uC`gZdEzV;1$6>ebotUsGarB1)Q(vYH~b(tyYvK^n-x5|x*$4Oy#
zTOM_U9`8IODQzabig`7jHj>T~>pf}6F0}XglT%I5JzO12xjfH2$w!{OL#!27eF!|-
z7F|*G5&c{0n>?8h?$^^3%I_aA>aW<ZABr@cU2;q>^q4F4{M9%qzOU(*nBHZdnOX$Q
zY&5i2<x5_zFuK3Z@EdIkfgx5kz-R-bTJ;OQ*%*>yH7;<ML0TFvC;fQKwF8YiJycri
zqQmOI_t+}y*}BjpsoMkKp{A_uN4f-K<z&ohzrer@A?J)RmiW42v*WCBC$4e7ORFbR
zO5;X~5^Ve1tsNh%&8yaEJRbsZ`fJfW&UydUh1S_Ai4@~qntH_=7;4xa8@nI67;5b~
z2ee-*W&cCivFyz$=eAsj{NlE%^8IMNC?=>`6!$A_Ez#$0jxJ)F8R5o%Yb&Wc;1_bU
z3rJF+<}z8LgRS^XGHrvGuEj1kw~r<O9UoF=ro8~j&u0DH#8>`yq7C2bn}sx~9np2|
zHxgSiKbSYUStG5gLF7tz%EowPw&d^3;=(H`Z^O`wKorkD1IQG_@&>v{udxifYU-M?
zp0k@)a6HJJPyq(p{^dU%DO1;%$opO+-szg?H3GxSHSJlZm1=SG#5-zluEjA>p=sr8
z8HWcv%TMuR`(5L6Orn#eE>u76lO=uGRz`NB`t@I|DVCF@I+nV)=WT9@SvLx2V`v7g
zPio*AB|ND8>O*J6RT||--ze@|LEPz{)|4Vm6K5Ag&4bEGAFdvL2xV(-uBfb>g*EJK
zmCE&P?-AM;97-Ej4uHtl`bkG~H`!ZFgMpRi-e&x|L)gMxV8<erWZF~6UY@_>nl7AX
zAv{zW!`=3cC}OQ!^%UICgwqm@))nE-y8V~0+T`c~e&zC9oJdRlaO6PiPPg`<VdVpZ
z0Z5Iz{QDaAlBul*7!y&917R#IP8jaJ^C#OQb8E6%&J<9j`@?zk-n$l>pZiOHk&0F=
zX@BNQ9(jYi&;)CjxONQFiZ2VTE8y*V{f`T0Mr3Jx6J+{N6n?|};wCbNw_)QaX;12N
z#>5&r364vLa4Tun-84wrzVYHlz#hkj>X(EjJuGa(3aptf9A#JGUK@lgyb6^8&gl%5
zM&w-|Dwg5*ULpZZt_?-rBR_3_KBv=t_#o~wRM}HN7P%z7{lMVYsn)(w?XrQvms>%Q
zgFn}?OpT9VFgq;*KMP;bJTvI#7}aw>u|L0k;-=bBGcC!zr;v1>H)=wbQsk(I34NpA
zGW45ZuNF<SpxM7*_eh*e>mp{i)?-%=9bj49-eOuTknl76*pbClC*o<Cd!tfHH20w5
z{-Z1vk2B=`X!Oj<D9I}lRfd%<(csrF(<31*r=H3(0n!`WWgH*4&}>yp#MS218%=vs
zR<n(|B3R)>2Fa+zdC9OtH;L^Pj+AbH;(!f#1TO`=%h*2ed--66&oVtMq{qiyf8y5l
z?mBUQ#(mc^dv07<vhZlTLK<-?5h%>(P*@J?XTdaQ2l<4&mU)r=90r_o9SZ$fz_WIN
zafPJX<C68wg&O9Pv-G93;GDUh({c7MQqN`1EiF<FuRoOXj$ly=%bQ|RKL~5iA74hr
zWT9sC_dl2%n|JOqN!nZ9qQpM!{h+j%sVz8VI^L<r7qZo#L6SqB5U(1X{TLtj1(M>}
zf6p?~3;hN|avGO1)v7itd<gOr)3+FWXvDqfT;V>z1NTWTIXBACK;K;{len)-<xL_e
z@eclP%P~@A73U$XKKq*wC2?QFvKIV5^Dzu2Nz}=M_Y}9bxVZRRa$!)l0RN^*nQq+h
zX62l5UUEd5R3E5c{6}tPwUO+R$QXmousxU-l!ZHVXtA4fBTzOY)zi{uZv3BJx}7RP
z;5*4fYJ_z@Erfkj1&6mx0nC**#-?;b!SA)rL2Sjm7vEoOI@lC#Wd9_3CB<RV=1t_A
z6}Oz}gE1REyqJ!SbJd@r1$5KigBBgS(?NjkDPH)6?>`6Y?mnyil4-<yx&P}}7Ozc2
z@@Q2@qLkYmayko)&C;M8+@iKgGLdDC)9!hMweN7}S*{+T!|WukvNW-|NnyHx7zWRj
zbD+hj*5?)NVp4RqTMMobv!ui?mHM@qe`2sWtaR}>(B!68DZhT=L9p9t76dTvHcOn|
z|8$OPS?ah<p*z??1}!#TDjnq?oTi__8F^5v>8wbmE@I`$i+s)R89NIZCn4qm;c!x2
z2Xe_yg5X*(LcY@t9yESb9<;bBqJZ8oj~s9_%@4E8asZv=!PP<7J+SK;E?u-DeYG#f
zH)@`JZtT8F$(fr!5FCX0Y!j9>tm|Muj@{MWEqiCJyyw?|P@l@a0@*OJt-EI0Irx!0
zGYILFRJ_-qx=9VWo<3UZiI;=J%#y-1c<O8VoNlo%!eUqo_|R|z+%m63f2$=LZt)`<
ze|_W;PUG8*bb$dttvPzI5_9^06uX0S&r-wWy7#$awt41rfarh`pnorBbQU^zqH*!~
zk5!AnRhjVsit#Zqdh!ln`zOFlG56k0%<RV;ZctjYC4i@C5$A3?QDBE|FqkjYZO~no
zf4osQC$XA4{Yk8|IKJKR>X*f;CEtR$GDeZU7mKC5iC=Ax;r`63nLatTx?wz?|0Y7b
z0?KpgauEBvkj{l(Xa3(qaAv!FWQ-q(=w*zN8R;bras_V|m+My|flEu4`s)b_FYsgA
z;v0MwA~q8)J*M1dDK4)oG75hLiwQg3(_HMhJp67-?};ig@aI=)Oc{qk!gQ{8k=aG8
z%PQXcg=PKsX^4B?XHP5*Z{5L4v1~C}uhMQXL0X|NkkG(3>BZ6QY)W74h~Ve$!J=+9
zL;HIa6x2F!PLj)!-rzFmAWhpHX78irScdz(be`LNZy6y%*L}Pa6cLhp`~IQePkRx0
zZnlu)(S2K#4lan)?!7jgY;i?SD|RHi>efMAT$HQQdhg6LCpqt>#65)~jPA1ux3iPo
zX=!ONq~Vo;XGl}ri1(>m7OqP-wHK%6O^*lb4V@k277>Z;)BU2{e4*DI<ix$k<5eD!
zeO=RheI`WfVPgID4q*4!3tEH{Z!_LE<;Fc*T9XqsdiYa=Kvt9I(S1L3=L>h9O%%#v
z<j)$(jR1aW5z4(c<Q*U~?c>$Ut|M4LXZM9_>#U#q#~{Jhdrs^7>l(p*wqzYVEgTI8
zLKqbg&Sk;zc=2!cg3<$5f42ff^E}-+6^-AE0ADhV;T6fg7C~YHH^XDKpIo_~?CoOm
z=<eg2cdtLeLcNz&%fw#{_Po)Bb0)EbiGVYE67m~@w#4e*q*AeOR0DRiB0amC97*<O
z7ISnla}`tq{E_M-Wz_HuKS1O!Dq}9hf;zRfTUxPX>~~@rY~PD)qg?u+xCcK=)N=<#
zUU{x&mV~9<1&yX{hI@T-eropbAbUy#rcX^)Vk`;bwKJ!|TWbrSZ}Ri=leB<-dKl;l
z<?LG*&Vg}hwcL?>uEt-njv^LmO18-?K~R&?r!R(Fw@RyRRe|}&6|*Mi6$M**9^vc@
zovM4)j3lOtxCb!&by5MX#y8GDx~3m0fO*nwPFW*f*+93tnhS%a|1LET-spbV;dZ?H
zV5jzjMsQ?T0epTcB7RJ|Qq|4+cR4l{CZ$-#%%|6b$h$jaK{n5y+(tEEB*B8z_e6rY
zRQT)&e4$lE-YwZnRR{!jk*c<lVaazo4vxiVl~#|r))0}3Mujo~T75H0g%z-i&=!s7
zM6?UE0%S_p5_;?sSqCqLI|Kv!G0_$|(03VyJB)nn_&0&_4{y~*P=(|A;vxIY?(EgZ
zV`J9$Mi07?Pk8A{MjjohFGZe-EVePLKk>xZBmH-KgE%I>>9d09^)MMklj6oi2x-ip
zOmqg;ntRKPz6jAf7tV{Ee`rB-vTJ$8Cm`B!<S{qrmR}lAs=dod^~YaYfucii#yq~+
zW<4k$<(gg)y=>4RR_67~M{KE@R?jid{bDi2z>fcIS{Ppk!&JV5s9TCHg{A;9`GF;B
znuO-ieX`Jab5HVrhRPC^ffxeZm|dXgNa#Nh0(0M#{Jo{X$=j1@7AiI=y2JOA9tB2x
zhfJ~qUeLw^8+L!rNMX#UEjQbZ<l^k+rO?DfI`jxZYMl%Nt54Rulv1yzOux<+cgOq1
zxWppI5ncp9&iIXC-i}`7D==}-eLhzOTHY7Smzv{Sf?a`K0uKRoqr1w+^*skQG=>PJ
zUYu)l)Gw~j^pf6fvcOlM<#vRssk%`7mA_N+cVA8(I#%@N(5`9GBX!T@{ptK)byxlm
z_4oY|B@{|z38j)<vadr$wk%~|hOA)_p)kV`DoG_OqCsRQ%h<9tA=yTDW63^@L6#Ye
z(f2iYdoPdAKk)T~$Aib?bzb+Ld+s^Ub6(GTk0>o$DLej1dx=4E5-Fnp{$=*w;S5of
zXy9{)U5v_Rm{;j}7NUGRaI+P>c%NGqZ&?(inm%6ORx0d~C_B&_l&{$)%mXer_ij&c
zn)5<Y;b9TBIm~V$8<llMiDCx6_L6ipO8&5_tT$itm1CGp<g<RV2{TG<I+C5BQzSiT
z#ttJibCdo^Uw7`Yd8PGtV5FB@+4fkJ_K>r{XXY?l^7|~-n)FhKN12&-ILIfir{^ox
zjl9h=nJ>v2W7t_rBqy(uGr`8w+V1CgcmeQx1&B4t)aRmhQGhlG?w)P!Gu!drS0<N3
zE;idZzhY9b5;3Igp+LDO_Jttzbt7=l1a5J@Rf1cAKF{K@U&GhDDiwM6hNoe-==6<h
zI)4Wl|Naoxz5ca|?~FX8;G=mCBAl)7_zx!@_I6hx<x)_|T=>=Nzb9#<WTkq*9t(Dk
zuGz2W>b-|Ru#vD0v<n@s`tBsi@0~5F>tz+LI_LbGr7Mg>&BuaG+|p8w3J6>#->r&^
z0)~*!{|J8=5eVk@n!RFiH0Bbz_wia941T9v)T-@fyujJe`Y*Kf4`wg4-lO1M9>%QE
zp(`m5f8YlrE~KaiH2jfNi|!U1JR%=+qQKMpa+$>gA0`TFJw<!-gW3{d;hfgkCVp%&
zhp^M*Zak1>l!{@uEfaHYu`I$M4J`%K{8-C=3o`n(XE>_gYS75MuFn8tWM7Uyo?-}|
z^x8mszb}&G;><zlr$5x?<mMbI?ze8=(odbMh_g+<kXvV2RJ(e1tK!I8?-06|PBk~%
zhIWQFw!R0B!~`7g!kMhco0wTla~Dg`t;^okcaQkJb>V4;g8QEi$Lv^Fk$*84sNk%0
zY~SWHUw%=-R09~PlUJdG{)|djq6Dg_vTR)1N6!7$J4r=%n;DF5ol`N!RhkA$hr~m%
zEy*@!NIR$Quv0N_yDv2+)LiHlwT_PM>m}sraec<sZK<jk<s!7<Szkw_-xm+1CjFqn
zzGq8|*|`!<7b*M7IQ<P2?cU&$NHP-e=Vo8f%n)u0D$BPT>3zDMq&Y7h^y;(b#5_Cs
zRl_`ftAD~(4VS%kwH>x;>{XDVitXjx1Zxbq`)>afB(yT&BoxF}-dt*hL6^4yBNGRF
z#{Kmp`IH*Gln}zswEX0!g+u1;s-eAZJGh7XB>qfRzAZz9P!I1ds4NsxXq`RKUhDsE
z#^CO|1y-(@z36QNcNNHK$t5N%@0^&iFziywoJR}OCX4dlM&B+rdeq8HAM`MH(Y3Mm
zb9xeuRq`wr3|C_cOgCy_==sS4)-v*|z>e(Da@2I2ZT5QIRrugIHs?~26OSDlD~ENv
z`Y>X(@Z~IPeO$7_7HWS6D>J8;KElQkXiKLHnkpZzax3wXG9q9v)B0s7c&SJan3L1|
z>M$jT@1R{n1!h<h%HJn*eG1>pKdtH5X0{M_^Iqmh>HmB@QXG+a_n1GkRba)(u8Jxl
zY;Qzf6K5Bul<da{eq#2k`q>M8r_=MMPeH3)m=M<&1Uq6;M%ODJy@*wY^iylkl};$-
zbYYeSY@%gPSWPprC&xr~Rc(>j$tNywJ$|9wzk@RxJQ*`!)8t+dQeAO`QX2;{(fFVb
zzJH$^2P`Xt9*YrUcyqr&8k!OE%G>Z5v7vxYpFzGvakH3_ea($+`hj}kD)>{OoS0)-
zkrDe=&X?MYg_gx7$H&+X%_nIy_@>t;eHrV~q+78d>-@1tTa`*NO~!koandWf7>D$J
z@7wP3^K}-n5$ohk)smOJ41Vce2{GLBnjzI}H*&|E$wN<{cYL7eX9|EiahTsX{(ViJ
z0HQF+eI;awZ%1Sdsh@<gEb%rRH!cO2dd)UCh?`S0@JT!2X-vsCZ>6R%2a07CY<5*n
z_F!Y4=L}^-7=y&Fti?U+3m&MRIiyhM+4AwLwixbD!5m_;2P`atNLrFhD$g4$RlUo?
zmm(M~kbe~u)V_`vi}!Rb7sHy2*fSb7CkNNb+#x$RzmEH%!9y7Q1uGf-9n!fLwFBGy
zv!=@yq<@Vp>zP|cG=og#kWXmT$=hk{CcdEhq$b-`{eNCs`GS)=Mlm@ra`ybEEJoAo
z8OJU@yg$S@dFU$l*+HalPegAf=Lk<kFxThG?GjVFY|H$IN2lV_7#!q&IH^gQ2?Szf
zrJz5x;U4bb>5~^#zAo^70?D<@<hul9@&KTrSR8oeI`2pFKVMlS4bRF0oxY-2=j?hu
zUEDC^g`~preOPDJ7Xh5evI$)zJ0aT>C#}A;(s52$?ZvE}+}+$)CzIlf-7RwphJJL@
z*0eZC_$1o}yc|;I0J1g>z=+tN^8BmwiK#I{wZZIXGu*Pfv0JpqBxb~f-ak&3jxi9h
zpm}%Vv6$B>%jfR5Om+m>fai#0XBoKJJz-10R1jtvVm)3tP$kI2=uM@e#_qg2w(l-w
zvMbv$4-V6^+{mS(_Oc9$^#8|w^P!-5I%lJ?Rjjrp+7a&AB96U=W}9=p=GCYphs}Ip
z22U05iO)oPkDPn3ZuJ>qnV);QnGbq_qb=1=CXh(fEyxZX-O`r{=$6h7jucPHteu>=
zdv~65D2$3`637{zr#IIAQ-7f#JrK2r`_sVmaYNw-L&NWm0`xM1yi8JBvpEjANt)|h
zi2kQ#;vx$s^5#XVB14aD+TR5-nyd1~pZ+W*P=&VZ-s#9%D*dwYLbVE;LNgM!6(d<2
z@agj@N(~TLuk6LN&;K%!i}2!@OCz~u$>La<El29O2%Vf&3qz2ruV(P`0uDltt8Toy
zH=%Cr)Cy8;p_kr>E{Y-4g`3xs-iwUPTshR|g=5D`O<Y-P!ur<qwc`9!K{%x`F9vLW
zC!sfB9`$)g{8)%BdF5J2e-C(PDXD#v?uWM=0q_JKM_HDgbL(8i{#hUUcmo6<(=407
zJ=27z;T~zZvx79%jiv9Pe}eevPcU@U9-7XpDomL2J6^DC2rc%qFVwla@n?H@k>1zJ
zy5tNIPnB9IJ=Ak%EqTk3obj>>Rz1=vtwcTM#a>})#K_l!`>vXxMvuK(m(2%N+q7MP
z?L4Tv9x}VIlnl8|c8h4~B9Fw{AKUxNLG3jf_<Hr9*L}hx7%oxWhL~sGKYD4P`})vA
z?0p#z>U^W*3Cr}Zbv@O!(u(dV1Tw8ZAB<$VEnwvr!gW!`LBEcv#YmbvqEGmO&vJC+
zvTjs3So)FW=#W92&WmL)9mfX19Z4oqQ7^gPT=-8vpit07+B9#uZxKduV!F?o>ioSH
z-^bGQqNEP{H(X}4cz5w6`tf9+ddri{_~Ze;)vrFss`+hNbj&4(LZm`?BkF}2Se6U!
z6#91jODGjh<*Bz*6CpWJ43hDKj7@8$Gb(mbY>V;FoQ7jmhJ;VF?DP|%p5BPbMA<+~
zKg6eZx6L)ub9WO&BRcvATJd+({^d0(QI)^QNXW_t+xL>SI$7}>yXL&c{jI{WkHyqn
z+Br#XEFAeBplm}ueW55A-geDjLC#V?1YXgVg3;8;mG!>#(w=$6zQ8Xc_C6#C&e#y6
z*<wr2k7ning*Pk;{jW|`X>T|Cz1H@#$Czq@(r-d7;JoPue!CU&ySKe8rVp7`JPLOj
zEAUM9>{dP;F~#7?i0h(veVC8A;o3C)d?m+`4@h~;0M}xDnLr6o7unFv55{R2PV$CD
z?eG11HX7LLVYb-WRQf3+gk3|r#*J#OWSf!J`L!+MLsk55<GG6zi*ts9<g=OJbV>dq
z8;EkpSexYU#<DWpU3pSWBjW0p81Ct^PZe0zFG{R%Ebj7k+Khm=KCj^6`uA=8RB+Lw
zSdOz?WcRN8SpQSb!f43grLm2k;=qz>|5brN-3)6miymu0P1mxML?B&t?W2hKQ%T$$
zn$dMS=9*OS>%e9b*GZiHZ&xM$t2A6mIFv1;_^IU_UN4{9g>^-5W7bS6=5*!ELGM3h
zd(P(lWK#*Z;oi*i6}N1+rsU0b?|{hI+A~|p3bJ#e(-i7QygYHe`UTxzY>hSctbSb0
z(ql-5=vAih>$I6Hm&^y@8kGyW@;qX<>@v8I>u|i5+3MF^b5@z@ZS0nID>sX=i7&nM
z=Ba5)m|eirH*Cz;so<OpFL>Hm;;vE@Uc!QI<XDR@$B!f`!JdU=y4e4?ygP*zA@7+5
zi;z2kOO6^;@J4#<n~Nrl-WXXQ6KYrD<5B3W))!0p9I8@Bk|Pj6i*jH7s4BAdF-BM+
zeFX>fe-r^aZ)N9KF!yJs;J{Fj2EtX138&NasWYV{G(hB@MDAY)yJ>ktCbY|upU2lm
zTYw}c`jlb*U``AcQjY)X0ECq^kEl4h8l-;4v0$|On2xUR^x@tCll*a5LxJ0Z@IVF|
z%AUCdcy8{*FTvD3s0lyCzU;)kupQm_Dz|@rv5nBd;O;%Y_dX^Lw8T{dp<iXhn;BZK
z9Zq{T@zS?h+Cic1klQ~B?jB-en|DKe9lw8iE#bJhMnYy+A)XBFFY@Y;5qrF7@>Km#
z=4<>INAFqZ-QX_@c=nmmR0!bDb*cHLhM41i3)SWu=T{};A>7vu%eh=2q@o}FHz!R+
z_XsWgaAXX7o^|Qm<+V}HOxv?wg%JCY8Ndy3!_(p=E}06~I)*a`R_pLwx&hfr(nQUN
zd0fwR$n}2E6{j(hV8eE^zZxAe8K{plHP;wp`hMrh6WdvoEZ{cl0JphAdVA#>75p{h
zH<XP`nFrWUWPm;jN*Z6y4Ix$pb@>+D*yKbj@0lpOgm>rcl5bLTEQzRB6VN0`Gg5K5
zm0r{o<izwe;u01jZBmu0bj<{U2}F4ojI(_#5LqZg2aNE3DrPQ8S-axb`r}5{qeo#Q
zwq<@OU(NB7un~<Jw<A%$cEHN#3W4gY6UiMG0-+!s+E?QRi5ZY2E33urO5eqW2u9D&
z0+xa;=fA!?vm8~1EXDdUhUZC!V-)@KT<#v$u(cJV7d7Ljtq~qXFc$iOpNY9yVHgBT
z{XUp-6MTzyN{nh4EXmfmAHjHLa=>z(GvT}I)7sN6?u0tc*?F~g6Yd9NDb;3k5#dq(
z&N$h`iaf;NVGBu$$y-oZdv^-EoB^%92Nm)MptU_bJgY`VY%m#%iy_PIi;*04XjnnU
zZ502N#ofxZ`7!Ev=Zyu9Mc>Yf1u3&)aHwhi;U)Q#4NLNt3(@s!G&s{L_3%?{-{&=)
z!*v8U9`uD-aJ%5Fw-X`Va+BX#*GkGX=W}Ew|A_O9+aIE#chn0l<##xv>B|b@$I$%d
z<DG0B&)b&ePDSuNiv1uz9x@<0z?=ep@XIS$WweOTcOQNkfyNgFRaY$n=6~vvgFcRm
ztf$-+Q8|>j5d;Z-cnUA?LYp9lFe+!bEthw5$<z;JqT{4?r!Th61~j>*oI|qu9GwX<
zA6d+IYt+QE2kl@!ht4dsQCzMb-RTCUTQ`qW`blH2%p?|m5Q*MckxZJZy-tGP;<N5l
zUVqKk=-mm1_SUQ=&fY4pKYf0eP)k2$407U}{Sur<Ma5K1xeGwr$85adVvW{(jg)H4
z$%!Unj6`#6vlQTfwd!Hk&ow)%vd(MVHdbH1XJUCaaVhs(SjZN(v&$;&1T&W;YkVMj
zB{BZK5LWx$9#QlDpKGtX<EBb?seDJzqlTvfT?=dd16O*40tjuKA>&U-dDf`xXmKBj
ziWQ8Q@{I23h9?TU!3stv?PkVtJJ-V8cg3P}rA}Gp-iqVcPo|b4*~%2KPzMuyfnfuL
zG$32`4y<Qz2Y2AijvMqySv4X_4EG=fbxYqWqLf9?hStwh_`5g3zL~%-H-<Y_;QI6P
zccM&4Pmp)OXO;X~E-VfYmYBXOU+nM%dlR>N%{+Rp4kmxWz73jr5<SwV*;_l&q&6pn
zzmvENG9)8GBcr&EfuPYpK@-{mLo@O1VrFHG*$_+b^u%heN-N>H6*r@|4o{vl`%M_A
zXL0x2al$<q2f+78l>>k51vP?`@S`8s0YMVfKSLk3_*hfo%~_VPVafiH-_y1@`y|!x
zDS=H_hC2wzIvKnhD#jlLT^;5mwwD;(l@nnccS&Ah=|YCbblGh0U4#S5p`B3oFgJZW
z`N<ggXPa(tQMxgc75mEkxsN%O+=Q49dOlXcDxy&jx9^D_biA?P05(z}^G_H6;A=uv
z^%kSnWcr4t2vb#jFC9ry&GUyK8{Srhz1HoX$GE3I7MX#;y+`h-=x;3NG)GJ?myVm;
zCoAlUie|e}D=}9&iP5O2_T<no&dO!2K2^<sYtXaBu3t@D`PZ-W6U{ojBs&f@-9?VN
zSf_(H>kfoW3*6<QXaHNWp^vn))J8HVll#`G&78Q`?9FZsNVH92wvT^?epTGxMhQYJ
zqc{!j37oxxDs$@)xE0lhy7%s2R=NCu?_#KFQ#cn|KTNwueT6qKQjiO&0{c_%bY|IZ
zt&k9H8vDF$J%DFBmGB6vHK?{@p0H27dkxyI(dp#uJJODV*2buWjiLz~FnfhIl&Zbz
zB4Js6<^V}q($YWZ{&}+W5GAVu@d;lA4SNl${@!ZU{uYiYdjDRK6-92r=j}JuIShYL
zG32h`(XCvYM{JUez*{br^AMa4PQOe6;6^UC=7+*rAZwysgWs}uuM>iWm>=geMoqrL
z1f3D##WuZ(BSkt~EHBx6s$QA)YmjB3L-P`2D{4mZIYE1o14#@_DH2n@n0Mu%bnuT{
z^MxffG<4zA$4Goj<;{;vvLg=-1JBZyw^aIb%0>{d5BFGIEas)4LgI%Fq;0Fc)mu!G
zli+{}2}O`xDiec&x8IW>u}dha|3Qg_4+GhOBfWW0^6d&W)qYqqKk=73Ic=~A42&_h
zdkMDB2rZ(AJ7x`esdzB^(p4vZt(y5gy#a+a^M*Vk2Mss=O+zjL?BX3>kqelu1v~mk
z8_W0Oi8!7((iU^Ylddn?(cWzv1n>77vVSezM^Ig;Ol{4qPpr3GsnUX)2QR_pZ~f{6
z`t?%zvAMfd*6eTD;}Aj%-R`4H_r@RFOM4Z9<TeM42->QVetQFO7Gnt;*ti#mQN%&R
zM!f$NZQkf)9eeV(*@gqd<6MwVd`3kxcnW=_i)Ewf4T>`YlHNgfwGHy75A@>+8%DJ3
ze&ywlp$Uw|$@oEH@h6e7im`l3$`@;6{+8uMVU6RAI*w4&8Ve$r-<<6+nWR{E+axgx
zQZv&M$0QI)o{S3^QcU$?W|Q5;*`oTOC5Tq$0CIy|lYl}_SvT{PiYdDc2>x^JDd=W;
zG#w8t6eBhCI}^1BeOMf30;f1v6yh^jh>QK!GwE>u4zuaL4iO;Hwqu=%Og57^icrb^
zdtZItMmhW~afKprc654pms7OG!WlLQGk7~JSjo%FF~*xP>5G?>99F5=u#~rb+pM(_
z32EDxoDe#S3Dj@F|6aFktwCOh<sQ=_Ug(b_#a0;<Hh(_$7wk5V1d=(ao`)1tKs{ye
z(xOlasHm<dUq@6^C6f0O3@N&=K~}}bDAMjG#C4(+56qDRFvl-z=V#$mG}#>JsGls@
z$fl<92<CjU#xM-ym$v~O9|%V_6Ze_SaHpe>h_zFzg5}NqS{8l3CrA;K#3A-YhXccL
zGyx1JS4FED2=s9@TXqVUrh2s-iQ3}09mlsx*32Z=jw2RAl6&ku8$>_J#0P^|S0_gJ
z8Z4ef{_kzbKn-=(J6ulY>T@5PLT*$g$V5y=trv;aj(Q~__dmkCaE4Ej-VG`KKu)Q)
ztizh;T)J?-$pj~*gQ*?{rYgNg1EEOQ1MywD`dH+}GW8V?MqHIw4`fJAHKMt({PVLt
zjiu2}EIE-=O8Qm1J#a*2kG~i695AjoDO1XT8Q!894|kLD#+O0SvdQ=5H3uY)vM%-$
zV5IYWf2nwt{WKw^XKBY469l<MB0)Y7EAIs#9CUpN*l~2vOeG+zpJE)$x3m-nVX<>%
zDm!Ooc9ehP13NaLmIkARkbUI%QQr<t>OD_97N}R}`(f%b`FW%NfixqEv{y3^DeI(4
zvnBbC$*IhJ`>ONGj?ofs^|h9)U~Guv5!wBIVv(S2sN1tBKfEILbogSodgRF1`nA80
zO>$B~-Gd`Pfx+H*6RK)>^F%@<a~hdf3A^JBwoV(nH$nRLCg_X+Ol|L=0DapnyB=by
zJ?U6=2wFjJbwIs&TJ>OPqrlKs*=IHYZ{|a@6)Nvp&-EfwMRsT07w!9v$k^<>XFniz
zI!&knw_ly@;cjJQ|L=jw12&T}kj(BC>i8wYK-*VmD$Xt<$XXBF{Pz-3yKI`@#Cjtx
zsl}aio;c`1vYSV#{p2^hN&u#*0pgQ)VMRtV7o_uwEPOb6e!nMr{Ue%^;JT#g&li=?
z@E*KU?*gb^=@cI`<+JY=Blgf_R)fc%^lQZPYQY`z6{wUqq`j?rBOJ5>^=5}8HeYt>
z5`TWsYw(!}@O;5(62*%<&_801EjjLpx;Lr+Zr%4=Z2Nvhh(3W`=as|F+J5tGt7_+A
z{%c=j1wr)~gGl@y&38@RXOvo$&(vkWo`->YkL2(LJcD#sxV#UPO#$^dRi~WP0upq_
zN6fERj|Xx<ZI$;KVHPa(ODGFh5y(N0<tA4CUuU$UDO4>uC;c}yyAy;Cs@GTdZ^+f+
z-$}u^aL67&gm)Bc2<GtFJGC%%#DHc@lz0)cyDQ9*!2JCN@#C8ZEnBYx_)%Qr-7MvA
zO}5j7hSyXNuHEq8%`CoW)E5z3tW%@~4+>CBl)=z^qqKPgCDLx#C1s8x#Qsx8q8A0*
zK{xdgbpQST!LK;rr8m=>9R5=+I<N#b3U2~&(v{|aJ`I@F6Tp?8cT+z6zn-S7GaN`b
i85H3c{~r%vJ4C`j*Qw&FVHy?iqkaA6wE_*hu>S+X!WTIJ
index 01b8f923dc12f5956d17199aba7de2f322bc1e78..29e5d552d1cf3707a9ae15754f28e7d6480ecfc8
GIT binary patch
literal 58364
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�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
D^%KqO
--- a/browser/extensions/screenshots/webextension/log.js
+++ b/browser/extensions/screenshots/webextension/log.js
@@ -1,25 +1,25 @@
/* globals buildSettings */
/* eslint-disable no-console */
"use strict";
this.log = (function() {
- let exports = {};
+ const exports = {};
const levels = ["debug", "info", "warn", "error"];
if (!levels.includes(buildSettings.logLevel)) {
console.warn("Invalid buildSettings.logLevel:", buildSettings.logLevel);
}
- let shouldLog = {};
+ const shouldLog = {};
{
let startLogging = false;
- for (let level of levels) {
+ for (const level of levels) {
if (buildSettings.logLevel === level) {
startLogging = true;
}
if (startLogging) {
shouldLog[level] = true;
}
}
}
--- a/browser/extensions/screenshots/webextension/makeUuid.js
+++ b/browser/extensions/screenshots/webextension/makeUuid.js
@@ -1,19 +1,19 @@
"use strict";
this.makeUuid = (function() {
// generates a v4 UUID
return function makeUuid() { // eslint-disable-line no-unused-vars
// get sixteen unsigned 8 bit random values
- var randomValues = window
+ const randomValues = window
.crypto
.getRandomValues(new Uint8Array(36));
- return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
- var i = Array.prototype.slice.call(arguments).slice(-2)[0]; // grab the `offset` parameter
- var r = randomValues[i] % 16|0, v = c === 'x' ? r : (r & 0x3 | 0x8);
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) {
+ const i = Array.prototype.slice.call(arguments).slice(-2)[0]; // grab the `offset` parameter
+ const r = randomValues[i] % 16|0, v = c === "x" ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
};
})();
null;
--- a/browser/extensions/screenshots/webextension/manifest.json
+++ b/browser/extensions/screenshots/webextension/manifest.json
@@ -1,12 +1,12 @@
{
"manifest_version": 2,
"name": "Firefox Screenshots",
- "version": "29.0.0",
+ "version": "30.0.0",
"description": "__MSG_addonDescription__",
"author": "__MSG_addonAuthorsList__",
"homepage_url": "https://github.com/mozilla-services/screenshots",
"applications": {
"gecko": {
"id": "screenshots@mozilla.org",
"strict_min_version": "57.0a1"
}
--- a/browser/extensions/screenshots/webextension/onboarding/slides.js
+++ b/browser/extensions/screenshots/webextension/onboarding/slides.js
@@ -1,14 +1,14 @@
/* globals log, catcher, onboardingHtml, onboardingCss, util, shooter, callBackground, assertIsTrusted, assertIsBlankDocument */
"use strict";
this.slides = (function() {
- let exports = {};
+ const exports = {};
const { watchFunction } = catcher;
let iframe;
let doc;
let currentSlide = 1;
let numberOfSlides;
let callbacks;
@@ -26,24 +26,24 @@ this.slides = (function() {
iframe.style.zIndex = "99999999999";
iframe.style.border = "none";
iframe.style.position = "fixed";
iframe.style.top = "0";
iframe.style.left = "0";
iframe.style.margin = "0";
iframe.scrolling = "no";
updateIframeSize();
- let html = onboardingHtml.replace('<style></style>', `<style>${onboardingCss}</style>`);
+ let html = onboardingHtml.replace("<style></style>", `<style>${onboardingCss}</style>`);
html = html.replace(/MOZ_EXTENSION([^"]+)/g, (match, filename) => {
return browser.extension.getURL(filename);
});
iframe.addEventListener("load", catcher.watchFunction(() => {
doc = iframe.contentDocument;
assertIsBlankDocument(doc);
- let parsedDom = (new DOMParser()).parseFromString(
+ const parsedDom = (new DOMParser()).parseFromString(
html,
"text/html"
);
doc.replaceChild(
doc.adoptNode(parsedDom.documentElement),
doc.documentElement
);
doc.addEventListener("keyup", onKeyUp);
@@ -68,47 +68,47 @@ this.slides = (function() {
iframe = doc = null;
currentSlide = 1;
numberOfSlides = undefined;
callbacks = undefined;
};
function localizeText(doc) {
let els = doc.querySelectorAll("[data-l10n-id]");
- for (let el of els) {
- let id = el.getAttribute("data-l10n-id");
- let text = browser.i18n.getMessage(id);
+ for (const el of els) {
+ const id = el.getAttribute("data-l10n-id");
+ const text = browser.i18n.getMessage(id);
el.textContent = text;
}
els = doc.querySelectorAll("[data-l10n-label-id]");
- for (let el of els) {
- let id = el.getAttribute("data-l10n-label-id");
- let text = browser.i18n.getMessage(id);
+ for (const el of els) {
+ const id = el.getAttribute("data-l10n-label-id");
+ const text = browser.i18n.getMessage(id);
el.setAttribute("aria-label", text);
}
// termsAndPrivacyNoticeCloudServices is a more complicated substitution:
- let termsContainer = doc.querySelector(".onboarding-legal-notice");
+ const termsContainer = doc.querySelector(".onboarding-legal-notice");
termsContainer.innerHTML = "";
- let termsSentinel = "__TERMS__";
- let privacySentinel = "__PRIVACY__";
- let sentinelSplitter = "!!!";
- let linkTexts = {
+ const termsSentinel = "__TERMS__";
+ const privacySentinel = "__PRIVACY__";
+ const sentinelSplitter = "!!!";
+ const linkTexts = {
[termsSentinel]: browser.i18n.getMessage("termsAndPrivacyNoticeTermsLink"),
[privacySentinel]: browser.i18n.getMessage("termsAndPrivacyNoticyPrivacyLink")
};
- let linkUrls = {
+ const linkUrls = {
[termsSentinel]: "https://www.mozilla.org/about/legal/terms/services/",
[privacySentinel]: "https://www.mozilla.org/privacy/firefox/"
};
- let text = browser.i18n.getMessage(
+ const text = browser.i18n.getMessage(
"termsAndPrivacyNotice2",
[sentinelSplitter + termsSentinel + sentinelSplitter,
sentinelSplitter + privacySentinel + sentinelSplitter]);
- let parts = text.split(sentinelSplitter);
- for (let part of parts) {
+ const parts = text.split(sentinelSplitter);
+ for (const part of parts) {
let el;
if (part === termsSentinel || part === privacySentinel) {
el = doc.createElement("a");
el.href = linkUrls[part];
el.textContent = linkTexts[part];
el.target = "_blank";
el.id = (part === termsSentinel) ? "terms" : "privacy";
} else {
@@ -123,34 +123,34 @@ this.slides = (function() {
doc.querySelector("#next").addEventListener("click", watchFunction(assertIsTrusted(() => {
shooter.sendEvent("navigate-slide", "next");
next();
})));
doc.querySelector("#prev").addEventListener("click", watchFunction(assertIsTrusted(() => {
shooter.sendEvent("navigate-slide", "prev");
prev();
})));
- for (let el of doc.querySelectorAll(".goto-slide")) {
+ for (const el of doc.querySelectorAll(".goto-slide")) {
el.addEventListener("click", watchFunction(assertIsTrusted((event) => {
shooter.sendEvent("navigate-slide", "goto");
- let el = event.target;
- let index = parseInt(el.getAttribute("data-number"), 10);
+ const el = event.target;
+ const index = parseInt(el.getAttribute("data-number"), 10);
setSlide(index);
})));
}
doc.querySelector("#skip").addEventListener("click", watchFunction(assertIsTrusted((event) => {
shooter.sendEvent("cancel-slides", "skip");
callbacks.onEnd();
})));
doc.querySelector("#done").addEventListener("click", watchFunction(assertIsTrusted((event) => {
shooter.sendEvent("finish-slides", "done");
callbacks.onEnd();
})));
doc.querySelector("#slide-overlay").addEventListener("click", watchFunction(assertIsTrusted((event) => {
- if (event.target == doc.querySelector("#slide-overlay")) {
+ if (event.target === doc.querySelector("#slide-overlay")) {
shooter.sendEvent("cancel-slides", "background-click");
callbacks.onEnd();
}
})));
setSlide(1);
}
function next() {
@@ -193,20 +193,20 @@ this.slides = (function() {
if (index < 1) {
index = 1;
}
if (index > numberOfSlides) {
index = numberOfSlides;
}
shooter.sendEvent("visited-slide", `slide-${index}`);
currentSlide = index;
- let slideEl = doc.querySelector("#slide-container");
+ const slideEl = doc.querySelector("#slide-container");
for (let i = 1; i <= numberOfSlides; i++) {
- let className = `active-slide-${i}`;
- if (i == currentSlide) {
+ const className = `active-slide-${i}`;
+ if (i === currentSlide) {
slideEl.classList.add(className);
} else {
slideEl.classList.remove(className);
}
}
}
return exports;
--- a/browser/extensions/screenshots/webextension/randomString.js
+++ b/browser/extensions/screenshots/webextension/randomString.js
@@ -1,14 +1,14 @@
/* exported randomString */
"use strict";
this.randomString = function randomString(length, chars) {
- let randomStringChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+ const randomStringChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
chars = chars || randomStringChars;
let result = "";
for (let i = 0; i < length; i++) {
result += chars[Math.floor(Math.random() * chars.length)]
}
return result;
}
null;
--- a/browser/extensions/screenshots/webextension/selector/callBackground.js
+++ b/browser/extensions/screenshots/webextension/selector/callBackground.js
@@ -2,26 +2,26 @@
"use strict";
this.callBackground = function callBackground(funcName, ...args) {
return browser.runtime.sendMessage({funcName, args}).then((result) => {
if (result && result.type === "success") {
return result.value;
} else if (result && result.type === "error") {
- let exc = new Error(result.message || "Unknown error");
+ const exc = new Error(result.message || "Unknown error");
exc.name = "BackgroundError";
- if ('errorCode' in result) {
+ if ("errorCode" in result) {
exc.errorCode = result.errorCode;
}
- if ('popupMessage' in result) {
+ if ("popupMessage" in result) {
exc.popupMessage = result.popupMessage;
}
throw exc;
} else {
log.error("Unexpected background result:", result);
- let exc = new Error(`Bad response type from background page: ${result && result.type || undefined}`);
+ const exc = new Error(`Bad response type from background page: ${result && result.type || undefined}`);
exc.resultType = result ? (result.type || "undefined") : "undefined result";
throw exc;
}
});
}
null;
--- a/browser/extensions/screenshots/webextension/selector/documentMetadata.js
+++ b/browser/extensions/screenshots/webextension/selector/documentMetadata.js
@@ -11,38 +11,38 @@ this.documentMetadata = (function() {
el = document.querySelector("meta[name='cre']");
if (el) {
return el.getAttribute("content");
}
return null;
}
function getOpenGraph() {
- let openGraph = {};
+ const openGraph = {};
// If you update this, also update _OPENGRAPH_PROPERTIES in shot.js:
- let forceSingle = `title type url`.split(" ");
- let openGraphProperties = `
+ const forceSingle = `title type url`.split(" ");
+ const openGraphProperties = `
title type url image audio description determiner locale site_name video
image:secure_url image:type image:width image:height
video:secure_url video:type video:width image:height
audio:secure_url audio:type
article:published_time article:modified_time article:expiration_time article:author article:section article:tag
book:author book:isbn book:release_date book:tag
profile:first_name profile:last_name profile:username profile:gender
`.split(/\s+/g);
- for (let prop of openGraphProperties) {
+ for (const prop of openGraphProperties) {
let elems = document.querySelectorAll(`meta[property='og:${prop}']`);
if (forceSingle.includes(prop) && elems.length > 1) {
elems = [elems[0]];
}
let value;
if (elems.length > 1) {
value = [];
- for (let elem of elems) {
- let v = elem.getAttribute("content");
+ for (const elem of elems) {
+ const v = elem.getAttribute("content");
if (v) {
value.push(v);
}
}
if (!value.length) {
value = null;
}
} else if (elems.length === 1) {
@@ -51,36 +51,36 @@ this.documentMetadata = (function() {
if (value) {
openGraph[prop] = value;
}
}
return openGraph;
}
function getTwitterCard() {
- let twitterCard = {};
+ const twitterCard = {};
// If you update this, also update _TWITTERCARD_PROPERTIES in shot.js:
- let properties = `
+ const properties = `
card site title description image
player player:width player:height player:stream player:stream:content_type
`.split(/\s+/g);
- for (let prop of properties) {
- let elem = document.querySelector(`meta[name='twitter:${prop}']`);
+ for (const prop of properties) {
+ const elem = document.querySelector(`meta[name='twitter:${prop}']`);
if (elem) {
- let value = elem.getAttribute("content");
+ const value = elem.getAttribute("content");
if (value) {
twitterCard[prop] = value;
}
}
}
return twitterCard;
}
return function documentMetadata() {
- let result = {};
+ const result = {};
result.docTitle = document.title;
result.siteName = findSiteName();
result.openGraph = getOpenGraph();
result.twitterCard = getTwitterCard();
return result;
};
})();
--- a/browser/extensions/screenshots/webextension/selector/shooter.js
+++ b/browser/extensions/screenshots/webextension/selector/shooter.js
@@ -1,92 +1,109 @@
/* globals global, documentMetadata, util, uicontrol, ui, catcher */
/* globals buildSettings, domainFromUrl, randomString, shot, blobConverters */
"use strict";
this.shooter = (function() { // eslint-disable-line no-unused-vars
- let exports = {};
+ const exports = {};
const { AbstractShot } = shot;
const RANDOM_STRING_LENGTH = 16;
let backend;
let shotObject;
let supportsDrawWindow;
const callBackground = global.callBackground;
const clipboard = global.clipboard;
function regexpEscape(str) {
// http://stackoverflow.com/questions/3115150/how-to-escape-regular-expression-special-characters-using-javascript
return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
function sanitizeError(data) {
- const href = new RegExp(regexpEscape(window.location.href), 'g');
- const origin = new RegExp(`${regexpEscape(window.location.origin)}[^ \t\n\r",>]*`, 'g');
+ const href = new RegExp(regexpEscape(window.location.href), "g");
+ const origin = new RegExp(`${regexpEscape(window.location.origin)}[^ \t\n\r",>]*`, "g");
const json = JSON.stringify(data)
- .replace(href, 'REDACTED_HREF')
- .replace(origin, 'REDACTED_URL');
+ .replace(href, "REDACTED_HREF")
+ .replace(origin, "REDACTED_URL");
const result = JSON.parse(json);
return result;
}
catcher.registerHandler((errorObj) => {
callBackground("reportError", sanitizeError(errorObj));
});
catcher.watchFunction(() => {
- let canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
- let ctx = canvas.getContext('2d');
+ const canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
+ const ctx = canvas.getContext("2d");
supportsDrawWindow = !!ctx.drawWindow;
})();
- let screenshotPage = exports.screenshotPage = function(selectedPos, captureType) {
- if (!supportsDrawWindow) {
- return null;
- }
- let height = selectedPos.bottom - selectedPos.top;
- let width = selectedPos.right - selectedPos.left;
- let canvas = document.createElementNS('http://www.w3.org/1999/xhtml', 'canvas');
- let ctx = canvas.getContext('2d');
+ function captureToCanvas(selectedPos, captureType) {
+ const height = selectedPos.bottom - selectedPos.top;
+ const width = selectedPos.right - selectedPos.left;
+ const canvas = document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
+ const ctx = canvas.getContext("2d");
let expand = window.devicePixelRatio !== 1;
- if (captureType == 'fullPage' || captureType == 'fullPageTruncated') {
+ if (captureType === "fullPage" || captureType === "fullPageTruncated") {
expand = false;
canvas.width = width;
canvas.height = height;
} else {
canvas.width = width * window.devicePixelRatio;
canvas.height = height * window.devicePixelRatio;
}
if (expand) {
ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
}
ui.iframe.hide();
ctx.drawWindow(window, selectedPos.left, selectedPos.top, width, height, "#fff");
- let limit = buildSettings.pngToJpegCutoff;
+ return canvas;
+ }
+
+ const screenshotPage = exports.screenshotPage = function(selectedPos, captureType) {
+ if (!supportsDrawWindow) {
+ return null;
+ }
+ const canvas = captureToCanvas(selectedPos, captureType);
+ const limit = buildSettings.pngToJpegCutoff;
let dataUrl = canvas.toDataURL();
if (limit && dataUrl.length > limit) {
- let jpegDataUrl = canvas.toDataURL("image/jpeg");
+ const jpegDataUrl = canvas.toDataURL("image/jpeg");
if (jpegDataUrl.length < dataUrl.length) {
// Only use the JPEG if it is actually smaller
dataUrl = jpegDataUrl;
}
}
return dataUrl;
};
+ function screenshotPageAsync(selectedPos, captureType) {
+ if (!supportsDrawWindow) {
+ return Promise.resolve(null);
+ }
+ const canvas = captureToCanvas(selectedPos, captureType);
+ ui.iframe.showLoader();
+ const width = selectedPos.right - selectedPos.left;
+ const height = selectedPos.bottom - selectedPos.top;
+ const imageData = canvas.getContext("2d").getImageData(0, 0, width, height);
+ return callBackground("canvasToDataURL", imageData);
+ }
+
let isSaving = null;
exports.takeShot = function(captureType, selectedPos, url) {
// isSaving indicates we're aleady in the middle of saving
// we use a timeout so in the case of a failure the button will
// still start working again
- if (Math.floor(selectedPos.left) == Math.floor(selectedPos.right) ||
- Math.floor(selectedPos.top) == Math.floor(selectedPos.bottom)) {
- let exc = new Error("Empty selection");
+ if (Math.floor(selectedPos.left) === Math.floor(selectedPos.right) ||
+ Math.floor(selectedPos.top) === Math.floor(selectedPos.bottom)) {
+ const exc = new Error("Empty selection");
exc.popupMessage = "EMPTY_SELECTION";
exc.noReport = true;
catcher.unhandled(exc);
return;
}
let imageBlob;
const uicontrol = global.uicontrol;
let deactivateAfterFinish = true;
@@ -100,26 +117,26 @@ this.shooter = (function() { // eslint-d
}
isSaving = null;
}, 1000);
selectedPos = selectedPos.asJson();
let captureText = "";
if (buildSettings.captureText) {
captureText = util.captureEnclosedText(selectedPos);
}
- let dataUrl = url || screenshotPage(selectedPos, captureType);
+ const dataUrl = url || screenshotPage(selectedPos, captureType);
let type = blobConverters.getTypeFromDataUrl(dataUrl);
type = type ? type.split("/", 2)[1] : null;
if (dataUrl) {
- imageBlob = blobConverters.dataUrlToBlob(dataUrl);
+ imageBlob = buildSettings.uploadBinary ? blobConverters.dataUrlToBlob(dataUrl) : null;
shotObject.delAllClips();
shotObject.addClip({
createdDate: Date.now(),
image: {
- url: "data:",
+ url: buildSettings.uploadBinary ? "" : dataUrl,
type,
captureType,
text: captureText,
location: selectedPos,
dimensions: {
x: selectedPos.right - selectedPos.left,
y: selectedPos.bottom - selectedPos.top
}
@@ -139,94 +156,98 @@ this.shooter = (function() { // eslint-d
shotId: shotObject.id,
shot: shotObject.asJson(),
imageBlob
}).then((url) => {
return clipboard.copy(url).then((copied) => {
return callBackground("openShot", { url, copied });
});
}, (error) => {
- if ('popupMessage' in error && (error.popupMessage == "REQUEST_ERROR" || error.popupMessage == 'CONNECTION_ERROR')) {
+ if ("popupMessage" in error && (error.popupMessage === "REQUEST_ERROR" || error.popupMessage === "CONNECTION_ERROR")) {
// The error has been signaled to the user, but unlike other errors (or
// success) we should not abort the selection
deactivateAfterFinish = false;
// We need to unhide the UI since screenshotPage() hides it.
ui.iframe.unhide();
return;
}
- if (error.name != "BackgroundError") {
+ if (error.name !== "BackgroundError") {
// BackgroundError errors are reported in the Background page
throw error;
}
}).then(() => {
if (deactivateAfterFinish) {
uicontrol.deactivate();
}
}));
};
exports.downloadShot = function(selectedPos, previewDataUrl) {
- let dataUrl = previewDataUrl || screenshotPage(selectedPos);
- let promise = Promise.resolve(dataUrl);
- if (!dataUrl) {
- promise = callBackground(
- "screenshotPage",
- selectedPos.asJson(),
- {
- scrollX: window.scrollX,
- scrollY: window.scrollY,
- innerHeight: window.innerHeight,
- innerWidth: window.innerWidth
+ const shotPromise = previewDataUrl ? Promise.resolve(previewDataUrl) : screenshotPageAsync(selectedPos, "fullPage");
+ catcher.watchPromise(shotPromise.then(dataUrl => {
+ let promise = Promise.resolve(dataUrl);
+ if (!dataUrl) {
+ promise = callBackground(
+ "screenshotPage",
+ selectedPos.asJson(),
+ {
+ scrollX: window.scrollX,
+ scrollY: window.scrollY,
+ innerHeight: window.innerHeight,
+ innerWidth: window.innerWidth
+ });
+ }
+ catcher.watchPromise(promise.then((dataUrl) => {
+ let type = blobConverters.getTypeFromDataUrl(dataUrl);
+ type = type ? type.split("/", 2)[1] : null;
+ shotObject.delAllClips();
+ shotObject.addClip({
+ createdDate: Date.now(),
+ image: {
+ url: dataUrl,
+ type,
+ location: selectedPos
+ }
});
- }
- catcher.watchPromise(promise.then((dataUrl) => {
- let type = blobConverters.getTypeFromDataUrl(dataUrl);
- type = type ? type.split("/", 2)[1] : null;
- shotObject.delAllClips();
- shotObject.addClip({
- createdDate: Date.now(),
- image: {
- url: dataUrl,
- type,
- location: selectedPos
- }
- });
- ui.triggerDownload(dataUrl, shotObject.filename);
- uicontrol.deactivate();
- }));
+ ui.triggerDownload(dataUrl, shotObject.filename);
+ uicontrol.deactivate();
+ }));
+ }))
};
let copyInProgress = null;
exports.copyShot = function(selectedPos, previewDataUrl) {
// This is pretty slow. We'll ignore additional user triggered copy events
// while it is in progress.
if (copyInProgress) {
return;
}
// A max of five seconds in case some error occurs.
copyInProgress = setTimeout(() => {
copyInProgress = null;
}, 5000);
- let unsetCopyInProgress = () => {
+ const unsetCopyInProgress = () => {
if (copyInProgress) {
clearTimeout(copyInProgress);
copyInProgress = null;
}
}
- let dataUrl = previewDataUrl || screenshotPage(selectedPos);
- let blob = blobConverters.dataUrlToBlob(dataUrl);
- catcher.watchPromise(callBackground("copyShotToClipboard", blob).then(() => {
- uicontrol.deactivate();
- unsetCopyInProgress();
- }, unsetCopyInProgress));
+ const shotPromise = previewDataUrl ? Promise.resolve(previewDataUrl) : screenshotPageAsync(selectedPos, "fullPage");
+ catcher.watchPromise(shotPromise.then(dataUrl => {
+ const blob = blobConverters.dataUrlToBlob(dataUrl);
+ catcher.watchPromise(callBackground("copyShotToClipboard", blob).then(() => {
+ uicontrol.deactivate();
+ unsetCopyInProgress();
+ }, unsetCopyInProgress));
+ }));
};
exports.sendEvent = function(...args) {
- let maybeOptions = args[args.length - 1];
+ const maybeOptions = args[args.length - 1];
if (typeof maybeOptions === "object") {
maybeOptions.incognito = browser.extension.inIncognitoContext;
} else {
args.push({incognito: browser.extension.inIncognitoContext});
}
callBackground("sendEvent", ...args);
--- a/browser/extensions/screenshots/webextension/selector/ui.js
+++ b/browser/extensions/screenshots/webextension/selector/ui.js
@@ -1,14 +1,14 @@
/* globals log, util, catcher, inlineSelectionCss, callBackground, assertIsTrusted, assertIsBlankDocument, buildSettings blobConverters */
"use strict";
this.ui = (function() { // eslint-disable-line no-unused-vars
- let exports = {};
+ const exports = {};
const SAVE_BUTTON_HEIGHT = 50;
const { watchFunction } = catcher;
exports.isHeader = function(el) {
while (el) {
if (el.classList &&
(el.classList.contains("myshots-button") ||
@@ -17,83 +17,81 @@ this.ui = (function() { // eslint-disabl
el.classList.contains("cancel-shot"))) {
return true;
}
el = el.parentNode;
}
return false;
}
- let substitutedCss = inlineSelectionCss.replace(/MOZ_EXTENSION([^"]+)/g, (match, filename) => {
+ const substitutedCss = inlineSelectionCss.replace(/MOZ_EXTENSION([^"]+)/g, (match, filename) => {
return browser.extension.getURL(filename);
});
function makeEl(tagName, className) {
if (!iframe.document()) {
throw new Error("Attempted makeEl before iframe was initialized");
}
- let el = iframe.document().createElement(tagName);
+ const el = iframe.document().createElement(tagName);
if (className) {
el.className = className;
}
return el;
}
function onResize() {
if (this.sizeTracking.windowDelayer) {
clearTimeout(this.sizeTracking.windowDelayer);
}
this.sizeTracking.windowDelayer = setTimeout(watchFunction(() => {
this.updateElementSize(true);
}), 50);
}
function localizeText(doc) {
- let els = doc.querySelectorAll("[data-l10n-id], [data-l10n-title]");
- for (let el of els) {
- let id = el.getAttribute("data-l10n-id");
+ const els = doc.querySelectorAll("[data-l10n-id], [data-l10n-title]");
+ for (const el of els) {
+ const id = el.getAttribute("data-l10n-id");
if (id) {
- let text = browser.i18n.getMessage(id);
+ const text = browser.i18n.getMessage(id);
el.textContent = text;
}
- let title = el.getAttribute("data-l10n-title");
+ const title = el.getAttribute("data-l10n-title");
if (title) {
- let titleText = browser.i18n.getMessage(title);
- let sanitized = titleText && titleText.replace("&", "&")
+ const titleText = browser.i18n.getMessage(title);
+ const sanitized = titleText && titleText.replace("&", "&")
.replace('"', """)
.replace("<", "<")
.replace(">", ">");
el.setAttribute("title", sanitized);
}
}
}
function highContrastCheck(win) {
- let result, doc, el;
- doc = win.document;
- el = doc.createElement("div");
+ const doc = win.document;
+ const el = doc.createElement("div");
el.style.backgroundImage = "url('#')";
el.style.display = "none";
doc.body.appendChild(el);
- let computed = win.getComputedStyle(el);
+ const computed = win.getComputedStyle(el);
+ doc.body.removeChild(el);
// When Windows is in High Contrast mode, Firefox replaces background
// image URLs with the string "none".
- result = computed && computed.backgroundImage === "none";
- doc.body.removeChild(el);
- return result;
+ return (computed && computed.backgroundImage === "none");
}
- let isDownloadOnly = exports.isDownloadOnly = function() {
+ const isDownloadOnly = exports.isDownloadOnly = function() {
return window.downloadOnly;
}
// the download notice is rendered in iframes that match the document height
// or the window height. If parent iframe matches window height, pass in true
function renderDownloadNotice(initAtBottom = false) {
- let notice = makeEl("table", "notice");
+ const notice = makeEl("table", "notice");
notice.innerHTML = `
<div class="notice-tooltip">
<p data-l10n-id="downloadOnlyDetails"></p>
<ul>
<li data-l10n-id="downloadOnlyDetailsPrivate"></li>
<li data-l10n-id="downloadOnlyDetailsNeverRemember"></li>
<li data-l10n-id="downloadOnlyDetailsESR"></li>
<li data-l10n-id="downloadOnlyDetailsNoUploadPref"></li>
@@ -102,51 +100,51 @@ this.ui = (function() { // eslint-disabl
<tbody>
<tr class="notice-wrapper">
<td class="notice-content" data-l10n-id="downloadOnlyNotice"></td>
<td class="notice-help"></td>
</tr>
<tbody>`;
localizeText(notice);
if (initAtBottom) {
- notice.style.bottom = '10px';
+ notice.style.bottom = "10px";
}
return notice;
}
function initializeIframe() {
- let el = document.createElement("iframe");
+ const el = document.createElement("iframe");
el.src = browser.extension.getURL("blank.html");
el.style.zIndex = "99999999999";
el.style.border = "none";
el.style.top = "0";
el.style.left = "0";
el.style.margin = "0";
el.scrolling = "no";
el.style.clip = "auto";
return el;
}
- let iframeSelection = exports.iframeSelection = {
+ const iframeSelection = exports.iframeSelection = {
element: null,
addClassName: "",
sizeTracking: {
timer: null,
windowDelayer: null,
lastHeight: null,
lastWidth: null
},
document: null,
display(installHandlerOnDocument) {
return new Promise((resolve, reject) => {
if (!this.element) {
this.element = initializeIframe();
this.element.id = "firefox-screenshots-selection-iframe";
this.element.style.display = "none";
- this.element.style.setProperty('position', 'absolute', 'important');
+ this.element.style.setProperty("position", "absolute", "important");
this.updateElementSize();
this.element.addEventListener("load", watchFunction(() => {
this.document = this.element.contentDocument;
assertIsBlankDocument(this.document);
// eslint-disable-next-line no-unsanitized/property
this.document.documentElement.innerHTML = `
<head>
<style>${substitutedCss}</style>
@@ -187,43 +185,43 @@ this.ui = (function() { // eslint-disabl
updateElementSize(force) {
// Note: if someone sizes down the page, then the iframe will keep the
// document from naturally shrinking. We use force to temporarily hide
// the element so that we can tell if the document shrinks
const visible = this.element.style.display !== "none";
if (force && visible) {
this.element.style.display = "none";
}
- let height = Math.max(
+ const height = Math.max(
document.documentElement.clientHeight,
document.body.clientHeight,
document.documentElement.scrollHeight,
document.body.scrollHeight);
if (height !== this.sizeTracking.lastHeight) {
this.sizeTracking.lastHeight = height;
this.element.style.height = height + "px";
}
// Do not use window.innerWidth since that includes the width of the
// scroll bar.
- let width = Math.max(
+ const width = Math.max(
document.documentElement.clientWidth,
document.body.clientWidth,
document.documentElement.scrollWidth,
document.body.scrollWidth);
if (width !== this.sizeTracking.lastWidth) {
this.sizeTracking.lastWidth = width;
this.element.style.width = width + "px";
// Since this frame has an absolute position relative to the parent
// document, if the parent document's body has a relative position and
// left and/or top not at 0, then the left and/or top of the parent
// document's body is not at (0, 0) of the viewport. That makes the
// frame shifted relative to the viewport. These margins negates that.
if (window.getComputedStyle(document.body).position === "relative") {
- let docBoundingRect = document.documentElement.getBoundingClientRect();
- let bodyBoundingRect = document.body.getBoundingClientRect();
+ const docBoundingRect = document.documentElement.getBoundingClientRect();
+ const bodyBoundingRect = document.body.getBoundingClientRect();
this.element.style.marginLeft = `-${bodyBoundingRect.right - docBoundingRect.right}px`;
this.element.style.marginTop = `-${bodyBoundingRect.bottom - docBoundingRect.bottom}px`;
}
}
if (force && visible) {
this.element.style.display = "";
}
},
@@ -262,25 +260,25 @@ this.ui = (function() { // eslint-disabl
this.stopSizeWatch();
util.removeNode(this.element);
this.element = this.document = null;
}
};
iframeSelection.onResize = watchFunction(assertIsTrusted(onResize.bind(iframeSelection)), true);
- let iframePreSelection = exports.iframePreSelection = {
+ const iframePreSelection = exports.iframePreSelection = {
element: null,
document: null,
display(installHandlerOnDocument, standardOverlayCallbacks) {
return new Promise((resolve, reject) => {
if (!this.element) {
this.element = initializeIframe();
this.element.id = "firefox-screenshots-preselection-iframe";
- this.element.style.setProperty('position', 'fixed', 'important');
+ this.element.style.setProperty("position", "fixed", "important");
this.element.style.width = "100%";
this.element.style.height = "100%";
this.element.addEventListener("load", watchFunction(() => {
this.document = this.element.contentDocument;
assertIsBlankDocument(this.document)
// eslint-disable-next-line no-unsanitized/property
this.document.documentElement.innerHTML = `
<head>
@@ -293,17 +291,17 @@ this.ui = (function() { // eslint-disabl
<div class="face-container">
<div class="eye left"><div class="eyeball"></div></div>
<div class="eye right"><div class="eyeball"></div></div>
<div class="face"></div>
</div>
<div class="preview-instructions" data-l10n-id="screenshotInstructions"></div>
<button class="cancel-shot">${browser.i18n.getMessage("cancelScreenshot")}</button>
<div class="myshots-all-buttons-container">
- ${isDownloadOnly() ? '' : `
+ ${isDownloadOnly() ? "" : `
<button class="myshots-button" tabindex="1" data-l10n-id="myShotsLink"></button>
<div class="spacer"></div>
`}
<button class="visible" tabindex="2" data-l10n-id="saveScreenshotVisibleArea"></button>
<button class="full-page" tabindex="3" data-l10n-id="saveScreenshotFullPage"></button>
</div>
</div>
</div>
@@ -372,35 +370,26 @@ this.ui = (function() { // eslint-disabl
remove() {
this.hide();
util.removeNode(this.element);
this.element = null;
this.document = null;
}
};
- function getAttributeText(l10nID) {
- let text = browser.i18n.getMessage(l10nID);
- return text &&
- text.replace("&", "&")
- .replace('"', """)
- .replace("<", "<")
- .replace(">", ">");
- }
-
- let iframePreview = exports.iframePreview = {
+ const iframePreview = exports.iframePreview = {
element: null,
document: null,
display(installHandlerOnDocument, standardOverlayCallbacks) {
return new Promise((resolve, reject) => {
if (!this.element) {
this.element = initializeIframe();
this.element.id = "firefox-screenshots-preview-iframe";
this.element.style.display = "none";
- this.element.style.setProperty('position', 'fixed', 'important');
+ this.element.style.setProperty("position", "fixed", "important");
this.element.style.height = "100%";
this.element.style.width = "100%";
this.element.onload = watchFunction(() => {
this.document = this.element.contentDocument;
// eslint-disable-next-line no-unsanitized/property
this.document.documentElement.innerHTML = `
<head>
<style>${substitutedCss}</style>
@@ -426,16 +415,19 @@ this.ui = (function() { // eslint-disabl
src="${browser.extension.getURL("icons/download.svg")}" /></button>
<button class="preview-button-save"
data-l10n-title="saveScreenshotSelectedArea"><img
src="${browser.extension.getURL("icons/cloud.svg")}"
/>${browser.i18n.getMessage("saveScreenshotSelectedArea")}</button>`
}
</div>
</div>
+ <div class="loader" style="display:none">
+ <div class="loader-inner"></div>
+ </div>
</div>
</body>`;
installHandlerOnDocument(this.document);
this.document.documentElement.dir = browser.i18n.getMessage("@@bidi_dir");
this.document.documentElement.lang = browser.i18n.getMessage("@@ui_locale");
localizeText(this.document);
const overlay = this.document.querySelector(".preview-overlay");
if (isDownloadOnly()) {
@@ -466,42 +458,55 @@ this.ui = (function() { // eslint-disabl
},
unhide() {
this.element.style.display = "";
catcher.watchPromise(callBackground("sendEvent", "internal", "unhide-preview-frame"));
this.element.focus();
},
+ showLoader() {
+ this.document.body.querySelector(".preview-image").style.display = "none";
+ this.document.body.querySelector(".notice").style.display = "none";
+ this.document.body.querySelector(".loader").style.display = "";
+ },
+
remove() {
this.hide();
util.removeNode(this.element);
this.element = null;
this.document = null;
}
};
iframePreSelection.onResize = watchFunction(onResize.bind(iframePreSelection), true);
- let iframe = exports.iframe = {
+ const iframe = exports.iframe = {
currentIframe: iframePreSelection,
display(installHandlerOnDocument, standardOverlayCallbacks) {
return iframeSelection.display(installHandlerOnDocument)
.then(() => iframePreSelection.display(installHandlerOnDocument, standardOverlayCallbacks))
.then(() => iframePreview.display(installHandlerOnDocument, standardOverlayCallbacks));
},
hide() {
this.currentIframe.hide();
},
unhide() {
this.currentIframe.unhide();
},
+ showLoader() {
+ if (this.currentIframe.showLoader) {
+ this.currentIframe.showLoader();
+ this.currentIframe.unhide();
+ }
+ },
+
getElementFromPoint(x, y) {
return this.currentIframe.getElementFromPoint(x, y);
},
remove() {
iframeSelection.remove();
iframePreSelection.remove();
iframePreview.remove();
@@ -531,17 +536,17 @@ this.ui = (function() { // eslint-disabl
if (this.currentIframe === iframeSelection || this.currentIframe === iframePreSelection) {
this.hide();
}
this.currentIframe = iframePreview;
this.unhide();
}
};
- let movements = ["topLeft", "top", "topRight", "left", "right", "bottomLeft", "bottom", "bottomRight"];
+ const movements = ["topLeft", "top", "topRight", "left", "right", "bottomLeft", "bottom", "bottomRight"];
/** Creates the selection box */
exports.Box = {
display(pos, callbacks) {
this._createEl();
if (callbacks !== undefined && callbacks.cancel) {
// We use onclick here because we don't want addEventListener
@@ -584,18 +589,18 @@ this.ui = (function() { // eslint-disabl
e.preventDefault();
e.stopPropagation();
}));
this.copy.style.display = "";
} else {
this.copy.style.display = "none";
}
- let winBottom = window.innerHeight;
- let pageYOffset = window.pageYOffset;
+ const winBottom = window.innerHeight;
+ const pageYOffset = window.pageYOffset;
if ((pos.right - pos.left) < 78 || (pos.bottom - pos.top) < 78) {
this.el.classList.add("small-selection");
} else {
this.el.classList.remove("small-selection");
}
// if the selection bounding box is w/in SAVE_BUTTON_HEIGHT px of the bottom of
@@ -641,101 +646,101 @@ this.ui = (function() { // eslint-disabl
this.downloadNotice.style.top = (currentYOffset + currentWinBottom - 60) + "px";
}
};
if (this.downloadNotice) {
this.downloadNotice.style.top = (pageYOffset + winBottom - 60) + "px";
// event callbacks are delayed 100ms each to keep from overloading things
this.windowChangeStop = this.delayExecution(100, this.repositionDownloadNotice);
- window.addEventListener('scroll', watchFunction(assertIsTrusted(this.windowChangeStop)));
- window.addEventListener('resize', watchFunction(assertIsTrusted(this.windowChangeStop)));
+ window.addEventListener("scroll", watchFunction(assertIsTrusted(this.windowChangeStop)));
+ window.addEventListener("resize", watchFunction(assertIsTrusted(this.windowChangeStop)));
}
},
// used to eventually move the download-only warning
// when a user ends scrolling or ends resizing a window
delayExecution(delay, cb) {
let timer;
return function() {
- if (typeof timer !== 'undefined') {
+ if (typeof timer !== "undefined") {
clearTimeout(timer);
}
timer = setTimeout(cb, delay);
}
},
remove() {
if (this.downloadNotice) {
- window.removeEventListener('scroll', this.windowChangeStop, true);
- window.removeEventListener('resize', this.windowChangeStop, true);
+ window.removeEventListener("scroll", this.windowChangeStop, true);
+ window.removeEventListener("resize", this.windowChangeStop, true);
}
- for (let name of ["el", "bgTop", "bgLeft", "bgRight", "bgBottom", "downloadNotice"]) {
+ for (const name of ["el", "bgTop", "bgLeft", "bgRight", "bgBottom", "downloadNotice"]) {
if (name in this) {
util.removeNode(this[name]);
this[name] = null;
}
}
},
_createEl() {
let boxEl = this.el;
if (boxEl) {
return;
}
boxEl = makeEl("div", "highlight");
- let buttons = makeEl("div", "highlight-buttons");
- let cancel = makeEl("button", "highlight-button-cancel");
- let cancelImg = makeEl("img");
+ const buttons = makeEl("div", "highlight-buttons");
+ const cancel = makeEl("button", "highlight-button-cancel");
+ const cancelImg = makeEl("img");
cancelImg.src = browser.extension.getURL("icons/cancel.svg");
cancel.title = browser.i18n.getMessage("cancelScreenshot");
cancel.appendChild(cancelImg);
buttons.appendChild(cancel);
- let copy = makeEl("button", "highlight-button-copy");
+ const copy = makeEl("button", "highlight-button-copy");
copy.title = browser.i18n.getMessage("copyScreenshot");
- let copyImg = makeEl("img");
+ const copyImg = makeEl("img");
copyImg.src = browser.extension.getURL("icons/copy.svg");
copy.appendChild(copyImg);
buttons.appendChild(copy);
let download, save;
if (isDownloadOnly()) {
download = makeEl("button", "highlight-button-download download-only-button");
- let downloadImg = makeEl("img");
+ const downloadImg = makeEl("img");
downloadImg.src = browser.extension.getURL("icons/download.svg");
download.appendChild(downloadImg);
download.append(browser.i18n.getMessage("downloadScreenshot"));
download.title = browser.i18n.getMessage("downloadScreenshot");
} else {
download = makeEl("button", "highlight-button-download");
download.title = browser.i18n.getMessage("downloadScreenshot");
- let downloadImg = makeEl("img");
+ const downloadImg = makeEl("img");
downloadImg.src = browser.extension.getURL("icons/download.svg");
download.appendChild(downloadImg);
save = makeEl("button", "highlight-button-save");
- let saveImg = makeEl("img");
+ const saveImg = makeEl("img");
saveImg.src = browser.extension.getURL("icons/cloud.svg");
save.appendChild(saveImg);
save.append(browser.i18n.getMessage("saveScreenshotSelectedArea"));
save.title = browser.i18n.getMessage("saveScreenshotSelectedArea");
}
buttons.appendChild(download);
if (save) {
buttons.appendChild(save);
}
this.cancel = cancel;
this.download = download;
this.copy = copy;
this.save = save;
boxEl.appendChild(buttons);
- for (let name of movements) {
- let elTarget = makeEl("div", "mover-target direction-" + name);
- let elMover = makeEl("div", "mover");
+ for (const name of movements) {
+ const elTarget = makeEl("div", "mover-target direction-" + name);
+ const elMover = makeEl("div", "mover");
elTarget.appendChild(elMover);
boxEl.appendChild(elTarget);
}
this.bgTop = makeEl("div", "bghighlight");
iframe.document().body.appendChild(this.bgTop);
this.bgLeft = makeEl("div", "bghighlight");
iframe.document().body.appendChild(this.bgLeft);
this.bgRight = makeEl("div", "bghighlight");
@@ -747,19 +752,19 @@ this.ui = (function() { // eslint-disabl
this.downloadNotice = renderDownloadNotice();
iframe.document().body.appendChild(this.downloadNotice);
}
this.el = boxEl;
},
draggerDirection(target) {
while (target) {
- if (target.nodeType == document.ELEMENT_NODE) {
+ if (target.nodeType === document.ELEMENT_NODE) {
if (target.classList.contains("mover-target")) {
- for (let name of movements) {
+ for (const name of movements) {
if (target.classList.contains("direction-" + name)) {
return name;
}
}
catcher.unhandled(new Error("Surprising mover element"), {element: target.outerHTML});
log.warn("Got mover-target that wasn't a specific direction");
}
}
@@ -768,17 +773,17 @@ this.ui = (function() { // eslint-disabl
return null;
},
isSelection(target) {
while (target) {
if (target.tagName === "BUTTON") {
return false;
}
- if (target.nodeType == document.ELEMENT_NODE && target.classList.contains("highlight")) {
+ if (target.nodeType === document.ELEMENT_NODE && target.classList.contains("highlight")) {
return true;
}
target = target.parentNode;
}
return false;
},
isControl(target) {
@@ -859,42 +864,42 @@ this.ui = (function() { // eslint-disabl
remove() {
util.removeNode(this.el);
this.el = this.xEl = this.yEl = null;
}
};
exports.Preview = {
display(dataUrl, showCropWarning) {
- let img = makeEl("IMG");
- let imgBlob = blobConverters.dataUrlToBlob(dataUrl);
+ const img = makeEl("IMG");
+ const imgBlob = blobConverters.dataUrlToBlob(dataUrl);
img.src = URL.createObjectURL(imgBlob);
iframe.document().querySelector(".preview-image").appendChild(img);
if (showCropWarning && !(isDownloadOnly())) {
- let imageCroppedEl = makeEl("table", "notice");
+ const imageCroppedEl = makeEl("table", "notice");
imageCroppedEl.style.bottom = "10px";
imageCroppedEl.innerHTML = `<tbody>
<tr class="notice-wrapper">
<td class="notice-content"></td>
</tr>
</tbody>`;
- let contentCell = imageCroppedEl.getElementsByTagName("td");
+ const contentCell = imageCroppedEl.getElementsByTagName("td");
contentCell[0].textContent = browser.i18n.getMessage("imageCroppedWarning", buildSettings.maxImageHeight);
iframe.document().querySelector(".preview-overlay").appendChild(imageCroppedEl);
}
}
};
/** Removes every UI this module creates */
exports.remove = function() {
- for (let name in exports) {
+ for (const name in exports) {
if (name.startsWith("iframe")) {
continue;
}
- if (typeof exports[name] == "object" && exports[name].remove) {
+ if (typeof exports[name] === "object" && exports[name].remove) {
exports[name].remove();
}
}
exports.iframe.remove();
};
exports.triggerDownload = function(url, filename) {
return catcher.watchPromise(callBackground("downloadShot", {url, filename}));
--- a/browser/extensions/screenshots/webextension/selector/uicontrol.js
+++ b/browser/extensions/screenshots/webextension/selector/uicontrol.js
@@ -1,15 +1,15 @@
/* globals log, catcher, util, ui, slides */
/* globals shooter, callBackground, selectorLoader, assertIsTrusted, buildSettings */
"use strict";
this.uicontrol = (function() {
- let exports = {};
+ const exports = {};
/** ********************************************************
* selection
*/
/* States:
"crosshairs":
@@ -90,16 +90,30 @@ this.uicontrol = (function() {
function eventOptionsForMove(posStart, posEnd) {
return {
cd1: round10(posEnd.y - posStart.y),
cd2: round10(posEnd.x - posStart.x)
};
}
+ function downloadShot() {
+ const previewDataUrl = (captureType === "fullPageTruncated") ? null : dataUrl;
+ // Downloaded shots don't have dimension limits
+ removeDimensionLimitsOnFullPageShot();
+ shooter.downloadShot(selectedPos, previewDataUrl);
+ }
+
+ function copyShot() {
+ const previewDataUrl = (captureType === "fullPageTruncated") ? null : dataUrl;
+ // Copied shots don't have dimension limits
+ removeDimensionLimitsOnFullPageShot();
+ shooter.copyShot(selectedPos, previewDataUrl);
+ }
+
/** *********************************************
* State and stateHandlers infrastructure
*/
// This enumerates all the anchors on the selection, and what part of the
// selection they move:
const movements = {
topLeft: ["x1", "y1"],
@@ -128,33 +142,33 @@ this.uicontrol = (function() {
if (captureType === "fullPageTruncated") {
captureType = "fullPage";
selectedPos = new Selection(
0, 0,
getDocumentWidth(), getDocumentHeight());
}
}
- let standardDisplayCallbacks = {
+ const standardDisplayCallbacks = {
cancel: () => {
sendEvent("cancel-shot", "overlay-cancel-button");
exports.deactivate();
}, save: () => {
sendEvent("save-shot", "overlay-save-button");
shooter.takeShot("selection", selectedPos);
}, download: () => {
sendEvent("download-shot", "overlay-download-button");
- shooter.downloadShot(selectedPos);
+ downloadShot();
}, copy: () => {
sendEvent("copy-shot", "overlay-copy-button");
- shooter.copyShot(selectedPos);
+ copyShot();
}
};
- let standardOverlayCallbacks = {
+ const standardOverlayCallbacks = {
cancel: () => {
sendEvent("cancel-shot", "cancel-preview-button");
exports.deactivate();
},
onClickCancel: e => {
sendEvent("cancel-shot", "cancel-selection-button");
e.preventDefault();
e.stopPropagation();
@@ -190,49 +204,43 @@ this.uicontrol = (function() {
}
height = Math.min(height, MAX_PAGE_HEIGHT);
selectedPos = new Selection(
0, 0,
width, height);
setState("previewing");
},
onSavePreview: () => {
- sendEvent(`save-${captureType.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}`, "save-preview-button");
+ sendEvent(`save-${captureType.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`, "save-preview-button");
shooter.takeShot(captureType, selectedPos, dataUrl);
},
onDownloadPreview: () => {
- sendEvent(`download-${captureType.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}`, "download-preview-button");
- // Downloaded shots don't have dimension limits
- let previewDataUrl = (captureType === "fullPageTruncated") ? null : dataUrl;
- removeDimensionLimitsOnFullPageShot();
- shooter.downloadShot(selectedPos, previewDataUrl);
+ sendEvent(`download-${captureType.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`, "download-preview-button");
+ downloadShot();
},
onCopyPreview: () => {
- sendEvent(`copy-${captureType.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}`, "copy-preview-button");
- // Copied shots don't have dimension limits
- let previewDataUrl = (captureType === "fullPageTruncated") ? null : dataUrl;
- removeDimensionLimitsOnFullPageShot();
- shooter.copyShot(selectedPos, previewDataUrl);
+ sendEvent(`copy-${captureType.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase()}`, "copy-preview-button");
+ copyShot();
}
};
/** Holds all the objects that handle events for each state: */
- let stateHandlers = {};
+ const stateHandlers = {};
function getState() {
return getState.state;
}
getState.state = "cancel";
function setState(s) {
if (!stateHandlers[s]) {
throw new Error("Unknown state: " + s);
}
- let cur = getState.state;
- let handler = stateHandlers[cur];
+ const cur = getState.state;
+ const handler = stateHandlers[cur];
if (handler.end) {
handler.end();
}
getState.state = s;
if (stateHandlers[s].start) {
stateHandlers[s].start();
}
}
@@ -314,22 +322,22 @@ this.uicontrol = (function() {
}
get height() {
return Math.abs(this.y1 - this.y2);
}
/** Sort x1/x2 and y1/y2 so x1<x2, y1<y2 */
sortCoords() {
if (this.x1 > this.x2) {
- let tmp = this.x2;
+ const tmp = this.x2;
this.x2 = this.x1;
this.x1 = tmp;
}
if (this.y1 > this.y2) {
- let tmp = this.y2;
+ const tmp = this.y2;
this.y2 = this.y1;
this.y1 = tmp;
}
}
union(other) {
return new Selection(
Math.min(this.left, other.left),
@@ -353,17 +361,17 @@ this.uicontrol = (function() {
}
}
Selection.getBoundingClientRect = function(el) {
if (!el.getBoundingClientRect) {
// Typically the <html> element or somesuch
return null;
}
- let rect = el.getBoundingClientRect();
+ const rect = el.getBoundingClientRect();
if (!rect) {
return null;
}
return new Selection(rect.left, rect.top, rect.right, rect.bottom);
};
/** Represents a single x/y point, typically for a mouse click that doesn't have a drag: */
class Pos {
@@ -389,25 +397,26 @@ this.uicontrol = (function() {
*/
let dataUrl;
stateHandlers.previewing = {
start() {
dataUrl = shooter.screenshotPage(selectedPos, captureType);
ui.iframe.usePreview();
- ui.Preview.display(dataUrl, captureType == "fullPageTruncated");
+ ui.Preview.display(dataUrl, captureType === "fullPageTruncated");
}
};
stateHandlers.onboarding = {
start() {
- if (typeof slides == "undefined") {
+ if (typeof slides === "undefined") {
throw new Error("Attempted to set state to onboarding without loading slides");
}
+ sendEvent("internal", "unhide-onboarding-frame");
catcher.watchPromise(slides.display({
onEnd: this.slidesOnEnd.bind(this)
}));
},
slidesOnEnd() {
callBackground("hasSeenOnboarding");
setState("crosshairs");
@@ -423,22 +432,16 @@ this.uicontrol = (function() {
cachedEl: null,
start() {
selectedPos = mousedownPos = null;
this.cachedEl = null;
watchPromise(ui.iframe.display(installHandlersOnDocument, standardOverlayCallbacks).then(() => {
ui.iframe.usePreSelection();
ui.Box.remove();
- const upHandler = watchFunction(assertIsTrusted(keyupHandler));
- document.addEventListener("keyup", upHandler);
- registeredDocumentHandlers.push({name: "keyup", doc: document, upHandler, useCapture: false});
- const downHandler = watchFunction(assertIsTrusted(keydownHandler));
- document.addEventListener("keydown", downHandler);
- registeredDocumentHandlers.push({name: "keydown", doc: document, downHandler, useCapture: false});
}));
},
mousemove(event) {
ui.PixelDimensions.display(event.pageX, event.pageY, event.pageX, event.pageY);
if (event.target.classList &&
(!event.target.classList.contains("preview-overlay"))) {
// User is hovering over a toolbar button or control
@@ -451,22 +454,22 @@ this.uicontrol = (function() {
}
let el;
if (event.target.classList && event.target.classList.contains("preview-overlay")) {
// The hover is on the overlay, so we need to figure out the real element
el = ui.iframe.getElementFromPoint(
event.pageX + window.scrollX - window.pageXOffset,
event.pageY + window.scrollY - window.pageYOffset
);
- let xpos = Math.floor(10 * (event.pageX - window.innerWidth / 2) / window.innerWidth);
- let ypos = Math.floor(10 * (event.pageY - window.innerHeight / 2) / window.innerHeight)
+ const xpos = Math.floor(10 * (event.pageX - window.innerWidth / 2) / window.innerWidth);
+ const ypos = Math.floor(10 * (event.pageY - window.innerHeight / 2) / window.innerHeight)
- for (var i = 0; i < 2; i++) {
- let move = `translate(${xpos}px, ${ypos}px)`;
- event.target.getElementsByClassName('eyeball')[i].style.transform = move;
+ for (let i = 0; i < 2; i++) {
+ const move = `translate(${xpos}px, ${ypos}px)`;
+ event.target.getElementsByClassName("eyeball")[i].style.transform = move;
}
} else {
// The hover is on the element we care about, so we use that
el = event.target;
}
if (this.cachedEl && this.cachedEl === el) {
// Still hovering over the same element
return;
@@ -503,42 +506,42 @@ this.uicontrol = (function() {
break;
}
}
lastRect = rect;
lastNode = node;
node = node.parentNode;
}
if (rect && node) {
- let evenBetter = this.evenBetterElement(node, rect);
+ const evenBetter = this.evenBetterElement(node, rect);
if (evenBetter) {
node = lastNode = evenBetter;
rect = Selection.getBoundingClientRect(evenBetter);
attemptExtend = false;
}
}
if (rect && attemptExtend) {
let extendNode = lastNode.nextSibling;
while (extendNode) {
if (extendNode.nodeType === document.ELEMENT_NODE) {
break;
}
extendNode = extendNode.nextSibling;
if (!extendNode) {
- let parent = lastNode.parentNode;
+ const parent = lastNode.parentNode;
for (let i = 0; i < parent.childNodes.length; i++) {
if (parent.childNodes[i] === lastNode) {
extendNode = parent.childNodes[i + 1];
}
}
}
}
if (extendNode) {
- let extendSelection = Selection.getBoundingClientRect(extendNode);
- let extendRect = rect.union(extendSelection);
+ const extendSelection = Selection.getBoundingClientRect(extendNode);
+ const extendRect = rect.union(extendSelection);
if (extendRect.width <= MAX_DETECT_WIDTH && extendRect.height <= MAX_DETECT_HEIGHT) {
rect = extendRect;
}
}
}
if (rect && (rect.width < MIN_DETECT_ABSOLUTE_WIDTH || rect.height < MIN_DETECT_ABSOLUTE_HEIGHT)) {
rect = null;
@@ -549,24 +552,24 @@ this.uicontrol = (function() {
ui.HoverBox.display(rect);
}
autoDetectRect = rect;
},
/** When we find an element, maybe there's one that's just a little bit better... */
evenBetterElement(node, origRect) {
let el = node.parentNode;
- let ELEMENT_NODE = document.ELEMENT_NODE;
- while (el && el.nodeType == ELEMENT_NODE) {
+ const ELEMENT_NODE = document.ELEMENT_NODE;
+ while (el && el.nodeType === ELEMENT_NODE) {
if (!el.getAttribute) {
return null;
}
- let role = el.getAttribute("role");
- if (role === "article" || (el.className && typeof el.className == "string" && el.className.search("tweet ") !== -1)) {
- let rect = Selection.getBoundingClientRect(el);
+ const role = el.getAttribute("role");
+ if (role === "article" || (el.className && typeof el.className === "string" && el.className.search("tweet ") !== -1)) {
+ const rect = Selection.getBoundingClientRect(el);
if (!rect) {
return null;
}
if (rect.width <= MAX_DETECT_WIDTH && rect.height <= MAX_DETECT_HEIGHT) {
return el;
}
return null;
}
@@ -574,29 +577,29 @@ this.uicontrol = (function() {
}
return null;
},
mousedown(event) {
// FIXME: this is happening but we don't know why, we'll track it now
// but avoid popping up messages:
if (typeof ui === "undefined") {
- let exc = new Error("Undefined ui in mousedown");
+ const exc = new Error("Undefined ui in mousedown");
exc.unloadTime = unloadTime;
exc.nowTime = Date.now();
exc.noPopup = true;
throw exc;
}
if (ui.isHeader(event.target)) {
return undefined;
}
// If the pageX is greater than this, then probably it's an attempt to get
// to the scrollbar, or an actual scroll, and not an attempt to start the
// selection:
- let maxX = window.innerWidth - SCROLLBAR_WIDTH;
+ const maxX = window.innerWidth - SCROLLBAR_WIDTH;
if (event.pageX >= maxX) {
event.stopPropagation();
event.preventDefault();
return false;
}
mousedownPos = new Pos(event.pageX + window.scrollX, event.pageY + window.scrollY);
setState("draggingReady");
@@ -666,26 +669,26 @@ this.uicontrol = (function() {
this.mouseup(event);
},
findGoodEl() {
let el = mousedownPos.elementFromPoint();
if (!el) {
return null;
}
- let isGoodEl = (el) => {
- if (el.nodeType != document.ELEMENT_NODE) {
+ const isGoodEl = (el) => {
+ if (el.nodeType !== document.ELEMENT_NODE) {
return false;
}
- if (el.tagName == "IMG") {
- let rect = el.getBoundingClientRect();
+ if (el.tagName === "IMG") {
+ const rect = el.getBoundingClientRect();
return rect.width >= this.minAutoImageWidth && rect.height >= this.minAutoImageHeight;
}
- let display = window.getComputedStyle(el).display;
- if (['block', 'inline-block', 'table'].includes(display)) {
+ const display = window.getComputedStyle(el).display;
+ if (["block", "inline-block", "table"].includes(display)) {
return true;
// FIXME: not sure if this is useful:
// let rect = el.getBoundingClientRect();
// return rect.width <= this.maxAutoElementWidth && rect.height <= this.maxAutoElementHeight;
}
return false;
};
while (el) {
@@ -739,22 +742,22 @@ this.uicontrol = (function() {
};
stateHandlers.selected = {
start() {
ui.iframe.useSelection();
},
mousedown(event) {
- let target = event.target;
- if (target.tagName == "HTML") {
+ const target = event.target;
+ if (target.tagName === "HTML") {
// This happens when you click on the scrollbar
return undefined;
}
- let direction = ui.Box.draggerDirection(target);
+ const direction = ui.Box.draggerDirection(target);
if (direction) {
sendEvent("start-resize-selection", "handle");
stateHandlers.resizing.startResize(event, direction);
} else if (ui.Box.isSelection(target)) {
sendEvent("start-move-selection", "selection");
stateHandlers.resizing.startResize(event, "move");
} else if (!ui.Box.isControl(target)) {
mousedownPos = new Pos(event.pageX, event.pageY);
@@ -785,50 +788,50 @@ this.uicontrol = (function() {
return false;
},
mouseup(event) {
this._resize(event);
sendEvent("selection-resized");
ui.Box.display(selectedPos, standardDisplayCallbacks);
if (resizeHasMoved) {
- if (resizeDirection == "move") {
- let startPos = new Pos(resizeStartSelected.left, resizeStartSelected.top);
- let endPos = new Pos(selectedPos.left, selectedPos.top);
+ if (resizeDirection === "move") {
+ const startPos = new Pos(resizeStartSelected.left, resizeStartSelected.top);
+ const endPos = new Pos(selectedPos.left, selectedPos.top);
sendEvent(
"move-selection", "mouseup",
eventOptionsForMove(startPos, endPos));
} else {
sendEvent(
"resize-selection", "mouseup",
eventOptionsForResize(resizeStartSelected, selectedPos));
}
- } else if (resizeDirection == "move") {
+ } else if (resizeDirection === "move") {
sendEvent("keep-resize-selection", "mouseup");
} else {
sendEvent("keep-move-selection", "mouseup");
}
setState("selected");
},
_resize(event) {
- let diffX = event.pageX - resizeStartPos.x;
- let diffY = event.pageY - resizeStartPos.y;
- let movement = movements[resizeDirection];
+ const diffX = event.pageX - resizeStartPos.x;
+ const diffY = event.pageY - resizeStartPos.y;
+ const movement = movements[resizeDirection];
if (movement[0]) {
let moveX = movement[0];
- moveX = moveX == "*" ? ["x1", "x2"] : [moveX];
- for (let moveDir of moveX) {
+ moveX = moveX === "*" ? ["x1", "x2"] : [moveX];
+ for (const moveDir of moveX) {
selectedPos[moveDir] = util.truncateX(resizeStartSelected[moveDir] + diffX);
}
}
if (movement[1]) {
let moveY = movement[1];
- moveY = moveY == "*" ? ["y1", "y2"] : [moveY];
- for (let moveDir of moveY) {
+ moveY = moveY === "*" ? ["y1", "y2"] : [moveY];
+ for (const moveDir of moveY) {
selectedPos[moveDir] = util.truncateY(resizeStartSelected[moveDir] + diffY);
}
}
if (diffX || diffY) {
resizeHasMoved = true;
}
scrollIfByEdge(event.pageX, event.pageY);
ui.Box.display(selectedPos);
@@ -858,20 +861,20 @@ this.uicontrol = (function() {
return Math.max(
document.body && document.body.clientHeight,
document.documentElement.clientHeight,
document.body && document.body.scrollHeight,
document.documentElement.scrollHeight);
}
function scrollIfByEdge(pageX, pageY) {
- let top = window.scrollY;
- let bottom = top + window.innerHeight;
- let left = window.scrollX;
- let right = left + window.innerWidth;
+ const top = window.scrollY;
+ const bottom = top + window.innerHeight;
+ const left = window.scrollX;
+ const right = left + window.innerWidth;
if (pageY + SCROLL_BY_EDGE >= bottom && bottom < getDocumentHeight()) {
window.scrollBy(0, SCROLL_BY_EDGE);
} else if (pageY - SCROLL_BY_EDGE <= top) {
window.scrollBy(0, -SCROLL_BY_EDGE);
}
if (pageX + SCROLL_BY_EDGE >= right && right < getDocumentWidth()) {
window.scrollBy(SCROLL_BY_EDGE, 0);
} else if (pageX - SCROLL_BY_EDGE <= left) {
@@ -879,22 +882,22 @@ this.uicontrol = (function() {
}
}
/** *********************************************
* Selection communication
*/
// If the slides module is loaded then we're supposed to onboard
- let shouldOnboard = typeof slides !== "undefined";
+ const shouldOnboard = typeof slides !== "undefined";
exports.activate = function() {
if (!document.body) {
callBackground("abortStartShot");
- let tagName = String(document.documentElement.tagName || "").replace(/[^a-z0-9]/ig, "");
+ const tagName = String(document.documentElement.tagName || "").replace(/[^a-z0-9]/ig, "");
sendEvent("abort-start-shot", `document-is-${tagName}`);
selectorLoader.unloadModules();
return;
}
if (isFrameset()) {
callBackground("abortStartShot");
sendEvent("abort-start-shot", "frame-page");
selectorLoader.unloadModules();
@@ -904,27 +907,27 @@ this.uicontrol = (function() {
if (shouldOnboard) {
setState("onboarding");
} else {
setState("crosshairs");
}
}
function isFrameset() {
- return document.body.tagName == "FRAMESET";
+ return document.body.tagName === "FRAMESET";
}
exports.deactivate = function() {
try {
sendEvent("internal", "deactivate");
setState("cancel");
- callBackground('closeSelector');
+ callBackground("closeSelector");
selectorLoader.unloadModules();
} catch (e) {
- log.error('Error in deactivate', e)
+ log.error("Error in deactivate", e)
// Sometimes this fires so late that the document isn't available
// We don't care about the exception, so we swallow it here
}
};
let unloadTime = 0;
exports.unload = function() {
@@ -932,78 +935,78 @@ this.uicontrol = (function() {
unloadTime = Date.now();
removeHandlers();
};
/** *********************************************
* Event handlers
*/
- let primedDocumentHandlers = new Map();
+ const primedDocumentHandlers = new Map();
let registeredDocumentHandlers = []
function addHandlers() {
["mouseup", "mousedown", "mousemove", "click"].forEach((eventName) => {
- let fn = watchFunction(assertIsTrusted((function(eventName, event) {
- if (typeof event.button == "number" && event.button !== 0) {
+ const fn = watchFunction(assertIsTrusted((function(eventName, event) {
+ if (typeof event.button === "number" && event.button !== 0) {
// Not a left click
return undefined;
}
if (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) {
// Modified click of key
return undefined;
}
- let state = getState();
- let handler = stateHandlers[state];
+ const state = getState();
+ const handler = stateHandlers[state];
if (handler[eventName]) {
return handler[eventName](event);
}
return undefined;
}).bind(null, eventName)));
primedDocumentHandlers.set(eventName, fn);
});
primedDocumentHandlers.set("keyup", watchFunction(assertIsTrusted(keyupHandler)));
primedDocumentHandlers.set("keydown", watchFunction(assertIsTrusted(keydownHandler)));
- window.addEventListener('beforeunload', beforeunloadHandler);
+ window.document.addEventListener("visibilitychange", visibilityChangeHandler);
+ window.addEventListener("beforeunload", beforeunloadHandler);
}
let mousedownSetOnDocument = false;
function installHandlersOnDocument(docObj) {
- for (let [eventName, handler] of primedDocumentHandlers) {
- let watchHandler = watchFunction(handler);
- let useCapture = eventName !== "keyup";
+ for (const [eventName, handler] of primedDocumentHandlers) {
+ const watchHandler = watchFunction(handler);
+ const useCapture = eventName !== "keyup";
docObj.addEventListener(eventName, watchHandler, useCapture);
registeredDocumentHandlers.push({name: eventName, doc: docObj, handler: watchHandler, useCapture});
}
if (!mousedownSetOnDocument) {
- let mousedownHandler = primedDocumentHandlers.get("mousedown");
+ const mousedownHandler = primedDocumentHandlers.get("mousedown");
document.addEventListener("mousedown", mousedownHandler, true);
registeredDocumentHandlers.push({name: "mousedown", doc: document, handler: mousedownHandler, useCapture: true});
mousedownSetOnDocument = true;
}
}
function beforeunloadHandler() {
sendEvent("cancel-shot", "tab-load");
exports.deactivate();
}
function keydownHandler(event) {
// In MacOS, the keyup event for 'c' is not fired when performing cmd+c.
- if (event.code === "KeyC" && (event.ctrlKey || event.metaKey)) {
- callBackground("getPlatformOs").then(os => {
+ if (event.code === "KeyC" && (event.ctrlKey || event.metaKey)
+ && ["previewing", "selected"].includes(getState.state)) {
+ catcher.watchPromise(callBackground("getPlatformOs").then(os => {
if ((event.ctrlKey && os !== "mac") ||
(event.metaKey && os === "mac")) {
sendEvent("copy-shot", "keyboard-copy");
- shooter.copyShot(selectedPos);
+ copyShot();
}
- }).catch(() => {
- // handled by catcher.watchPromise
- });
+ }));
}
}
function keyupHandler(event) {
if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) {
// unused modifier keys
return;
}
@@ -1013,27 +1016,35 @@ this.uicontrol = (function() {
}
// Enter to trigger Save or Download by default. But if the user tabbed to
// select another button, then we do not want this.
if ((event.key || event.code) === "Enter"
&& getState.state === "selected"
&& ui.iframe.document().activeElement.tagName === "BODY") {
if (ui.isDownloadOnly()) {
sendEvent("download-shot", "keyboard-enter");
- shooter.downloadShot(selectedPos);
+ downloadShot();
} else {
sendEvent("save-shot", "keyboard-enter");
shooter.takeShot("selection", selectedPos);
}
}
}
+ function visibilityChangeHandler(event) {
+ // The document is the event target
+ if (event.target.hidden) {
+ sendEvent("internal", "document-hidden");
+ }
+ }
+
function removeHandlers() {
window.removeEventListener("beforeunload", beforeunloadHandler);
- for (let {name, doc, handler, useCapture} of registeredDocumentHandlers) {
+ window.document.removeEventListener("visibilitychange", visibilityChangeHandler);
+ for (const {name, doc, handler, useCapture} of registeredDocumentHandlers) {
doc.removeEventListener(name, handler, !!useCapture);
}
registeredDocumentHandlers = [];
}
catcher.watchFunction(exports.activate)();
return exports;
--- a/browser/extensions/screenshots/webextension/selector/util.js
+++ b/browser/extensions/screenshots/webextension/selector/util.js
@@ -1,52 +1,52 @@
"use strict";
this.util = (function() { // eslint-disable-line no-unused-vars
- let exports = {};
+ const exports = {};
/** Removes a node from its document, if it's a node and the node is attached to a parent */
exports.removeNode = function(el) {
if (el && el.parentNode) {
el.remove();
}
};
/** Truncates the X coordinate to the document size */
exports.truncateX = function(x) {
- let max = Math.max(document.documentElement.clientWidth, document.body.clientWidth, document.documentElement.scrollWidth, document.body.scrollWidth);
+ const max = Math.max(document.documentElement.clientWidth, document.body.clientWidth, document.documentElement.scrollWidth, document.body.scrollWidth);
if (x < 0) {
return 0;
} else if (x > max) {
return max;
}
return x;
};
/** Truncates the Y coordinate to the document size */
exports.truncateY = function(y) {
- let max = Math.max(document.documentElement.clientHeight, document.body.clientHeight, document.documentElement.scrollHeight, document.body.scrollHeight);
+ const max = Math.max(document.documentElement.clientHeight, document.body.clientHeight, document.documentElement.scrollHeight, document.body.scrollHeight);
if (y < 0) {
return 0;
} else if (y > max) {
return max;
}
return y;
};
// Pixels of wiggle the captured region gets in captureSelectedText:
- var CAPTURE_WIGGLE = 10;
+ const CAPTURE_WIGGLE = 10;
const ELEMENT_NODE = document.ELEMENT_NODE;
exports.captureEnclosedText = function(box) {
- var scrollX = window.scrollX;
- var scrollY = window.scrollY;
- var text = [];
+ const scrollX = window.scrollX;
+ const scrollY = window.scrollY;
+ const text = [];
function traverse(el) {
- var elBox = el.getBoundingClientRect();
+ let elBox = el.getBoundingClientRect();
elBox = {
top: elBox.top + scrollY,
bottom: elBox.bottom + scrollY,
left: elBox.left + scrollX,
right: elBox.right + scrollX
};
if (elBox.bottom < box.top ||
elBox.top > box.bottom ||
@@ -55,31 +55,31 @@ this.util = (function() { // eslint-disa
// Totally outside of the box
return;
}
if (elBox.bottom > box.bottom + CAPTURE_WIGGLE ||
elBox.top < box.top - CAPTURE_WIGGLE ||
elBox.right > box.right + CAPTURE_WIGGLE ||
elBox.left < box.left - CAPTURE_WIGGLE) {
// Partially outside the box
- for (var i = 0; i < el.childNodes.length; i++) {
- var child = el.childNodes[i];
- if (child.nodeType == ELEMENT_NODE) {
+ for (let i = 0; i < el.childNodes.length; i++) {
+ const child = el.childNodes[i];
+ if (child.nodeType === ELEMENT_NODE) {
traverse(child);
}
}
return;
}
addText(el);
}
function addText(el) {
let t;
- if (el.tagName == "IMG") {
+ if (el.tagName === "IMG") {
t = el.getAttribute("alt") || el.getAttribute("title");
- } else if (el.tagName == "A") {
+ } else if (el.tagName === "A") {
t = el.innerText;
if (el.getAttribute("href") && !el.getAttribute("href").startsWith("#")) {
t += " (" + el.href + ")";
}
} else {
t = el.innerText;
}
if (t) {
--- a/browser/extensions/screenshots/webextension/sitehelper.js
+++ b/browser/extensions/screenshots/webextension/sitehelper.js
@@ -3,64 +3,64 @@
communicate with the add-on */
"use strict";
this.sitehelper = (function() {
// This gives us the content's copy of XMLHttpRequest, instead of the wrapped
// copy that this content script gets:
- let ContentXMLHttpRequest = content.XMLHttpRequest;
+ const ContentXMLHttpRequest = content.XMLHttpRequest;
catcher.registerHandler((errorObj) => {
callBackground("reportError", errorObj);
});
function sendCustomEvent(name, detail) {
- if (typeof detail == "object") {
+ if (typeof detail === "object") {
// Note sending an object can lead to security problems, while a string
// is safe to transfer:
detail = JSON.stringify(detail);
}
document.dispatchEvent(new CustomEvent(name, {detail}));
}
/** Set the cookie, even if third-party cookies are disabled in this browser
(when they are disabled, login from the background page won't set cookies) */
function sendBackupCookieRequest(authHeaders) {
// See https://bugzilla.mozilla.org/show_bug.cgi?id=1295660
// This bug would allow us to access window.content.XMLHttpRequest, and get
// a safer (not overridable by content) version of the object.
// This is a very minimal attempt to verify that the XMLHttpRequest object we got
// is legitimate. It is not a good test.
- if (Object.toString.apply(ContentXMLHttpRequest) != "function XMLHttpRequest() {\n [native code]\n}") {
+ if (Object.toString.apply(ContentXMLHttpRequest) !== "function XMLHttpRequest() {\n [native code]\n}") {
console.warn("Insecure copy of XMLHttpRequest");
return;
}
- let req = new ContentXMLHttpRequest();
+ const req = new ContentXMLHttpRequest();
req.open("POST", "/api/set-login-cookie");
- for (let name in authHeaders) {
+ for (const name in authHeaders) {
req.setRequestHeader(name, authHeaders[name]);
}
req.send("");
req.onload = () => {
- if (req.status != 200) {
+ if (req.status !== 200) {
console.warn("Attempt to set Screenshots cookie via /api/set-login-cookie failed:", req.status, req.statusText, req.responseText);
}
};
}
document.addEventListener("delete-everything", catcher.watchFunction((event) => {
// FIXME: reset some data in the add-on
}, false));
document.addEventListener("request-login", catcher.watchFunction((event) => {
- let shotId = event.detail;
+ const shotId = event.detail;
catcher.watchPromise(callBackground("getAuthInfo", shotId || null).then((info) => {
sendBackupCookieRequest(info.authHeaders);
sendCustomEvent("login-successful", {deviceId: info.deviceId, isOwner: info.isOwner, backupCookieRequest: true});
}));
}));
document.addEventListener("request-onboarding", catcher.watchFunction((event) => {
callBackground("requestOnboarding");