(self["webpackChunkphotos"] = self["webpackChunkphotos"] || []).push([["vendors-node_modules_nextcloud_vue_dist_Components_ActionButton_js-node_modules_nextcloud_vue-bc77c2"],{ /***/ "./node_modules/@nextcloud/calendar-js/dist/index.esm.js": /*!***************************************************************!*\ !*** ./node_modules/@nextcloud/calendar-js/dist/index.esm.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "AbstractComponent": () => (/* binding */ AbstractComponent), /* harmony export */ "AbstractParser": () => (/* binding */ AbstractParser), /* harmony export */ "AbstractRecurringComponent": () => (/* binding */ AbstractRecurringComponent), /* harmony export */ "AbstractValue": () => (/* binding */ AbstractValue), /* harmony export */ "AlarmComponent": () => (/* binding */ AlarmComponent), /* harmony export */ "AttachmentProperty": () => (/* binding */ AttachmentProperty), /* harmony export */ "AttendeeProperty": () => (/* binding */ AttendeeProperty), /* harmony export */ "BinaryValue": () => (/* binding */ BinaryValue), /* harmony export */ "CalendarComponent": () => (/* binding */ CalendarComponent), /* harmony export */ "ConferenceProperty": () => (/* binding */ ConferenceProperty), /* harmony export */ "DateTimeValue": () => (/* binding */ DateTimeValue), /* harmony export */ "DurationValue": () => (/* binding */ DurationValue), /* harmony export */ "EventComponent": () => (/* binding */ EventComponent), /* harmony export */ "ExpectedICalJSError": () => (/* binding */ ExpectedICalJSError), /* harmony export */ "FreeBusyComponent": () => (/* binding */ FreeBusyComponent), /* harmony export */ "FreeBusyProperty": () => (/* binding */ FreeBusyProperty), /* harmony export */ "GeoProperty": () => (/* binding */ GeoProperty), /* harmony export */ "ICalendarParser": () => (/* binding */ ICalendarParser), /* harmony export */ "IllegalValueError": () => (/* binding */ IllegalValueError), /* harmony export */ "ImageProperty": () => (/* binding */ ImageProperty), /* harmony export */ "JournalComponent": () => (/* binding */ JournalComponent), /* harmony export */ "ModificationNotAllowedError": () => (/* binding */ ModificationNotAllowedError), /* harmony export */ "Parameter": () => (/* binding */ Parameter), /* harmony export */ "ParserManager": () => (/* binding */ ParserManager), /* harmony export */ "PeriodValue": () => (/* binding */ PeriodValue), /* harmony export */ "Property": () => (/* binding */ Property), /* harmony export */ "RecurValue": () => (/* binding */ RecurValue), /* harmony export */ "RecurrenceManager": () => (/* binding */ RecurrenceManager), /* harmony export */ "RecurringWithoutDtStartError": () => (/* binding */ RecurringWithoutDtStartError), /* harmony export */ "RelationProperty": () => (/* binding */ RelationProperty), /* harmony export */ "RequestStatusProperty": () => (/* binding */ RequestStatusProperty), /* harmony export */ "TextProperty": () => (/* binding */ TextProperty), /* harmony export */ "Timezone": () => (/* binding */ Timezone), /* harmony export */ "TimezoneAdapter": () => (/* binding */ TimezoneAdapter), /* harmony export */ "TimezoneComponent": () => (/* binding */ TimezoneComponent), /* harmony export */ "TimezoneManager": () => (/* binding */ TimezoneManager), /* harmony export */ "ToDoComponent": () => (/* binding */ ToDoComponent), /* harmony export */ "TriggerProperty": () => (/* binding */ TriggerProperty), /* harmony export */ "UTCOffsetValue": () => (/* binding */ UTCOffsetValue), /* harmony export */ "UnknownICALTypeError": () => (/* binding */ UnknownICALTypeError), /* harmony export */ "createEvent": () => (/* binding */ createEvent), /* harmony export */ "createFreeBusyRequest": () => (/* binding */ createFreeBusyRequest), /* harmony export */ "getConstructorForICALType": () => (/* binding */ getConstructorForICALType), /* harmony export */ "getConstructorForPropertyName": () => (/* binding */ getConstructorForPropertyName), /* harmony export */ "getParserManager": () => (/* binding */ getParserManager), /* harmony export */ "getReadableTimezoneName": () => (/* binding */ getReadableTimezoneName), /* harmony export */ "getSortedTimezoneList": () => (/* binding */ getSortedTimezoneList), /* harmony export */ "getTimezoneManager": () => (/* binding */ getTimezoneManager), /* harmony export */ "isOlsonTimezone": () => (/* binding */ isOlsonTimezone), /* harmony export */ "parseICSAndGetAllOccurrencesBetween": () => (/* binding */ parseICSAndGetAllOccurrencesBetween), /* harmony export */ "setConfig": () => (/* binding */ setConfig) /* harmony export */ }); /* harmony import */ var ical_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ical.js */ "./node_modules/ical.js/build/ical.js"); /* harmony import */ var ical_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(ical_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! uuid */ "./node_modules/uuid/dist/esm-browser/v4.js"); /* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ "./node_modules/console-browserify/index.js"); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AbstractParser * @classdesc */ class AbstractParser { /** * @constructor * * @param {Object=} options Object of options * @param {Boolean=} options.extractGlobalProperties Whether or not to preserve properties from the VCALENDAR component (defaults to false) * @param {Boolean=} options.removeRSVPForAttendees Whether or not to remove RSVP from attendees (defaults to false) * @param {Boolean=} options.includeTimezones Whether or not to include timezones (defaults to false) * @param {Boolean=} options.preserveMethod Whether or not to preserve the iCalendar method (defaults to false) * @param {Boolean=} options.processFreeBusy Whether or not to process VFreeBusy components (defaults to false) */ constructor(options = {}) { if (new.target === AbstractParser) { throw new TypeError('Cannot instantiate abstract class AbstractParser'); } /** * Options for the parser * * @type {{removeRSVPForAttendees: Boolean}} * @private */ this._options = Object.assign({}, options); /** * A name extracted from the calendar-data * * @type {String|null} * @protected */ this._name = null; /** * A color extracted from the calendar-data * * @type {String|null} * @protected */ this._color = null; /** * Gets the url that this icalendar file can be updated from * * @type {String} * @protected */ this._sourceURL = null; /** * Gets the update interval if this icalendar file can be updated from a source * * @type {String} * @protected */ this._refreshInterval = null; /** * Gets the default timezone of this calendar * * @type {String} * @protected */ this._calendarTimezone = null; /** * Error count during parsing * * @type {Array} * @protected */ this._errors = []; } /** * Gets the name extracted from the calendar-data * * @returns {String|null} */ getName() { return this._name; } /** * Gets the color extracted from the calendar-data * * @returns {String|null} */ getColor() { return this._color; } /** * Gets whether this import can be converted into a webcal subscription * * @returns {boolean} */ offersWebcalFeed() { return this._sourceURL !== null; } /** * Gets the url pointing to the webcal source * * @returns {String|null} */ getSourceURL() { return this._sourceURL; } /** * Gets the recommended refresh rate to update this subscription * * @returns {String|null} */ getRefreshInterval() { return this._refreshInterval; } /** * Gets the default timezone of this calendar * * @returns {String} */ getCalendarTimezone() { return this._calendarTimezone; } /** * {String|Object} data * * @param {any} data The data to parse * @throws TypeError */ parse(data) { throw new TypeError('Abstract method not implemented by subclass'); } /** * Returns one CalendarComponent at a time */ *getItemIterator() { // eslint-disable-line require-yield throw new TypeError('Abstract method not implemented by subclass'); } /** * Get an array of all items * * @returns {CalendarComponent[]} */ getAllItems() { return Array.from(this.getItemIterator()); } /** * Returns a boolean whether or not the parsed data contains vevents * * @returns {boolean} */ containsVEvents() { return false; } /** * Returns a boolean whether or not the parsed data contains vjournals * * @returns {boolean} */ containsVJournals() { return false; } /** * Returns a boolean whether or not the parsed data contains vtodos * * @returns {boolean} */ containsVTodos() { return false; } /** * Returns a boolean whether or not the parsed data contains vfreebusys * * @returns {boolean} */ containsVFreeBusy() { return false; } /** * Returns a boolean whether * * @returns {boolean} */ hasErrors() { return this._errors.length !== 0; } /** * Get a list of all errors that occurred * * @returns {*[]} */ getErrorList() { return this._errors.slice(); } /** * Returns the number of calendar-objects in parser * * @returns {number} */ getItemCount() { return 0; } /** * Gets an option provided * * @param {String} name The name of the option to get * @param {*} defaultValue The default value to return if option not provided * @returns {any} * @protected */ _getOption(name, defaultValue) { return Object.prototype.hasOwnProperty.call(this._options, name) ? this._options[name] : defaultValue; } /** * Return list of supported mime types * * @static */ static getMimeTypes() { throw new TypeError('Abstract method not implemented by subclass'); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class ModificationNotAllowedError extends Error {} /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ function lockableTrait(baseClass) { /** * @class LockableTrait */ return class extends baseClass { /** * Constructor */ constructor(...args) { super(...args); /** * Indicator whether this value was locked for changes * * @type {boolean} * @private */ this._mutable = true; } /** * Returns whether or not this object is locked * * @returns {boolean} */ isLocked() { return !this._mutable; } /** * Marks this object is immutable * locks it against further modification */ lock() { this._mutable = false; } /** * Marks this object as mutable * allowing further modification */ unlock() { this._mutable = true; } /** * Check if modifications are allowed * * @throws {ModificationNotAllowedError} if this object is locked for modification * @protected */ _modify() { if (!this._mutable) { throw new ModificationNotAllowedError(); } } /** * Check if modification of content is allowed * * @throws {ModificationNotAllowedError} if this object is locked for modification * @protected */ _modifyContent() { this._modify(); } }; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class ExpectedICalJSError extends Error {} /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Turns the entire string lowercase * * @param {String} str The string to turn lowercase * @returns {string} */ function lc(str) { return str.toLowerCase(); } /** * Turns the entire string uppercase * * @param {String} str The string to turn uppercase * @returns {string} */ function uc(str) { return str.toUpperCase(); } /** * Capitalizes the string * * @param {String} str The string of which the first character will be turned uppercase * @returns {string} */ function ucFirst(str) { return str.charAt(0).toUpperCase() + str.slice(1); } /** * Makes sure that a string starts with a certain other string * This is mostly used in the attendeeProperty to assure the uri starts with mailto: * * @param {String} str The string to check for the prefix and prepend if necessary * @param {String} startWith The prefix to be added if necessary * @returns {string} */ function startStringWith(str, startWith) { if (!str.startsWith(startWith)) { str = startWith + str; } return str; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @type {Map} */ const GLOBAL_CONFIG = new Map(); /** * Sets a new config key * * @param {String} key The config-key to set * @param {*} value The value to set for given config-key */ function setConfig(key, value) { GLOBAL_CONFIG.set(key, value); } /** * gets value of a config key * * @param {String} key The config-key to get * @param {*} defaultValue Default value of config does not exist * @returns {*} */ function getConfig(key, defaultValue) { return GLOBAL_CONFIG.get(key) || defaultValue; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * creates a new ICAL.Component object * * @param {string} componentName The name of the component to create * @returns {ICAL.Component} */ function createComponent(componentName) { return new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Component)(lc(componentName)); } /** * creates a new ICAL.Property object * * @param {string} propertyName The name of the property to create * @returns {ICAL.Property} */ function createProperty(propertyName) { return new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Property)(lc(propertyName)); } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ function observerTrait(baseClass) { /** * @class ObserverTrait */ return class extends baseClass { /** * Constructor */ constructor(...args) { super(...args); /** * List of subscribers * * @type {Function[]} * @private */ this._subscribers = []; } /** * Adds a new subscriber * * @param {Function} handler - Handler to be called when modification happens */ subscribe(handler) { this._subscribers.push(handler); } /** * Removes a subscriber * * @param {Function} handler - Handler to be no longer called when modification happens */ unsubscribe(handler) { const index = this._subscribers.indexOf(handler); if (index === -1) { return; } this._subscribers.splice(index, 1); } /** * Notify all subscribed handlers * * @protected */ _notifySubscribers(...args) { for (const handler of this._subscribers) { handler(...args); } } }; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class Parameter * @classdesc This class represents a property parameters as defined in RFC 5545 Section 3.2 * * @url https://tools.ietf.org/html/rfc5545#section-3.2 * @url */ class Parameter extends observerTrait(lockableTrait(class {})) { /** * Constructor * * @param {string} name The name of the parameter * @param {string|Array|null} value The value of the parameter */ constructor(name, value = null) { super(); /** * Name of the parameter * * @type {string} * @private */ this._name = uc(name); /** * Value of the parameter * * @type {string|Array|null} * @private */ this._value = value; } /** * Get parameter name * * @readonly * @returns {String} */ get name() { return this._name; } /** * Get parameter value * * @returns {String|Array} */ get value() { return this._value; } /** * Set new parameter value * * @throws {ModificationNotAllowedError} if parameter is locked for modification * @param {String|Array} value The new value to set */ set value(value) { this._modifyContent(); this._value = value; } /** * Gets the first value of this parameter * * @returns {String|null} */ getFirstValue() { if (!this.isMultiValue()) { return this.value; } else { if (this.value.length > 0) { return this.value[0]; } } return null; } /** * Gets an iterator for all values */ *getValueIterator() { if (this.isMultiValue()) { yield* this.value.slice()[Symbol.iterator](); } else { yield this.value; } } /** * Returns whether or not the value is a multivalue * * @returns {Boolean} */ isMultiValue() { return Array.isArray(this._value); } /** * Creates a copy of this parameter * * @returns {Parameter} */ clone() { const parameter = new this.constructor(this._name); if (this.isMultiValue()) { // only copy array values, don't copy array reference parameter.value = this._value.slice(); } else { parameter.value = this._value; } // cloned parameters are always mutable return parameter; } /** * @inheritDoc */ _modifyContent() { super._modifyContent(); this._notifySubscribers(); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AbstractValue * @classdesc BaseClass for all values */ class AbstractValue extends observerTrait(lockableTrait(class {})) { /** * Constructor * * @param {ICAL.Binary|ICAL.Duration|ICAL.Period|ICAL.Recur|ICAL.Time|ICAL.UtcOffset} icalValue The ICAL.JS object to wrap */ constructor(icalValue) { if (new.target === AbstractValue) { throw new TypeError('Cannot instantiate abstract class AbstractValue'); } super(); /** * Wrapped ICAL.js value * * @type {ICAL.Binary|ICAL.Duration|ICAL.Period|ICAL.Recur|ICAL.Time|ICAL.UtcOffset} */ this._innerValue = icalValue; } /** * Gets wrapped ICAL.JS object * * @returns {*} */ toICALJs() { return this._innerValue; } /** * @inheritDoc */ _modifyContent() { super._modifyContent(); this._notifySubscribers(); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class BinaryValue * @classdesc Wrapper for ICAL.Binary * * @url https://tools.ietf.org/html/rfc5545#section-3.1.3 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/binary.js */ class BinaryValue extends AbstractValue { /** * Sets the raw b64 encoded value * * @returns {String} */ get rawValue() { return this._innerValue.value; } /** * Gets the raw b64 encoded value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {String} value - The new raw value */ set rawValue(value) { this._modifyContent(); this._innerValue.value = value; } /** * Gets the decoded value * * @returns {String} */ get value() { return this._innerValue.decodeValue(); } /** * Sets the decoded Value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {String} decodedValue - The new encoded value */ set value(decodedValue) { this._modifyContent(); this._innerValue.setEncodedValue(decodedValue); } /** * clones this value * * @returns {BinaryValue} */ clone() { return BinaryValue.fromRawValue(this._innerValue.value); } /** * Create a new BinaryValue object from an ICAL.Binary object * * @param {ICAL.Binary} icalValue - The ICAL.Binary object * @returns {BinaryValue} */ static fromICALJs(icalValue) { return new BinaryValue(icalValue); } /** * Create a new BinaryValue object from a raw b64 encoded value * * @param {String} rawValue - The raw value * @returns {BinaryValue} */ static fromRawValue(rawValue) { const icalBinary = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Binary)(rawValue); return BinaryValue.fromICALJs(icalBinary); } /** * Create a new BinaryValue object from decoded value * * @param {String} decodedValue - The encoded value * @returns {BinaryValue} */ static fromDecodedValue(decodedValue) { const icalBinary = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Binary)(); icalBinary.setEncodedValue(decodedValue); return BinaryValue.fromICALJs(icalBinary); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class DurationValue * @classdesc Wrapper for ICAL.Duration * * @url https://tools.ietf.org/html/rfc5545#section-3.3.6 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/duration.js */ class DurationValue extends AbstractValue { /** * Gets the weeks of the stored duration-value * * @returns {Number} */ get weeks() { return this._innerValue.weeks; } /** * Sets the weeks of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if value is negative * @param {Number} weeks Amount of weeks */ set weeks(weeks) { this._modifyContent(); if (weeks < 0) { throw new TypeError('Weeks cannot be negative, use isNegative instead'); } this._innerValue.weeks = weeks; } /** * Gets the days of the stored duration-value * * @returns {Number} */ get days() { return this._innerValue.days; } /** * Sets the days of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if value is negative * @param {Number} days Amount of days */ set days(days) { this._modifyContent(); if (days < 0) { throw new TypeError('Days cannot be negative, use isNegative instead'); } this._innerValue.days = days; } /** * Gets the hours of the stored duration-value * * @returns {Number} */ get hours() { return this._innerValue.hours; } /** * Sets the weeks of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if value is negative * @param {Number} hours Amount of hours */ set hours(hours) { this._modifyContent(); if (hours < 0) { throw new TypeError('Hours cannot be negative, use isNegative instead'); } this._innerValue.hours = hours; } /** * Gets the minutes of the stored duration-value * * @returns {Number} */ get minutes() { return this._innerValue.minutes; } /** * Sets the minutes of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if value is negative * @param {Number} minutes Amount of minutes */ set minutes(minutes) { this._modifyContent(); if (minutes < 0) { throw new TypeError('Minutes cannot be negative, use isNegative instead'); } this._innerValue.minutes = minutes; } /** * Gets the seconds of the stored duration-value * * @returns {Number} */ get seconds() { return this._innerValue.seconds; } /** * Sets the seconds of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if value is negative * @param {Number} seconds Amount of seconds */ set seconds(seconds) { this._modifyContent(); if (seconds < 0) { throw new TypeError('Seconds cannot be negative, use isNegative instead'); } this._innerValue.seconds = seconds; } /** * Gets the negative-indicator of the stored duration-value * * @returns {Boolean} */ get isNegative() { return this._innerValue.isNegative; } /** * Gets the negative-indicator of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Boolean} isNegative Whether or not the duration is negative */ set isNegative(isNegative) { this._modifyContent(); this._innerValue.isNegative = !!isNegative; } /** * Gets the amount of total seconds of the stored duration-value * * @returns {*|Number} */ get totalSeconds() { return this._innerValue.toSeconds(); } /** * Sets the amount of total seconds of the stored duration-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} totalSeconds The total amounts of seconds to set */ set totalSeconds(totalSeconds) { this._modifyContent(); this._innerValue.fromSeconds(totalSeconds); } /** * Compares this duration to another one * * @param {DurationValue} otherDuration The duration to compare to * @returns {Number} -1, 0 or 1 for less/equal/greater */ compare(otherDuration) { return this._innerValue.compare(otherDuration.toICALJs()); } /** * Adds the value of another duration to this one * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DurationValue} otherDuration The duration to add */ addDuration(otherDuration) { this._modifyContent(); this.totalSeconds += otherDuration.totalSeconds; this._innerValue.normalize(); } /** * Subtract the value of another duration from this one * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DurationValue} otherDuration The duration to subtract */ subtractDuration(otherDuration) { this._modifyContent(); this.totalSeconds -= otherDuration.totalSeconds; this._innerValue.normalize(); } /** * clones this value * * @returns {DurationValue} */ clone() { return DurationValue.fromICALJs(this._innerValue.clone()); } /** * Create a new DurationValue object from an ICAL.Duration object * * @param {ICAL.Duration} icalValue The ical.js duration value * @returns {DurationValue} */ static fromICALJs(icalValue) { return new DurationValue(icalValue); } /** * Create a new DurationValue object from a number of seconds * * @param {Number} seconds Total amount of seconds * @returns {DurationValue} */ static fromSeconds(seconds) { const icalDuration = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Duration.fromSeconds(seconds); return new DurationValue(icalDuration); } /** * Create a new DurationValue object from data * * @param {Object} data The destructuring object * @param {Number=} data.weeks Number of weeks to set * @param {Number=} data.days Number of days to set * @param {Number=} data.hours Number of hours to set * @param {Number=} data.minutes Number of minutes to set * @param {Number=} data.seconds Number of seconds to set * @param {Boolean=} data.isNegative Whether or not duration is negative * @returns {DurationValue} */ static fromData(data) { const icalDuration = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Duration.fromData(data); return new DurationValue(icalDuration); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class DateTimeValue * @classdesc Wrapper for ICAL.Time * * @url https://tools.ietf.org/html/rfc5545#section-3.3.4 * @url https://tools.ietf.org/html/rfc5545#section-3.3.5 * @url https://tools.ietf.org/html/rfc5545#section-3.3.12 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/time.js */ class DateTimeValue extends AbstractValue { /** * Gets the year of the stored date-time-value * * @returns {Number} */ get year() { return this._innerValue.year; } /** * Sets the year of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} year Number of years to set */ set year(year) { this._modifyContent(); this._innerValue.year = year; } /** * Gets the month of the stored date-time-value * * @returns {Number} */ get month() { return this._innerValue.month; } /** * Sets the month of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} month Number of months to set */ set month(month) { this._modifyContent(); if (month < 1 || month > 12) { throw new TypeError('Month out of range'); } this._innerValue.month = month; } /** * Gets the day of the stored date-time-value * * @returns {Number} */ get day() { return this._innerValue.day; } /** * Sets the day of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if out of range * @param {Number} day Number of days to set */ set day(day) { this._modifyContent(); if (day < 1 || day > 31) { throw new TypeError('Day out of range'); } this._innerValue.day = day; } /** * Gets the hour of the stored date-time-value * * @returns {Number} */ get hour() { return this._innerValue.hour; } /** * Sets the hour of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if out of range * @param {Number} hour Number of hours to set */ set hour(hour) { this._modifyContent(); if (hour < 0 || hour > 23) { throw new TypeError('Hour out of range'); } this._innerValue.hour = hour; } /** * Gets the minute of the stored date-time-value * * @returns {Number} */ get minute() { return this._innerValue.minute; } /** * Sets the minute of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if out of range * @param {Number} minute Number of minutes to set */ set minute(minute) { this._modifyContent(); if (minute < 0 || minute > 59) { throw new TypeError('Minute out of range'); } this._innerValue.minute = minute; } /** * Gets the second of the stored date-time-value * * @returns {Number} */ get second() { return this._innerValue.second; } /** * Sets the second of the stored date-time-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if out of range * @param {Number} second Number of seconds to set */ set second(second) { this._modifyContent(); if (second < 0 || second > 59) { throw new TypeError('Second out of range'); } this._innerValue.second = second; } /** * Gets the timezone of this date-time-value * * @returns {String|null} */ get timezoneId() { // If zone.tzid is set and it's not 'floating' nor 'UTC', then it's a proper // timezone that we also have a timezone id for if (this._innerValue.zone.tzid && this._innerValue.zone.tzid !== 'floating' && this._innerValue.zone.tzid === 'UTC') { return this._innerValue.zone.tzid; } // If there is a timezone set, but we didn't have a zone.tzid in the previous if, // this means that the tzid does not have a definition stored along it. // we will keep this information anyway to not lose it if (this._innerValue.timezone) { return this._innerValue.timezone; } // this is the case when it's floating / UTC return this._innerValue.zone.tzid || null; } /** * Gets whether this date-time-value is a date or date-time * * @returns {boolean} */ get isDate() { return this._innerValue.isDate; } /** * Sets whether this date-time-value is a date or date-time * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {boolean} isDate Whether this is a date or date-time value */ set isDate(isDate) { this._modifyContent(); this._innerValue.isDate = !!isDate; if (isDate) { this._innerValue.hour = 0; this._innerValue.minute = 0; this._innerValue.second = 0; } } /** * Gets the unix-time * * @returns {Number} */ get unixTime() { return this._innerValue.toUnixTime(); } /** * returns vanilla javascript date object * * @returns {Date} */ get jsDate() { return this._innerValue.toJSDate(); } /** * Adds a duration to this date-time-value * * @param {DurationValue} duration The duration to ad */ addDuration(duration) { this._innerValue.addDuration(duration.toICALJs()); } /** * Subtract another date excluding timezones * * @param {DateTimeValue} other The date-time value to subtract * @returns {DurationValue} */ subtractDateWithoutTimezone(other) { const icalDuration = this._innerValue.subtractDate(other.toICALJs()); return DurationValue.fromICALJs(icalDuration); } /** * Subtract another date, taking timezones into account * * @param {DateTimeValue} other The date-time value to subtract * @returns {DurationValue} */ subtractDateWithTimezone(other) { const icalDuration = this._innerValue.subtractDateTz(other.toICALJs()); return DurationValue.fromICALJs(icalDuration); } /** * Compares this DateTimeValue object with another one * * @param {DateTimeValue} other The date-time to compare to * @returns {Number} -1, 0 or 1 for less/equal/greater */ compare(other) { return this._innerValue.compare(other.toICALJs()); } /** * Compares only the date part in a given timezone * * @param {DateTimeValue} other The date-time to compare to * @param {Timezone} timezone The timezone to compare in * @returns {Number} -1, 0 or 1 for less/equal/greater */ compareDateOnlyInGivenTimezone(other, timezone) { return this._innerValue.compareDateOnlyTz(other.toICALJs(), timezone.toICALTimezone()); } /** * Returns a clone of this object which was converted to a different timezone * * @param {Timezone} timezone TimezoneId to convert to * @returns {DateTimeValue} */ getInTimezone(timezone) { const clonedICALTime = this._innerValue.convertToZone(timezone.toICALTimezone()); return DateTimeValue.fromICALJs(clonedICALTime); } /** * Get the inner ICAL.Timezone * * @returns {ICAL.Timezone} * @package */ getICALTimezone() { return this._innerValue.zone; } /** * Returns a clone of this object which was converted to a different timezone * * @param {ICAL.Timezone} timezone TimezoneId to convert to * @returns {DateTimeValue} * @package */ getInICALTimezone(timezone) { const clonedICALTime = this._innerValue.convertToZone(timezone); return DateTimeValue.fromICALJs(clonedICALTime); } /** * Returns a clone of this object which was converted to UTC * * @returns {DateTimeValue} */ getInUTC() { const clonedICALTime = this._innerValue.convertToZone((ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone.utcTimezone)); return DateTimeValue.fromICALJs(clonedICALTime); } /** * This silently replaces the inner timezone without converting the actual time * * @param {ICAL.Timezone} timezone The timezone to replace with * @package */ silentlyReplaceTimezone(timezone) { this._modify(); this._innerValue = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)({ year: this.year, month: this.month, day: this.day, hour: this.hour, minute: this.minute, second: this.second, isDate: this.isDate, timezone }); } /** * Replaces the inner timezone without converting the actual time * * @param {Timezone} timezone The timezone to replace with */ replaceTimezone(timezone) { this._modifyContent(); this._innerValue = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.fromData({ year: this.year, month: this.month, day: this.day, hour: this.hour, minute: this.minute, second: this.second, isDate: this.isDate }, timezone.toICALTimezone()); } /** * Calculates the UTC offset of the date-time-value in its timezone * * @returns {Number} */ utcOffset() { return this._innerValue.utcOffset(); } /** * Check if this is an event with floating time * * @returns {boolean} */ isFloatingTime() { return this._innerValue.zone.tzid === 'floating'; } /** * clones this value * * @returns {DateTimeValue} */ clone() { return DateTimeValue.fromICALJs(this._innerValue.clone()); } /** * Create a new DateTimeValue object from an ICAL.Time object * * @param {ICAL.Time} icalValue The ical.js Date value to initialise from * @returns {DateTimeValue} */ static fromICALJs(icalValue) { return new DateTimeValue(icalValue); } /** * Creates a new DateTimeValue object based on a vanilla javascript object * * @param {Date} jsDate The JavaScript date to initialise from * @param {Boolean=} useUTC Whether or not to treat it as UTC * @returns {DateTimeValue} */ static fromJSDate(jsDate, useUTC = false) { const icalValue = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.fromJSDate(jsDate, useUTC); return DateTimeValue.fromICALJs(icalValue); } /** * Creates a new DateTimeValue object based on simple parameters * * @param {Object} data The destructuring object * @param {Number=} data.year Amount of years to set * @param {Number=} data.month Amount of month to set (1-based) * @param {Number=} data.day Amount of days to set * @param {Number=} data.hour Amount of hours to set * @param {Number=} data.minute Amount of minutes to set * @param {Number=} data.second Amount of seconds to set * @param {Boolean=} data.isDate Whether this is a date or date-time * @param {Timezone=} timezone The timezone of the DateTimeValue * @returns {DateTimeValue} */ static fromData(data, timezone) { const icalValue = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.fromData(data, timezone ? timezone.toICALTimezone() : undefined); return DateTimeValue.fromICALJs(icalValue); } } DateTimeValue.SUNDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.SUNDAY); DateTimeValue.MONDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.MONDAY); DateTimeValue.TUESDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.TUESDAY); DateTimeValue.WEDNESDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.WEDNESDAY); DateTimeValue.THURSDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.THURSDAY); DateTimeValue.FRIDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.FRIDAY); DateTimeValue.SATURDAY = (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.SATURDAY); DateTimeValue.DEFAULT_WEEK_START = DateTimeValue.MONDAY; /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class PeriodValue * @classdesc Wrapper for ICAL.Period * * @url https://tools.ietf.org/html/rfc5545#section-3.3.9 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/period.js */ class PeriodValue extends AbstractValue { /** * @inheritDoc */ constructor(...args) { super(...args); /** * DateTimeValue object for start * * @type {DateTimeValue} * @private */ this._start = DateTimeValue.fromICALJs(this._innerValue.start); /** * DateTimeValue object for end * * @type {DateTimeValue|null} * @private */ this._end = null; /** * DurationValue object for duration * * @type {DurationValue|null} * @private */ this._duration = null; } /** * Gets the start of the period-value * * @returns {DateTimeValue} */ get start() { return this._start; } /** * Sets the start of the period-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DateTimeValue} start The start of the period */ set start(start) { this._modifyContent(); this._start = start; this._innerValue.start = start.toICALJs(); } /** * Gets the end of the period-value * * @returns {DateTimeValue} */ get end() { if (!this._end) { if (this._duration) { this._duration.lock(); this._duration = null; } this._innerValue.end = this._innerValue.getEnd(); this._end = DateTimeValue.fromICALJs(this._innerValue.end); this._innerValue.duration = null; if (this.isLocked()) { this._end.lock(); } } return this._end; } /** * Sets the end of the period-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DateTimeValue} end The end of the period */ set end(end) { this._modifyContent(); this._innerValue.duration = null; this._innerValue.end = end.toICALJs(); this._end = end; } /** * Gets the duration of the period-value * The value is automatically locked. * If you want to edit the value, clone it and it as new duration * * @returns {DurationValue} */ get duration() { if (!this._duration) { if (this._end) { this._end.lock(); this._end = null; } this._innerValue.duration = this._innerValue.getDuration(); this._duration = DurationValue.fromICALJs(this._innerValue.duration); this._innerValue.end = null; if (this.isLocked()) { this._duration.lock(); } } return this._duration; } /** * Sets the duration of the period-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DurationValue} duration The duration to set */ set duration(duration) { this._modifyContent(); this._innerValue.end = null; this._innerValue.duration = duration.toICALJs(); this._duration = duration; } /** * @inheritDoc */ lock() { super.lock(); this.start.lock(); if (this._end) { this._end.lock(); } if (this._duration) { this._duration.lock(); } } /** * @inheritDoc */ unlock() { super.unlock(); this.start.unlock(); if (this._end) { this._end.unlock(); } if (this._duration) { this._duration.unlock(); } } /** * clones this value * * @returns {PeriodValue} */ clone() { return PeriodValue.fromICALJs(this._innerValue.clone()); } /** * Create a new PeriodValue object from a ICAL.Period object * * @param {ICAL.Period} icalValue The ical.js period value to initialise from * @returns {PeriodValue} */ static fromICALJs(icalValue) { return new PeriodValue(icalValue); } /** * Create a new PeriodValue object from start and end * * @param {Object} data The destructuring object * @param {DateTimeValue} data.start The start of the period * @param {DateTimeValue} data.end The end of the period * @returns {PeriodValue} */ static fromDataWithEnd(data) { const icalPeriod = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Period.fromData({ start: data.start.toICALJs(), end: data.end.toICALJs() }); return PeriodValue.fromICALJs(icalPeriod); } /** * Create a new PeriodValue object from start and duration * * @param {Object} data The destructuring object * @param {DateTimeValue} data.start The start of the period * @param {DurationValue} data.duration The duration of the period * @returns {PeriodValue} */ static fromDataWithDuration(data) { const icalPeriod = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Period.fromData({ start: data.start.toICALJs(), duration: data.duration.toICALJs() }); return PeriodValue.fromICALJs(icalPeriod); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ const ALLOWED_FREQ = ['SECONDLY', 'MINUTELY', 'HOURLY', 'DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY']; /** * @class RecurValue * @classdesc Wrapper for ICAL.Recur * * @url https://tools.ietf.org/html/rfc5545#section-3.3.10 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/recur.js */ class RecurValue extends AbstractValue { /** * Constructor * * @param {ICAL.Recur} icalValue The ical.js rrule value * @param {DateTimeValue?} until The Until date */ constructor(icalValue, until) { super(icalValue); /** * DateTimeValue object for Until * * @type {DateTimeValue} * @private */ this._until = until; } /** * Gets the stored interval of this recurrence rule * * @returns {Number} */ get interval() { return this._innerValue.interval; } /** * Sets the stored interval of this recurrence rule * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} interval New Interval to set */ set interval(interval) { this._modifyContent(); this._innerValue.interval = parseInt(interval, 10); } /** * Gets the weekstart used to calculate the recurrence expansion * * @returns {Number} */ get weekStart() { return this._innerValue.wkst; } /** * Sets the weekstart used to calculate the recurrence expansion * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if weekstart out of range * @param {Number} weekStart New start of week to set */ set weekStart(weekStart) { this._modifyContent(); if (weekStart < DateTimeValue.SUNDAY || weekStart > DateTimeValue.SATURDAY) { throw new TypeError('Weekstart out of range'); } this._innerValue.wkst = weekStart; } /** * Gets the until value if set * The value is automatically locked. * If you want to edit the value, clone it and it as new until * * @returns {null|DateTimeValue} */ get until() { if (!this._until && this._innerValue.until) { this._until = DateTimeValue.fromICALJs(this._innerValue.until); } return this._until; } /** * Sets the until value, automatically removes count * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {DateTimeValue} until New until date to set */ set until(until) { this._modifyContent(); if (this._until) { this._until.lock(); } this._until = until; this._innerValue.count = null; this._innerValue.until = until.toICALJs(); } /** * Gets the count value if set * * @returns {null|Number} */ get count() { return this._innerValue.count; } /** * Sets the count value, automatically removes until * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} count New occurrence limit to set */ set count(count) { this._modifyContent(); if (this._until) { this._until.lock(); this._until = null; } this._innerValue.until = null; this._innerValue.count = parseInt(count, 10); } /** * Gets the frequency of the recurrence rule * * @returns {String} see */ get frequency() { return this._innerValue.freq; } /** * Sets the frequency of the recurrence rule * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if frequency is unknown * @param {String} freq New frequency to set */ set frequency(freq) { this._modifyContent(); if (!ALLOWED_FREQ.includes(freq)) { throw new TypeError('Unknown frequency'); } this._innerValue.freq = freq; } /** * Modifies this recurrence-value to unset count and until */ setToInfinite() { this._modifyContent(); if (this._until) { this._until.lock(); this._until = null; } this._innerValue.until = null; this._innerValue.count = null; } /** * Checks whether the stored rule is finite * * @returns {Boolean} */ isFinite() { return this._innerValue.isFinite(); } /** * Checks whether the recurrence rule is limited by count * * @returns {Boolean} */ isByCount() { return this._innerValue.isByCount(); } /** * Adds a part to a component to the recurrence-rule * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {String} componentName The name of the recurrence-component to add * @param {String|Number} value The value to add */ addComponent(componentName, value) { this._modifyContent(); this._innerValue.addComponent(componentName, value); } /** * Sets / overwrites a component to the recurrence-rule * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {String} componentName The name of the component to set * @param {Number[]|String[]} value The value to set */ setComponent(componentName, value) { this._modifyContent(); if (value.length === 0) { delete this._innerValue.parts[componentName.toUpperCase()]; } else { this._innerValue.setComponent(componentName, value); } } /** * Removes all parts of a component * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {String} componentName The name of the component to remove */ removeComponent(componentName) { delete this._innerValue.parts[uc(componentName)]; } /** * Gets all parts of a component * * @param {String} componentName The name of the component to get * @returns {Array} */ getComponent(componentName) { return this._innerValue.getComponent(componentName); } /** * Checks if this recurrence rule is valid according to RFC 5545 * * @returns {boolean} */ isRuleValid() { return true; } /** * @inheritDoc */ lock() { super.lock(); if (this._until) { this._until.lock(); } } /** * @inheritDoc */ unlock() { super.unlock(); if (this._until) { this._until.unlock(); } } /** * clones this value * * @returns {RecurValue} */ clone() { return RecurValue.fromICALJs(this._innerValue.clone()); } /** * Create a new RecurValue object from a ICAL.Recur object * * @param {ICAL.Recur} icalValue The ICAL.JS Recur value * @param {DateTimeValue?} until The Until date * @returns {RecurValue} */ static fromICALJs(icalValue, until = null) { return new RecurValue(icalValue, until); } /** * Create a new RecurValue object from a data object * * @param {Object} data The destructuring object * @param {String=} data.freq FREQ part of RRULE * @param {Number=} data.interval INTERVAL part of RRULE * @param {Number=} data.wkst WEEKSTART part of RRULE * @param {DateTimeValue=} data.until UNTIL part of RRULE * @param {Number=} data.count COUNT part of RRULE * @param {Number[]=} data.bysecond BYSECOND part of RRULE * @param {Number[]=} data.byminute BYMINUTE part of RRULE * @param {Number[]=} data.byhour BYHOUR part of RRULE * @param {String[]=} data.byday BYDAY part of RRULE * @param {Number[]=} data.bymonthday BYMONTHDAY part of RRULE * @param {Number[]=} data.byyearday BYYEARDAY part of RRULE * @param {Number[]=} data.byweekno BYWEEKNO part of RRULE * @param {Number[]=} data.bymonth BYMONTH part of RRULE * @param {Number[]=} data.bysetpos BYSETPOS part of RRULE * @returns {RecurValue} */ static fromData(data) { let until = null; if (data.until) { until = data.until; data.until = data.until.toICALJs(); } const icalRecur = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Recur.fromData(data); return RecurValue.fromICALJs(icalRecur, until); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class UTCOffsetValue * @classdesc Wrapper for ICAL.UtcOffset * * @url https://tools.ietf.org/html/rfc5545#section-3.3.14 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/utc_offset.js */ class UTCOffsetValue extends AbstractValue { /** * Gets the hour part of the offset-value * * @returns {Number} */ get hours() { return this._innerValue.hours; } /** * Sets the hour part of the offset-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} hours - New hours to set */ set hours(hours) { this._modifyContent(); this._innerValue.hours = hours; } /** * Gets the minute part of the offset-value * * @returns {Number} */ get minutes() { return this._innerValue.minutes; } /** * Sets the minute part of the offset-value * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} minutes - New minutes to set */ set minutes(minutes) { this._modifyContent(); this._innerValue.minutes = minutes; } /** * Gets the factor * * @returns {Number} */ get factor() { return this._innerValue.factor; } /** * Sets the factor * * @throws {ModificationNotAllowedError} if value is locked for modification * @throws {TypeError} if factor is neither 1 nor -1 * @param {Number} factor - New factor to set, 1 for positive, -1 for negative */ set factor(factor) { this._modifyContent(); if (factor !== 1 && factor !== -1) { throw new TypeError('Factor may only be set to 1 or -1'); } this._innerValue.factor = factor; } /** * Gets the total amount of seconds * * @returns {Number} */ get totalSeconds() { return this._innerValue.toSeconds(); } /** * Sets the total amount of seconds * * @throws {ModificationNotAllowedError} if value is locked for modification * @param {Number} totalSeconds - New number of total seconds to set */ set totalSeconds(totalSeconds) { this._modifyContent(); this._innerValue.fromSeconds(totalSeconds); } /** * Compares this UTCOffset to another one * * @param {UTCOffsetValue} other - The other UTCOffsetValue to compare with * @returns {Number} -1, 0 or 1 for less/equal/greater */ compare(other) { return this._innerValue.compare(other.toICALJs()); } /** * Clones this value * * @returns {UTCOffsetValue} */ clone() { return UTCOffsetValue.fromICALJs(this._innerValue.clone()); } /** * Create a new UTCOffsetValue object from a ICAL.UTCOffset object * * @param {ICAL.UtcOffset} icalValue - The ICAL.UtcOffset object to initialize this object from * @returns {UTCOffsetValue} */ static fromICALJs(icalValue) { return new UTCOffsetValue(icalValue); } /** * Create a new UTCOffsetValue object from a data object * * @param {Object} data - Object with data to create UTCOffsetValue object from * @param {Number=} data.hours - The number of hours to set * @param {Number=} data.minutes - The number of minutes to set * @param {Number=} data.factor - The factor to use, 1 for positive, -1 for negative * @returns {UTCOffsetValue} */ static fromData(data) { const icalUTCOffset = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().UtcOffset)(); icalUTCOffset.fromData(data); return UTCOffsetValue.fromICALJs(icalUTCOffset); } /** * Create a new UTCOffsetValue object from an amount of seconds *w * @param {Number} seconds - The total number of seconds to create the UTCOffsetValue object from * @returns {UTCOffsetValue} */ static fromSeconds(seconds) { const icalUTCOffset = ical_js__WEBPACK_IMPORTED_MODULE_0___default().UtcOffset.fromSeconds(seconds); return UTCOffsetValue.fromICALJs(icalUTCOffset); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class UnknownICALTypeError extends Error {} /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @author Richard Steinmetz * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * * @param {String} icaltype The icaltype to get a Value constructor for * @returns {RecurValue|PeriodValue|BinaryValue|DurationValue|UTCOffsetValue|DateTimeValue} */ function getConstructorForICALType(icaltype) { switch (lc(icaltype)) { case 'binary': return BinaryValue; case 'date': case 'date-time': return DateTimeValue; case 'duration': return DurationValue; case 'period': return PeriodValue; case 'recur': return RecurValue; case 'utc-offset': return UTCOffsetValue; default: throw new UnknownICALTypeError(); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class Property * @classdesc This class represents a property as defined in RFC 5545 Section 3.5 * * @url https://tools.ietf.org/html/rfc5545#section-3.5 * @url https://github.com/mozilla-comm/ical.js/blob/master/lib/ical/property.js */ class Property extends observerTrait(lockableTrait(class {})) { /** * Constructor * * @param {String} name The name of the property * @param {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} value The value of the property * @param {Parameter[]|[String][]} parameters Array of parameters * @param {CalendarComponent|null} root The root of the calendar-document * @param {AbstractComponent|null} parent The parent-element of this property */ constructor(name, value = null, parameters = [], root = null, parent = null) { super(); /** * Name of the property * * @type {String} * @protected */ this._name = uc(name); /** * Value of the property * * @type {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} * @protected */ this._value = value; /** * List of parameters associated with this parameter * * @type {Map} */ this._parameters = new Map(); /** * Root node of ical document * * @type {CalendarComponent|null} * @protected */ this._root = root; /** * Parent node * * @type {AbstractComponent|null} * @protected */ this._parent = parent; this._setParametersFromConstructor(parameters); if (value instanceof AbstractValue) { value.subscribe(() => this._notifySubscribers()); } } /** * Get property name * * @readonly * @returns {String} */ get name() { return this._name; } /** * Get parameter value * * @returns {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} */ get value() { return this._value; } /** * Set new parameter value * * @param {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} value The value of the property * @throws {ModificationNotAllowedError} if property is locked for modification */ set value(value) { this._modifyContent(); this._value = value; if (value instanceof AbstractValue) { value.subscribe(() => this._notifySubscribers()); } } /** * Gets the root of this property * * @returns {CalendarComponent|null} */ get root() { return this._root; } /** * Sets the root of this property * * @param {CalendarComponent|null} root The root of the calendar-document * @throws {ModificationNotAllowedError} if property is locked for modification */ set root(root) { this._modify(); this._root = root; } /** * Gets the direct parent element of this property * * @returns {AbstractComponent} */ get parent() { return this._parent; } /** * Sets the direct parent element of this property * * @param {AbstractComponent|null} parent The parent element of this property * @throws {ModificationNotAllowedError} if property is locked for modification */ set parent(parent) { this._modify(); this._parent = parent; } /** * Gets the first value of this property * * @returns {null|String|Number|AbstractValue} */ getFirstValue() { if (!this.isMultiValue()) { return this.value; } else { if (this.value.length > 0) { return this.value[0]; } } return null; } /** * Gets an iterator over all values */ *getValueIterator() { if (this.isMultiValue()) { yield* this.value.slice()[Symbol.iterator](); } else { yield this.value; } } /** * Adds a value to the multi-value property * * @param {String|AbstractValue} value Value to add */ addValue(value) { if (!this.isMultiValue()) { throw new TypeError('This is not a multivalue property'); } this._modifyContent(); this.value.push(value); } /** * Checks if a value is inside this multi-value property * * @param {String|AbstractValue} value Value to check for * @returns {Boolean} */ hasValue(value) { if (!this.isMultiValue()) { throw new TypeError('This is not a multivalue property'); } return this.value.includes(value); } /** * Removes a value from this multi-value property * * @param {String|AbstractValue} value Value to remove */ removeValue(value) { if (!this.hasValue(value)) { return; } this._modifyContent(); const index = this.value.indexOf(value); this.value.splice(index, 1); } /** * Sets a parameter on this property * * @param {Parameter} parameter The parameter to set * @throws {ModificationNotAllowedError} if property is locked for modification */ setParameter(parameter) { this._modify(); this._parameters.set(parameter.name, parameter); parameter.subscribe(() => this._notifySubscribers()); } /** * Gets a parameter on this property by its name * * @param {String} parameterName Name of the parameter to get * @returns {Parameter} */ getParameter(parameterName) { return this._parameters.get(uc(parameterName)); } /** * Gets an iterator over all available parameters */ *getParametersIterator() { yield* this._parameters.values(); } /** * Get first value of a parameter * * @param {String} parameterName Name of the parameter * @returns {null|String} */ getParameterFirstValue(parameterName) { const parameter = this.getParameter(parameterName); if (parameter instanceof Parameter) { if (parameter.isMultiValue()) { return parameter.value[0]; } else { return parameter.value; } } return null; } /** * Returns whether a parameter exists on this property * * @param {String} parameterName Name of the parameter * @returns {boolean} */ hasParameter(parameterName) { return this._parameters.has(uc(parameterName)); } /** * Deletes a parameter on this property * * @param {String} parameterName Name of the parameter * @throws {ModificationNotAllowedError} if property is locked for modification */ deleteParameter(parameterName) { this._modify(); this._parameters.delete(uc(parameterName)); } /** * update a parameter if it exists, * create a new one if it doesn't * * @param {String} parameterName Name of the parameter * @param {string|Array|null} value Value to set * @throws {ModificationNotAllowedError} if property is locked for modification */ updateParameterIfExist(parameterName, value) { this._modify(); if (this.hasParameter(parameterName)) { const parameter = this.getParameter(parameterName); parameter.value = value; } else { const parameter = new Parameter(uc(parameterName), value); this.setParameter(parameter); } } /** * Returns whether or not the value is a multivalue * * @returns {Boolean} */ isMultiValue() { return Array.isArray(this._value); } /** * Returns whether or not this valus is decorated * * @returns {boolean} */ isDecoratedValue() { if (this.isMultiValue()) { return this._value[0] instanceof AbstractValue; } else { return this._value instanceof AbstractValue; } } /** * Marks this parameter is immutable * locks it against further modification */ lock() { super.lock(); for (const parameter of this.getParametersIterator()) { parameter.lock(); } if (this.isDecoratedValue()) { for (const value of this.getValueIterator()) { value.lock(); } } } /** * Marks this parameter as mutable * allowing further modification */ unlock() { super.unlock(); for (const parameter of this.getParametersIterator()) { parameter.unlock(); } if (this.isDecoratedValue()) { for (const value of this.getValueIterator()) { value.unlock(); } } } /** * Creates a copy of this parameter * * @returns {Property} */ clone() { const parameters = []; for (const parameter of this.getParametersIterator()) { parameters.push(parameter.clone()); } return new this.constructor(this.name, this._cloneValue(), parameters, this.root, this.parent); } /** * Copies the values of this property * * @returns {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} * @protected */ _cloneValue() { if (this.isDecoratedValue()) { if (this.isMultiValue()) { return this._value.map(val => val.clone()); } else { return this._value.clone(); } } else { if (this.isMultiValue()) { // only copy array values, don't copy array reference return this._value.slice(); } else { return this._value; } } } /** * Sets parameters from the constructor * * @param {Parameter[]|[String][]} parameters Array of parameters to set * @private */ _setParametersFromConstructor(parameters) { parameters.forEach(parameter => { if (!(parameter instanceof Parameter)) { parameter = new Parameter(parameter[0], parameter[1]); } this.setParameter(parameter); }); } /** * Creates a new Component based on an ical object * * @param {ICAL.Property} icalProperty The ical.js property to initialise from * @param {CalendarComponent=} root The root of the calendar-document * @param {AbstractComponent=} parent The parent element of this property * @returns {Property} */ static fromICALJs(icalProperty, root = null, parent = null) { if (!(icalProperty instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Property))) { throw new ExpectedICalJSError(); } let value; if (icalProperty.isDecorated) { const constructor = getConstructorForICALType(icalProperty.getFirstValue().icaltype); if (icalProperty.isMultiValue) { value = icalProperty.getValues().map(val => constructor.fromICALJs(val)); } else { value = constructor.fromICALJs(icalProperty.getFirstValue()); } } else { if (icalProperty.isMultiValue) { value = icalProperty.getValues(); } else { value = icalProperty.getFirstValue(); } } const parameters = []; const paramNames = Object.keys(Object.assign({}, icalProperty.toJSON()[1])); paramNames.forEach(paramName => { // Timezone id is handled by DateTimeValue if (uc(paramName) === 'TZID') { return; } parameters.push([paramName, icalProperty.getParameter(paramName)]); }); return new this(icalProperty.name, value, parameters, root, parent); } /** * Returns an ICAL.js property based on this Property * * @returns {ICAL.Property} */ toICALJs() { const icalProperty = createProperty(lc(this.name)); if (this.isMultiValue()) { if (this.isDecoratedValue()) { icalProperty.setValues(this.value.map(val => val.toICALJs())); } else { icalProperty.setValues(this.value); } } else { if (this.isDecoratedValue()) { icalProperty.setValue(this.value.toICALJs()); } else { icalProperty.setValue(this.value); } } for (const parameter of this.getParametersIterator()) { icalProperty.setParameter(lc(parameter.name), parameter.value); } const firstValue = this.getFirstValue(); if (firstValue instanceof DateTimeValue && firstValue.timezoneId !== 'floating' && firstValue.timezoneId !== 'UTC' && !firstValue.isDate) { icalProperty.setParameter('tzid', firstValue.timezoneId); } return icalProperty; } /** * @inheritDoc */ _modifyContent() { super._modifyContent(); this._notifySubscribers(); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AttachmentProperty * @classdesc This class represents an attachment property as defined in RFC 5545 Section 3.8.1.1 * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.1 */ class AttachmentProperty extends Property { /** * Gets the format-type of this attachment * * @returns {String} */ get formatType() { return this.getParameterFirstValue('FMTTYPE'); } /** * Sets the format-type of this attachment * * @param {String} fmtType Mime-type of attachment */ set formatType(fmtType) { this.updateParameterIfExist('FMTTYPE', fmtType); } /** * Gets the uri of this attachment * * @returns {String|null} */ get uri() { if (this._value instanceof BinaryValue) { return null; } return this._value; } /** * Sets the uri of this attachment * * @param {String} uri Link to attachment if applicable */ set uri(uri) { this.value = uri; } /** * Gets the encoding of this attachment * * @returns {string|null} */ get encoding() { if (this._value instanceof BinaryValue) { return 'BASE64'; } return null; } /** * Gets the data stored in this attachment * * @returns {String|null} */ get data() { if (this._value instanceof BinaryValue) { return this._value.value; } return null; } /** * Sets the data stored in this attachment * * @param {String} data The data of the attachment */ set data(data) { if (this.value instanceof BinaryValue) { this.value.value = data; } else { this.value = BinaryValue.fromDecodedValue(data); } } /** * @inheritDoc */ toICALJs() { const icalProperty = super.toICALJs(); if (this._value instanceof BinaryValue) { icalProperty.setParameter('ENCODING', 'BASE64'); } return icalProperty; } /** * Creates a new AttachmentProperty based on data * * @param {String} data The data of the attachment * @param {String=} formatType The mime-type of the data * @returns {AttachmentProperty} */ static fromData(data, formatType = null) { const binaryValue = BinaryValue.fromDecodedValue(data); const property = new AttachmentProperty('ATTACH', binaryValue); if (formatType) { property.formatType = formatType; } return property; } /** * Creates a new AttachmentProperty based on a link * * @param {String} uri The URI for the attachment * @param {String=} formatType The mime-type of the uri * @returns {AttachmentProperty} */ static fromLink(uri, formatType = null) { const property = new AttachmentProperty('ATTACH', uri); if (formatType) { property.formatType = formatType; } return property; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AttendeeProperty * @classdesc This class represents an attendee property as defined in RFC 5545 Section 3.8.4.1 * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 */ class AttendeeProperty extends Property { /** * Returns the role of the attendee. * * @returns {string} */ get role() { const allowed = ['CHAIR', 'REQ-PARTICIPANT', 'OPT-PARTICIPANT', 'NON-PARTICIPANT']; const defaultValue = 'REQ-PARTICIPANT'; if (this.hasParameter('ROLE')) { const value = this.getParameterFirstValue('ROLE'); if (allowed.includes(value)) { return value; } } return defaultValue; } /** * Sets new role of the attendee * * @param {String} role The role of the attendee (e.g. CHAIR, REQ-PARTICIPANT) */ set role(role) { this.updateParameterIfExist('ROLE', role); } /** * Returns the calendar-user-type of an attendee * * @returns {string} */ get userType() { const allowed = ['INDIVIDUAL', 'GROUP', 'RESOURCE', 'ROOM', 'UNKNOWN']; if (!this.hasParameter('CUTYPE')) { return 'INDIVIDUAL'; } else { const value = this.getParameterFirstValue('CUTYPE'); if (allowed.includes(value)) { return value; } return 'UNKNOWN'; } } /** * Sets new calendar-user-type of attendee * * @param {String} userType The type of user (e.g. INDIVIDUAL, GROUP) */ set userType(userType) { this.updateParameterIfExist('CUTYPE', userType); } /** * Returns the "Répondez s'il vous plaît" value for attendee * * @returns {boolean} */ get rsvp() { if (!this.hasParameter('RSVP')) { return false; } else { const value = this.getParameterFirstValue('RSVP'); return uc(value) === 'TRUE'; } } /** * Updates the "Répondez s'il vous plaît" value for attendee * * @param {boolean} rsvp Whether or not to send out an invitation */ set rsvp(rsvp) { this.updateParameterIfExist('RSVP', rsvp ? 'TRUE' : 'FALSE'); } /** * Returns the common-name of the attendee * * @returns {string|null} */ get commonName() { return this.getParameterFirstValue('CN'); } /** * Sets a new common-name of the attendee * * @param {string} commonName The display name of the attendee */ set commonName(commonName) { this.updateParameterIfExist('CN', commonName); } /** * Returns the participation-status of the attendee * * @returns {string} */ get participationStatus() { let vobjectType; if (this.parent) { vobjectType = this.parent.name; } else { // let's assume we are inside an event // if we don't know better vobjectType = 'VEVENT'; } const allowed = { VEVENT: ['NEEDS-ACTION', 'ACCEPTED', 'DECLINED', 'TENTATIVE', 'DELEGATED'], VJOURNAL: ['NEEDS-ACTION', 'ACCEPTED', 'DECLINED'], VTODO: ['NEEDS-ACTION', 'ACCEPTED', 'DECLINED', 'TENTATIVE', 'DELEGATED', 'COMPLETED', 'IN-PROCESS'] }; if (!this.hasParameter('PARTSTAT')) { return 'NEEDS-ACTION'; } else { const value = this.getParameterFirstValue('PARTSTAT'); if (allowed[vobjectType].includes(value)) { return value; } return 'NEEDS-ACTION'; } } /** * Sets a new participation-status of the attendee * * @param {String} participationStatus The participation status (e.g. ACCEPTED, DECLINED) */ set participationStatus(participationStatus) { this.updateParameterIfExist('PARTSTAT', participationStatus); } /** * Gets this attendee's language * * @returns {String} */ get language() { return this.getParameterFirstValue('LANGUAGE'); } /** * Sets this attendee's language * This can be used to influence the language of the invitation email * * @param {String} language The preferred language of the attendee */ set language(language) { this.updateParameterIfExist('LANGUAGE', language); } /** * Gets the email of the attendee * * @returns {String} */ get email() { return this.value; } /** * Sets the email address of the attendee * * @param {String} email The e-email address of the attendee */ set email(email) { this.value = startStringWith(email, 'mailto:'); } /** * Is this attendee the organizer? * * @returns {boolean} */ isOrganizer() { return this._name === 'ORGANIZER'; } /** * Creates a new AttendeeProperty from name and email * * @param {String} name The display name * @param {String} email The email address * @param {Boolean=} isOrganizer Whether this is the organizer or an attendee * @returns {AttendeeProperty} */ static fromNameAndEMail(name, email, isOrganizer = false) { const propertyName = isOrganizer ? 'ORGANIZER' : 'ATTENDEE'; email = startStringWith(email, 'mailto:'); return new AttendeeProperty(propertyName, email, [['CN', name]]); } /** * Creates a new AttendeeProperty from name, email, role, userType and rsvp * * @param {String} name The display name * @param {String} email The email address * @param {String} role The role * @param {String} userType The type of user * @param {Boolean} rsvp Whether to send out an invitation * @param {Boolean=} isOrganizer Whether this is the organizer or an attendee * @returns {AttendeeProperty} */ static fromNameEMailRoleUserTypeAndRSVP(name, email, role, userType, rsvp, isOrganizer = false) { const propertyName = isOrganizer ? 'ORGANIZER' : 'ATTENDEE'; email = startStringWith(email, 'mailto:'); return new AttendeeProperty(propertyName, email, [['CN', name], ['ROLE', role], ['CUTYPE', userType], ['RSVP', rsvp ? 'TRUE' : 'FALSE']]); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ (ical_js__WEBPACK_IMPORTED_MODULE_0___default().design.icalendar.property.conference) = { defaultType: 'uri' }; (ical_js__WEBPACK_IMPORTED_MODULE_0___default().design.icalendar.param.feature) = { valueType: 'cal-address', multiValue: ',' }; /** * @class ConferenceProperty * * @url https://tools.ietf.org/html/rfc7986#section-5.11 */ class ConferenceProperty extends Property { /** * Iterator that iterates over all supported features * of the conference system */ *getFeatureIterator() { if (!this.hasParameter('FEATURE')) { return; } const parameter = this.getParameter('FEATURE'); yield* parameter.getValueIterator(); } /** * Lists all supported features of the conference system * * @returns {String[]} */ listAllFeatures() { if (!this.hasParameter('FEATURE')) { return []; } return this.getParameter('FEATURE').value.slice(); } /** * Adds a supported feature to the conference system * * @param {String} featureToAdd Feature to add */ addFeature(featureToAdd) { this._modify(); if (!this.hasParameter('FEATURE')) { this.updateParameterIfExist('FEATURE', [featureToAdd]); } else { if (this.hasFeature(featureToAdd)) { return; } const parameter = this.getParameter('FEATURE'); parameter.value.push(featureToAdd); } } /** * Removes a supported feature * * @param {String} feature The feature to remove */ removeFeature(feature) { this._modify(); if (!this.hasFeature(feature)) { return; } const parameter = this.getParameter('FEATURE'); const index = parameter.value.indexOf(feature); parameter.value.splice(index, 1); } /** * Removes all supported features from this conference system */ clearAllFeatures() { this.deleteParameter('FEATURE'); } /** * Check if this conference system supports a feature * * @param {String} feature The feature to check * @returns {boolean} */ hasFeature(feature) { if (!this.hasParameter('FEATURE')) { return false; } const parameter = this.getParameter('FEATURE'); if (!Array.isArray(parameter.value)) { return false; } return parameter.value.includes(feature); } /** * Gets label for the conference system * * @returns {String} */ get label() { return this.getParameterFirstValue('LABEL'); } /** * Updates the label for the conference system * * @param {String} label The label to set */ set label(label) { this.updateParameterIfExist('LABEL', label); } /** * Gets the uri for this conference system */ get uri() { return this.value; } /** * Sets the uri for this conference system * * @param {String} uri The URI to set */ set uri(uri) { this.value = uri; } /** * @inheritDoc */ toICALJs() { const icalProperty = super.toICALJs(); icalProperty.setParameter('value', 'URI'); return icalProperty; } /** * Creates a new ConferenceProperty based on URI, label and features * * @param {String} uri URI of the Conference * @param {String=} label Label of the conference * @param {String[]=} features Features of the conference * @returns {ConferenceProperty} */ static fromURILabelAndFeatures(uri, label = null, features = null) { const property = new ConferenceProperty('CONFERENCE', uri); if (label) { property.updateParameterIfExist('label', label); } if (features) { property.updateParameterIfExist('feature', features); } return property; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class FreeBusyProperty * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.6 */ class FreeBusyProperty extends Property { /** * Gets the type of this FreeBusyProperty * * @returns {String} */ get type() { const allowed = ['FREE', 'BUSY', 'BUSY-UNAVAILABLE', 'BUSY-TENTATIVE']; const defaultValue = 'BUSY'; if (this.hasParameter('FBTYPE')) { const value = this.getParameterFirstValue('FBTYPE'); if (allowed.includes(value)) { return value; } } return defaultValue; } /** * Sets the type of this FreeBusyProperty * * @param {String} type The type of information (e.g. FREE, BUSY, etc.) */ set type(type) { this.updateParameterIfExist('FBTYPE', type); } /** * Creates a new FreeBusyProperty based on period and type * * @param {PeriodValue} period The period for FreeBusy Information * @param {String} type The type of the period * @returns {FreeBusyProperty} */ static fromPeriodAndType(period, type) { return new FreeBusyProperty('FREEBUSY', period, [['fbtype', type]]); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class GeoProperty * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.6 */ class GeoProperty extends Property { /** * @inheritDoc */ constructor(name, value = [0, 0], parameters = [], root = null, parent = null) { super(name, value, parameters, root, parent); } /** * Gets the latitude stored in this property * * @returns {Number} */ get latitude() { return this._value[0]; } /** * Sets the latitude stored in this property * * @param {String|Number} lat Latitude */ set latitude(lat) { this._modifyContent(); if (typeof lat !== 'number') { lat = parseFloat(lat); } this._value[0] = lat; } /** * Gets the longitude stored in this property */ get longitude() { return this._value[1]; } /** * Sets the longitude stored in this property * * @param {String|Number} long Longitude */ set longitude(long) { this._modifyContent(); if (typeof long !== 'number') { long = parseFloat(long); } this._value[1] = long; } /** * @inheritDoc * * TODO: this is an ugly hack right now. * As soon as the value is an array, we assume it's multivalue * but GEO is a (the one and only besides request-status) structured value and is also * stored inside an array. * * Calling icalProperty.setValues will throw an error */ toICALJs() { const icalProperty = createProperty(lc(this.name)); icalProperty.setValue(this.value); this._parameters.forEach(parameter => { icalProperty.setParameter(lc(parameter.name), parameter.value); }); return icalProperty; } /** * Creates a new GeoProperty based on a latitude and a longitude value * * @param {Number} lat Latitude * @param {Number} long Longitude * @returns {GeoProperty} */ static fromPosition(lat, long) { return new GeoProperty('GEO', [lat, long]); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ImageProperty * * @url https://tools.ietf.org/html/rfc7986#section-5.10 */ class ImageProperty extends AttachmentProperty { /** * Gets the image-type */ get display() { return this.getParameterFirstValue('DISPLAY') || 'BADGE'; } /** * Gets the image-type * * @param {String} display The display-type image is optimized for */ set display(display) { this.updateParameterIfExist('DISPLAY', display); } /** * Creates a new ImageProperty based on data * * @param {String} data The data of the image * @param {String=} display The display-type it's optimized for * @param {String=} formatType The mime-type of the image * @returns {ImageProperty} */ static fromData(data, display = null, formatType = null) { const binaryValue = BinaryValue.fromDecodedValue(data); const property = new ImageProperty('IMAGE', binaryValue); if (display) { property.display = display; } if (formatType) { property.formatType = formatType; } return property; } /** * Creates a new ImageProperty based on a link * * @param {String} uri The uri of the image * @param {String=} display The display-type it's optimized for * @param {String=} formatType The mime-type of the image * @returns {ImageProperty} */ static fromLink(uri, display = null, formatType = null) { const property = new ImageProperty('IMAGE', uri); if (display) { property.display = display; } if (formatType) { property.formatType = formatType; } return property; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class RelationProperty * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.5 */ class RelationProperty extends Property { /** * Get's the relation-type of this related-to property * * @returns {String} */ get relationType() { const allowed = ['PARENT', 'CHILD', 'SIBLING']; const defaultValue = 'PARENT'; if (!this.hasParameter('RELTYPE')) { return defaultValue; } else { const value = this.getParameterFirstValue('RELTYPE'); if (allowed.includes(value)) { return value; } return defaultValue; } } /** * Sets a new relation type * * @param {String} relationType The type of relation (e.g. SIBLING, PARENT, etc.) */ set relationType(relationType) { this.updateParameterIfExist('RELTYPE', relationType); } /** * Gets Id of related object * * @returns {String} */ get relatedId() { return this.value; } /** * Sets a new related id * * @param {String} relatedId The Id of the related document */ set relatedId(relatedId) { this.value = relatedId; } /** * Creates a new RELATED-TO property based on a relation-type and id * * @param {String} relType The type of the relation (e.g. SIBLING, CHILD) * @param {String} relId The Id of the related document * @returns {RelationProperty} */ static fromRelTypeAndId(relType, relId) { return new RelationProperty('RELATED-TO', relId, [['RELTYPE', relType]]); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class RequestStatusProperty * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.8.8.3 */ class RequestStatusProperty extends Property { /** * @inheritDoc */ constructor(name, value = ['1', 'Pending'], parameters = [], root = null, parent = null) { super(name, value, parameters, root, parent); } /** * Gets the status code of the request status * * @returns {Number} */ get statusCode() { return parseFloat(this.value[0]); } /** * Sets the status code of the request status * * @param {Number} statusCode The statusCode of the request */ set statusCode(statusCode) { this._modifyContent(); this.value[0] = statusCode.toString(); // This makes sure 2.0 is actually saved as 2.0, not 2 if (statusCode === Math.floor(statusCode)) { this.value[0] += '.0'; } } /** * Gets the status message of the request status * * @returns {string} */ get statusMessage() { return this.value[1]; } /** * Sets the status message of the request status * * @param {String} statusMessage The message of the request */ set statusMessage(statusMessage) { this._modifyContent(); this.value[1] = statusMessage; } /** * Gets the exception data of the request status if available * * @returns {null|String} */ get exceptionData() { if (!this.value[2]) { return null; } return this.value[2]; } /** * Sets the exception dtat of the request status * * @param {String} exceptionData The additional exception-data */ set exceptionData(exceptionData) { this._modifyContent(); this.value[2] = exceptionData; } /** * Check if request is pending * * @returns {boolean} */ isPending() { return this.statusCode >= 1 && this.statusCode < 2; } /** * Check if request was successful * * @returns {boolean} */ isSuccessful() { return this.statusCode >= 2 && this.statusCode < 3; } /** * Check if a client error occurred * * @returns {boolean} */ isClientError() { return this.statusCode >= 3 && this.statusCode < 4; } /** * Check if a scheduling error occurred * * @returns {boolean} */ isSchedulingError() { return this.statusCode >= 4 && this.statusCode < 5; } /** * @inheritDoc * * TODO: this is an ugly hack right now. * As soon as the value is an array, we assume it's multivalue * but REQUEST-STATUS is a (the one and only besides GEO) structured value and is also * stored inside an array. * * Calling icalProperty.setValues will throw an error */ toICALJs() { const icalProperty = createProperty(lc(this.name)); icalProperty.setValue(this.value); this._parameters.forEach(parameter => { icalProperty.setParameter(lc(parameter.name), parameter.value); }); return icalProperty; } /** * Creates a new RequestStatusProperty from a code and a status message * * @param {Number} code The status-code of the request * @param {String} message The message of the request * @returns {RequestStatusProperty} */ static fromCodeAndMessage(code, message) { return new RequestStatusProperty('REQUEST-STATUS', [code.toString(), message]); } } // All request statuses registered in RFC 5546 RequestStatusProperty.SUCCESS = [2.0, 'Success']; RequestStatusProperty.SUCCESS_FALLBACK = [2.1, 'Success, but fallback taken on one or more property values.']; RequestStatusProperty.SUCCESS_PROP_IGNORED = [2.2, 'Success; invalid property ignored.']; RequestStatusProperty.SUCCESS_PROPPARAM_IGNORED = [2.3, 'Success; invalid property parameter ignored.']; RequestStatusProperty.SUCCESS_NONSTANDARD_PROP_IGNORED = [2.4, 'Success; unknown, non-standard property ignored.']; RequestStatusProperty.SUCCESS_NONSTANDARD_PROPPARAM_IGNORED = [2.5, 'Success; unknown, non-standard property value ignored.']; RequestStatusProperty.SUCCESS_COMP_IGNORED = [2.6, 'Success; invalid calendar component ignored.']; RequestStatusProperty.SUCCESS_FORWARDED = [2.7, 'Success; request forwarded to Calendar User.']; RequestStatusProperty.SUCCESS_REPEATING_IGNORED = [2.8, 'Success; repeating event ignored. Scheduled as a single component.']; RequestStatusProperty.SUCCESS_TRUNCATED_END = [2.9, 'Success; truncated end date time to date boundary.']; RequestStatusProperty.SUCCESS_REPEATING_VTODO_IGNORED = [2.10, 'Success; repeating VTODO ignored. Scheduled as a single VTODO.']; RequestStatusProperty.SUCCESS_UNBOUND_RRULE_CLIPPED = [2.11, 'Success; unbounded RRULE clipped at some finite number of instances.']; RequestStatusProperty.CLIENT_INVALID_PROPNAME = [3.0, 'Invalid property name.']; RequestStatusProperty.CLIENT_INVALID_PROPVALUE = [3.1, 'Invalid property value.']; RequestStatusProperty.CLIENT_INVALID_PROPPARAM = [3.2, 'Invalid property parameter.']; RequestStatusProperty.CLIENT_INVALID_PROPPARAMVALUE = [3.3, 'Invalid property parameter value.']; RequestStatusProperty.CLIENT_INVALUD_CALENDAR_COMP_SEQ = [3.4, 'Invalid calendar component sequence.']; RequestStatusProperty.CLIENT_INVALID_DATE_TIME = [3.5, 'Invalid date or time.']; RequestStatusProperty.CLIENT_INVALID_RRULE = [3.6, 'Invalid rule.']; RequestStatusProperty.CLIENT_INVALID_CU = [3.7, 'Invalid Calendar User.']; RequestStatusProperty.CLIENT_NO_AUTHORITY = [3.8, 'No authority.']; RequestStatusProperty.CLIENT_UNSUPPORTED_VERSION = [3.9, 'Unsupported version.']; RequestStatusProperty.CLIENT_TOO_LARGE = [3.10, 'Request entity too large.']; RequestStatusProperty.CLIENT_REQUIRED_COMP_OR_PROP_MISSING = [3.11, 'Required component or property missing.']; RequestStatusProperty.CLIENT_UNKNOWN_COMP_OR_PROP = [3.12, 'Unknown component or property found.']; RequestStatusProperty.CLIENT_UNSUPPORTED_COMP_OR_PROP = [3.13, 'Unsupported component or property found.']; RequestStatusProperty.CLIENT_UNSUPPORTED_CAPABILITY = [3.14, 'Unsupported capability.']; RequestStatusProperty.SCHEDULING_EVENT_CONFLICT = [4.0, 'Event conflict. Date/time is busy.']; RequestStatusProperty.SERVER_REQUEST_NOT_SUPPORTED = [5.0, 'Request not supported.']; RequestStatusProperty.SERVER_SERVICE_UNAVAILABLE = [5.1, 'Service unavailable.']; RequestStatusProperty.SERVER_INVALID_CALENDAR_SERVICE = [5.2, 'Invalid calendar service.']; RequestStatusProperty.SERVER_NO_SCHEDULING_FOR_USER = [5.3, 'No scheduling support for user.']; /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class TextProperty * @classdesc */ class TextProperty extends Property { /** * Gets the alternate text * * @returns {String} */ get alternateText() { return this.getParameterFirstValue('ALTREP'); } /** * Sets the alternate text * * @param {String} altRep The alternative text */ set alternateText(altRep) { this.updateParameterIfExist('ALTREP', altRep); } /** * Gets language of this property * * @returns {String} */ get language() { return this.getParameterFirstValue('LANGUAGE'); } /** * Sets language of this property * * @param {String} language The language of the text */ set language(language) { this.updateParameterIfExist('LANGUAGE', language); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class TriggerProperty * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.8.6.3 */ class TriggerProperty extends Property { /** * Gets the related parameter * * @returns {String} */ get related() { if (!this.hasParameter('RELATED')) { return 'START'; } return this.getParameterFirstValue('RELATED'); } /** * Sets the related parameter * * @param {String} related Either START or END */ set related(related) { this.updateParameterIfExist('RELATED', related); } /** * Gets the value of this trigger * (If you override the setter, you also have to override the getter or * it will simply be undefined) * * @returns {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]} */ get value() { return super.value; } /** * Set the value of this trigger * * @param {DurationValue|DateTimeValue} value The time of trigger */ set value(value) { super.value = value; // If it's not a duration, remove related parameter if (value instanceof DateTimeValue) { this.deleteParameter('RELATED'); super.value = value.getInUTC(); } } /** * Gets whether this alarm trigger is relative * * @returns {boolean} */ isRelative() { return this.getFirstValue() instanceof DurationValue; } /** * Creates a new absolute trigger * * @param {DateTimeValue} alarmTime Time to create Trigger from * @returns {TriggerProperty} */ static fromAbsolute(alarmTime) { return new TriggerProperty('TRIGGER', alarmTime); } /** * Creates a new relative trigger * * @param {DurationValue} alarmOffset Duration to create Trigger from * @param {Boolean=} relatedToStart Related to Start or end? * @returns {TriggerProperty} */ static fromRelativeAndRelated(alarmOffset, relatedToStart = true) { return new TriggerProperty('TRIGGER', alarmOffset, [['RELATED', relatedToStart ? 'START' : 'END']]); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @author Richard Steinmetz * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * * @param {String} propName Name of the prop to get constructor for * @returns {AttendeeProperty|GeoProperty|ConferenceProperty|Property|AttachmentProperty|ImageProperty|RelationProperty|RequestStatusProperty} */ function getConstructorForPropertyName(propName) { switch (uc(propName)) { case 'ATTACH': return AttachmentProperty; case 'ATTENDEE': case 'ORGANIZER': return AttendeeProperty; case 'CONFERENCE': return ConferenceProperty; case 'FREEBUSY': return FreeBusyProperty; case 'GEO': return GeoProperty; case 'IMAGE': return ImageProperty; case 'RELATED-TO': return RelationProperty; case 'REQUEST-STATUS': return RequestStatusProperty; case 'TRIGGER': return TriggerProperty; case 'COMMENT': case 'CONTACT': case 'DESCRIPTION': case 'LOCATION': case 'SUMMARY': return TextProperty; default: return Property; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AbstractComponent */ class AbstractComponent extends observerTrait(lockableTrait(class {})) { /** * Constructor * * @param {String} name - Name of component * @param {Property[]} properties - Array of properties stored inside the component * @param {AbstractComponent[]} components - Array of subcomponents stored inside this component * @param {CalendarComponent|null} root - The root of this calendar document * @param {AbstractComponent|null} parent - The parent component of this element */ constructor(name, properties = [], components = [], root = null, parent = null) { super(); /** * Name of component * * @type {String} * @private */ this._name = uc(name); /** * All properties in this component * * @type {Map} * @private */ this._properties = new Map(); /** * All subcomponents of this component * * @type {Map} * @private */ this._components = new Map(); /** * Root node of ical document * * @type {CalendarComponent|null} * @private */ this._root = root; /** * Parent node * * @type {AbstractComponent|null} * @private */ this._parent = parent; this._setPropertiesFromConstructor(properties); this._setComponentsFromConstructor(components); } /** * Get the component's name * * @returns {String} */ get name() { return this._name; } /** * Gets the root of this calendar-document * * @returns {CalendarComponent} */ get root() { return this._root; } /** * Sets the root of this calendar-document * * @param {CalendarComponent} root The new root element */ set root(root) { this._modify(); this._root = root; for (const property of this.getPropertyIterator()) { property.root = root; } for (const component of this.getComponentIterator()) { component.root = root; } } /** * Gets the parent component * * @returns {AbstractComponent} */ get parent() { return this._parent; } /** * Sets the parent component * * @param {AbstractComponent} parent The new parent element */ set parent(parent) { this._modify(); this._parent = parent; } /** * Gets the first property that matches the given propertyName * * @param {String} propertyName Name of the property to get * @returns {Property|null} */ getFirstProperty(propertyName) { if (!this._properties.has(uc(propertyName))) { return null; } return this._properties.get(uc(propertyName))[0]; } /** * Gets the first value of the first property matching that name * * @param {String} propertyName Name of the property to get first value of * @returns {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} */ getFirstPropertyFirstValue(propertyName) { const property = this.getFirstProperty(propertyName); if (!property) { return null; } return property.getFirstValue(); } /** * update a property if it exists, * create a new one if it doesn't * * @param {String} propertyName Name of the property to update / create * @param {String|Number|AbstractValue|String[]|Number[]|AbstractValue[]|null} value The value to set */ updatePropertyWithValue(propertyName, value) { this._modify(); const property = this.getFirstProperty(propertyName); if (property) { property.value = value; } else { const constructor = getConstructorForPropertyName(propertyName); const newProperty = new constructor(propertyName, value, [], this, this.root); this.addProperty(newProperty); } } /** * Returns iterator for all properties of a given propertyName * or if no propertyName was given over all available properties * * @param {String=} propertyName Name of the property to get an iterator for */ *getPropertyIterator(propertyName = null) { if (propertyName) { if (!this.hasProperty(propertyName)) { return; } // this._properties.get() returns an array // [Symbol.iterator]() creates an iterator from that array yield* this._properties.get(uc(propertyName)).slice()[Symbol.iterator](); } else { for (const key of this._properties.keys()) { yield* this.getPropertyIterator(key); } } } /** * Get all properties by name that match the given LANG parameter * * @param {String} propertyName The name of the property * @param {String|null} lang The lang to query * @private */ *_getAllOfPropertyByLang(propertyName, lang) { for (const property of this.getPropertyIterator(propertyName)) { // getParameterFirstValue will return null if language not set, so no language parameter will match lang=null if (property.getParameterFirstValue('LANGUAGE') === lang) { yield property; } } } /** * Get the first property by name that matches the given LANG parameter * * @param {String} propertyName The name of the property * @param {String|null} lang The lang to query * @returns {Property|null} * @private */ _getFirstOfPropertyByLang(propertyName, lang) { const iterator = this._getAllOfPropertyByLang(propertyName, lang); return iterator.next().value || null; } /** * Adds a property * * @param {Property} property The property to add * @returns {boolean} */ addProperty(property) { this._modify(); property.root = this.root; property.parent = this; if (this._properties.has(property.name)) { const arr = this._properties.get(property.name); if (arr.indexOf(property) !== -1) { // If the property is already part of this component, // return false to indicate an error return false; } arr.push(property); } else { this._properties.set(property.name, [property]); } property.subscribe(() => this._notifySubscribers()); return true; } /** * Checks if this component has a property of the given name * * @param {String} propertyName The name of the property * @returns {boolean} */ hasProperty(propertyName) { return this._properties.has(uc(propertyName)); } /** * Removes the given property from this component * * @param {Property} property The property to delete * @returns {boolean} */ deleteProperty(property) { this._modify(); if (!this._properties.has(property.name)) { return false; } const arr = this._properties.get(property.name); const index = arr.indexOf(property); if (index === -1) { return false; } if (index !== -1 && arr.length === 1) { // If this is the last property of the given name, // remove the entire array from _properties // This is required for hasProperty to work properly this._properties.delete(property.name); } else { arr.splice(index, 1); } return true; } /** * Removes all properties of a given name * * @param {String} propertyName The name of the property * @returns {boolean} */ deleteAllProperties(propertyName) { this._modify(); return this._properties.delete(uc(propertyName)); } /** * Gets the first component of a given name * * @param {String} componentName The name of the component * @returns {AbstractComponent|null} */ getFirstComponent(componentName) { if (!this.hasComponent(componentName)) { return null; } return this._components.get(uc(componentName))[0]; } /** * Returns iterator for all components of a given componentName * or if no componentName was given over all available components * * @param {String=} componentName The name of the component */ *getComponentIterator(componentName) { if (componentName) { if (!this.hasComponent(componentName)) { return; } // this._components.get() returns an array // [Symbol.iterator]() creates an iterator from that array yield* this._components.get(uc(componentName)).slice()[Symbol.iterator](); } else { for (const key of this._components.keys()) { yield* this.getComponentIterator(key); } } } /** * Adds a new component to this component * * @param {AbstractComponent} component The component to add * @returns {Boolean} */ addComponent(component) { this._modify(); component.root = this.root; component.parent = this; if (this._components.has(component.name)) { const arr = this._components.get(component.name); if (arr.indexOf(component) !== -1) { // If the property is already part of this component, // return false to indicate an error return false; } arr.push(component); } else { this._components.set(component.name, [component]); } component.subscribe(() => this._notifySubscribers()); return true; } /** * Checks if this component has a component of the given name * * @param {String} componentName The name of the component * @returns {boolean} */ hasComponent(componentName) { return this._components.has(uc(componentName)); } /** * Removes the given component from this component * * @param {AbstractComponent} component The component to delete * @returns {boolean} */ deleteComponent(component) { this._modify(); if (!this._components.has(component.name)) { return false; } const arr = this._components.get(component.name); const index = arr.indexOf(component); if (index === -1) { return false; } if (index !== -1 && arr.length === 1) { // If this is the last component of the given name, // remove the entire array from _components // This is required for hasComponent to work properly this._components.delete(component.name); } else { arr.splice(index, 1); } return true; } /** * Removes all components of a given name * * @param {String} componentName The name of the component * @returns {boolean} */ deleteAllComponents(componentName) { this._modify(); return this._components.delete(uc(componentName)); } /** * Marks this parameter is immutable * locks it against further modification */ lock() { super.lock(); for (const property of this.getPropertyIterator()) { property.lock(); } for (const component of this.getComponentIterator()) { component.lock(); } } /** * Marks this parameter as mutable * allowing further modification */ unlock() { super.unlock(); for (const property of this.getPropertyIterator()) { property.unlock(); } for (const component of this.getComponentIterator()) { component.unlock(); } } /** * Creates a copy of this parameter * * @returns {AbstractComponent} */ clone() { const properties = []; for (const property of this.getPropertyIterator()) { properties.push(property.clone()); } const components = []; for (const component of this.getComponentIterator()) { components.push(component.clone()); } return new this.constructor(this.name, properties, components, this.root, this.parent); } /** * Adds properties from constructor to this._properties * * @param {Property[]} properties Array of properties * @private */ _setPropertiesFromConstructor(properties) { for (let property of properties) { if (Array.isArray(property)) { const constructor = getConstructorForPropertyName(property[0]); property = new constructor(property[0], property[1]); } this.addProperty(property); } } /** * Adds components from constructor to this._components * * @param {AbstractComponent[]} components Array of components * @private */ _setComponentsFromConstructor(components) { for (const component of components) { this.addComponent(component); } } /** * Creates a new Component based on an ical object * * @param {ICAL.Component} icalValue The ical.js component to initialise from * @param {CalendarComponent=} root The root of the Calendar Document * @param {AbstractComponent=} parent The parent element of this component * @returns {AbstractComponent} */ static fromICALJs(icalValue, root = null, parent = null) { if (!(icalValue instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Component))) { throw new ExpectedICalJSError(); } const name = icalValue.name; const newComponent = new this(name, [], [], root, parent); for (const icalProp of icalValue.getAllProperties()) { const constructor = getConstructorForPropertyName(icalProp.name); const property = constructor.fromICALJs(icalProp, root, newComponent); newComponent.addProperty(property); } for (const icalComp of icalValue.getAllSubcomponents()) { const constructor = this._getConstructorForComponentName(icalComp.name); const component = constructor.fromICALJs(icalComp, root, newComponent); newComponent.addComponent(component); } return newComponent; } /** * Gets a constructor for a give component name * * @param {String} componentName The name of the component * @returns {AbstractComponent} * @protected */ static _getConstructorForComponentName(componentName) { return AbstractComponent; } /** * turns this Component into an ICAL.js component * * @returns {ICAL.Component} */ toICALJs() { const component = createComponent(lc(this.name)); for (const prop of this.getPropertyIterator()) { component.addProperty(prop.toICALJs()); } for (const comp of this.getComponentIterator()) { component.addSubcomponent(comp.toICALJs()); } return component; } } /** * Advertise properties that may at most occur once * * Properties, which may at most occur once, get a simple getter and setter * * @param {Object} prototype The object's prototype * @param {Object} options The options for advertising properties * @param {Boolean} advertiseValueOnly Whether to advertise the value only or the entire property */ function advertiseSingleOccurrenceProperty(prototype, options, advertiseValueOnly = true) { options = getDefaultOncePropConfig(options); Object.defineProperty(prototype, options.name, { get() { const value = this.getFirstPropertyFirstValue(options.iCalendarName); if (!value) { return options.defaultValue; } else { if (Array.isArray(options.allowedValues) && !options.allowedValues.includes(value)) { return options.unknownValue; } return value; } }, set(value) { this._modify(); if (value === null) { this.deleteAllProperties(options.iCalendarName); return; } if (Array.isArray(options.allowedValues) && !options.allowedValues.includes(value)) { throw new TypeError('Illegal value'); } this.updatePropertyWithValue(options.iCalendarName, value); } }); } /** * Advertise properties that may occur more than once * * Properties, which may occur more than once, won't get simple getter / setter, * but rather a more advanced set of get{name}Iterator, get{name}List, add{name}, * remove{name} and clearAll{name} methods * * @param {Object} prototype The object's prototype * @param {Object} options The options for advertising properties */ function advertiseMultipleOccurrenceProperty(prototype, options) { options = getDefaultMultiplePropConfig(options); prototype['get' + ucFirst(options.name) + 'Iterator'] = function* () { yield* this.getPropertyIterator(options.iCalendarName); }; prototype['get' + ucFirst(options.name) + 'List'] = function () { return Array.from(this['get' + ucFirst(options.name) + 'Iterator']()); }; prototype['remove' + ucFirst(options.name)] = function (property) { this.deleteProperty(property); }; prototype['clearAll' + ucFirst(options.pluralName)] = function () { this.deleteAllProperties(options.iCalendarName); }; } /** * advertises a multi-value string property enabling simple access by language * This is used for: * - CATEGORIES * - RESOURCES * * @param {Object} prototype The object's prototype * @param {Object} options The options for advertising properties */ function advertiseMultiValueStringPropertySeparatedByLang(prototype, options) { options = getDefaultMultiplePropConfig(options); prototype['get' + ucFirst(options.name) + 'Iterator'] = function* (lang = null) { for (const property of this._getAllOfPropertyByLang(options.iCalendarName, lang)) { yield* property.getValueIterator(); } }; prototype['get' + ucFirst(options.name) + 'List'] = function (lang = null) { return Array.from(this['get' + ucFirst(options.name) + 'Iterator'](lang)); }; prototype['add' + ucFirst(options.name)] = function (value, lang = null) { const property = this._getFirstOfPropertyByLang(options.iCalendarName, lang); if (property) { property.addValue(value); } else { const newProperty = new Property(options.iCalendarName, [value]); if (lang) { const languageParameter = new Parameter('LANGUAGE', lang); newProperty.setParameter(languageParameter); } this.addProperty(newProperty); } }; prototype['remove' + ucFirst(options.name)] = function (value, lang = null) { for (const property of this._getAllOfPropertyByLang(options.iCalendarName, lang)) { if (property.isMultiValue() && property.hasValue(value)) { if (property.value.length === 1) { this.deleteProperty(property); return true; } property.removeValue(value); return true; } } return false; }; prototype['clearAll' + ucFirst(options.pluralName)] = function (lang = null) { for (const property of this._getAllOfPropertyByLang(options.iCalendarName, lang)) { this.deleteProperty(property); } }; } /** * advertise a component * * @param {Object} prototype The object's prototype * @param {Object} options The options for advertising components */ function advertiseComponent(prototype, options) { options = getDefaultMultipleCompConfig(options); prototype['get' + ucFirst(options.name) + 'Iterator'] = function* () { yield* this.getComponentIterator(options.iCalendarName); }; prototype['get' + ucFirst(options.name) + 'List'] = function () { return Array.from(this['get' + ucFirst(options.name) + 'Iterator']()); }; prototype['remove' + ucFirst(options.name)] = function (component) { this.deleteComponent(component); }; prototype['clearAll' + ucFirst(options.pluralName)] = function () { this.deleteAllComponents(options.iCalendarName); }; } /** * Fill up the options object for advertiseProperty * * @param {Object|String} options The options object * @param {String} options.name Advertised name of the property * @param {String=} options.iCalendarName The iCalendar name of the property * @param {String[]=} options.allowedValues A list of allowed values * @param {String|Number=} options.defaultValue The default value if unset * @param {String|Number=} options.unknownValue The fallback value if unknown value * @returns {Object} */ function getDefaultOncePropConfig(options) { if (typeof options === 'string') { options = { name: options }; } return Object.assign({}, { iCalendarName: uc(options.name), pluralName: options.name + 's', allowedValues: null, defaultValue: null, unknownValue: null }, options); } /** * Fill up the options object for advertiseProperty * * @param {Object|String} options The options object * @param {String} options.name Advertised name of property * @param {String=} options.iCalendarName The iCalendar name of the property * @param {Boolean=} options.customAddMethod Whether or not to use a custom add method * @returns {Object} */ function getDefaultMultiplePropConfig(options) { if (typeof options === 'string') { options = { name: options }; } return Object.assign({}, { iCalendarName: uc(options.name), pluralName: options.name + 's' }, options); } /** * Fill up the options object for advertiseComponent * * @param {Object|String} options Options destructuring object * @param {String} options.name Advertised name of component * @param {String=} options.iCalendarName The iCalendar name of the component * @param {Boolean=} options.customAddMethod Whether or not to use a custom add method * @returns {Object} */ function getDefaultMultipleCompConfig(options) { if (typeof options === 'string') { options = { name: options }; } return Object.assign({}, { iCalendarName: 'V' + uc(options.name), pluralName: options.name + 's' }, options); } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Gets a new DateObject set to now * * @returns {Date} */ function dateFactory() { return new Date(); } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class RecurringWithoutDtStartError extends Error {} /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class RecurrenceHelper * @classdesc * * TODO: This needs caching */ class RecurrenceManager { /** * Constructor * * @param {AbstractRecurringComponent} masterItem The master-item of the recurrence-set */ constructor(masterItem) { /** * * @type {AbstractRecurringComponent} * @private */ this._masterItem = masterItem; /** * Set of Recurrence exception items * * Number is the unix time representation of the recurrence ID * * @type {Map} * @private */ this._recurrenceExceptionItems = new Map(); /** * A sorted index of recurrence ids with range * * @type {Number[]} * @private */ this._rangeRecurrenceExceptionItemsIndex = []; /** * Cached difference of dtstart and recurrenceId for recurrence exceptions with range * * @type {Map} * @private */ this._rangeRecurrenceExceptionItemsDiffCache = new Map(); /** * Set of Recurrence exception items that have a RANGE of THISANDFUTURE * * Number is the unix time representation of the recurrence ID * * @type {Map} * @private */ this._rangeRecurrenceExceptionItems = new Map(); } /** * * @returns {AbstractRecurringComponent} */ get masterItem() { return this._masterItem; } /** * * @param {AbstractRecurringComponent} masterItem The master-item of the recurrence-set */ set masterItem(masterItem) { this._masterItem = masterItem; } /** * Gets an iterator over all registered recurrence exceptions of this calendar-document */ *getRecurrenceExceptionIterator() { yield* this._recurrenceExceptionItems.values(); } /** * Gets a list of all registered recurrence-exceptions of this calendar-document * * @returns {AbstractRecurringComponent[]} */ getRecurrenceExceptionList() { return Array.from(this.getRecurrenceExceptionIterator()); } /** * Checks if there is a recurrence Exception for a given recurrenceId * * @param {DateTimeValue|Number} recurrenceId The recurrenceId to check * @returns {boolean} */ hasRecurrenceExceptionForId(recurrenceId) { if (recurrenceId instanceof DateTimeValue) { recurrenceId = recurrenceId.unixTime; } else if (recurrenceId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)) { recurrenceId = recurrenceId.toUnixTime(); } return this._recurrenceExceptionItems.has(recurrenceId); } /** * Gets the recurrence exception for a given recurrence Id * * @param {DateTimeValue|Number} recurrenceId The recurrenceId to get * @returns {AbstractRecurringComponent|null} */ getRecurrenceException(recurrenceId) { if (recurrenceId instanceof DateTimeValue) { recurrenceId = recurrenceId.unixTime; } else if (recurrenceId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)) { recurrenceId = recurrenceId.toUnixTime(); } return this._recurrenceExceptionItems.get(recurrenceId) || null; } /** * Check if there is a recurrence-exception with a range for a given recurrence-id * * @param {DateTimeValue|Number} recurrenceId The recurrenceId to check * @returns {boolean} */ hasRangeRecurrenceExceptionForId(recurrenceId) { if (recurrenceId instanceof DateTimeValue) { recurrenceId = recurrenceId.unixTime; } else if (recurrenceId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)) { recurrenceId = recurrenceId.toUnixTime(); } if (this._rangeRecurrenceExceptionItemsIndex.length === 0) { return false; } return this._rangeRecurrenceExceptionItemsIndex[0] < recurrenceId; } /** * Get recurrence-exception with range that's affecting the given recurrence-id * * @param {DateTimeValue|Number} recurrenceId The recurrenceId to get * @returns {AbstractRecurringComponent|null} */ getRangeRecurrenceExceptionForId(recurrenceId) { if (recurrenceId instanceof DateTimeValue) { recurrenceId = recurrenceId.unixTime; } else if (recurrenceId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)) { recurrenceId = recurrenceId.toUnixTime(); } const index = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(this._rangeRecurrenceExceptionItemsIndex, recurrenceId, (a, b) => a - b); if (index === 0) { return null; } const key = this._rangeRecurrenceExceptionItemsIndex[index - 1]; return this._rangeRecurrenceExceptionItems.get(key); } /** * Gets the difference between recurrence-id and start * Mostly needed to handle recurrence-exceptions with range * * @param {DateTimeValue|Number} recurrenceId The recurrenceId to get * @returns {DurationValue|null} */ getRangeRecurrenceExceptionDiff(recurrenceId) { if (recurrenceId instanceof DateTimeValue) { recurrenceId = recurrenceId.unixTime; } else if (recurrenceId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)) { recurrenceId = recurrenceId.toUnixTime(); } if (this._rangeRecurrenceExceptionItemsDiffCache.has(recurrenceId)) { return this._rangeRecurrenceExceptionItemsDiffCache.get(recurrenceId); } const recurrenceException = this.getRangeRecurrenceExceptionForId(recurrenceId); if (!recurrenceException) { return null; } const originalRecurrenceId = recurrenceException.recurrenceId; const originalModifiedStart = recurrenceException.startDate; const difference = originalModifiedStart.subtractDateWithTimezone(originalRecurrenceId); difference.lock(); this._rangeRecurrenceExceptionItemsDiffCache.set(recurrenceId, difference); return difference; } /** * Adds a new recurrence-exception to this calendar-document * * @param {AbstractRecurringComponent} recurrenceExceptionItem The recurrence-exception-item to relate to recurrence-set */ relateRecurrenceException(recurrenceExceptionItem) { this._modify(); const key = this._getRecurrenceIdKey(recurrenceExceptionItem); this._recurrenceExceptionItems.set(key, recurrenceExceptionItem); if (recurrenceExceptionItem.modifiesFuture()) { this._rangeRecurrenceExceptionItems.set(key, recurrenceExceptionItem); const index = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(this._rangeRecurrenceExceptionItemsIndex, key, (a, b) => a - b); this._rangeRecurrenceExceptionItemsIndex.splice(index, 0, key); } recurrenceExceptionItem.recurrenceManager = this; } /** * Removes a recurrence exception by the item itself * * @param {AbstractRecurringComponent} recurrenceExceptionItem The recurrence-exception remove */ removeRecurrenceException(recurrenceExceptionItem) { const key = this._getRecurrenceIdKey(recurrenceExceptionItem); this.removeRecurrenceExceptionByRecurrenceId(key); } /** * Removes a recurrence exception by it's unix-time * * @param {Number} recurrenceId The recurrence-exception to remove */ removeRecurrenceExceptionByRecurrenceId(recurrenceId) { this._modify(); this._recurrenceExceptionItems.delete(recurrenceId); this._rangeRecurrenceExceptionItems.delete(recurrenceId); this._rangeRecurrenceExceptionItemsDiffCache.delete(recurrenceId); const index = this._rangeRecurrenceExceptionItemsIndex.indexOf(recurrenceId); if (index !== -1) { this._rangeRecurrenceExceptionItemsIndex.splice(index, 1); } } /** * * @param {AbstractRecurringComponent} recurrenceExceptionItem Object to get key from * @returns {Number} * @private */ _getRecurrenceIdKey(recurrenceExceptionItem) { return recurrenceExceptionItem.recurrenceId.unixTime; } /** * Gets an iterator over all recurrence rules */ *getRecurrenceRuleIterator() { for (const property of this._masterItem.getPropertyIterator('RRULE')) { yield property.getFirstValue(); } } /** * Gets a list of all recurrence rules * * @returns {RecurValue[]} */ getRecurrenceRuleList() { return Array.from(this.getRecurrenceRuleIterator()); } /** * Adds a new recurrence rule * * @param {RecurValue} recurrenceRule The RRULE to add */ addRecurrenceRule(recurrenceRule) { this._modify(); this.resetCache(); const property = new Property('RRULE', recurrenceRule); this._masterItem.addProperty(property); } /** * Removes a recurrence rule * * @param {RecurValue} recurrenceRule The RRULE to remove */ removeRecurrenceRule(recurrenceRule) { this._modify(); this.resetCache(); for (const property of this._masterItem.getPropertyIterator('RRULE')) { if (property.getFirstValue() === recurrenceRule) { this._masterItem.deleteProperty(property); } } } /** * Removes all recurrence rules */ clearAllRecurrenceRules() { this._modify(); this.resetCache(); this._masterItem.deleteAllProperties('RRULE'); } /** * Gets an iterator over all recurrence * * @param {boolean} isNegative Whether or not to get EXDATES * @param {String} valueType Limit type of EXDATES */ *getRecurrenceDateIterator(isNegative = false, valueType = null) { for (const property of this._getPropertiesForRecurrenceDate(isNegative, valueType)) { yield* property.getValueIterator(); } } /** * * @param {boolean} isNegative Whether or not to get EXDATES * @param {String} valueType Limit type of EXDATES * @returns {(DateTimeValue|PeriodValue)[]} */ listAllRecurrenceDates(isNegative = false, valueType = null) { return Array.from(this.getRecurrenceDateIterator(isNegative, valueType)); } /** * This adds a new recurrence-date value. * It automatically adds it to the first property of the same value-type * or creates a new one if necessary * * @param {boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {DateTimeValue|PeriodValue} value EXDATE to add */ addRecurrenceDate(isNegative = false, value) { this._modify(); this.resetCache(); // Only add DateTime Value if its of the same timezone let timezoneId = null; if (value instanceof DateTimeValue && !value.isDate) { timezoneId = value.timezoneId; } const valueType = this._getValueTypeByValue(value); const iterator = this._getPropertiesForRecurrenceDate(isNegative, valueType, timezoneId); const first = iterator.next.value; if (first instanceof Property) { const propertyValue = first.value; propertyValue.push(value); this.masterItem.markPropertyAsDirty(isNegative ? 'EXDATE' : 'RDATE'); } else { const propertyName = this._getPropertyNameByIsNegative(isNegative); const property = new Property(propertyName, value); this._masterItem.addProperty(property); } } /** * Checks if a recurrenceID is an RDATE or EXDATE * * @param {Boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {DateTimeValue} recurrenceId Recurrence-Id to check * @returns {boolean} */ hasRecurrenceDate(isNegative = false, recurrenceId) { for (let value of this.getRecurrenceDateIterator(isNegative)) { if (value instanceof PeriodValue) { value = value.start; } if (value.compare(recurrenceId) === 0) { return true; } } return false; } /** * * @param {Boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {DateTimeValue} recurrenceId Recurrence-Id to get * @returns {null|DateTimeValue|PeriodValue} */ getRecurrenceDate(isNegative = false, recurrenceId) { for (const value of this.getRecurrenceDateIterator(isNegative)) { let valueToCheck = value; if (valueToCheck instanceof PeriodValue) { valueToCheck = valueToCheck.start; } if (valueToCheck.compare(recurrenceId) === 0) { return value; } } return null; } /** * This deletes a recurrence-date value from this recurrence-set * * @param {boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {DateTimeValue|PeriodValue} value The EXDATE/RDATE to remove */ removeRecurrenceDate(isNegative = false, value) { this._modify(); this.resetCache(); const valueType = this._getValueTypeByValue(value); for (const property of this._getPropertiesForRecurrenceDate(isNegative, valueType)) { for (const valueToCheck of property.getValueIterator()) { if (value === valueToCheck) { const allValues = property.value; if (allValues.length === 1) { this.masterItem.deleteProperty(property); continue; } const index = allValues.indexOf(value); allValues.splice(index, 1); this.masterItem.markPropertyAsDirty(isNegative ? 'EXDATE' : 'RDATE'); } } } } /** * Clears all recurrence-date information * * @param {boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {String} valueType The type of RDATEs/EXDATEs to remove */ clearAllRecurrenceDates(isNegative = false, valueType = null) { this._modify(); this.resetCache(); for (const property of this._getPropertiesForRecurrenceDate(isNegative, valueType)) { this._masterItem.deleteProperty(property); } } /** * Gets the property name for recurrence dates based on the isNegative boolean * * @param {boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @returns {string} * @private */ _getPropertyNameByIsNegative(isNegative) { return isNegative ? 'EXDATE' : 'RDATE'; } /** * Gets the value type based on the provided value * * @param {PeriodValue|DateTimeValue} value The value to get type of property from * @returns {string} * @private */ _getValueTypeByValue(value) { if (value instanceof PeriodValue) { return 'PERIOD'; } else if (value.isDate) { return 'DATE'; } else { return 'DATETIME'; } } /** * * @param {boolean} isNegative Whether we are dealing with an EXDATE or RDATE * @param {String|null} valueType The type of values to get * @param {ICAL.Timezone=} timezoneId Filter by timezone * @private */ *_getPropertiesForRecurrenceDate(isNegative, valueType, timezoneId = null) { const propertyName = this._getPropertyNameByIsNegative(isNegative); for (const property of this._masterItem.getPropertyIterator(propertyName)) { if (valueType === null) { yield property; } else if (uc(valueType) === 'PERIOD' && property.getFirstValue() instanceof PeriodValue) { yield property; } else if (uc(valueType) === 'DATE' && property.getFirstValue().isDate) { yield property; } else if (uc(valueType) === 'DATETIME' && !property.getFirstValue().isDate) { if (timezoneId === null || property.getFirstValue().timezoneId === timezoneId) { yield property; } } } } /** * Checks if the entire set of recurrence rules is finite * * @returns {boolean} */ isFinite() { return this.getRecurrenceRuleList().every(rule => rule.isFinite()); } /** * @returns {boolean} */ isEmptyRecurrenceSet() { return this._getRecurExpansionObject().next() === undefined; } /** * Gets the occurrence at the exact given recurrenceId * * @param {DateTimeValue} recurrenceId RecurrenceId to get * @returns {AbstractRecurringComponent|null} */ getOccurrenceAtExactly(recurrenceId) { if (!this.masterItem.isRecurring()) { if (this.masterItem.getReferenceRecurrenceId().compare(recurrenceId) === 0) { return this.masterItem; } return null; } const iterator = this._getRecurExpansionObject(); const icalRecurrenceId = recurrenceId.toICALJs(); let next; while (next = iterator.next()) { if (next.compare(icalRecurrenceId) === 0) { // It's a match 🔥 return this._getOccurrenceAtRecurrenceId(DateTimeValue.fromICALJs(next)); } if (next.compare(icalRecurrenceId) === 1) { // We hit an occurrence in the future, return null return null; } } return null; } /** * Gets the closest occurrence to the given recurrenceId. * That's either the closest in the future, or in case the * recurrence-set ends before recurrenceId, the last one * * This function works solely on the basis of recurrence-ids. * It ignores the actual date of recurrence-exceptions. * Ideally we should fix it and provide a similar implementation * like getAllOccurrencesBetweenIterator, but for now it's the * accepted behavior. * * @param {DateTimeValue} recurrenceId RecurrenceId to get * @returns {AbstractRecurringComponent} */ getClosestOccurrence(recurrenceId) { if (!this.masterItem.isRecurring()) { return this.masterItem; } const iterator = this._getRecurExpansionObject(); recurrenceId = recurrenceId.toICALJs(); let previous = null; let next; while (next = iterator.next()) { if (next.compare(recurrenceId) === -1) { previous = next; } else { // This is the case when it's either equal or in the future const dateTimeValue = DateTimeValue.fromICALJs(next); return this._getOccurrenceAtRecurrenceId(dateTimeValue); } } const dateTimeValue = DateTimeValue.fromICALJs(previous); return this._getOccurrenceAtRecurrenceId(dateTimeValue); } /** * Get all occurrences between start and end * Start and End are inclusive * * @param {DateTimeValue} queriedTimeRangeStart Start of time-range * @param {DateTimeValue} queriedTimeRangeEnd End of time-range */ *getAllOccurrencesBetweenIterator(queriedTimeRangeStart, queriedTimeRangeEnd) { if (!this.masterItem.isRecurring()) { if (typeof this.masterItem.isInTimeFrame !== 'function') { yield this.masterItem; } if (this.masterItem.isInTimeFrame(queriedTimeRangeStart, queriedTimeRangeEnd)) { yield this.masterItem; } return; } const iterator = this._getRecurExpansionObject(); const queriedICALJsTimeRangeStart = queriedTimeRangeStart.toICALJs(); const queriedICALJsTimeRangeEnd = queriedTimeRangeEnd.toICALJs(); const recurrenceIdKeys = Array.from(this._recurrenceExceptionItems.keys()); const maximumRecurrenceId = Math.max.apply(Math, recurrenceIdKeys); let next; while (next = iterator.next()) { // We have to get the real occurrence to resolve RECURRENCE-IDs const dateTimeValue = DateTimeValue.fromICALJs(next); const occurrence = this._getOccurrenceAtRecurrenceId(dateTimeValue); // Check what type of recurrence object we are dealing with // Depending on that, the time to compare to changes // If we are dealing events, we have to compare to the end-date // If we are dealing with tasks, we will have to compare to the due-date // etc. // For now we are only implementing events, other components will come later let compareDate = null; switch (uc(occurrence.name)) { case 'VEVENT': case 'VTODO': compareDate = occurrence.endDate.toICALJs(); break; case 'VJOURNAL': default: compareDate = next; break; } // If the date we are comparing to is before our time-range, // we don't want to yield this event if (compareDate.compare(queriedICALJsTimeRangeStart) === -1) { continue; } // If we have an object that is: // 1. either // 1.1 - no recurrence exception // or // 1.2 - a recurrence-exception that modifies the future // and // 2. starts after the queried time-range ends, then we stop expanding const startDate = occurrence.startDate.toICALJs(); if ((!occurrence.isRecurrenceException() || occurrence.modifiesFuture()) && startDate.compare(queriedICALJsTimeRangeEnd) === 1) { // Just break if there are no recurrence-exceptions if (this._recurrenceExceptionItems.size === 0) { break; } // Keep iterating until our currently checked recurrenceId // is bigger than the maximum recurrence-id that we have. if (next.toUnixTime() > maximumRecurrenceId) { break; } else { continue; } } if (typeof occurrence.isInTimeFrame !== 'function') { yield occurrence; } if (occurrence.isInTimeFrame(queriedTimeRangeStart, queriedTimeRangeEnd)) { yield occurrence; } } } /** * Get all occurrences between start and end * * @param {DateTimeValue} start Start of time-range * @param {DateTimeValue} end End of time-range * @returns {(*|null)[]} */ getAllOccurrencesBetween(start, end) { return Array.from(this.getAllOccurrencesBetweenIterator(start, end)); } /** * Update the UID of all components in the recurrence set * * @param {String} newUID The new UID of the calendar-document */ updateUID(newUID) { this._masterItem.updatePropertyWithValue('UID', newUID); for (const recurrenceExceptionItem of this.getRecurrenceExceptionIterator()) { recurrenceExceptionItem.updatePropertyWithValue('UID', newUID); } } /** * Updates the recurrence-information accordingly, * whenever the start-date of the master-item changes * * @param {DateTimeValue} newStartDate The new start-date * @param {DateTimeValue} oldStartDate The old start-date */ updateStartDateOfMasterItem(newStartDate, oldStartDate) { const difference = newStartDate.subtractDateWithTimezone(oldStartDate); // update EXDATE for (const exdate of this.getRecurrenceDateIterator(true)) { // If this EXDATE matches an RDATE, don't update, because we don't update RDATEs if (this.hasRecurrenceDate(false, exdate)) { continue; } // EXDATE are always either DATE or DATETIME, // no need to check for PERIOD exdate.addDuration(difference); } for (const recurrenceException of this.getRecurrenceExceptionIterator()) { // We don't edit RDATES, so don't update recurrence-ids if they // are based on an RDATE if (this.hasRecurrenceDate(false, recurrenceException.recurrenceId)) { continue; } this.removeRecurrenceException(recurrenceException); recurrenceException.recurrenceId.addDuration(difference); this.relateRecurrenceException(recurrenceException); } // update UNTIL of recurrence-rules for (const rrule of this.getRecurrenceRuleIterator()) { if (rrule.until) { rrule.until.addDuration(difference); } } } /** * Gets an object for the given recurrenceId * It does not verify that the given recurrenceId * is actually a valid recurrence of this calendar-document * * @param {DateTimeValue} recurrenceId Recurrence-Id to get * @returns {AbstractRecurringComponent} * @private */ _getOccurrenceAtRecurrenceId(recurrenceId) { if (this.hasRecurrenceExceptionForId(recurrenceId)) { const recurrenceException = this.getRecurrenceException(recurrenceId); if (!recurrenceException.canCreateRecurrenceExceptions()) { return recurrenceException; } return recurrenceException.forkItem(recurrenceId); } else if (this.hasRangeRecurrenceExceptionForId(recurrenceId)) { const rangeRecurrenceException = this.getRangeRecurrenceExceptionForId(recurrenceId); const difference = this.getRangeRecurrenceExceptionDiff(recurrenceId); return rangeRecurrenceException.forkItem(recurrenceId, difference); } else if (recurrenceId.compare(this._masterItem.startDate) === 0) { if (!this._masterItem.canCreateRecurrenceExceptions()) { return this._masterItem; } return this._masterItem.forkItem(recurrenceId); } else { return this._masterItem.forkItem(recurrenceId); } } /** * Resets the internal recur-expansion object. * This is necessary after each modification of the * recurrence-information */ resetCache() {// TODO - implement me } /** * Gets a new ICAL.RecurExpansion object * * Inspired by how ICAL.JS RecurExpansion * serialises and unserialises its state * * @returns {ICAL.RecurExpansion} * @private */ _getRecurExpansionObject() { if (this._masterItem.startDate === null) { throw new RecurringWithoutDtStartError(); } const dtstart = this._masterItem.startDate.toICALJs(); let last = dtstart.clone(); const ruleIterators = []; let ruleDateInc; const ruleDates = []; let ruleDate = null; const exDates = []; const complete = false; for (const ruleValue of this.getRecurrenceRuleIterator()) { ruleIterators.push(ruleValue.toICALJs().iterator(dtstart)); ruleIterators[ruleIterators.length - 1].next(); } for (let rDateValue of this.getRecurrenceDateIterator()) { if (rDateValue instanceof PeriodValue) { rDateValue = rDateValue.start; } rDateValue = rDateValue.toICALJs(); const index = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(ruleDates, rDateValue, (a, b) => a.compare(b)); ruleDates.splice(index, 0, rDateValue); } // Is the first RDATE prior to our current DTSTART? if (ruleDates.length > 0 && ruleDates[0].compare(dtstart) === -1) { ruleDateInc = 0; last = ruleDates[0].clone(); } else { ruleDateInc = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(ruleDates, dtstart, (a, b) => a.compare(b)); ruleDate = exDates[ruleDateInc]; } for (let exDateValue of this.getRecurrenceDateIterator(true)) { exDateValue = exDateValue.toICALJs(); const index = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(exDates, exDateValue, (a, b) => a.compare(b)); exDates.splice(index, 0, exDateValue); } const exDateInc = ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.binsearchInsert(exDates, dtstart, (a, b) => a.compare(b)); const exDate = exDates[exDateInc]; return new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().RecurExpansion)({ dtstart, last, ruleIterators, ruleDateInc, exDateInc, ruleDates, ruleDate, exDates, exDate, complete }); } /** * @private */ _modify() { if (this._masterItem.isLocked()) { throw new ModificationNotAllowedError(); } } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class TimezoneComponent * @classdesc * * There are no advertised properties / components for the TimezoneComponent, * since we don't care about it. * Editing / accessing the timezone information directly is not a use-case * All the timezone-handling is done by the underlying ICAL.JS * * @url https://tools.ietf.org/html/rfc5545#section-3.6.5 */ class TimezoneComponent extends AbstractComponent { /** * Returns a calendar-js Timezone object * * @returns {Timezone} */ toTimezone() { return new Timezone(this.toICALJs()); } } /** * The timezoneId of this timezone-component * * @name TimezoneComponent#timezoneId * @type {String} */ advertiseSingleOccurrenceProperty(TimezoneComponent.prototype, { name: 'timezoneId', iCalendarName: 'tzid' }); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class Timezone */ class Timezone { /** * Constructor * * @param {String|ICAL.Timezone|ICAL.Component} timezoneId Id of the timezone * @param {String?} ics The iCalendar timezone definition */ constructor(timezoneId, ics) { /** * Id of the timezone, used before initialising * * @type {String} * @private */ this._timezoneId = null; /** * ICS representation of the timezone, used before initialising * * @type {String} * @private */ this._ics = null; /** * @type {ICAL.Timezone|null} */ this._innerValue = null; /** * * @type {boolean} * @private */ this._initialized = false; // If the first parameter is already // an instance of ICAL.Timezone, // skip lazy loading if (timezoneId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone)) { this._innerValue = timezoneId; this._initialized = true; } else if (timezoneId instanceof (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Component)) { this._innerValue = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone)(timezoneId); this._initialized = true; } else { this._timezoneId = timezoneId; this._ics = ics; } } /** * Gets the timezone id * * @returns {String} */ get timezoneId() { if (this._initialized) { return this._innerValue.tzid; } return this._timezoneId; } /** * Gets the UTC Offset for a given date in this timezone * * @param {Number} year Year of the date * @param {Number} month Month of the date (1-based) * @param {Number} day Day of the date * @param {Number} hour Hour of the date * @param {Number} minute Minute of the date * @param {Number} second Second of the date * @returns {Number} */ offsetForArray(year, month, day, hour, minute, second) { this._initialize(); const time = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time)({ year, month, day, hour, minute, second, isDate: false }); return this._innerValue.utcOffset(time); } /** * Converts a timestamp to an array of year, month, day, hour, minute, second. * * @param {Number} ms Timestamp in milliseconds * @returns {Number[]} */ timestampToArray(ms) { this._initialize(); // just create a dummy object because fromUnixTime is not exposed on ICAL.Time const time = ical_js__WEBPACK_IMPORTED_MODULE_0___default().Time.fromData({ year: 1970, month: 1, day: 1, hour: 0, minute: 0, second: 0 }); time.fromUnixTime(Math.floor(ms / 1000)); const local = time.convertToZone(this._innerValue); return [local.year, local.month, // THIS is 1-based ! local.day, local.hour, local.minute, local.second]; } /** * * @returns {TimezoneComponent} */ toTimezoneComponent() { return TimezoneComponent.fromICALJs(this.toICALJs()); } /** * Returns * * @returns {ICAL.Timezone} */ toICALTimezone() { this._initialize(); return this._innerValue; } /** * Returns the corresponding ICAL. * * @returns {ICAL.Component} */ toICALJs() { this._initialize(); return this._innerValue.component; } /** * Initialises the inner ICAL.Timezone component * * @private */ _initialize() { if (!this._initialized) { const jCal = ical_js__WEBPACK_IMPORTED_MODULE_0___default().parse(this._ics); const icalComp = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Component)(jCal); this._innerValue = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone)(icalComp); this._initialized = true; } } } Timezone.utc = new Timezone((ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone.utcTimezone)); Timezone.floating = new Timezone((ical_js__WEBPACK_IMPORTED_MODULE_0___default().Timezone.localTimezone)); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AlarmComponent * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.6.6 */ class AlarmComponent extends AbstractComponent { /** * Adds a new attendee based on their name and email-address * * @param {String} name - Name of the attendee * @param {String} email - E-Mail address of the attendee * @returns {boolean} */ addAttendeeFromNameAndEMail(name, email) { const attendeeProperty = AttendeeProperty.fromNameAndEMail(name, email); return this.addProperty(attendeeProperty); } /** * Gets the trigger property * * @url https://tools.ietf.org/html/rfc5545#section-3.8.6.3 * * @returns {TriggerProperty} */ get trigger() { return this.getFirstProperty('TRIGGER'); } /** * Sets an absolute alarm * * @param {DateTimeValue} alarmTime - Absolute time for the trigger */ setTriggerFromAbsolute(alarmTime) { const triggerProperty = TriggerProperty.fromAbsolute(alarmTime); this.deleteAllProperties('TRIGGER'); this.addProperty(triggerProperty); } /** * Sets a relative trigger * * @param {DurationValue} alarmOffset - Relative time of the trigger, either related to start or end * @param {Boolean=} relatedToStart - Related to Start or end? */ setTriggerFromRelative(alarmOffset, relatedToStart = true) { const triggerProperty = TriggerProperty.fromRelativeAndRelated(alarmOffset, relatedToStart); this.deleteAllProperties('TRIGGER'); this.addProperty(triggerProperty); } } /** * Action to be taken when this Alarm is due * Possible values: * - AUDIO * - DISPLAY * - EMAIL * * @url https://tools.ietf.org/html/rfc5545#section-3.8.6.1 * * @name AlarmComponent#action * @type {String} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, 'action'); /** * Description for this alarm * Can only be used in combination with action DISPLAY and EMAIL * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name AlarmComponent#description * @type {String} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, 'description'); /** * Summary for this alarm * Can only be used in combination with action EMAIL * Will be used as the EMAIL's subject * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.12 * * @name AlarmComponent#summary * @type {String} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, 'summary'); /** * The duration specifies the delay period between repeated alarms. * This property must be specified along with the repeat property * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.5 * * @name AlarmComponent#duration * @type {String} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, 'duration'); /** * The number of times an alarm should be repeated. * This property must be specified along with the duration property * * @url https://tools.ietf.org/html/rfc5545#section-3.8.6.2 * * @name AlarmComponent#repeat * @type {Number} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, 'repeat'); /** * This attachment points to a sound file, can only be used in combination * with ACTION AUDIO * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.1 * * @name AlarmComponent#attachment * @type {AttachmentProperty} */ advertiseSingleOccurrenceProperty(AlarmComponent.prototype, { name: 'attachment', iCalendarName: 'ATTACH' }); /** * Get an iterator over all attendees * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name AlarmComponent#getAttendeeIterator * @function * @returns {IterableIterator} */ /** * Get a list of all attendees * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name AlarmComponent#getAttendeeList * @function * @returns {AttendeeProperty[]} */ /** * Adds a new attendee to this alarm-component * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name AlarmComponent#addAttendee * @function * @param {AttendeeProperty} attendee - The attendee object to add */ /** * Removes an attendee from this alarm-component * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name AlarmComponent#removeAttendee * @function * @param {AttendeeProperty} attendee - The attendee object to remove */ /** * Removes all attendees from this alarm-component * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name AlarmComponent#clearAllAttendees * @function */ advertiseMultipleOccurrenceProperty(AlarmComponent.prototype, 'attendee'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Gets the constructor for a component name * This will only return a constructor for components, * that can be nested inside other ones * * @param {String} compName - Component name to get default constructor for * @returns {AlarmComponent|AbstractComponent} */ function getConstructorForComponentName$1(compName) { switch (uc(compName)) { case 'VALARM': return AlarmComponent; default: return AbstractComponent; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AbstractRecurringComponent * @classdesc AbstractRecurringComponent is the basis for * EventComponent, JournalComponent and TodoComponent. * * It contains all the logic for recurrence-expansion and * recurrence-management plus all management for all * properties and all subcomponents that the three * components mentioned before have in common */ class AbstractRecurringComponent extends AbstractComponent { /** * @inheritDoc */ constructor(...args) { super(...args); /** * In case this object is virtual, primary item refers to the master object * that this object was forked from. * * Otherwise primary item is null * * @type {AbstractRecurringComponent} * @private */ this._primaryItem = null; /** * Indicator whether this is a direct fork of a primary item, representing * the very same recurrence id * * @type {boolean} * @private */ this._isExactForkOfPrimary = false; /** * The original recurrence-id of this occurrence. * Mostly needed for range exceptions with a range * * @type {DateTimeValue|null} * @private */ this._originalRecurrenceId = null; /** * Instance of the recurrence manager. * This object is shared among all instances * of a recurrence-set * * @type {RecurrenceManager} * @private */ this._recurrenceManager = null; /** * Indicator whether this component was modified * In case it was, the last-modified property * needs to be updated before saving the event * * @type {boolean} * @private */ this._dirty = false; /** * Indicator whether there have been significant changes * In case the changes are considered significant, * the sequence needs to be incremented * * @type {boolean} * @private */ this._significantChange = false; /** * Id of this AbstractRecurringComponent * * @type {String|null} * @private */ this._cachedId = null; } /** * Gets the primary-item of this recurring item * * @returns {AbstractRecurringComponent} */ get primaryItem() { return this._primaryItem; } /** * Sets the primary-item of this recurring item * * @param {AbstractRecurringComponent} primaryItem The new primary-item */ set primaryItem(primaryItem) { this._modify(); this._primaryItem = primaryItem; } /** * Gets whether or not this is a fork of the primary item * for the same recurrence-id * * @returns {boolean} */ get isExactForkOfPrimary() { return this._isExactForkOfPrimary; } /** * Sets the isExactForkOfPrimary indicator, see getter for description * * @param {boolean} isExactForkOfPrimary Whether or not this is an exact fork */ set isExactForkOfPrimary(isExactForkOfPrimary) { this._isExactForkOfPrimary = isExactForkOfPrimary; } /** * Gets the original recurrence-id * * @returns {DateTimeValue} */ get originalRecurrenceId() { return this._originalRecurrenceId; } /** * Sets the original recurrence-id * * @param {DateTimeValue} originalRecurrenceId The new original recurrence-id */ set originalRecurrenceId(originalRecurrenceId) { this._originalRecurrenceId = originalRecurrenceId; } /** * Gets the recurrence-manager of this recurrence-set * * @returns {RecurrenceManager} */ get recurrenceManager() { return this._recurrenceManager; } /** * Sets the recurrence-manager of this recurrence-set * * @param {RecurrenceManager} recurrenceManager The new recurrence-manager */ set recurrenceManager(recurrenceManager) { this._recurrenceManager = recurrenceManager; } /** * Gets the master-item of this recurring item * * @returns {AbstractRecurringComponent} */ get masterItem() { return this.recurrenceManager.masterItem; } /** * Returns whether this item is the master item * * @returns {boolean} */ isMasterItem() { return this.masterItem === this; } /** * Gets a unique ID for this occurrence of the event * * Please note that if the same event occurs in multiple calendars, * this id will not be unique. Software using this library will have to * manually mix in the calendar id into this id * * @returns {String} */ get id() { if (this._cachedId) { return this._cachedId; } if (this.startDate === null) { this._cachedId = encodeURIComponent(this.uid); return this._cachedId; } this._cachedId = [encodeURIComponent(this.uid), encodeURIComponent(this.getReferenceRecurrenceId().unixTime.toString())].join('###'); return this._cachedId; } /** * Gets the UID property * * @returns {String|null} */ get uid() { return this.getFirstPropertyFirstValue('UID'); } /** * Sets the UID property and the UID property of all related exceptions * * @param {String} uid The new UID */ set uid(uid) { this._recurrenceManager.updateUID(uid); } /** * Gets the start date of the event * * @returns {DateTimeValue} */ get startDate() { return this.getFirstPropertyFirstValue('dtstart'); } /** * Sets the start date of the event * * @param {DateTimeValue} start The new start-date to set */ set startDate(start) { const oldStartDate = this.startDate; this.updatePropertyWithValue('dtstart', start); if (this.isMasterItem()) { this._recurrenceManager.updateStartDateOfMasterItem(start, oldStartDate); } } /** * Checks whether this item is part of a recurring set * * @returns {boolean} */ isPartOfRecurrenceSet() { return this.masterItem.isRecurring(); } /** * Checks whether this component is recurring * * @returns {boolean} */ isRecurring() { return this.hasProperty('RRULE') || this.hasProperty('RDATE'); } /** * Checks whether this component is a recurrence-exception * * @returns {boolean} */ isRecurrenceException() { return this.hasProperty('RECURRENCE-ID'); } /** * Checks wether this component is a recurrence-exception * and whether it's modifying the future * * @returns {boolean} */ modifiesFuture() { if (!this.isRecurrenceException()) { return false; } const property = this.getFirstProperty('RECURRENCE-ID'); return property.getParameterFirstValue('RANGE') === 'THISANDFUTURE'; } /** * Creates an occurrence at the given time * * This is an internal function for calendar-js, used by the recurrence-manager * Do not call from outside * * @param {DateTimeValue} recurrenceId The recurrence-Id of the forked item * @param {DurationValue=} startDiff to be used when The start-diff (used for RECURRENCE-ID;RANGE=THISANDFUTURE) * @returns {AbstractRecurringComponent} */ forkItem(recurrenceId, startDiff = null) { const occurrence = this.clone(); occurrence.recurrenceManager = this.recurrenceManager; occurrence.primaryItem = this; // Exact match for master item or recurrence-exception if (occurrence.getReferenceRecurrenceId().compare(recurrenceId) === 0) { occurrence.isExactForkOfPrimary = true; } if (!occurrence.hasProperty('DTSTART')) { throw new TypeError('Can\'t fork item without a DTSTART'); } if (occurrence.getFirstPropertyFirstValue('DTSTART').timezoneId !== recurrenceId.timezoneId) { const originalTimezone = occurrence.getFirstPropertyFirstValue('DTSTART').getICALTimezone(); recurrenceId = recurrenceId.getInICALTimezone(originalTimezone); } occurrence.originalRecurrenceId = recurrenceId.clone(); const dtStartValue = occurrence.getFirstPropertyFirstValue('DTSTART'); let period = null; if (this._recurrenceManager.hasRecurrenceDate(false, recurrenceId)) { const recurrenceDate = this._recurrenceManager.getRecurrenceDate(false, recurrenceId); if (recurrenceDate instanceof PeriodValue) { period = recurrenceDate; } } let duration; if (occurrence.hasProperty('DTEND')) { const dtEndValue = occurrence.getFirstPropertyFirstValue('DTEND'); duration = dtEndValue.subtractDateWithTimezone(dtStartValue); } else if (occurrence.hasProperty('DUE')) { const dueValue = occurrence.getFirstPropertyFirstValue('DUE'); duration = dueValue.subtractDateWithTimezone(dtStartValue); } if (!(occurrence.isRecurrenceException() && occurrence.isExactForkOfPrimary)) { occurrence.updatePropertyWithValue('DTSTART', recurrenceId.clone()); if (startDiff) { occurrence.startDate.addDuration(startDiff); } if (occurrence.hasProperty('DTEND')) { const dtEnd = occurrence.startDate.clone(); dtEnd.addDuration(duration); occurrence.updatePropertyWithValue('DTEND', dtEnd); } else if (occurrence.hasProperty('DUE')) { const due = occurrence.startDate.clone(); due.addDuration(duration); occurrence.updatePropertyWithValue('DUE', due); } if (period) { occurrence.deleteAllProperties('DTEND'); occurrence.deleteAllProperties('DURATION'); occurrence.updatePropertyWithValue('DTEND', period.end.clone()); } } occurrence.resetDirty(); return occurrence; } /** * Checks whether it's possible to create a recurrence exception for this event * It is possible * * @returns {boolean} */ canCreateRecurrenceExceptions() { let primaryIsRecurring = false; if (this.primaryItem && this.primaryItem.isRecurring()) { primaryIsRecurring = true; } return this.isRecurring() || this.modifiesFuture() || !this.isRecurring() && primaryIsRecurring; } /** * creates a recurrence exception based on this event * If the parameter thisAndAllFuture is set to true, * it will apply changes to this and all future occurrences * * @param {boolean} thisAndAllFuture Whether to create an exception for this and all future * @returns {AbstractRecurringComponent[]} the AbstractRecurringComponent of the future events. * In case you set `thisAndAllFuture` to true, this will be an * AbstractRecurringComponent inside a entirely new calendar component */ createRecurrenceException(thisAndAllFuture = false) { if (!this.canCreateRecurrenceExceptions()) { throw new Error('Can\'t create recurrence-exceptions for non-recurring items'); } const previousPrimaryItem = this.primaryItem; /** * The overall support for RANGE=THISANDFUTURE is really bad. * Instead, we have to create a new event/journal/task and * set an until date on the old one. * * Also see: * - https://github.com/nextcloud/calendar/issues/7#issuecomment-292574813 * - https://github.com/nextcloud/calendar/issues/7#issuecomment-299169143 * * Right now, this replaces all future occurrence modifications, * including recurrence-exceptions, RDATES and EXDATES. * This is also how other CUAs handle it, but i would be happy * to put that up for discussion. * * Keeping future RDates + their recurrence-exceptions would be rather easy. * Updating recurrence-exceptions, that are based off normal recurrence rules, * could be very expensive. */ if (thisAndAllFuture) { if (this.isExactForkOfPrimary) { // master item if (this.primaryItem.isMasterItem()) { this._overridePrimaryItem(); return [this, this]; } } this.removeThisOccurrence(true); this.recurrenceManager = new RecurrenceManager(this); this._originalRecurrenceId = null; this.primaryItem = this; this.updatePropertyWithValue('UID', (0,uuid__WEBPACK_IMPORTED_MODULE_1__["default"])()); this._cachedId = null; this.addRelation('SIBLING', previousPrimaryItem.uid); previousPrimaryItem.addRelation('SIBLING', this.uid); // delete to make sure all parameters are gone this.deleteAllProperties('RECURRENCE-ID'); this.deleteAllProperties('RDATE'); this.deleteAllProperties('EXDATE'); this.updatePropertyWithValue('CREATED', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('DTSTAMP', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('LAST-MODIFIED', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('SEQUENCE', 0); this._significantChange = false; this._dirty = false; this.root = this.root.constructor.fromEmpty(); this.root.addComponent(this); this.parent = this.root; // this is a completely new event, we should set the RSVP of all attendees to true, // so that they receive an invitation to the new event, not only the cancellation of the old one for (const attendee of this.getAttendeeIterator()) { attendee.rsvp = true; } } else { // delete to make sure all parameters are gone this.deleteAllProperties('RECURRENCE-ID'); this.recurrenceId = this.getReferenceRecurrenceId().clone(); this.root.addComponent(this); this.recurrenceManager.relateRecurrenceException(this); this.primaryItem = this; this.deleteAllProperties('RDATE'); this.deleteAllProperties('RRULE'); this.deleteAllProperties('EXDATE'); this.updatePropertyWithValue('CREATED', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('DTSTAMP', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('LAST-MODIFIED', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('SEQUENCE', 0); if (this.recurrenceManager.hasRecurrenceDate(false, this.getReferenceRecurrenceId())) { const recurDate = this.recurrenceManager.getRecurrenceDate(false, this.getReferenceRecurrenceId()); if (recurDate instanceof PeriodValue) { const valueDateTimeRecurDate = recurDate.start; this.recurrenceManager.removeRecurrenceDate(false, recurDate); this.recurrenceManager.addRecurrenceDate(false, valueDateTimeRecurDate); } } this.originalRecurrenceId = null; } return [previousPrimaryItem, this]; } /** * Deletes this occurrence from the series of recurring events * If the parameter thisAndAllFuture is set to true, * it will remove this and all future occurrences * * @param {Boolean} thisAndAllFuture Whether to create an exception for this and all future * @throws EmptyRecurrenceSetError Thrown, when deleting an occurrence results in no more events * @returns {Boolean} true if this deleted the last occurrence in set, false if there are occurrences left */ removeThisOccurrence(thisAndAllFuture = false) { if (!this.isPartOfRecurrenceSet()) { // When deleting an object, that's not part of a recurring set, // the calendar-document would be empty. return true; } if (thisAndAllFuture) { // To get the UNTIL date, just deduct one second. // That's also how macOS does it, so this should be fairly // well supported among all clients const recurrenceId = this.getReferenceRecurrenceId().clone(); const until = recurrenceId.getInTimezone(Timezone.utc); until.addDuration(DurationValue.fromSeconds(-1)); for (const recurValue of this.recurrenceManager.getRecurrenceRuleIterator()) { recurValue.until = until.clone(); } for (const recurDate of this.recurrenceManager.getRecurrenceDateIterator()) { let valueToCheck = recurDate; if (recurDate instanceof PeriodValue) { valueToCheck = valueToCheck.start; } if (recurrenceId.compare(valueToCheck) <= 0) { this.recurrenceManager.removeRecurrenceDate(false, recurDate); } } for (const exceptionDate of this.recurrenceManager.getRecurrenceDateIterator(true)) { if (recurrenceId.compare(exceptionDate) <= 0) { this.recurrenceManager.removeRecurrenceDate(true, exceptionDate); } } for (const exception of this.recurrenceManager.getRecurrenceExceptionList()) { if (recurrenceId.compare(exception.recurrenceId) <= 0) { this.root.deleteComponent(exception); this.recurrenceManager.removeRecurrenceException(exception); } } } else { // Make sure we don't leave orphaned recurrence-exceptions if (this.isRecurrenceException() && !this.modifiesFuture()) { this.root.deleteComponent(this); this.recurrenceManager.removeRecurrenceException(this); } // If this is based on a recurrence-date, simply delete it // otherwise add an exception-date if (this.recurrenceManager.hasRecurrenceDate(false, this.getReferenceRecurrenceId())) { const recurDate = this.recurrenceManager.getRecurrenceDate(false, this.getReferenceRecurrenceId()); this.recurrenceManager.removeRecurrenceDate(false, recurDate); } else { this.recurrenceManager.addRecurrenceDate(true, this.getReferenceRecurrenceId().clone()); } } return this.recurrenceManager.isEmptyRecurrenceSet(); } /** * @inheritDoc */ clone() { const comp = super.clone(); comp.resetDirty(); return comp; } /** * Adds a new attendee * * @param {AttendeeProperty} attendee The attendee property to add * @private * @returns {boolean} */ _addAttendee(attendee) { // Check for different Attendee objects with the same uri for (const a of this.getAttendeeIterator()) { if (a.email === attendee.email) { return false; } } this.addProperty(attendee); return true; } /** * Adds a new attendee based on their name and email-address * * @param {String} name The name of the attendee to add * @param {String} email The email-address of the attendee to add * @returns {boolean} */ addAttendeeFromNameAndEMail(name, email) { const attendeeProperty = AttendeeProperty.fromNameAndEMail(name, email); return this._addAttendee(attendeeProperty); } /** * Adds a new attendee based on their properties * * @param {String} name The name of the attendee to add * @param {String} email The email-address of the attendee to add * @param {String} role The role of the attendee to add * @param {String} userType The type of attendee to add * @param {Boolean} rsvp Whether or not to request a response from the attendee * @returns {boolean} */ addAttendeeFromNameEMailRoleUserTypeAndRSVP(name, email, role, userType, rsvp) { const attendeeProperty = AttendeeProperty.fromNameEMailRoleUserTypeAndRSVP(name, email, role, userType, rsvp, false); return this._addAttendee(attendeeProperty); } /** * Sets the organiser property from common-name and email address * * @param {String} name The name of the organizer * @param {String} email The email-address of the organizer */ setOrganizerFromNameAndEMail(name, email) { this.deleteAllProperties('ORGANIZER'); this.addProperty(AttendeeProperty.fromNameAndEMail(name, email, true)); } /** * Adds a new attachment from raw data * * @param {String} data The data of the attachment * @param {String} formatType The mime-type of the attachment */ addAttachmentFromData(data, formatType = null) { this.addProperty(AttachmentProperty.fromData(data, formatType)); } /** * Adds a new attachment from a link * * @param {String} uri The URI of the attachment * @param {String} formatType The mime-type of the attachment */ addAttachmentFromLink(uri, formatType = null) { this.addProperty(AttachmentProperty.fromLink(uri, formatType)); } /** * Adds a new contact * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.2 * * @param {String} contact The textual contact description to add */ addContact(contact) { this.addProperty(new TextProperty('CONTACT', contact)); } /** * Adds a new comment * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.4 * * @param {String} comment The comment to add */ addComment(comment) { this.addProperty(new TextProperty('COMMENT', comment)); } /** * Adds a new image from raw data * * @param {String} data Data of the image to add * @param {String=} display What display-type the image is optimized for * @param {String=} formatType The mime-type of the image */ addImageFromData(data, display = null, formatType = null) { this.addProperty(ImageProperty.fromData(data, display, formatType)); } /** * Adds a new image from a link * * @param {String} uri The URI of the image to add * @param {String=} display What display-type the image is optimized for * @param {String=} formatType The mime-type of the image */ addImageFromLink(uri, display = null, formatType = null) { this.addProperty(ImageProperty.fromLink(uri, display, formatType)); } /** * Creates a new RELATED-TO property based on a relation-type and id * and adds it to this object * * @param {String} relType The type of relation to add * @param {String} relId The id of the related calendar-document */ addRelation(relType, relId) { this.addProperty(RelationProperty.fromRelTypeAndId(relType, relId)); } /** * Creates a new REQUEST-STATUS property based on code and message * and adds it to this object * * @param {Number} code The status-code of the request status * @param {String} message The message of the request status */ addRequestStatus(code, message) { this.addProperty(RequestStatusProperty.fromCodeAndMessage(code, message)); } /** * Adds a new absolute alarm based on action and trigger time * * @param {String} action The type of alarm Action * @param {DateTimeValue} alarmTime The trigger time of the alarm * @returns {AlarmComponent} */ addAbsoluteAlarm(action, alarmTime) { const alarmComp = new AlarmComponent('VALARM', [['action', action], TriggerProperty.fromAbsolute(alarmTime)]); this.addComponent(alarmComp); return alarmComp; } /** * Adds a new relative alarm based on action, trigger time and relativeTo parameter * * @param {String} action The type of alarm Action * @param {DurationValue} alarmOffset The trigger time of the alarm * @param {Boolean=} relatedToStart Whether or not the alarm is related to the event's start * @returns {AlarmComponent} */ addRelativeAlarm(action, alarmOffset, relatedToStart = true) { const alarmComp = new AlarmComponent('VALARM', [['action', action], TriggerProperty.fromRelativeAndRelated(alarmOffset, relatedToStart)]); this.addComponent(alarmComp); return alarmComp; } /** * Marks a certain property as edited * * @param {String} propertyName The name of the property */ markPropertyAsDirty(propertyName) { this.markDirty(); // Properties that must be considered a significant change // according to RFC 5546 Section 2.1.4 const props = ['DTSTART', 'DTEND', 'DURATION', 'RRULE', 'RDATE', 'EXDATE', 'STATUS', ...getConfig('property-list-significant-change', [])]; if (props.includes(uc(propertyName))) { this.markChangesAsSignificant(); } } /** * Marks a certain component as edited * * @param {String} componentName The name of the component */ markSubComponentAsDirty(componentName) { this.markDirty(); if (getConfig('component-list-significant-change', []).includes(componentName)) { this.markChangesAsSignificant(); } } /** * Returns whether or not this component is dirty * * @returns {boolean} */ isDirty() { return this._dirty || this._significantChange; } /** * Marks this object as dirty */ markDirty() { this._dirty = true; } /** * Marks changes as significant. Can be called by the program using this lib */ markChangesAsSignificant() { this._significantChange = true; } /** * Updates the event after modifications. * * @returns {boolean} true if last-modified was updated */ undirtify() { if (!this.isDirty()) { return false; } if (!this.hasProperty('SEQUENCE')) { this.sequence = 0; } this.updatePropertyWithValue('DTSTAMP', DateTimeValue.fromJSDate(dateFactory(), true)); this.updatePropertyWithValue('LAST-MODIFIED', DateTimeValue.fromJSDate(dateFactory(), true)); if (this._significantChange) { this.sequence++; } this.resetDirty(); return true; } /** * Resets the dirty indicators without updating DTSTAMP or LAST-MODIFIED */ resetDirty() { this._dirty = false; this._significantChange = false; } /** * @inheritDoc */ updatePropertyWithValue(propertyName, value) { super.updatePropertyWithValue(propertyName, value); if (uc(propertyName) === 'UID') { this._cachedId = null; } this.markPropertyAsDirty(propertyName); } /** * @inheritDoc */ addProperty(property) { this.markPropertyAsDirty(property.name); property.subscribe(() => this.markPropertyAsDirty(property.name)); return super.addProperty(property); } /** * @inheritDoc */ deleteProperty(property) { this.markPropertyAsDirty(property.name); return super.deleteProperty(property); } /** * @inheritDoc */ deleteAllProperties(propertyName) { this.markPropertyAsDirty(propertyName); return super.deleteAllProperties(propertyName); } /** * @inheritDoc */ addComponent(component) { this.markSubComponentAsDirty(component.name); component.subscribe(() => this.markSubComponentAsDirty(component.name)); return super.addComponent(component); } /** * @inheritDoc */ deleteComponent(component) { this.markSubComponentAsDirty(component.name); return super.deleteComponent(component); } /** * @inheritDoc */ deleteAllComponents(componentName) { this.markSubComponentAsDirty(componentName); return super.deleteAllComponents(componentName); } /** * Gets a recurrence-id that has to be used to refer to this event. * This is used for recurrence-management * * @returns {DateTimeValue} */ getReferenceRecurrenceId() { if (this.originalRecurrenceId) { return this.originalRecurrenceId; } else if (this.recurrenceId) { return this.recurrenceId; } else { return this.startDate; } } /** * Overrides the master item with this one * * @private */ _overridePrimaryItem() { const oldStartDate = this.primaryItem.startDate; for (const property of this.primaryItem.getPropertyIterator()) { this.primaryItem.deleteProperty(property); } for (const property of this.getPropertyIterator()) { this.primaryItem.addProperty(property); } this.recurrenceManager.resetCache(); if (this.startDate.compare(oldStartDate) !== 0) { this.recurrenceManager.updateStartDateOfMasterItem(this.startDate, oldStartDate); } } /** * @inheritDoc */ static _getConstructorForComponentName(componentName) { return getConstructorForComponentName$1(componentName); } /** * @inheritDoc */ static fromICALJs(...args) { const comp = super.fromICALJs(...args); comp.resetDirty(); return comp; } } /** * Date-Time stamp of this object. * It has different meaning, based on whether or not a method is defined * * @url https://tools.ietf.org/html/rfc5545#section-3.8.7.2 * * @name EventComponent#stampTime * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'stampTime', iCalendarName: 'DTSTAMP' }); /** * Recurrence-ID of this object, used for recurrence-exceptions * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.4 * * @name EventComponent#recurrenceId * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'recurrenceId', iCalendarName: 'RECURRENCE-ID' }); /** * Special color for this event / journal / task * * @url https://tools.ietf.org/html/rfc7986#section-5.9 * * @name EventComponent#color * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, 'color'); /** * Creation Time of this event / journal / task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.7.1 * * @name EventComponent#creationTime * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'creationTime', iCalendarName: 'CREATED' }); /** * The time this event / journal / task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.7.3 * * @name EventComponent#modificationTime * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'modificationTime', iCalendarName: 'LAST-MODIFIED' }); /** * Organizer of this event / journal / task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.3 * * @name EventComponent#organizer * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, 'organizer'); /** * Revision of this this event / journal / task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.7.4 * * @name EventComponent#sequence * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, 'sequence'); /** * Status of this event / journal / task * This indicates whether an event is tentative / confirmed / cancelled * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.11 * * @name EventComponent#status * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, 'status'); /** * URL of a more dynamic rendition of this event / journal / task * DO NOT use this to simply point to a website merely related. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.6 * * @name EventComponent#url * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, 'url'); /** * Title of this event / journal / task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.12 * * @name EventComponent#title * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'title', iCalendarName: 'SUMMARY' }); /** * Access class of this event / journal / task * This determines what other users can see when sharing * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.3 * * @name EventComponent#accessClass * @type {String} */ advertiseSingleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'accessClass', iCalendarName: 'class', allowedValues: ['PUBLIC', 'PRIVATE', 'CONFIDENTIAL'], defaultValue: 'PUBLIC', unknownValue: 'PRIVATE' }); /** * Returns an iterator over all categories * If the parameter lang is given, it will only * return an iterator for Categories matching that language * * @name AbstractRecurringComponent#getCategoryIterator * @function * @param {String=} lang * @returns {IterableIterator} */ /** * Returns a list of all categories * If the parameter lang is given, it will only * return an iterator for Categories matching that language * * @name AbstractRecurringComponent#getCategoryList * @function * @param {String=} lang * @returns {String[]} */ /** * Adds a new category * * @name AbstractRecurringComponent#addCategory * @function * @param {String} category * @param {String=} lang */ /** * Removes a category * * @name AbstractRecurringComponent#removeCategory * @function * @param {String} category * @param {String=} lang */ /** * Clear all categories of a given language * * @name AbstractRecurringComponent#clearAllCategories * @function */ advertiseMultiValueStringPropertySeparatedByLang(AbstractRecurringComponent.prototype, { name: 'category', pluralName: 'categories', iCalendarName: 'CATEGORIES' }); /** * Returns an iterator over all attendees * * @name AbstractRecurringComponent#getAttendeeIterator * @function * @returns {IterableIterator} */ /** * Gets a list of all attendees * * @name AbstractRecurringComponent#getAttendeeList * @function * @returns {AttachmentProperty[]} */ /** * Removes an attendee from this event / journal / task * * @name AbstractRecurringComponent#removeAttendee * @function * @param {AttendeeProperty} attendee */ /** * Removes all attendees from this event / journal / task * * @name AbstractRecurringComponent#clearAllAttendees * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'attendee' }); /** * Returns an iterator over all attachments * * @name AbstractRecurringComponent#getAttachmentIterator * @function * @returns {IterableIterator} */ /** * Gets a list of all attachments * * @name AbstractRecurringComponent#getAttachmentList * @function * @returns {AttachmentProperty[]} */ /** * Removes one attachment from this event / journal / task * * @name AbstractRecurringComponent#removeAttachment * @function * @param {AttachmentProperty} attachment */ /** * Removes all attachments from this event / journal / task * * @name AbstractRecurringComponent#clearAllAttachments * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'attachment', iCalendarName: 'ATTACH' }); /** * Returns an iterator over all relation properties * * @name AbstractRecurringComponent#getRelationIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all relation properties * * @name AbstractRecurringComponent#getRelationList * @function * @returns {RelationProperty[]} */ /** * Removes a relation from this event / journal / task * * @name AbstractRecurringComponent#removeRelation * @function * @param {RelationProperty} relation */ /** * Removes all relations from this event / journal / task * * @name AbstractRecurringComponent#clearAllRelations * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'relation', iCalendarName: 'RELATED-TO' }); /** * Returns an iterator over all comments in this event / journal / task * * @name AbstractRecurringComponent#getCommentIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all comments in this event / journal / task * * @name AbstractRecurringComponent#getCommentList * @function * @returns {TextProperty[]} */ /** * Removes a comment from this event / journal / task * * @name AbstractRecurringComponent#removeComment * @function * @param {TextProperty} comment */ /** * Removes all comments from this event / journal / task * * @name AbstractRecurringComponent#clearAllComments * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, 'comment'); /** * Returns an iterator over all contacts referenced in this event / journal / task * * @name AbstractRecurringComponent#getContactIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all contacts referenced in this event / journal / task * * @name AbstractRecurringComponent#getContactList * @function * @returns {TextProperty[]} */ /** * Removes one contact from this event / journal / task * * @name AbstractRecurringComponent#removeContact * @function * @param {TextProperty} contact */ /** * Removes all contacts from this event / journal / task * * @name AbstractRecurringComponent#clearAllContacts * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, 'contact'); /** * Returns an iterator over all image properties * * @name AbstractRecurringComponent#getImageIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all image properties * * @name AbstractRecurringComponent#getImageList * @function * @returns {ImageProperty[]} */ /** * Removes one image from this event / journal / task * * @name AbstractRecurringComponent#removeImage * @function * @param {ImageProperty} image */ /** * Removes all images from this event / journal / task * * @name AbstractRecurringComponent#clearAllImages * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, 'image'); /** * Returns an iterator over all request status * * @name AbstractRecurringComponent#getRequestStatusIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all request status * * @name AbstractRecurringComponent#getRequestStatusList * @function * @returns {RequestStatusProperty[]} */ /** * Removes one request status from this event / journal / task * * @name AbstractRecurringComponent#removeRequestStatus * @function * @param {RequestStatusProperty} requestStatus */ /** * Removes all request status from this event / journal / task * * @name AbstractRecurringComponent#clearAllRequestStatus * @function */ advertiseMultipleOccurrenceProperty(AbstractRecurringComponent.prototype, { name: 'requestStatus', pluralName: 'requestStatus', iCalendarName: 'REQUEST-STATUS' }); /** * Returns an iterator of all alarms * * @name AbstractRecurringComponent#getAlarmIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all alarms * * @name AbstractRecurringComponent#getAlarmList * @function * @returns {AlarmComponent[]} */ /** * Removes an alarm from this event / journal / task * * @name AbstractRecurringComponent#removeAlarm * @function * @param {AlarmComponent} alarm */ /** * Removes all alarms from this event / journal / task * * @name AbstractRecurringComponent#clearAllAlarms * @function */ advertiseComponent(AbstractRecurringComponent.prototype, 'alarm'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Gets kind of birthday event * returns "BDAY", "DEATHDATE", "ANNIVERSARY" * or null if this is not a birthday event * * @param {EventComponent} eventComponent The eventComponent of the birthday event * @returns {null|string} */ function getTypeOfBirthdayEvent(eventComponent) { return eventComponent.getFirstPropertyFirstValue('X-NEXTCLOUD-BC-FIELD-TYPE'); } /** * Gets icon for the birthday type * * @param {EventComponent} eventComponent The eventComponent of the birthday event * @returns {string|null} */ function getIconForBirthday(eventComponent) { const birthdayType = getTypeOfBirthdayEvent(eventComponent); switch (birthdayType) { case 'BDAY': return '🎂'; case 'DEATHDATE': return '⚰️'; case 'ANNIVERSARY': return '💍'; default: return null; } } /** * Returns the age of the birthday person or null of no birth-year given * * @param {EventComponent} eventComponent The eventComponent of the birthday event * @param {number} yearOfOccurrence The year to calculate the age for * @returns {null|number} */ function getAgeOfBirthday(eventComponent, yearOfOccurrence) { if (!eventComponent.hasProperty('X-NEXTCLOUD-BC-YEAR')) { return null; } const yearOfBirth = eventComponent.getFirstPropertyFirstValue('X-NEXTCLOUD-BC-YEAR'); return parseInt(yearOfOccurrence, 10) - parseInt(yearOfBirth, 10); } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class EventComponent * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.6.1 */ class EventComponent extends AbstractRecurringComponent { /** * Returns whether this event is an all-day event * * @returns {boolean} */ isAllDay() { return this.startDate.isDate && this.endDate.isDate; } /** * Checks whether it's possible to switch from date-time to date or vise-versa * * @returns {boolean} */ canModifyAllDay() { return !this.recurrenceManager.masterItem.isRecurring(); } /** * Gets the calculated end-date of the event * * Quote from RFC 5545 3.6.1: * The "DTSTART" property for a "VEVENT" specifies the inclusive * start of the event. For recurring events, it also specifies the * very first instance in the recurrence set. The "DTEND" property * for a "VEVENT" calendar component specifies the non-inclusive end * of the event. For cases where a "VEVENT" calendar component * specifies a "DTSTART" property with a DATE value type but no * "DTEND" nor "DURATION" property, the event's duration is taken to * be one day. For cases where a "VEVENT" calendar component * specifies a "DTSTART" property with a DATE-TIME value type but no * "DTEND" property, the event ends on the same calendar date and * time of day specified by the "DTSTART" property. * * @returns {DateTimeValue} */ get endDate() { if (this.hasProperty('dtend')) { return this.getFirstPropertyFirstValue('dtend'); } const dtend = this.startDate.clone(); if (this.hasProperty('duration')) { dtend.addDuration(this.getFirstPropertyFirstValue('duration')); } else if (this.startDate.isDate) { dtend.addDuration(DurationValue.fromSeconds(60 * 60 * 24)); } // There is nothing to do when this event is not allday return dtend; } /** * Sets the end time of the event * * @param {DateTimeValue} end The end of the event */ set endDate(end) { this.deleteAllProperties('duration'); this.updatePropertyWithValue('dtend', end); } /** * Gets the calculated duration of the event * * @returns {DurationValue} */ get duration() { if (this.hasProperty('duration')) { return this.getFirstPropertyFirstValue('duration'); } return this.startDate.subtractDateWithTimezone(this.endDate); } /** * Sets the calculated duration of the event * * @param {DurationValue} duration The duration of the event */ set duration(duration) { this.deleteAllProperties('dtend'); this.updatePropertyWithValue('duration', duration); } /** * Sets the geographical position based on latitude and longitude * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.6 * * @param {Number} lat - latitude * @param {Number} long - longitude */ setGeographicalPositionFromLatitudeAndLongitude(lat, long) { this.deleteAllProperties('GEO'); this.addProperty(GeoProperty.fromPosition(lat, long)); } /** * Adds a new conference property based on URI, label and features * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @param {String} uri The URI of the conference system * @param {String=} label The label for the conference system * @param {String[]=} features The features of the conference system */ addConference(uri, label = null, features = null) { this._modify(); this.addProperty(ConferenceProperty.fromURILabelAndFeatures(uri, label, features)); } /** * Adds a duration to the start of the event * * @param {DurationValue} duration The duration to add */ addDurationToStart(duration) { this.startDate.addDuration(duration); } /** * Adds a duration to the end of the event * * @param {DurationValue} duration The duration to add */ addDurationToEnd(duration) { const endDate = this.endDate; endDate.addDuration(duration); this.endDate = endDate; } /** * Shifts the entire event by the given duration * * @param {DurationValue} delta The duration to shift event by * @param {Boolean} allDay Whether the updated event should be all-day or not * @param {Timezone} defaultTimezone The default timezone if moving from all-day to timed event * @param {DurationValue} defaultAllDayDuration The default all-day duration if moving from timed to all-day * @param {DurationValue} defaultTimedDuration The default timed duration if moving from all-day to timed */ shiftByDuration(delta, allDay, defaultTimezone, defaultAllDayDuration, defaultTimedDuration) { const currentAllDay = this.isAllDay(); if (currentAllDay !== allDay && !this.canModifyAllDay()) { throw new TypeError('Can\'t modify all-day of this event'); } this.startDate.isDate = allDay; this.startDate.addDuration(delta); // If this event was moved from the all-day area into the time-grid, // then we have to add a timezone and the default duration if (currentAllDay && !allDay) { this.startDate.replaceTimezone(defaultTimezone); this.endDate = this.startDate.clone(); this.endDate.addDuration(defaultTimedDuration); } // If this event was moved from the time-grid into the all-day area, // then we have to change the default duration if (!currentAllDay && allDay) { this.endDate = this.startDate.clone(); this.endDate.addDuration(defaultAllDayDuration); } // If this event was only moved inside the time-grid or only inside // the all-day area, then we only have to adjust the end-date if (currentAllDay === allDay) { const endDate = this.endDate; endDate.addDuration(delta); this.endDate = endDate; } } /** * Checks if this is a birthday event * * @returns {boolean} */ isBirthdayEvent() { return getTypeOfBirthdayEvent(this) === 'BDAY'; } /** * Gets the icon to the birthday event * * @returns {string} */ getIconForBirthdayEvent() { return getIconForBirthday(this); } /** * Calculates the age of the birthday * * @returns {number} */ getAgeForBirthdayEvent() { return getAgeOfBirthday(this, this.startDate.year); } /** * Serializes the entire series to ICS * * @returns {string} */ toICSEntireSeries() { return this.root.toICS(); } /** * Serializes exactly this recurrence to ICS * It removes all recurrence information * * @returns {string} */ toICSThisOccurrence() { const clone = this.clone(); clone.deleteAllProperties('RRULE'); clone.deleteAllProperties('EXRULE'); clone.deleteAllProperties('RDATE'); clone.deleteAllProperties('EXDATE'); clone.deleteAllProperties('RECURRENCE-ID'); clone.root = clone.root.constructor.fromEmpty(); clone.parent = clone.root; clone.root.addComponent(clone); return clone.root.toICS(); } /** * Checks if this event is in a given time-frame * * @param {DateTimeValue} start Start of time-range to check * @param {DateTimeValue} end End of time-range to check * @returns {boolean} */ isInTimeFrame(start, end) { return start.compare(this.endDate) <= 0 && end.compare(this.startDate) >= 0; } } /** * Time-transparency of this event. * If set to TRANSPARENT, this event will be ignored for FREE/BUSY calculations. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.7 * * @name EventComponent#timeTransparency * @type {String} */ advertiseSingleOccurrenceProperty(EventComponent.prototype, { name: 'timeTransparency', iCalendarName: 'TRANSP', allowedValues: ['OPAQUE', 'TRANSPARENT'], defaultValue: 'OPAQUE' }); /** * Description of this event. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name EventComponent#description * @type {String} */ advertiseSingleOccurrenceProperty(EventComponent.prototype, 'description'); /** * Geographical position of this event * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.6 * * @name EventComponent#geographicalPosition * @type {String} */ advertiseSingleOccurrenceProperty(EventComponent.prototype, { name: 'geographicalPosition', iCalendarName: 'GEO' }); /** * Location that this event takes place in * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.7 * * @name EventComponent#location * @type {String} */ advertiseSingleOccurrenceProperty(EventComponent.prototype, 'location'); /** * Priority of this event * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.9 * * @name EventComponent#priority * @type Number */ advertiseSingleOccurrenceProperty(EventComponent.prototype, { name: 'priority', allowedValues: Array(9).keys(), defaultValue: 0, unknownValue: 0 }); /** * Returns an iterator over all resources * If the parameter lang is given, it will only * return an iterator for Resources matching that language * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name EventComponent#getResourceIterator * @function * @param {String=} lang * @returns {IterableIterator} */ /** * Returns a list of all resources * If the parameter lang is given, it will only * return an iterator for resources matching that language * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name EventComponent#getResourceList * @function * @param {String=} lang * @returns {String[]} */ /** * Adds a resource * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name EventComponent#addResource * @function * @param {String} resource * @param {String=} lang */ /** * Removes a resource * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name EventComponent#removeResource * @function * @param {String} resource * @param {String=} lang */ /** * Removes all resources from this event * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name EventComponent#clearAllResources * @function * @param {String=} lang */ advertiseMultiValueStringPropertySeparatedByLang(EventComponent.prototype, { name: 'resource', iCalendarName: 'RESOURCES' }); /** * Gets an iterator over all conference properties * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name EventComponent#getConferenceIterator * @function * @returns {IterableIterator} */ /** * Gets a list of all conference properties * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name EventComponent#getConferenceList * @function * @returns {ConferenceProperty[]} */ /** * Removes a conference from this event * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name EventComponent#removeConference * @function * @param {ConferenceProperty} conference */ /** * Removes all conferences from this event * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name EventComponent#clearAllConferences * @function */ advertiseMultipleOccurrenceProperty(EventComponent.prototype, 'conference'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class FreeBusyComponent * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.6.4 */ class FreeBusyComponent extends AbstractComponent { /** * Gets the start-date of the FreeBusy component * * @returns {DateTimeValue} */ get startDate() { return this.getFirstPropertyFirstValue('DTSTART'); } /** * Sets the start-date of the FreeBusy component * * @param {DateTimeValue} startDate The start of the queried time-range */ set startDate(startDate) { this._modify(); this.updatePropertyWithValue('DTSTART', startDate.getInTimezone(Timezone.utc)); } /** * Gets the end-date of the FreeBusy component * * @returns {DateTimeValue} */ get endDate() { return this.getFirstPropertyFirstValue('DTEND'); } /** * Sets the start-date of the FreeBusy component * * @param {DateTimeValue} endDate The end of the queried time-range */ set endDate(endDate) { this._modify(); this.updatePropertyWithValue('DTEND', endDate.getInTimezone(Timezone.utc)); } /** * Gets an iterator over all FreeBusyProperties */ *getFreeBusyIterator() { yield* this.getPropertyIterator('FREEBUSY'); } /** * Adds a new attendee based on their name and email-address * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @param {String} name The name of the attendee to add * @param {String} email The email-address of the attendee to add */ addAttendeeFromNameAndEMail(name, email) { this._modify(); this.addProperty(AttendeeProperty.fromNameAndEMail(name, email)); } /** * Sets the organiser property from common-name and email address * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.3 * * @param {String} name The name of the organizer * @param {String} email The email-address of the organizer */ setOrganizerFromNameAndEMail(name, email) { this._modify(); this.deleteAllProperties('ORGANIZER'); this.addProperty(AttendeeProperty.fromNameAndEMail(name, email, true)); } } /** * The organizer of this FreeBusy component * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.3 * * @name FreeBusyComponent#organizer * @type {AttendeeProperty} */ advertiseSingleOccurrenceProperty(FreeBusyComponent.prototype, 'organizer'); /** * The UID of this FreeBusy component * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.7 * * @name FreeBusyComponent#organizer * @type {AttendeeProperty} */ advertiseSingleOccurrenceProperty(FreeBusyComponent.prototype, 'uid'); /** * Returns an iterator of all attendees * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name FreeBusyComponent#getAttendeeIterator * @function * @returns {IterableIterator} */ /** * Returns a list of all attendees * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name FreeBusyComponent#getAttendeeList * @function * @returns {AttendeeProperty[]} */ /** * Removes an attendee * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name FreeBusyComponent#removeAttendee * @function * @param {AttendeeProperty} attendee */ /** * Removes all attendees * * @url https://tools.ietf.org/html/rfc5545#section-3.8.4.1 * * @name FreeBusyComponent#clearAllAttendees * @function */ advertiseMultipleOccurrenceProperty(FreeBusyComponent.prototype, 'attendee'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class JournalComponent * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.6.3 */ class JournalComponent extends AbstractRecurringComponent { /** * Adds a new description property * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @param {String} description The description text */ addDescription(description) { this.addProperty(new TextProperty('DESCRIPTION', description)); } } /** * Gets an iterator over all description properties * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name JournalComponent#getDescriptionIterator * @function * @returns {IterableIterator} */ /** * Gets a list of all description properties * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name JournalComponent#getDescriptionList * @function * @returns {ConferenceProperty[]} */ /** * Removes a description from this event * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name JournalComponent#removeDescription * @function * @param {ConferenceProperty} conference */ /** * Removes all descriptions from this event * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name JournalComponent#clearAllDescriptions * @function */ advertiseMultipleOccurrenceProperty(JournalComponent.prototype, 'description'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ToDoComponent * @classdesc * * @url https://tools.ietf.org/html/rfc5545#section-3.6.2 */ class ToDoComponent extends AbstractRecurringComponent { /** * Returns whether this event is an all-day event * * @returns {boolean} */ isAllDay() { const propertiesToCheck = ['DTSTART', 'DUE']; for (const propertyToCheck of propertiesToCheck) { if (this.hasProperty(propertyToCheck)) { return this.getFirstPropertyFirstValue(propertyToCheck).isDate; } } // If a task is not associated with any date, it is defined to // occur on any successive date until it is completed. // We are treating it as all-day in that case. return true; } /** * Checks whether it's possible to switch from date-time to date or vise-versa * * @returns {boolean} */ canModifyAllDay() { if (!this.hasProperty('dtstart') && !this.hasProperty('due')) { return false; } return !this.recurrenceManager.masterItem.isRecurring(); } /** * Gets the calculated end-date of the task * * If there is a due-date, we will just return that. * If there is a start-date and a duration, we will * calculate the end-date based on that. * * If there is neither a due-date nor a combination * of start-date and duration, we just return null * * @returns {DateTimeValue|null} */ get endDate() { if (this.hasProperty('due')) { return this.getFirstPropertyFirstValue('due'); } if (!this.hasProperty('dtstart') || !this.hasProperty('duration')) { return null; } const endDate = this.startDate.clone(); endDate.addDuration(this.getFirstPropertyFirstValue('duration')); return endDate; } /** * Shifts the entire task by the given duration * * @param {DurationValue} delta The duration to shift event by * @param {Boolean} allDay Whether the updated event should be all-day or not * @param {Timezone} defaultTimezone The default timezone if moving from all-day to timed event * @param {DurationValue} defaultAllDayDuration The default all-day duration if moving from timed to all-day * @param {DurationValue} defaultTimedDuration The default timed duration if moving from all-day to timed */ shiftByDuration(delta, allDay, defaultTimezone, defaultAllDayDuration, defaultTimedDuration) { const currentAllDay = this.isAllDay(); if (!this.hasProperty('dtstart') && !this.hasProperty('due')) { throw new TypeError('This task does not have a start-date nor due-date'); } if (currentAllDay !== allDay && !this.canModifyAllDay()) { throw new TypeError('Can\'t modify all-day of this todo'); } // If this task has a start-date, update it // This is especially important, if you shift // the task by a negative duration, because // dtstart always has to be prior to the due date if (this.hasProperty('dtstart')) { this.startDate.isDate = allDay; this.startDate.addDuration(delta); if (currentAllDay && !allDay) { this.startDate.replaceTimezone(defaultTimezone); } } if (this.hasProperty('due')) { this.dueTime.isDate = allDay; this.dueTime.addDuration(delta); if (currentAllDay && !allDay) { this.dueTime.replaceTimezone(defaultTimezone); } } } /** * Checks if this event is in a given time-frame * * @param {DateTimeValue} start Start of time-range to check * @param {DateTimeValue} end End of time-range to check * @returns {boolean} */ isInTimeFrame(start, end) { if (!this.hasProperty('dtstart') && !this.hasProperty('due')) { return true; } if (!this.hasProperty('dtstart') && this.hasProperty('due')) { return start.compare(this.endDate) <= 0; } return start.compare(this.endDate) <= 0 && end.compare(this.startDate) >= 0; } /** * Gets the geographical position property * * @returns {GeoProperty} */ get geographicalPosition() { return this.getFirstProperty('GEO'); } /** * Sets the geographical position based on latitude and longitude * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.6 * * @param {Number} lat - latitude * @param {Number} long - longitude */ setGeographicalPositionFromLatitudeAndLongitude(lat, long) { this.deleteAllProperties('GEO'); this.addProperty(GeoProperty.fromPosition(lat, long)); } /** * Adds a new conference property based on URI, label and features * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @param {String} uri The URI of the conference * @param {String=} label The label of the conference * @param {String[]=} features Supported features of conference-system */ addConference(uri, label = null, features = null) { this.addProperty(ConferenceProperty.fromURILabelAndFeatures(uri, label, features)); } } /** * The time when a task was completed * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.1 * * @name ToDoComponent#completedTime * @type {DateTimeValue} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, { name: 'completedTime', iCalendarName: 'COMPLETED' }); /** * The time when a task is due * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.3 * * @name ToDoComponent#dueTime * @type {DateTimeValue} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, { name: 'dueTime', iCalendarName: 'DUE' }); /** * The time when a task was completed * * @url https://tools.ietf.org/html/rfc5545#section-3.8.2.5 * * @name ToDoComponent#duration * @type {DurationValue} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, { name: 'duration' }); /** * The percentage a task was already fulfilled * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.8 * * @name ToDoComponent#percent * @type {Number} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, { name: 'percent', iCalendarName: 'PERCENT-COMPLETE' }); /** * Description of this task. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.5 * * @name ToDoComponent#description * @type {String} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, 'description'); /** * Location of this task. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.7 * * @name ToDoComponent#location * @type {String} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, 'location'); /** * Priority of this task. * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.9 * * @name ToDoComponent#priority * @type {String} */ advertiseSingleOccurrenceProperty(ToDoComponent.prototype, { name: 'priority', allowedValues: Array.from(Array(10).keys()), defaultValue: 0, unknownValue: 0 }); /** * Returns an iterator over all resources * If the parameter lang is given, it will only * return an iterator for Resources matching that language * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name ToDoComponent#getResourceIterator * @function * @param {String=} lang * @returns {IterableIterator} */ /** * Returns a list of all resources * If the parameter lang is given, it will only * return an iterator for resources matching that language * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name ToDoComponent#getResourceList * @function * @param {String=} lang * @returns {String[]} */ /** * Adds a resource * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name ToDoComponent#addResource * @function * @param {String} resource * @param {String=} lang */ /** * Removes a resource * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name ToDoComponent#removeResource * @function * @param {String} resource * @param {String=} lang */ /** * Removes all resources from this task * * @url https://tools.ietf.org/html/rfc5545#section-3.8.1.10 * * @name ToDoComponent#clearAllResources * @function * @param {String=} lang */ advertiseMultiValueStringPropertySeparatedByLang(ToDoComponent.prototype, { name: 'resource', iCalendarName: 'RESOURCES' }); /** * Gets an iterator over all conference properties * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name ToDoComponent#getConferenceIterator * @function * @returns {IterableIterator} */ /** * Gets a list of all conference properties * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name ToDoComponent#getConferenceList * @function * @returns {ConferenceProperty[]} */ /** * Removes a conference from this event * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name ToDoComponent#removeConference * @function * @param {ConferenceProperty} conference */ /** * Removes all conferences from this event * * @url https://tools.ietf.org/html/rfc7986#section-5.11 * * @name ToDoComponent#clearAllConferences * @function */ advertiseMultipleOccurrenceProperty(ToDoComponent.prototype, 'conference'); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Gets the constructor for a component name * This will only return a constructor for components, * that can be used in the root of a calendar-document * * @param {String} compName Name of the component to get constructor for * @returns {AbstractComponent|ToDoComponent|JournalComponent|FreeBusyComponent|TimezoneComponent|EventComponent} */ function getConstructorForComponentName(compName) { switch (uc(compName)) { case 'VEVENT': return EventComponent; case 'VFREEBUSY': return FreeBusyComponent; case 'VJOURNAL': return JournalComponent; case 'VTIMEZONE': return TimezoneComponent; case 'VTODO': return ToDoComponent; default: return AbstractComponent; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * This class represents one VCALENDAR block * * @url https://tools.ietf.org/html/rfc5545#section-3.4 */ class CalendarComponent extends AbstractComponent { /** * Constructor * * @inheritDoc */ constructor(name = 'VCALENDAR', properties = [], components = []) { super(name, properties, components); this.root = this; this.parent = null; } /** * Gets an iterator over all VTIMEZONE components */ *getTimezoneIterator() { yield* this.getComponentIterator('vtimezone'); } /** * Gets an iterator over all VObject components */ *getVObjectIterator() { yield* this.getEventIterator(); yield* this.getJournalIterator(); yield* this.getTodoIterator(); } /** * Gets an iterator over all VEVENT components */ *getEventIterator() { yield* this.getComponentIterator('vevent'); } /** * Gets an iterator over all VFREEBUSY components */ *getFreebusyIterator() { yield* this.getComponentIterator('vfreebusy'); } /** * Gets an iterator over all VJOURNAL components */ *getJournalIterator() { yield* this.getComponentIterator('vjournal'); } /** * Gets an iterator over all VTODO components */ *getTodoIterator() { yield* this.getComponentIterator('vtodo'); } /** * @inheritDoc */ static _getConstructorForComponentName(componentName) { return getConstructorForComponentName(componentName); } /** * Converts this calendar component into text/calendar * * @param {boolean} cleanUpTimezones Whether or not to clean up timezone data * @returns {string} */ toICS(cleanUpTimezones = true) { for (const vObject of this.getVObjectIterator()) { vObject.undirtify(); } const icalRoot = this.toICALJs(); if (cleanUpTimezones) { ical_js__WEBPACK_IMPORTED_MODULE_0___default().helpers.updateTimezones(icalRoot); } return icalRoot.toString(); } /** * Creates a new empty calendar-component * * @param {[String][]=} additionalProps Additional props to add to empty calendar-document * @returns {CalendarComponent} */ static fromEmpty(additionalProps = []) { return new this('VCALENDAR', [['prodid', getConfig('PRODID', '-//IDN georgehrke.com//calendar-js//EN')], ['calscale', 'GREGORIAN'], ['version', '2.0']].concat(additionalProps)); } /** * Creates a new calendar-component with a method * * @param {string} method The method for the calendar-document * @returns {CalendarComponent} */ static fromMethod(method) { return this.fromEmpty([['method', method]]); } /** * @inheritDoc */ static fromICALJs(icalValue) { const comp = super.fromICALJs(icalValue); comp.root = comp; return comp; } } /** * ProductId representing the software that created this calendar-document * * @url https://tools.ietf.org/html/rfc5545#section-3.7.3 * * @name CalendarComponent#productId * @type {String} */ advertiseSingleOccurrenceProperty(CalendarComponent.prototype, { name: 'productId', iCalendarName: 'PRODID' }); /** * iCalendar version of this calendar-document * minver and maxver parameters are not supported, since they * are virtually used by no calendaring-software * * @url https://tools.ietf.org/html/rfc5545#section-3.7.4 * * @name CalendarComponent#version * @type {String} */ advertiseSingleOccurrenceProperty(CalendarComponent.prototype, { name: 'version' }); /** * Calendar-scale used in this calendar-document * The default and only supported calendar-scale is GREGORIAN. * There is an iCalendar-extension about non-gregorian RRULES, * but that is not supported by calendar-js at the moment * @see https://tools.ietf.org/html/rfc7529 * * @url https://tools.ietf.org/html/rfc5545#section-3.7.1 * * @name CalendarComponent#calendarScale * @type {String} * @default "GREGORIAN" */ advertiseSingleOccurrenceProperty(CalendarComponent.prototype, { name: 'calendarScale', iCalendarName: 'CALSCALE', defaultValue: 'GREGORIAN' }); /** * Method of this calendar-document when being used in an iTIP message * Please see https://tools.ietf.org/html/rfc5546#section-3.2 for more information * * @url https://tools.ietf.org/html/rfc5545#section-3.7.2 * * @name CalendarComponent#method * @type {String} */ advertiseSingleOccurrenceProperty(CalendarComponent.prototype, { name: 'method' }); /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class AbstractRepairStep * @classdesc A repair step is used to fix calendar-data before it is parsed */ class AbstractRepairStep { /** * @constructor */ constructor() { if (new.target === AbstractRepairStep) { throw new TypeError('Cannot instantiate abstract class AbstractRepairStep'); } } /** * @param {String} input String representation of the data to repair */ repair(input) { throw new TypeError('Abstract method not implemented by subclass'); } /** * @returns {number} */ static priority() { return 0; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarAddMissingUIDRepairStep */ class ICalendarAddMissingUIDRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/^BEGIN:(VEVENT|VTODO|VJOURNAL)$(((?!^END:(VEVENT|VTODO|VJOURNAL)$)(?!^UID.*$)(.|\n))*)^END:(VEVENT|VTODO|VJOURNAL)$\n/gm, (match, vobjectName, vObjectBlock) => { return 'BEGIN:' + vobjectName + '\r\n' + 'UID:' + (0,uuid__WEBPACK_IMPORTED_MODULE_1__["default"])() + vObjectBlock + 'END:' + vobjectName + '\r\n'; }); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarAddMissingValueDateDoubleColonRepairStep */ class ICalendarAddMissingValueDateDoubleColonRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/^(DTSTART|DTEND)(.*):([0-9]{8})T(::)$/gm, (match, propName, parameters, date) => { return propName + ';VALUE=DATE:' + date; }); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarAddMissingValueDateRepairStep */ class ICalendarAddMissingValueDateRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/^(DTSTART|DTEND)(((?!VALUE=DATE).)*):([0-9]{8})$/gm, (match, propName, parameters, _, date) => { return propName + parameters + ';VALUE=DATE:' + date; }); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarEmptyTriggerRepairStep * @classdesc This repair step fixes malformed TRIGGER properties */ class ICalendarEmptyTriggerRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/^TRIGGER:P$/gm, 'TRIGGER:P0D').replace(/^TRIGGER:-P$/gm, 'TRIGGER:P0D'); } } /** * @copyright Copyright (c) 2020 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class ICalendarIllegalCreatedRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/^CREATED:00001231T000000Z$/gm, 'CREATED:19700101T000000Z'); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarMultipleVCalendarBlocksRepairStep * @classdesc This repair step merges multiple BEGIN:VCALENDAR...END:VCALENDAR blocks */ class ICalendarMultipleVCalendarBlocksRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { let containsProdId = false; let containsVersion = false; let containsCalscale = false; const includedTimezones = new Set(); return ics.replace(/^END:VCALENDAR$(((?!^BEGIN:)(.|\n))*)^BEGIN:VCALENDAR$\n/gm, '').replace(/^PRODID:(.*)$\n/gm, match => { if (containsProdId) { return ''; } containsProdId = true; return match; }).replace(/^VERSION:(.*)$\n/gm, match => { if (containsVersion) { return ''; } containsVersion = true; return match; }).replace(/^CALSCALE:(.*)$\n/gm, match => { if (containsCalscale) { return ''; } containsCalscale = true; return match; }).replace(/^BEGIN:VTIMEZONE$(((?!^END:VTIMEZONE$)(.|\n))*)^END:VTIMEZONE$\n/gm, match => { const tzidMatcher = match.match(/^TZID:(.*)$/gm); // If this Timezone definition contains no TZID for some reason, // just remove it, because we can't use it anyway if (tzidMatcher === null) { return ''; } const tzid = uc(tzidMatcher[0].substr(5)); if (includedTimezones.has(tzid)) { // If we already included this timezone, just skip return ''; } includedTimezones.add(tzid); return match; }); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarRemoveXNCGroupIdRepairStep * @classdesc This repair step removes the X-NC-GroupID parameter used in previous versions of Nextcloud */ class ICalendarRemoveXNCGroupIdRepairStep extends AbstractRepairStep { /** * Please see the corresponding test file for an example of broken calendar-data * * @inheritDoc */ repair(ics) { return ics.replace(/(^.*)(;X-NC-GROUP-ID=\d+)(:.*$)/gm, '$1$3'); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * Get an iterator over all repair steps for iCalendar documents */ function* getRepairSteps() { yield ICalendarAddMissingUIDRepairStep; yield ICalendarAddMissingValueDateDoubleColonRepairStep; yield ICalendarAddMissingValueDateRepairStep; yield ICalendarEmptyTriggerRepairStep; yield ICalendarIllegalCreatedRepairStep; yield ICalendarMultipleVCalendarBlocksRepairStep; yield ICalendarRemoveXNCGroupIdRepairStep; } var version = "2.2019c"; var aliases = { "AUS Central Standard Time": { aliasTo: "Australia/Darwin" }, "AUS Eastern Standard Time": { aliasTo: "Australia/Sydney" }, "Afghanistan Standard Time": { aliasTo: "Asia/Kabul" }, "Africa/Asmera": { aliasTo: "Africa/Asmara" }, "Africa/Timbuktu": { aliasTo: "Africa/Bamako" }, "Alaskan Standard Time": { aliasTo: "America/Anchorage" }, "America/Argentina/ComodRivadavia": { aliasTo: "America/Argentina/Catamarca" }, "America/Buenos_Aires": { aliasTo: "America/Argentina/Buenos_Aires" }, "America/Louisville": { aliasTo: "America/Kentucky/Louisville" }, "America/Montreal": { aliasTo: "America/Toronto" }, "America/Santa_Isabel": { aliasTo: "America/Tijuana" }, "Arab Standard Time": { aliasTo: "Asia/Riyadh" }, "Arabian Standard Time": { aliasTo: "Asia/Dubai" }, "Arabic Standard Time": { aliasTo: "Asia/Baghdad" }, "Argentina Standard Time": { aliasTo: "America/Argentina/Buenos_Aires" }, "Asia/Calcutta": { aliasTo: "Asia/Kolkata" }, "Asia/Katmandu": { aliasTo: "Asia/Kathmandu" }, "Asia/Rangoon": { aliasTo: "Asia/Yangon" }, "Asia/Saigon": { aliasTo: "Asia/Ho_Chi_Minh" }, "Atlantic Standard Time": { aliasTo: "America/Halifax" }, "Atlantic/Faeroe": { aliasTo: "Atlantic/Faroe" }, "Atlantic/Jan_Mayen": { aliasTo: "Europe/Oslo" }, "Azerbaijan Standard Time": { aliasTo: "Asia/Baku" }, "Azores Standard Time": { aliasTo: "Atlantic/Azores" }, "Bahia Standard Time": { aliasTo: "America/Bahia" }, "Bangladesh Standard Time": { aliasTo: "Asia/Dhaka" }, "Belarus Standard Time": { aliasTo: "Europe/Minsk" }, "Canada Central Standard Time": { aliasTo: "America/Regina" }, "Cape Verde Standard Time": { aliasTo: "Atlantic/Cape_Verde" }, "Caucasus Standard Time": { aliasTo: "Asia/Yerevan" }, "Cen. Australia Standard Time": { aliasTo: "Australia/Adelaide" }, "Central America Standard Time": { aliasTo: "America/Guatemala" }, "Central Asia Standard Time": { aliasTo: "Asia/Almaty" }, "Central Brazilian Standard Time": { aliasTo: "America/Cuiaba" }, "Central Europe Standard Time": { aliasTo: "Europe/Budapest" }, "Central European Standard Time": { aliasTo: "Europe/Warsaw" }, "Central Pacific Standard Time": { aliasTo: "Pacific/Guadalcanal" }, "Central Standard Time": { aliasTo: "America/Chicago" }, "Central Standard Time (Mexico)": { aliasTo: "America/Mexico_City" }, "China Standard Time": { aliasTo: "Asia/Shanghai" }, "E. Africa Standard Time": { aliasTo: "Africa/Nairobi" }, "E. Australia Standard Time": { aliasTo: "Australia/Brisbane" }, "E. South America Standard Time": { aliasTo: "America/Sao_Paulo" }, "Eastern Standard Time": { aliasTo: "America/New_York" }, "Egypt Standard Time": { aliasTo: "Africa/Cairo" }, "Ekaterinburg Standard Time": { aliasTo: "Asia/Yekaterinburg" }, "Etc/GMT": { aliasTo: "UTC" }, "Etc/GMT+0": { aliasTo: "UTC" }, "Etc/UCT": { aliasTo: "UTC" }, "Etc/UTC": { aliasTo: "UTC" }, "Etc/Unversal": { aliasTo: "UTC" }, "Etc/Zulu": { aliasTo: "UTC" }, "Europe/Belfast": { aliasTo: "Europe/London" }, "FLE Standard Time": { aliasTo: "Europe/Kiev" }, "Fiji Standard Time": { aliasTo: "Pacific/Fiji" }, GMT: { aliasTo: "UTC" }, "GMT Standard Time": { aliasTo: "Europe/London" }, "GMT+0": { aliasTo: "UTC" }, GMT0: { aliasTo: "UTC" }, "GTB Standard Time": { aliasTo: "Europe/Bucharest" }, "Georgian Standard Time": { aliasTo: "Asia/Tbilisi" }, "Greenland Standard Time": { aliasTo: "America/Godthab" }, Greenwich: { aliasTo: "UTC" }, "Greenwich Standard Time": { aliasTo: "Atlantic/Reykjavik" }, "Hawaiian Standard Time": { aliasTo: "Pacific/Honolulu" }, "India Standard Time": { aliasTo: "Asia/Calcutta" }, "Iran Standard Time": { aliasTo: "Asia/Tehran" }, "Israel Standard Time": { aliasTo: "Asia/Jerusalem" }, "Jordan Standard Time": { aliasTo: "Asia/Amman" }, "Kaliningrad Standard Time": { aliasTo: "Europe/Kaliningrad" }, "Korea Standard Time": { aliasTo: "Asia/Seoul" }, "Libya Standard Time": { aliasTo: "Africa/Tripoli" }, "Line Islands Standard Time": { aliasTo: "Pacific/Kiritimati" }, "Magadan Standard Time": { aliasTo: "Asia/Magadan" }, "Mauritius Standard Time": { aliasTo: "Indian/Mauritius" }, "Middle East Standard Time": { aliasTo: "Asia/Beirut" }, "Montevideo Standard Time": { aliasTo: "America/Montevideo" }, "Morocco Standard Time": { aliasTo: "Africa/Casablanca" }, "Mountain Standard Time": { aliasTo: "America/Denver" }, "Mountain Standard Time (Mexico)": { aliasTo: "America/Chihuahua" }, "Myanmar Standard Time": { aliasTo: "Asia/Rangoon" }, "N. Central Asia Standard Time": { aliasTo: "Asia/Novosibirsk" }, "Namibia Standard Time": { aliasTo: "Africa/Windhoek" }, "Nepal Standard Time": { aliasTo: "Asia/Katmandu" }, "New Zealand Standard Time": { aliasTo: "Pacific/Auckland" }, "Newfoundland Standard Time": { aliasTo: "America/St_Johns" }, "North Asia East Standard Time": { aliasTo: "Asia/Irkutsk" }, "North Asia Standard Time": { aliasTo: "Asia/Krasnoyarsk" }, "Pacific SA Standard Time": { aliasTo: "America/Santiago" }, "Pacific Standard Time": { aliasTo: "America/Los_Angeles" }, "Pacific Standard Time (Mexico)": { aliasTo: "America/Santa_Isabel" }, "Pacific/Johnston": { aliasTo: "Pacific/Honolulu" }, "Pakistan Standard Time": { aliasTo: "Asia/Karachi" }, "Paraguay Standard Time": { aliasTo: "America/Asuncion" }, "Romance Standard Time": { aliasTo: "Europe/Paris" }, "Russia Time Zone 10": { aliasTo: "Asia/Srednekolymsk" }, "Russia Time Zone 11": { aliasTo: "Asia/Kamchatka" }, "Russia Time Zone 3": { aliasTo: "Europe/Samara" }, "Russian Standard Time": { aliasTo: "Europe/Moscow" }, "SA Eastern Standard Time": { aliasTo: "America/Cayenne" }, "SA Pacific Standard Time": { aliasTo: "America/Bogota" }, "SA Western Standard Time": { aliasTo: "America/La_Paz" }, "SE Asia Standard Time": { aliasTo: "Asia/Bangkok" }, "Samoa Standard Time": { aliasTo: "Pacific/Apia" }, "Singapore Standard Time": { aliasTo: "Asia/Singapore" }, "South Africa Standard Time": { aliasTo: "Africa/Johannesburg" }, "Sri Lanka Standard Time": { aliasTo: "Asia/Colombo" }, "Syria Standard Time": { aliasTo: "Asia/Damascus" }, "Taipei Standard Time": { aliasTo: "Asia/Taipei" }, "Tasmania Standard Time": { aliasTo: "Australia/Hobart" }, "Tokyo Standard Time": { aliasTo: "Asia/Tokyo" }, "Tonga Standard Time": { aliasTo: "Pacific/Tongatapu" }, "Turkey Standard Time": { aliasTo: "Europe/Istanbul" }, UCT: { aliasTo: "UTC" }, "US Eastern Standard Time": { aliasTo: "America/Indiana/Indianapolis" }, "US Mountain Standard Time": { aliasTo: "America/Phoenix" }, "US/Central": { aliasTo: "America/Chicago" }, "US/Eastern": { aliasTo: "America/New_York" }, "US/Mountain": { aliasTo: "America/Denver" }, "US/Pacific": { aliasTo: "America/Los_Angeles" }, "US/Pacific-New": { aliasTo: "America/Los_Angeles" }, "Ulaanbaatar Standard Time": { aliasTo: "Asia/Ulaanbaatar" }, Universal: { aliasTo: "UTC" }, "Venezuela Standard Time": { aliasTo: "America/Caracas" }, "Vladivostok Standard Time": { aliasTo: "Asia/Vladivostok" }, "W. Australia Standard Time": { aliasTo: "Australia/Perth" }, "W. Central Africa Standard Time": { aliasTo: "Africa/Lagos" }, "W. Europe Standard Time": { aliasTo: "Europe/Berlin" }, "West Asia Standard Time": { aliasTo: "Asia/Tashkent" }, "West Pacific Standard Time": { aliasTo: "Pacific/Port_Moresby" }, "Yakutsk Standard Time": { aliasTo: "Asia/Yakutsk" }, Z: { aliasTo: "UTC" }, Zulu: { aliasTo: "UTC" }, utc: { aliasTo: "UTC" } }; var zones = { "Africa/Abidjan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0051900", longitude: "-0040200" }, "Africa/Accra": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0053300", longitude: "+0001300" }, "Africa/Addis_Ababa": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0090200", longitude: "+0384200" }, "Africa/Algiers": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0364700", longitude: "+0030300" }, "Africa/Asmara": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0152000", longitude: "+0385300" }, "Africa/Bamako": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0123900", longitude: "-0080000" }, "Africa/Bangui": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0042200", longitude: "+0183500" }, "Africa/Banjul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0132800", longitude: "-0163900" }, "Africa/Bissau": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0115100", longitude: "-0153500" }, "Africa/Blantyre": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0154700", longitude: "+0350000" }, "Africa/Brazzaville": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0041600", longitude: "+0151700" }, "Africa/Bujumbura": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0032300", longitude: "+0292200" }, "Africa/Cairo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0300300", longitude: "+0311500" }, "Africa/Casablanca": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20180325T020000\r\nRDATE:20180325T020000\r\nRDATE:20180617T020000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:20180513T030000\r\nRDATE:20180513T030000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20190609T020000\r\nRDATE:20190609T020000\r\nRDATE:20200524T020000\r\nRDATE:20210516T020000\r\nRDATE:20220508T020000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20181028T030000\r\nRDATE:20181028T030000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:20190505T030000\r\nRDATE:20190505T030000\r\nRDATE:20200419T030000\r\nRDATE:20210411T030000\r\nRDATE:20220327T030000\r\nEND:DAYLIGHT" ], latitude: "+0333900", longitude: "-0073500" }, "Africa/Ceuta": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0355300", longitude: "-0051900" }, "Africa/Conakry": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0093100", longitude: "-0134300" }, "Africa/Dakar": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0144000", longitude: "-0172600" }, "Africa/Dar_es_Salaam": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0064800", longitude: "+0391700" }, "Africa/Djibouti": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0113600", longitude: "+0430900" }, "Africa/Douala": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0040300", longitude: "+0094200" }, "Africa/El_Aaiun": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20180325T020000\r\nRDATE:20180325T020000\r\nRDATE:20180617T020000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:20180513T030000\r\nRDATE:20180513T030000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20181028T030000\r\nRDATE:20181028T030000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:20190505T030000\r\nRDATE:20190505T030000\r\nRDATE:20200419T030000\r\nRDATE:20210411T030000\r\nRDATE:20220327T030000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:+01\r\nDTSTART:20190609T020000\r\nRDATE:20190609T020000\r\nRDATE:20200524T020000\r\nRDATE:20210516T020000\r\nRDATE:20220508T020000\r\nEND:STANDARD" ], latitude: "+0270900", longitude: "-0131200" }, "Africa/Freetown": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0083000", longitude: "-0131500" }, "Africa/Gaborone": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0243900", longitude: "+0255500" }, "Africa/Harare": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0175000", longitude: "+0310300" }, "Africa/Johannesburg": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:SAST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0261500", longitude: "+0280000" }, "Africa/Juba": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0045100", longitude: "+0313700" }, "Africa/Kampala": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0001900", longitude: "+0322500" }, "Africa/Khartoum": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0153600", longitude: "+0323200" }, "Africa/Kigali": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0015700", longitude: "+0300400" }, "Africa/Kinshasa": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0041800", longitude: "+0151800" }, "Africa/Lagos": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0062700", longitude: "+0032400" }, "Africa/Libreville": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0002300", longitude: "+0092700" }, "Africa/Lome": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0060800", longitude: "+0011300" }, "Africa/Luanda": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0084800", longitude: "+0131400" }, "Africa/Lubumbashi": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0114000", longitude: "+0272800" }, "Africa/Lusaka": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0152500", longitude: "+0281700" }, "Africa/Malabo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0034500", longitude: "+0084700" }, "Africa/Maputo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0255800", longitude: "+0323500" }, "Africa/Maseru": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:SAST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0292800", longitude: "+0273000" }, "Africa/Mbabane": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:SAST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0261800", longitude: "+0310600" }, "Africa/Mogadishu": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0020400", longitude: "+0452200" }, "Africa/Monrovia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0061800", longitude: "-0104700" }, "Africa/Nairobi": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0011700", longitude: "+0364900" }, "Africa/Ndjamena": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0120700", longitude: "+0150300" }, "Africa/Niamey": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0133100", longitude: "+0020700" }, "Africa/Nouakchott": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0180600", longitude: "-0155700" }, "Africa/Ouagadougou": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0122200", longitude: "-0013100" }, "Africa/Porto-Novo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0062900", longitude: "+0023700" }, "Africa/Sao_Tome": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:WAT\r\nDTSTART:20180101T010000\r\nRDATE:20180101T010000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:20190101T020000\r\nRDATE:20190101T020000\r\nEND:STANDARD" ], latitude: "+0002000", longitude: "+0064400" }, "Africa/Tripoli": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0325400", longitude: "+0131100" }, "Africa/Tunis": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0364800", longitude: "+0101100" }, "Africa/Windhoek": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:CAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0223400", longitude: "+0170600" }, "America/Adak": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-0900\r\nTZNAME:HDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-1000\r\nTZNAME:HST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0515248", longitude: "-1763929" }, "America/Anchorage": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0611305", longitude: "-1495401" }, "America/Anguilla": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0181200", longitude: "-0630400" }, "America/Antigua": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0170300", longitude: "-0614800" }, "America/Araguaina": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0071200", longitude: "-0481200" }, "America/Argentina/Buenos_Aires": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0343600", longitude: "-0582700" }, "America/Argentina/Catamarca": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0282800", longitude: "-0654700" }, "America/Argentina/Cordoba": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0312400", longitude: "-0641100" }, "America/Argentina/Jujuy": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0241100", longitude: "-0651800" }, "America/Argentina/La_Rioja": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0292600", longitude: "-0665100" }, "America/Argentina/Mendoza": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0325300", longitude: "-0684900" }, "America/Argentina/Rio_Gallegos": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0513800", longitude: "-0691300" }, "America/Argentina/Salta": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0244700", longitude: "-0652500" }, "America/Argentina/San_Juan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0313200", longitude: "-0683100" }, "America/Argentina/San_Luis": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0331900", longitude: "-0662100" }, "America/Argentina/Tucuman": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0264900", longitude: "-0651300" }, "America/Argentina/Ushuaia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0544800", longitude: "-0681800" }, "America/Aruba": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0123000", longitude: "-0695800" }, "America/Asuncion": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19701004T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700322T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU\r\nEND:STANDARD" ], latitude: "-0251600", longitude: "-0574000" }, "America/Atikokan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0484531", longitude: "-0913718" }, "America/Bahia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0125900", longitude: "-0383100" }, "America/Bahia_Banderas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "+0204800", longitude: "-1051500" }, "America/Barbados": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0130600", longitude: "-0593700" }, "America/Belem": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0012700", longitude: "-0482900" }, "America/Belize": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0173000", longitude: "-0881200" }, "America/Blanc-Sablon": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0512500", longitude: "-0570700" }, "America/Boa_Vista": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0024900", longitude: "-0604000" }, "America/Bogota": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0043600", longitude: "-0740500" }, "America/Boise": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0433649", longitude: "-1161209" }, "America/Cambridge_Bay": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0690650", longitude: "-1050310" }, "America/Campo_Grande": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:20181104T000000\r\nRDATE:20181104T000000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:20180218T000000\r\nRDATE:20180218T000000\r\nRDATE:20190217T000000\r\nEND:STANDARD" ], latitude: "-0202700", longitude: "-0543700" }, "America/Cancun": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0210500", longitude: "-0864600" }, "America/Caracas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0103000", longitude: "-0665600" }, "America/Cayenne": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0045600", longitude: "-0522000" }, "America/Cayman": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0191800", longitude: "-0812300" }, "America/Chicago": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0415100", longitude: "-0873900" }, "America/Chihuahua": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0283800", longitude: "-1060500" }, "America/Costa_Rica": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0095600", longitude: "-0840500" }, "America/Creston": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0490600", longitude: "-1163100" }, "America/Cuiaba": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:20181104T000000\r\nRDATE:20181104T000000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:20180218T000000\r\nRDATE:20180218T000000\r\nRDATE:20190217T000000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0153500", longitude: "-0560500" }, "America/Curacao": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0121100", longitude: "-0690000" }, "America/Danmarkshavn": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0764600", longitude: "-0184000" }, "America/Dawson": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nTZNAME:PDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0640400", longitude: "-1392500" }, "America/Dawson_Creek": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0594600", longitude: "-1201400" }, "America/Denver": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0394421", longitude: "-1045903" }, "America/Detroit": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0421953", longitude: "-0830245" }, "America/Dominica": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0151800", longitude: "-0612400" }, "America/Edmonton": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0533300", longitude: "-1132800" }, "America/Eirunepe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0064000", longitude: "-0695200" }, "America/El_Salvador": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0134200", longitude: "-0891200" }, "America/Fort_Nelson": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0584800", longitude: "-1224200" }, "America/Fortaleza": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0034300", longitude: "-0383000" }, "America/Glace_Bay": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0461200", longitude: "-0595700" }, "America/Godthab": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:19700328T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYMONTHDAY=24,25,26,27,28,29,30;BYDAY=SA\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19701024T230000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYMONTHDAY=24,25,26,27,28,29,30;BYDAY=SA\r\nEND:STANDARD" ], latitude: "+0641100", longitude: "-0514400" }, "America/Goose_Bay": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT" ], latitude: "+0532000", longitude: "-0602500" }, "America/Grand_Turk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:20181104T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:20190310T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:20180311T020000\r\nRDATE:20180311T020000\r\nEND:DAYLIGHT" ], latitude: "+0212800", longitude: "-0710800" }, "America/Grenada": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0120300", longitude: "-0614500" }, "America/Guadeloupe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0161400", longitude: "-0613200" }, "America/Guatemala": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0143800", longitude: "-0903100" }, "America/Guayaquil": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0021000", longitude: "-0795000" }, "America/Guyana": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0064800", longitude: "-0581000" }, "America/Halifax": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0443900", longitude: "-0633600" }, "America/Havana": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:CST\r\nDTSTART:19701101T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:CDT\r\nDTSTART:19700308T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT" ], latitude: "+0230800", longitude: "-0822200" }, "America/Hermosillo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0290400", longitude: "-1105800" }, "America/Indiana/Indianapolis": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0394606", longitude: "-0860929" }, "America/Indiana/Knox": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0411745", longitude: "-0863730" }, "America/Indiana/Marengo": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0382232", longitude: "-0862041" }, "America/Indiana/Petersburg": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0382931", longitude: "-0871643" }, "America/Indiana/Tell_City": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0375711", longitude: "-0864541" }, "America/Indiana/Vevay": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0384452", longitude: "-0850402" }, "America/Indiana/Vincennes": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0384038", longitude: "-0873143" }, "America/Indiana/Winamac": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT" ], latitude: "+0410305", longitude: "-0863611" }, "America/Inuvik": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0682059", longitude: "-1334300" }, "America/Iqaluit": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0634400", longitude: "-0682800" }, "America/Jamaica": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0175805", longitude: "-0764736" }, "America/Juneau": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0581807", longitude: "-1342511" }, "America/Kentucky/Louisville": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0381515", longitude: "-0854534" }, "America/Kentucky/Monticello": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0364947", longitude: "-0845057" }, "America/Kralendijk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0120903", longitude: "-0681636" }, "America/La_Paz": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0163000", longitude: "-0680900" }, "America/Lima": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0120300", longitude: "-0770300" }, "America/Los_Angeles": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nTZNAME:PDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0340308", longitude: "-1181434" }, "America/Lower_Princes": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0180305", longitude: "-0630250" }, "America/Maceio": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0094000", longitude: "-0354300" }, "America/Managua": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0120900", longitude: "-0861700" }, "America/Manaus": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0030800", longitude: "-0600100" }, "America/Marigot": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0180400", longitude: "-0630500" }, "America/Martinique": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0143600", longitude: "-0610500" }, "America/Matamoros": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0255000", longitude: "-0973000" }, "America/Mazatlan": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0231300", longitude: "-1062500" }, "America/Menominee": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0450628", longitude: "-0873651" }, "America/Merida": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0205800", longitude: "-0893700" }, "America/Metlakatla": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:20191103T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:20181104T020000\r\nRDATE:20181104T020000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:20190120T020000\r\nRDATE:20190120T020000\r\nEND:STANDARD" ], latitude: "+0550737", longitude: "-1313435" }, "America/Mexico_City": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0192400", longitude: "-0990900" }, "America/Miquelon": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0470300", longitude: "-0562000" }, "America/Moncton": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0460600", longitude: "-0644700" }, "America/Monterrey": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0254000", longitude: "-1001900" }, "America/Montevideo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0345433", longitude: "-0561245" }, "America/Montserrat": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0164300", longitude: "-0621300" }, "America/Nassau": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0250500", longitude: "-0772100" }, "America/New_York": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0404251", longitude: "-0740023" }, "America/Nipigon": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0490100", longitude: "-0881600" }, "America/Nome": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0643004", longitude: "-1652423" }, "America/Noronha": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0035100", longitude: "-0322500" }, "America/North_Dakota/Beulah": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0471551", longitude: "-1014640" }, "America/North_Dakota/Center": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0470659", longitude: "-1011757" }, "America/North_Dakota/New_Salem": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0465042", longitude: "-1012439" }, "America/Ojinaga": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0293400", longitude: "-1042500" }, "America/Panama": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0085800", longitude: "-0793200" }, "America/Pangnirtung": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0660800", longitude: "-0654400" }, "America/Paramaribo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0055000", longitude: "-0551000" }, "America/Phoenix": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0332654", longitude: "-1120424" }, "America/Port-au-Prince": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0183200", longitude: "-0722000" }, "America/Port_of_Spain": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0103900", longitude: "-0613100" }, "America/Porto_Velho": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0084600", longitude: "-0635400" }, "America/Puerto_Rico": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0182806", longitude: "-0660622" }, "America/Punta_Arenas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0530900", longitude: "-0705500" }, "America/Rainy_River": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0484300", longitude: "-0943400" }, "America/Rankin_Inlet": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0624900", longitude: "-0920459" }, "America/Recife": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0080300", longitude: "-0345400" }, "America/Regina": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0502400", longitude: "-1043900" }, "America/Resolute": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT" ], latitude: "+0744144", longitude: "-0944945" }, "America/Rio_Branco": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0095800", longitude: "-0674800" }, "America/Santarem": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0022600", longitude: "-0545200" }, "America/Santiago": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:20190407T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYMONTHDAY=2,3,4,5,6,7,8;BYDAY=SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:20190908T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYMONTHDAY=2,3,4,5,6,7,8;BYDAY=SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:20180812T000000\r\nRDATE:20180812T000000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:-04\r\nDTSTART:20180513T000000\r\nRDATE:20180513T000000\r\nEND:STANDARD" ], latitude: "-0332700", longitude: "-0704000" }, "America/Santo_Domingo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0182800", longitude: "-0695400" }, "America/Sao_Paulo": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:20181104T000000\r\nRDATE:20181104T000000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:20180218T000000\r\nRDATE:20180218T000000\r\nRDATE:20190217T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:19700101T000000\r\nEND:DAYLIGHT" ], latitude: "-0233200", longitude: "-0463700" }, "America/Scoresbysund": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:-0100\r\nTZNAME:-01\r\nDTSTART:19701025T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0702900", longitude: "-0215800" }, "America/Sitka": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0571035", longitude: "-1351807" }, "America/St_Barthelemy": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0175300", longitude: "-0625100" }, "America/St_Johns": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0230\r\nTZOFFSETTO:-0330\r\nTZNAME:NST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0330\r\nTZOFFSETTO:-0230\r\nTZNAME:NDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT" ], latitude: "+0473400", longitude: "-0524300" }, "America/St_Kitts": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0171800", longitude: "-0624300" }, "America/St_Lucia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0140100", longitude: "-0610000" }, "America/St_Thomas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0182100", longitude: "-0645600" }, "America/St_Vincent": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0130900", longitude: "-0611400" }, "America/Swift_Current": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0501700", longitude: "-1075000" }, "America/Tegucigalpa": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0140600", longitude: "-0871300" }, "America/Thule": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0763400", longitude: "-0684700" }, "America/Thunder_Bay": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0482300", longitude: "-0891500" }, "America/Tijuana": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nTZNAME:PDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0323200", longitude: "-1170100" }, "America/Toronto": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nTZNAME:EDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nTZNAME:EST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0433900", longitude: "-0792300" }, "America/Tortola": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0182700", longitude: "-0643700" }, "America/Vancouver": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nTZNAME:PDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0491600", longitude: "-1230700" }, "America/Whitehorse": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nTZNAME:PDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nTZNAME:PST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0604300", longitude: "-1350300" }, "America/Winnipeg": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:CDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:CST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0495300", longitude: "-0970900" }, "America/Yakutat": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nTZNAME:AKDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nTZNAME:AKST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0593249", longitude: "-1394338" }, "America/Yellowknife": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nTZNAME:MDT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nTZNAME:MST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0622700", longitude: "-1142100" }, "Antarctica/Casey": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:20180311T040000\r\nRDATE:20180311T040000\r\nEND:STANDARD" ], latitude: "-0661700", longitude: "+1103100" }, "Antarctica/Davis": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0683500", longitude: "+0775800" }, "Antarctica/DumontDUrville": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:+10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0664000", longitude: "+1400100" }, "Antarctica/Macquarie": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0543000", longitude: "+1585700" }, "Antarctica/Mawson": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0673600", longitude: "+0625300" }, "Antarctica/McMurdo": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nTZNAME:NZDT\r\nDTSTART:19700927T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1200\r\nTZNAME:NZST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "-0775000", longitude: "+1663600" }, "Antarctica/Palmer": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0644800", longitude: "-0640600" }, "Antarctica/Rothera": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0673400", longitude: "-0680800" }, "Antarctica/Syowa": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0690022", longitude: "+0393524" }, "Antarctica/Troll": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0200\r\nTZNAME:+02\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "-0720041", longitude: "+0023206" }, "Antarctica/Vostok": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0782400", longitude: "+1065400" }, "Arctic/Longyearbyen": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0780000", longitude: "+0160000" }, "Asia/Aden": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0124500", longitude: "+0451200" }, "Asia/Almaty": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0431500", longitude: "+0765700" }, "Asia/Amman": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700326T235959\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1TH\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701030T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR\r\nEND:STANDARD" ], latitude: "+0315700", longitude: "+0355600" }, "Asia/Anadyr": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0644500", longitude: "+1772900" }, "Asia/Aqtau": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0443100", longitude: "+0501600" }, "Asia/Aqtobe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0501700", longitude: "+0571000" }, "Asia/Ashgabat": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0375700", longitude: "+0582300" }, "Asia/Atyrau": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0470700", longitude: "+0515600" }, "Asia/Baghdad": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0332100", longitude: "+0442500" }, "Asia/Bahrain": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0262300", longitude: "+0503500" }, "Asia/Baku": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0402300", longitude: "+0495100" }, "Asia/Bangkok": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0134500", longitude: "+1003100" }, "Asia/Barnaul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0532200", longitude: "+0834500" }, "Asia/Beirut": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0335300", longitude: "+0353000" }, "Asia/Bishkek": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0425400", longitude: "+0743600" }, "Asia/Brunei": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0045600", longitude: "+1145500" }, "Asia/Chita": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:+09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0520300", longitude: "+1132800" }, "Asia/Choibalsan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0480400", longitude: "+1143000" }, "Asia/Colombo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nTZNAME:+0530\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0065600", longitude: "+0795100" }, "Asia/Damascus": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701030T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700327T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT" ], latitude: "+0333000", longitude: "+0361800" }, "Asia/Dhaka": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0234300", longitude: "+0902500" }, "Asia/Dili": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:+09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0083300", longitude: "+1253500" }, "Asia/Dubai": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0251800", longitude: "+0551800" }, "Asia/Dushanbe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0383500", longitude: "+0684800" }, "Asia/Famagusta": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:20180325T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "+0350700", longitude: "+0335700" }, "Asia/Gaza": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701031T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:20190329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:20180324T010000\r\nRDATE:20180324T010000\r\nEND:DAYLIGHT" ], latitude: "+0313000", longitude: "+0342800" }, "Asia/Hebron": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701031T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:20190329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:20180324T010000\r\nRDATE:20180324T010000\r\nEND:DAYLIGHT" ], latitude: "+0313200", longitude: "+0350542" }, "Asia/Ho_Chi_Minh": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0104500", longitude: "+1064000" }, "Asia/Hong_Kong": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:HKT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0221700", longitude: "+1140900" }, "Asia/Hovd": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0480100", longitude: "+0913900" }, "Asia/Irkutsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0521600", longitude: "+1042000" }, "Asia/Istanbul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0410100", longitude: "+0285800" }, "Asia/Jakarta": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:WIB\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0061000", longitude: "+1064800" }, "Asia/Jayapura": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:WIT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0023200", longitude: "+1404200" }, "Asia/Jerusalem": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:IDT\r\nDTSTART:19700327T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYMONTHDAY=23,24,25,26,27,28,29;BYDAY=FR\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:IST\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0314650", longitude: "+0351326" }, "Asia/Kabul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0430\r\nTZOFFSETTO:+0430\r\nTZNAME:+0430\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0343100", longitude: "+0691200" }, "Asia/Kamchatka": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0530100", longitude: "+1583900" }, "Asia/Karachi": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:PKT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0245200", longitude: "+0670300" }, "Asia/Kathmandu": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0545\r\nTZOFFSETTO:+0545\r\nTZNAME:+0545\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0274300", longitude: "+0851900" }, "Asia/Khandyga": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:+09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0623923", longitude: "+1353314" }, "Asia/Kolkata": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nTZNAME:IST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0223200", longitude: "+0882200" }, "Asia/Krasnoyarsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0560100", longitude: "+0925000" }, "Asia/Kuala_Lumpur": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0031000", longitude: "+1014200" }, "Asia/Kuching": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0013300", longitude: "+1102000" }, "Asia/Kuwait": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0292000", longitude: "+0475900" }, "Asia/Macau": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0221150", longitude: "+1133230" }, "Asia/Magadan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0593400", longitude: "+1504800" }, "Asia/Makassar": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:WITA\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0050700", longitude: "+1192400" }, "Asia/Manila": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:PST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0143500", longitude: "+1210000" }, "Asia/Muscat": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0233600", longitude: "+0583500" }, "Asia/Nicosia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "+0351000", longitude: "+0332200" }, "Asia/Novokuznetsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0534500", longitude: "+0870700" }, "Asia/Novosibirsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0550200", longitude: "+0825500" }, "Asia/Omsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0550000", longitude: "+0732400" }, "Asia/Oral": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0511300", longitude: "+0512100" }, "Asia/Phnom_Penh": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0113300", longitude: "+1045500" }, "Asia/Pontianak": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:WIB\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0000200", longitude: "+1092000" }, "Asia/Pyongyang": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0830\r\nTZNAME:KST\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0830\r\nTZOFFSETTO:+0900\r\nTZNAME:KST\r\nDTSTART:20180504T233000\r\nRDATE:20180504T233000\r\nEND:STANDARD" ], latitude: "+0390100", longitude: "+1254500" }, "Asia/Qatar": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0251700", longitude: "+0513200" }, "Asia/Qostanay": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0531200", longitude: "+0633700" }, "Asia/Qyzylorda": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:20181221T000000\r\nRDATE:20181221T000000\r\nEND:STANDARD" ], latitude: "+0444800", longitude: "+0652800" }, "Asia/Riyadh": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0243800", longitude: "+0464300" }, "Asia/Sakhalin": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0465800", longitude: "+1424200" }, "Asia/Samarkand": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0394000", longitude: "+0664800" }, "Asia/Seoul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:KST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0373300", longitude: "+1265800" }, "Asia/Shanghai": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0311400", longitude: "+1212800" }, "Asia/Singapore": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0011700", longitude: "+1035100" }, "Asia/Srednekolymsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0672800", longitude: "+1534300" }, "Asia/Taipei": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:CST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0250300", longitude: "+1213000" }, "Asia/Tashkent": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0412000", longitude: "+0691800" }, "Asia/Tbilisi": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0414300", longitude: "+0444900" }, "Asia/Tehran": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0330\r\nTZNAME:+0330\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0330\r\nTZOFFSETTO:+0430\r\nTZNAME:+0430\r\nDTSTART:20180321T235959\r\nRDATE:20180321T235959\r\nRDATE:20190321T235959\r\nRDATE:20200320T235959\r\nRDATE:20210321T235959\r\nRDATE:20220321T235959\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0430\r\nTZOFFSETTO:+0330\r\nTZNAME:+0330\r\nDTSTART:20180921T235959\r\nRDATE:20180921T235959\r\nRDATE:20190921T235959\r\nRDATE:20200920T235959\r\nRDATE:20210921T235959\r\nRDATE:20220921T235959\r\nEND:STANDARD" ], latitude: "+0354000", longitude: "+0512600" }, "Asia/Thimphu": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0272800", longitude: "+0893900" }, "Asia/Tokyo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:JST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0353916", longitude: "+1394441" }, "Asia/Tomsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0563000", longitude: "+0845800" }, "Asia/Ulaanbaatar": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:+08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0475500", longitude: "+1065300" }, "Asia/Urumqi": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0434800", longitude: "+0873500" }, "Asia/Ust-Nera": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:+10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0643337", longitude: "+1431336" }, "Asia/Vientiane": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0175800", longitude: "+1023600" }, "Asia/Vladivostok": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:+10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0431000", longitude: "+1315600" }, "Asia/Yakutsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:+09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0620000", longitude: "+1294000" }, "Asia/Yangon": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0630\r\nTZOFFSETTO:+0630\r\nTZNAME:+0630\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0164700", longitude: "+0961000" }, "Asia/Yekaterinburg": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0565100", longitude: "+0603600" }, "Asia/Yerevan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0401100", longitude: "+0443000" }, "Atlantic/Azores": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:+0000\r\nTZNAME:+00\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:-0100\r\nTZNAME:-01\r\nDTSTART:19701025T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0374400", longitude: "-0254000" }, "Atlantic/Bermuda": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nTZNAME:ADT\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nTZNAME:AST\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "+0321700", longitude: "-0644600" }, "Atlantic/Canary": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:WEST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:WET\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0280600", longitude: "-0152400" }, "Atlantic/Cape_Verde": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0100\r\nTZNAME:-01\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0145500", longitude: "-0233100" }, "Atlantic/Faroe": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:WEST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:WET\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0620100", longitude: "-0064600" }, "Atlantic/Madeira": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:WEST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:WET\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0323800", longitude: "-0165400" }, "Atlantic/Reykjavik": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0640900", longitude: "-0215100" }, "Atlantic/South_Georgia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nTZNAME:-02\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0541600", longitude: "-0363200" }, "Atlantic/St_Helena": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0155500", longitude: "-0054200" }, "Atlantic/Stanley": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nTZNAME:-03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0514200", longitude: "-0575100" }, "Australia/Adelaide": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nTZNAME:ACST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nTZNAME:ACDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "-0345500", longitude: "+1383500" }, "Australia/Brisbane": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0272800", longitude: "+1530200" }, "Australia/Broken_Hill": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nTZNAME:ACST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nTZNAME:ACDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "-0315700", longitude: "+1412700" }, "Australia/Currie": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nTZNAME:AEDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "-0395600", longitude: "+1435200" }, "Australia/Darwin": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+0930\r\nTZNAME:ACST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0122800", longitude: "+1305000" }, "Australia/Eucla": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0845\r\nTZOFFSETTO:+0845\r\nTZNAME:+0845\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0314300", longitude: "+1285200" }, "Australia/Hobart": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nTZNAME:AEDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "-0425300", longitude: "+1471900" }, "Australia/Lindeman": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0201600", longitude: "+1490000" }, "Australia/Lord_Howe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1030\r\nTZNAME:+1030\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "-0313300", longitude: "+1590500" }, "Australia/Melbourne": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nTZNAME:AEDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "-0374900", longitude: "+1445800" }, "Australia/Perth": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nTZNAME:AWST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0315700", longitude: "+1155100" }, "Australia/Sydney": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nTZNAME:AEST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nTZNAME:AEDT\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT" ], latitude: "-0335200", longitude: "+1511300" }, "Europe/Amsterdam": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0522200", longitude: "+0045400" }, "Europe/Andorra": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0423000", longitude: "+0013100" }, "Europe/Astrakhan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0462100", longitude: "+0480300" }, "Europe/Athens": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0375800", longitude: "+0234300" }, "Europe/Belgrade": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0445000", longitude: "+0203000" }, "Europe/Berlin": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0523000", longitude: "+0132200" }, "Europe/Bratislava": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0480900", longitude: "+0170700" }, "Europe/Brussels": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0505000", longitude: "+0042000" }, "Europe/Bucharest": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0442600", longitude: "+0260600" }, "Europe/Budapest": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0473000", longitude: "+0190500" }, "Europe/Busingen": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0474200", longitude: "+0084100" }, "Europe/Chisinau": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0470000", longitude: "+0285000" }, "Europe/Copenhagen": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0554000", longitude: "+0123500" }, "Europe/Dublin": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:IST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "+0532000", longitude: "-0061500" }, "Europe/Gibraltar": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0360800", longitude: "-0052100" }, "Europe/Guernsey": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:BST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0492717", longitude: "-0023210" }, "Europe/Helsinki": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0601000", longitude: "+0245800" }, "Europe/Isle_of_Man": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:BST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0540900", longitude: "-0042800" }, "Europe/Istanbul": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0410100", longitude: "+0285800" }, "Europe/Jersey": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:BST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0491101", longitude: "-0020624" }, "Europe/Kaliningrad": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0544300", longitude: "+0203000" }, "Europe/Kiev": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0502600", longitude: "+0303100" }, "Europe/Kirov": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0583600", longitude: "+0493900" }, "Europe/Lisbon": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:WET\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:WEST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "+0384300", longitude: "-0090800" }, "Europe/Ljubljana": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0460300", longitude: "+0143100" }, "Europe/London": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nTZNAME:BST\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nTZNAME:GMT\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0513030", longitude: "+0000731" }, "Europe/Luxembourg": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0493600", longitude: "+0060900" }, "Europe/Madrid": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0402400", longitude: "-0034100" }, "Europe/Malta": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0355400", longitude: "+0143100" }, "Europe/Mariehamn": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0600600", longitude: "+0195700" }, "Europe/Minsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0535400", longitude: "+0273400" }, "Europe/Monaco": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0434200", longitude: "+0072300" }, "Europe/Moscow": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:MSK\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0554521", longitude: "+0373704" }, "Europe/Nicosia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "+0351000", longitude: "+0332200" }, "Europe/Oslo": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0595500", longitude: "+0104500" }, "Europe/Paris": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0485200", longitude: "+0022000" }, "Europe/Podgorica": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0422600", longitude: "+0191600" }, "Europe/Prague": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0500500", longitude: "+0142600" }, "Europe/Riga": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0565700", longitude: "+0240600" }, "Europe/Rome": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0415400", longitude: "+0122900" }, "Europe/Samara": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0531200", longitude: "+0500900" }, "Europe/San_Marino": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0435500", longitude: "+0122800" }, "Europe/Sarajevo": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0435200", longitude: "+0182500" }, "Europe/Saratov": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0513400", longitude: "+0460200" }, "Europe/Simferopol": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:MSK\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0445700", longitude: "+0340600" }, "Europe/Skopje": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0415900", longitude: "+0212600" }, "Europe/Sofia": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0424100", longitude: "+0231900" }, "Europe/Stockholm": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0592000", longitude: "+0180300" }, "Europe/Tallinn": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0592500", longitude: "+0244500" }, "Europe/Tirane": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0412000", longitude: "+0195000" }, "Europe/Ulyanovsk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0542000", longitude: "+0482400" }, "Europe/Uzhgorod": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0483700", longitude: "+0221800" }, "Europe/Vaduz": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0470900", longitude: "+0093100" }, "Europe/Vatican": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0415408", longitude: "+0122711" }, "Europe/Vienna": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0481300", longitude: "+0162000" }, "Europe/Vilnius": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0544100", longitude: "+0251900" }, "Europe/Volgograd": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:20181028T020000\r\nRDATE:20181028T020000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0300\r\nTZNAME:+03\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0484400", longitude: "+0442500" }, "Europe/Warsaw": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0521500", longitude: "+0210000" }, "Europe/Zagreb": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0454800", longitude: "+0155800" }, "Europe/Zaporozhye": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nTZNAME:EEST\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nTZNAME:EET\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0475000", longitude: "+0351000" }, "Europe/Zurich": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nTZNAME:CEST\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nTZNAME:CET\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD" ], latitude: "+0472300", longitude: "+0083200" }, "Indian/Antananarivo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0185500", longitude: "+0473100" }, "Indian/Chagos": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nTZNAME:+06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0072000", longitude: "+0722500" }, "Indian/Christmas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nTZNAME:+07\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0102500", longitude: "+1054300" }, "Indian/Cocos": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0630\r\nTZOFFSETTO:+0630\r\nTZNAME:+0630\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0121000", longitude: "+0965500" }, "Indian/Comoro": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0114100", longitude: "+0431600" }, "Indian/Kerguelen": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0492110", longitude: "+0701303" }, "Indian/Mahe": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0044000", longitude: "+0552800" }, "Indian/Maldives": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nTZNAME:+05\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0041000", longitude: "+0733000" }, "Indian/Mauritius": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0201000", longitude: "+0573000" }, "Indian/Mayotte": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nTZNAME:EAT\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0124700", longitude: "+0451400" }, "Indian/Reunion": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nTZNAME:+04\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0205200", longitude: "+0552800" }, "Pacific/Apia": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:19700405T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1400\r\nTZNAME:+14\r\nDTSTART:19700927T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT" ], latitude: "-0135000", longitude: "-1714400" }, "Pacific/Auckland": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nTZNAME:NZDT\r\nDTSTART:19700927T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1200\r\nTZNAME:NZST\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "-0365200", longitude: "+1744600" }, "Pacific/Bougainville": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0061300", longitude: "+1553400" }, "Pacific/Chatham": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1245\r\nTZOFFSETTO:+1345\r\nTZNAME:+1345\r\nDTSTART:19700927T024500\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1345\r\nTZOFFSETTO:+1245\r\nTZNAME:+1245\r\nDTSTART:19700405T034500\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD" ], latitude: "-0435700", longitude: "-1763300" }, "Pacific/Chuuk": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:+10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0072500", longitude: "+1514700" }, "Pacific/Easter": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:-06\r\nDTSTART:20190406T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SA\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:20190907T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SA\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:-06\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nTZNAME:-05\r\nDTSTART:20180811T220000\r\nRDATE:20180811T220000\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nTZNAME:-06\r\nDTSTART:20180512T220000\r\nRDATE:20180512T220000\r\nEND:STANDARD" ], latitude: "-0270900", longitude: "-1092600" }, "Pacific/Efate": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0174000", longitude: "+1682500" }, "Pacific/Enderbury": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0030800", longitude: "-1710500" }, "Pacific/Fakaofo": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0092200", longitude: "-1711400" }, "Pacific/Fiji": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700118T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=1;BYMONTHDAY=12,13,14,15,16,17,18;BYDAY=SU\r\nEND:STANDARD", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:20191110T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=2SU\r\nEND:DAYLIGHT", "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:20181104T020000\r\nRDATE:20181104T020000\r\nEND:DAYLIGHT" ], latitude: "-0180800", longitude: "+1782500" }, "Pacific/Funafuti": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0083100", longitude: "+1791300" }, "Pacific/Galapagos": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nTZNAME:-06\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0005400", longitude: "-0893600" }, "Pacific/Gambier": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0900\r\nTZNAME:-09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0230800", longitude: "-1345700" }, "Pacific/Guadalcanal": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0093200", longitude: "+1601200" }, "Pacific/Guam": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:ChST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0132800", longitude: "+1444500" }, "Pacific/Honolulu": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nTZNAME:HST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0211825", longitude: "-1575130" }, "Pacific/Kiritimati": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1400\r\nTZNAME:+14\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0015200", longitude: "-1572000" }, "Pacific/Kosrae": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0051900", longitude: "+1625900" }, "Pacific/Kwajalein": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0090500", longitude: "+1672000" }, "Pacific/Majuro": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0070900", longitude: "+1711200" }, "Pacific/Marquesas": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0930\r\nTZOFFSETTO:-0930\r\nTZNAME:-0930\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0090000", longitude: "-1393000" }, "Pacific/Midway": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nTZNAME:SST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0281300", longitude: "-1772200" }, "Pacific/Nauru": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0003100", longitude: "+1665500" }, "Pacific/Niue": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nTZNAME:-11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0190100", longitude: "-1695500" }, "Pacific/Norfolk": { ics: [ "BEGIN:DAYLIGHT\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:20191006T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:20200405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1130\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD", "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:20190701T000000\r\nRDATE:20190701T000000\r\nEND:STANDARD" ], latitude: "-0290300", longitude: "+1675800" }, "Pacific/Noumea": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0221600", longitude: "+1662700" }, "Pacific/Pago_Pago": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nTZNAME:SST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0141600", longitude: "-1704200" }, "Pacific/Palau": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nTZNAME:+09\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0072000", longitude: "+1342900" }, "Pacific/Pitcairn": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nTZNAME:-08\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0250400", longitude: "-1300500" }, "Pacific/Pohnpei": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nTZNAME:+11\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0065800", longitude: "+1581300" }, "Pacific/Port_Moresby": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:+10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0093000", longitude: "+1471000" }, "Pacific/Rarotonga": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nTZNAME:-10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0211400", longitude: "-1594600" }, "Pacific/Saipan": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nTZNAME:ChST\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0151200", longitude: "+1454500" }, "Pacific/Tahiti": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nTZNAME:-10\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0173200", longitude: "-1493400" }, "Pacific/Tarawa": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0012500", longitude: "+1730000" }, "Pacific/Tongatapu": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nTZNAME:+13\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0211000", longitude: "-1751000" }, "Pacific/Wake": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "+0191700", longitude: "+1663700" }, "Pacific/Wallis": { ics: [ "BEGIN:STANDARD\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nTZNAME:+12\r\nDTSTART:19700101T000000\r\nEND:STANDARD" ], latitude: "-0131800", longitude: "-1761000" } }; var tzData = { version: version, aliases: aliases, zones: zones }; /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class TimezoneManager */ class TimezoneManager { /** * Constructor */ constructor() { /** * Map of aliases * Alias name => timezoneId * * @type {Map} */ this._aliases = new Map(); /** * Map of Timezones * timezoneId => Timezone * * @type {Map} * @private */ this._timezones = new Map(); } /** * Gets a timezone for the given id * * @param {String} timezoneId The id of the timezone * @returns {Timezone|null} */ getTimezoneForId(timezoneId) { return this._getTimezoneForIdRec(timezoneId, 0); } _getTimezoneForIdRec(timezoneId, level) { if (this._timezones.has(timezoneId)) { return this._timezones.get(timezoneId); } if (level >= 20) { // too much recursion console.error('TimezoneManager.getTimezoneForIdRec() exceeds recursion limits'); return null; } if (this._aliases.has(timezoneId)) { const resolvedTimezoneId = this._aliases.get(timezoneId); // can be a recursive alias: return this._getTimezoneForIdRec(resolvedTimezoneId, level + 1); } return null; } /** * Checks if there is a timezone for the given id stored in this manager * * @param {String} timezoneId The id of the timezone * @returns {boolean} */ hasTimezoneForId(timezoneId) { return this._timezones.has(timezoneId) || this._aliases.has(timezoneId); } /** * Checks if the given timezone id is an alias * * @param {String} timezoneId The id of the timezone * @returns {boolean} */ isAlias(timezoneId) { return !this._timezones.has(timezoneId) && this._aliases.has(timezoneId); } /** * Lists all timezones * * @param {Boolean=} includeAliases Whether or not to include aliases * @returns {String[]} */ listAllTimezones(includeAliases = false) { const timezones = Array.from(this._timezones.keys()); if (includeAliases) { return timezones.concat(Array.from(this._aliases.keys())); } return timezones; } /** * Registers a timezone * * @param {Timezone} timezone The timezone-object to register */ registerTimezone(timezone) { this._timezones.set(timezone.timezoneId, timezone); } registerDefaultTimezones() { console.debug(`@nextcloud/calendar-js app is using version ${tzData.version} of the timezone database`); for (const tzid in tzData.zones) { if (Object.prototype.hasOwnProperty.call(tzData.zones, [tzid])) { const ics = ['BEGIN:VTIMEZONE', 'TZID:' + tzid, ...tzData.zones[tzid].ics, 'END:VTIMEZONE'].join('\r\n'); this.registerTimezoneFromICS(tzid, ics); } } for (const tzid in tzData.aliases) { if (Object.prototype.hasOwnProperty.call(tzData.aliases, [tzid])) { this.registerAlias(tzid, tzData.aliases[tzid].aliasTo); } } } /** * Registers a timezone based on ics data * * @param {String} timezoneId The id of the timezone * @param {String} ics The iCalendar timezone definition */ registerTimezoneFromICS(timezoneId, ics) { const timezone = new Timezone(timezoneId, ics); this.registerTimezone(timezone); } /** * Registers a new timezone-alias * * @param {String} aliasName The timezone-id of the alias * @param {String} timezoneId The timezone-id to resolve the alias to */ registerAlias(aliasName, timezoneId) { this._aliases.set(aliasName, timezoneId); } /** * Unregisters a timezone * * @param {String} timezoneId Unregisters a timezone by Id */ unregisterTimezones(timezoneId) { this._timezones.delete(timezoneId); } /** * Unregisters a timezone-alias * * @param {String} aliasName The alias to unregister */ unregisterAlias(aliasName) { this._aliases.delete(aliasName); } /** * Clear all timezones */ clearAllTimezones() { this._aliases = new Map(); this._timezones = new Map(); timezoneManager.registerTimezone(Timezone.utc); timezoneManager.registerTimezone(Timezone.floating); timezoneManager.registerAlias('GMT', Timezone.utc.timezoneId); timezoneManager.registerAlias('Z', Timezone.utc.timezoneId); } } const timezoneManager = new TimezoneManager(); timezoneManager.clearAllTimezones(); /** * Gets the default instance of the timezone manager * * @returns {TimezoneManager} */ function getTimezoneManager() { return timezoneManager; } /** * * @param {String} tzName Name of the timezone to check * @returns {boolean} */ function isOlsonTimezone(tzName) { const hasSlash = tzName.indexOf('/') !== -1; const hasSpace = tzName.indexOf(' ') !== -1; const startsWithETC = tzName.startsWith('Etc'); const startsWithUS = tzName.startsWith('US/'); return hasSlash && !hasSpace && !startsWithETC && !startsWithUS; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ICalendarParser * @classdesc */ class ICalendarParser extends AbstractParser { /** * @inheritDoc */ constructor(...args) { super(...args); /** * The raw text/calendar data * * @type {String} * @protected */ this._rawData = null; /** * The CalendarComponent representing the raw data * * @type {CalendarComponent} * @protected */ this._calendarComponent = null; /** * A flag whether this calendar-data contains vevents * * @type {boolean} * @private */ this._containsVEvents = false; /** * A flag whether this calendar-data contains vjournals * * @type {boolean} * @private */ this._containsVJournals = false; /** * A flag whether this calendar-data contains vtodos * * @type {boolean} * @private */ this._containsVTodos = false; /** * A flag whether this calendar-data contains vfreebusy * * @type {boolean} * @private */ this._containsVFreeBusy = false; /** * A map containing all VObjects. * The key of this map is the UID * The value an array of all VObjects with that particular UID * * @type {Map} * @private */ this._items = new Map(); /** * Items that are no recurrence-exceptions * The key of this map is the UID * * @type {Map} * @private */ this._masterItems = new Map(); /** * Items that are recurrence exceptions * * @type {Map} * @private */ this._recurrenceExceptionItems = new Map(); /** * Some recurrence-exceptions come without a master item * In that case we need to forge a master item * * @type {Map} * @private */ this._forgedMasterItems = new Map(); /** * A list of timezone-components found in the calendar-data * * @type {Map} * @private */ this._timezones = new Map(); /** * A set of required timezones for each UID * * @type {Map>} * @private */ this._requiredTimezones = new Map(); /** * Instance of the default timezone-manager * * @type {TimezoneManager} * @private */ this._defaultTimezoneManager = getTimezoneManager(); } /** * Parses the actual calendar-data * * @param {String} ics The icalendar data to parse */ parse(ics) { this._rawData = ics; this._applyRepairSteps(); // If a timezone is not inside our TimezoneManager at the time of parsing // the internal zone will be marked as floating inside ICAL.Time // so before we start any actual parsing, we need to extract all timezones // and add them to the TimezoneManager this._extractTimezones(); this._registerTimezones(); this._createCalendarComponent(); if (this._getOption('extractGlobalProperties', false)) { this._extractProperties(); } this._processVObjects(); if (this._getOption('processFreeBusy', false)) { this._processVFreeBusy(); } } /** * @inheritDoc */ *getItemIterator() { for (const itemList of this._items.values()) { const calendarComp = CalendarComponent.fromEmpty(); if (this._getOption('includeTimezones', false)) { this._addRequiredTimezonesToCalendarComp(calendarComp, itemList[0].uid); } // Preserve the original product id, just in case we need special handling for certain clients later on ... if (this._calendarComponent.hasProperty('PRODID')) { calendarComp.deleteAllProperties('PRODID'); calendarComp.addProperty(this._calendarComponent.getFirstProperty('PRODID').clone()); } if (this._getOption('preserveMethod', false)) { if (this._calendarComponent.hasProperty('METHOD')) { calendarComp.deleteAllProperties('METHOD'); calendarComp.addProperty(this._calendarComponent.getFirstProperty('METHOD').clone()); } } for (const item of itemList) { calendarComp.addComponent(item); } yield calendarComp; } } /** * @inheritDoc */ containsVEvents() { return this._containsVEvents; } /** * @inheritDoc */ containsVJournals() { return this._containsVJournals; } /** * @inheritDoc */ containsVTodos() { return this._containsVTodos; } /** * @inheritDoc */ containsVFreeBusy() { return this._containsVFreeBusy; } /** * @inheritDoc */ getItemCount() { return Array.from(this._items.keys()).length; } /** * Applies all registered repair steps * * @private */ _applyRepairSteps() { for (const RepairStep of getRepairSteps()) { const step = new RepairStep(); this._rawData = step.repair(this._rawData); } } /** * Creates a calendar component based upon the repaired data * * @private */ _createCalendarComponent() { const jCal = ical_js__WEBPACK_IMPORTED_MODULE_0___default().parse(this._rawData); const icalComp = new (ical_js__WEBPACK_IMPORTED_MODULE_0___default().Component)(jCal); this._calendarComponent = CalendarComponent.fromICALJs(icalComp); } /** * extracts properties * * @protected */ _extractProperties() { this._extractPropertyAndPutResultIntoVariable(['name', 'x-wr-calname'], '_name'); this._extractPropertyAndPutResultIntoVariable(['color', 'x-apple-calendar-color'], '_color'); this._extractPropertyAndPutResultIntoVariable(['source'], '_sourceURL'); this._extractPropertyAndPutResultIntoVariable(['refresh-interval', 'x-published-ttl'], '_refreshInterval'); this._extractPropertyAndPutResultIntoVariable(['x-wr-timezone'], '_calendarTimezone'); } /** * Extract a property and writes it into a class property * names must be an array, it will use the value of the fist * propertyname it can find * * @param {String[]} names The names of the properties to check * @param {String} variableName The variable name to save it under * @private */ _extractPropertyAndPutResultIntoVariable(names, variableName) { for (const name of names) { if (this._calendarComponent.hasProperty(name)) { this[variableName] = this._calendarComponent.getFirstPropertyFirstValue(name); return; } } } /** * Extracts timezones from the calendar component * * @protected */ _extractTimezones() { const matches = this._rawData.match(/^BEGIN:VTIMEZONE$(((?!^END:VTIMEZONE$)(.|\n))*)^END:VTIMEZONE$\n/gm); if (!matches) { return; } for (const match of matches) { const tzidMatcher = match.match(/^TZID:(.*)$/gm); if (!tzidMatcher) { continue; } const tzid = tzidMatcher[0].substr(5); const timezone = new Timezone(tzid, match); this._timezones.set(tzid, timezone); } } /** * Registers unknown timezones into our timezone-manager * * @protected */ _registerTimezones() { for (const [tzid, timezone] of this._timezones) { if (!this._defaultTimezoneManager.hasTimezoneForId(tzid)) { this._defaultTimezoneManager.registerTimezone(timezone); } } } /** * Processes the parsed vobjects * * @protected */ _processVObjects() { for (const vObject of this._calendarComponent.getVObjectIterator()) { this._addItem(vObject); this._markCompTypeAsSeen(vObject.name); if (vObject.isRecurrenceException()) { this._addRecurrenceException(vObject); } else { vObject.recurrenceManager = new RecurrenceManager(vObject); this._masterItems.set(vObject.uid, vObject); } for (const propertyToCheck of vObject.getPropertyIterator()) { for (const value of propertyToCheck.getValueIterator()) { if (value instanceof DateTimeValue && value.timezoneId) { this._addRequiredTimezone(vObject.uid, value.timezoneId); } } } // TRIGGER is supposed to be stored in UTC only, // but not all clients stick to this for (const alarm of vObject.getAlarmIterator()) { for (const propertyToCheck of alarm.getPropertyIterator()) { for (const value of propertyToCheck.getValueIterator()) { if (value instanceof DateTimeValue && value.timezoneId) { this._addRequiredTimezone(vObject.uid, value.timezoneId); } } } } if (this._getOption('removeRSVPForAttendees', false)) { for (const attendee of vObject.getAttendeeIterator()) { attendee.deleteParameter('RSVP'); } } } for (const recurrenceExceptionList of this._recurrenceExceptionItems.values()) { for (const recurrenceException of recurrenceExceptionList) { // Check if there is a master item for this recurrence exception // otherwise we have to forge one if (!this._masterItems.has(recurrenceException.uid)) { const constructor = getConstructorForComponentName(recurrenceException.name); const forgedMaster = new constructor(recurrenceException.name, [['UID', recurrenceException.uid], ['DTSTAMP', recurrenceException.stampTime.clone()], ['DTSTART', recurrenceException.recurrenceId.clone()]]); forgedMaster.recurrenceManager = new RecurrenceManager(forgedMaster); this._forgedMasterItems.set(recurrenceException.uid, forgedMaster); this._masterItems.set(recurrenceException.uid, forgedMaster); this._addItem(forgedMaster); } else { const master = this._masterItems.get(recurrenceException.uid); // This should usually not be the case, // only if the calendar-data is seriously broken. // Let's try to handle it anyway by adding it to // forgedMasterItems, we will simply add RDATEs // in the next step to make it recur if (!master.isRecurring()) { this._forgedMasterItems.set(master.uid, master); } } if (this._forgedMasterItems.has(recurrenceException.uid)) { const forgedMaster = this._forgedMasterItems.get(recurrenceException.uid); forgedMaster.recurrenceManager.addRecurrenceDate(false, recurrenceException.recurrenceId.clone()); } const masterItem = this._masterItems.get(recurrenceException.uid); masterItem.recurrenceManager.relateRecurrenceException(recurrenceException); } } } /** * Process FreeBusy components * * @private */ _processVFreeBusy() { for (const vObject of this._calendarComponent.getFreebusyIterator()) { this._addItem(vObject); this._markCompTypeAsSeen(vObject.name); for (const propertyToCheck of vObject.getPropertyIterator()) { for (const value of propertyToCheck.getValueIterator()) { if (value instanceof DateTimeValue && value.timezoneId) { this._addRequiredTimezone(vObject.uid, value.timezoneId); } } } } } /** * * @param {AbstractRecurringComponent} item The recurrence-item to register * @private */ _addRecurrenceException(item) { if (this._recurrenceExceptionItems.has(item.uid)) { const arr = this._recurrenceExceptionItems.get(item.uid); arr.push(item); } else { this._recurrenceExceptionItems.set(item.uid, [item]); } } /** * * @param {AbstractRecurringComponent} item The item to register * @private */ _addItem(item) { if (this._items.has(item.uid)) { const arr = this._items.get(item.uid); arr.push(item); } else { this._items.set(item.uid, [item]); } } /** * * @param {String} uid The uid of the calendar-object * @param {String} timezoneId The timezoneId required by the object * @private */ _addRequiredTimezone(uid, timezoneId) { if (timezoneId === 'UTC' || timezoneId === 'floating' || timezoneId === 'GMT' || timezoneId === 'Z') { return; } if (this._requiredTimezones.has(uid)) { this._requiredTimezones.get(uid).add(timezoneId); } else { const set = new Set([timezoneId]); this._requiredTimezones.set(uid, set); } } /** * * @param {CalendarComponent} calendarComp The calendar-component to add timezones to * @param {String} uid The UID of the calendar-object * @private */ _addRequiredTimezonesToCalendarComp(calendarComp, uid) { if (!this._requiredTimezones.has(uid)) { return; } for (const requiredTimezone of this._requiredTimezones.get(uid)) { if (!this._defaultTimezoneManager.hasTimezoneForId(requiredTimezone)) { return; } const timezone = this._defaultTimezoneManager.getTimezoneForId(requiredTimezone); // Is this an alias? if (timezone.timezoneId !== requiredTimezone) { this._replaceTimezoneWithAnotherOne(calendarComp, requiredTimezone, timezone.timezoneId); } const timezoneComponent = timezone.toTimezoneComponent(); calendarComp.addComponent(timezoneComponent); } } /** * Replaces all occurrences of searchTimezone with replaceTimezone * * @param {CalendarComponent} calendarComponent The calendar-component to replace a timezone in * @param {String} searchTimezone The timezone to replace * @param {String} replaceTimezone The replacement timezone * @private */ _replaceTimezoneWithAnotherOne(calendarComponent, searchTimezone, replaceTimezone) { for (const vObject of this._calendarComponent.getVObjectIterator()) { for (const propertyToCheck of vObject.getPropertyIterator()) { for (const value of propertyToCheck.getValueIterator()) { if (!(value instanceof DateTimeValue)) { continue; } if (value.timezoneId === searchTimezone) { value.silentlyReplaceTimezone(replaceTimezone); } } } // TRIGGER is supposed to be stored in UTC only, // but not all clients stick to this for (const alarm of vObject.getAlarmIterator()) { for (const propertyToCheck of alarm.getPropertyIterator()) { for (const value of propertyToCheck.getValueIterator()) { if (!(value instanceof DateTimeValue)) { continue; } if (value.timezoneId === searchTimezone) { value.silentlyReplaceTimezone(replaceTimezone); } } } } } } /** * Marks a certain component type as seen. * This is used for * containsVEvents() * containsVJournals() * containsVTodos() * * @param {String} compName The name of the visited component * @private */ _markCompTypeAsSeen(compName) { switch (uc(compName)) { case 'VEVENT': this._containsVEvents = true; break; case 'VJOURNAL': this._containsVJournals = true; break; case 'VTODO': this._containsVTodos = true; break; case 'VFREEBUSY': this._containsVFreeBusy = true; break; } } /** * @inheritDoc */ static getMimeTypes() { return ['text/calendar']; } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class ParserManager * @classdesc */ class ParserManager { /** * Constructor */ constructor() { /** * List of supported parsers * * @type {Function[]} */ this._parsers = []; } /** * Get a list of all supported file-types * * @returns {String[]} */ getAllSupportedFileTypes() { return this._parsers.reduce((allFileTypes, parser) => allFileTypes.concat(parser.getMimeTypes()), []); } /** * Get an instance of a parser for one specific file-type * * @param {String} fileType The mime-type to get a parser for * @param {Object=} options Options destructuring object * @param {Boolean=} options.extractGlobalProperties Whether or not to preserve properties from the VCALENDAR component (defaults to false) * @param {Boolean=} options.removeRSVPForAttendees Whether or not to remove RSVP from attendees (defaults to false) * @param {Boolean=} options.includeTimezones Whether or not to include timezones (defaults to false) * @param {Boolean=} options.preserveMethod Whether or not to preserve the iCalendar method (defaults to false) * @param {Boolean=} options.processFreeBusy Whether or not to process VFreeBusy components (defaults to false) * * @returns {AbstractParser} */ getParserForFileType(fileType, options) { const Parser = this._parsers.find(parser => parser.getMimeTypes().includes(fileType)); if (!Parser) { throw new TypeError('Unknown file-type.'); } return new Parser(options); } /** * Registers a parser * * @param {Function} parser The parser to register */ registerParser(parser) { this._parsers.push(parser); } } /** * Gets an instance of the ParserManager with all default parsers * * @returns {ParserManager} */ function getParserManager() { const parserManager = new ParserManager(); // We only support iCalendar for now. // JSON calendar and CSV will be supported soon, // but require some more work parserManager.registerParser(ICalendarParser); // parserManager.registerParser(JCalendarParser) // parserManager.registerParser(CSVParser) return parserManager; } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * @class TimezoneAdapter * @classdesc Connecting ICAL.TimezoneService with our TimezoneManager */ class TimezoneAdapter { /** * Constructor * * @param {TimezoneManager} timezoneManager The timezone-manager to wrap */ constructor(timezoneManager) { /** * TimezoneManager object * * @type {TimezoneManager} * @private */ this._timezoneManager = timezoneManager; } /** * @param {string} timezoneId The id of the timezone * @returns {boolean} */ has(timezoneId) { return this._timezoneManager.hasTimezoneForId(timezoneId); } /** * @param {String} timezoneId The id of the timezone * @returns {ICAL.Timezone|undefined} */ get(timezoneId) { const timezone = this._timezoneManager.getTimezoneForId(timezoneId); if (!timezone) { return undefined; } return timezone.toICALTimezone(); } /** * @throws TypeError */ register() { throw new TypeError('Not allowed to register new timezone'); } /** * @throws TypeError */ remove() { throw new TypeError('Not allowed to remove timezone'); } /** * @throws TypeError */ reset() { throw new TypeError('Not allowed to reset TimezoneService'); } } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ class IllegalValueError extends Error {} /** * @copyright Copyright (c) 2021 Christoph Wurst * * @author Christoph Wurst * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ /** * * @param {string[]} timezoneList List of Olsen timezones * @param {Array} additionalTimezones List of additional timezones * @param {String} globalTimezoneName The localized name of the "Global" timezones * @returns {[]} */ function getSortedTimezoneList(timezoneList = [], additionalTimezones = [], globalTimezoneName = 'Global') { const sortedByContinent = {}; const sortedList = []; for (const timezoneId of timezoneList) { const components = timezoneId.split('/'); let [continent, name] = [components.shift(), components.join('/')]; if (!name) { name = continent; continent = globalTimezoneName; } sortedByContinent[continent] = sortedByContinent[continent] || { continent, regions: [] }; sortedByContinent[continent].regions.push({ label: getReadableTimezoneName(name), cities: [], timezoneId }); } for (const additionalTimezone of additionalTimezones) { const { continent, label, timezoneId } = additionalTimezone; sortedByContinent[continent] = sortedByContinent[continent] || { continent, regions: [] }; sortedByContinent[continent].regions.push({ label, cities: [], timezoneId }); } for (const continent in sortedByContinent) { if (!Object.prototype.hasOwnProperty.call(sortedByContinent, continent)) { continue; } sortedByContinent[continent].regions.sort((a, b) => { if (a.label < b.label) { return -1; } return 1; }); sortedList.push(sortedByContinent[continent]); } // Sort continents by name sortedList.sort((a, b) => { if (a.continent < b.continent) { return -1; } return 1; }); return sortedList; } /** * Get human-readable name for timezoneId * * @param {string} timezoneId TimezoneId to turn human-readable * @returns {string} */ function getReadableTimezoneName(timezoneId) { return timezoneId.split('_').join(' ').replace('St ', 'St. ').split('/').join(' - '); } /** * @copyright Copyright (c) 2019 Georg Ehrke * * @author Georg Ehrke * * @author Richard Steinmetz * * @license GNU AGPL version 3 or any later version * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * */ if (!((ical_js__WEBPACK_IMPORTED_MODULE_0___default().TimezoneService) instanceof TimezoneAdapter)) { (ical_js__WEBPACK_IMPORTED_MODULE_0___default().TimezoneService) = new TimezoneAdapter(getTimezoneManager()); } /** * parses a single ICS and returns an iterator over all occurrences * in a given timeframe * * @param {String} ics The calendar-data to parse * @param {DateTimeValue} start The start of the queried time-range * @param {DateTimeValue} end The end of the queried time-range */ function* parseICSAndGetAllOccurrencesBetween(ics, start, end) { const parserManager = getParserManager(); const icsParser = parserManager.getParserForFileType('text/calendar'); icsParser.parse(ics); const objectIterator = icsParser.getItemIterator(); const calendarComp = objectIterator.next().value; if (calendarComp === undefined) { return; } const vObjectIterator = calendarComp.getVObjectIterator(); const firstVObject = vObjectIterator.next().value; if (firstVObject === undefined) { return; } yield* firstVObject.recurrenceManager.getAllOccurrencesBetweenIterator(start, end); } /** * Creates a new event * * @param {DateTimeValue} start Start-time of the new event * @param {DateTimeValue} end End-time of the new event * @returns {CalendarComponent} */ function createEvent(start, end) { const calendar = CalendarComponent.fromEmpty(); const eventComponent = new EventComponent('VEVENT'); eventComponent.updatePropertyWithValue('CREATED', DateTimeValue.fromJSDate(dateFactory(), true)); eventComponent.updatePropertyWithValue('DTSTAMP', DateTimeValue.fromJSDate(dateFactory(), true)); eventComponent.updatePropertyWithValue('LAST-MODIFIED', DateTimeValue.fromJSDate(dateFactory(), true)); eventComponent.updatePropertyWithValue('SEQUENCE', 0); eventComponent.updatePropertyWithValue('UID', (0,uuid__WEBPACK_IMPORTED_MODULE_1__["default"])()); eventComponent.updatePropertyWithValue('DTSTART', start); eventComponent.updatePropertyWithValue('DTEND', end); calendar.addComponent(eventComponent); eventComponent.recurrenceManager = new RecurrenceManager(eventComponent); return calendar; } /** * Creates a FreeBusy Request to be used on the scheduling outbox * * @param {DateTimeValue} start The start of the queried time-range * @param {DateTimeValue} end The end of the queried time-range * @param {AttendeeProperty} organizer The organizer querying information * @param {AttendeeProperty[]}attendees The list of attendees to query information for * @returns {CalendarComponent} */ function createFreeBusyRequest(start, end, organizer, attendees) { const calendar = CalendarComponent.fromMethod('REQUEST'); const freeBusyComponent = new FreeBusyComponent('VFREEBUSY'); freeBusyComponent.updatePropertyWithValue('DTSTAMP', DateTimeValue.fromJSDate(dateFactory(), true)); freeBusyComponent.updatePropertyWithValue('UID', (0,uuid__WEBPACK_IMPORTED_MODULE_1__["default"])()); freeBusyComponent.updatePropertyWithValue('DTSTART', start.clone().getInUTC()); freeBusyComponent.updatePropertyWithValue('DTEND', end.clone().getInUTC()); freeBusyComponent.addProperty(organizer.clone()); for (const attendee of attendees) { const clonedAttendee = attendee.clone(); clonedAttendee.deleteParameter('ROLE'); clonedAttendee.deleteParameter('CUTYPE'); clonedAttendee.deleteParameter('RSVP'); clonedAttendee.deleteParameter('PARTSTAT'); clonedAttendee.deleteParameter('REQUEST-STATUS'); clonedAttendee.deleteParameter('LANGUAGE'); freeBusyComponent.addProperty(clonedAttendee); } calendar.addComponent(freeBusyComponent); return calendar; } //# sourceMappingURL=index.esm.js.map /***/ }), /***/ "./node_modules/@nextcloud/vue/dist/Components/ActionButton.js": /*!*********************************************************************!*\ !*** ./node_modules/@nextcloud/vue/dist/Components/ActionButton.js ***! \*********************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /*! For license information please see ActionButton.js.LICENSE.txt */ !function(t,n){ true?module.exports=n():0}(self,(function(){return function(){var t={5938:function(t,n,e){"use strict";var o=e(9156);n.Z={name:"ActionButton",mixins:[o.Z],props:{disabled:{type:Boolean,default:!1}},computed:{isFocusable:function(){return!this.disabled}}}},723:function(t,n,e){"use strict";var o=e(2734),i=e.n(o);n.Z={before:function(){this.$slots.default&&""!==this.text.trim()||(i().util.warn("".concat(this.$options.name," cannot be empty and requires a meaningful text content"),this),this.$destroy(),this.$el.remove())},beforeUpdate:function(){this.text=this.getText()},data:function(){return{text:this.getText()}},computed:{isLongText:function(){return this.text&&this.text.trim().length>20}},methods:{getText:function(){return this.$slots.default?this.$slots.default[0].text.trim():""}}}},9156:function(t,n,e){"use strict";var o=e(723),i=e(6021);n.Z={mixins:[o.Z],props:{icon:{type:String,default:""},title:{type:String,default:""},closeAfterClick:{type:Boolean,default:!1},ariaLabel:{type:String,default:""}},computed:{isIconUrl:function(){try{return new URL(this.icon)}catch(t){return!1}}},methods:{onClick:function(t){if(this.$emit("click",t),this.closeAfterClick){var n=(0,i.Z)(this,"Actions");n&&n.closeMenu&&n.closeMenu()}}}}},6021:function(t,n){"use strict";n.Z=function(t,n){for(var e=t.$parent;e;){if(e.$options.name===n)return e;e=e.$parent}}},7087:function(t,n,e){"use strict";var o=e(4015),i=e.n(o),r=e(3645),a=e.n(r)()(i());a.push([t.id,".material-design-icon[data-v-ef50c406]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-ef50c406]{background-color:var(--color-background-hover)}.action--disabled[data-v-ef50c406]{pointer-events:none;opacity:.5}.action--disabled[data-v-ef50c406]:hover,.action--disabled[data-v-ef50c406]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-ef50c406]{opacity:1 !important}.action-button[data-v-ef50c406]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;padding-right:14px;box-sizing:border-box;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;font-size:var(--default-font-size);line-height:44px}.action-button[data-v-ef50c406]:hover,.action-button[data-v-ef50c406]:focus{opacity:1}.action-button>span[data-v-ef50c406]{cursor:pointer;white-space:nowrap}.action-button__icon[data-v-ef50c406]{width:44px;height:44px;opacity:1;background-position:14px center;background-size:16px;background-repeat:no-repeat}.action-button[data-v-ef50c406] .material-design-icon{width:44px;height:44px;opacity:1}.action-button[data-v-ef50c406] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-button p[data-v-ef50c406]{max-width:220px;line-height:1.6em;padding:10.8px 0;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis}.action-button__longtext[data-v-ef50c406]{cursor:pointer;white-space:pre-wrap}.action-button__title[data-v-ef50c406]{font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline-block}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB,CACrB,gCAOD,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBCtB8C,CDuB9C,qBAAsB,CAEtB,cAAe,CACf,kBAAmB,CAEnB,UClBiB,CDmBjB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,kCAAmC,CACnC,gBC7CmB,CDsBpB,4EA2BE,SC9Ba,CDGf,qCA+BE,cAAe,CACf,kBAAmB,CACnB,sCAGA,UC1DkB,CD2DlB,WC3DkB,CD4DlB,SCzCa,CD0Cb,+BAAwC,CACxC,oBC1Da,CD2Db,2BAA4B,CAzC9B,sDA6CE,UCnEkB,CDoElB,WCpEkB,CDqElB,SClDa,CDGf,iFAkDG,qBAAsB,CAlDzB,kCAwDE,eAAgB,CAChB,iBAAkB,CAGlB,gBAAgD,CAEhD,cAAe,CACf,eAAgB,CAGhB,eAAgB,CAChB,sBAAuB,CACvB,0CAGA,cAAe,CAEf,oBAAqB,CACrB,uCAGA,gBAAiB,CACjB,sBAAuB,CACvB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,oBAAqB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),n.Z=a},3645:function(t){"use strict";t.exports=function(t){var n=[];return n.toString=function(){return this.map((function(n){var e=t(n);return n[2]?"@media ".concat(n[2]," {").concat(e,"}"):e})).join("")},n.i=function(t,e,o){"string"==typeof t&&(t=[[null,t,""]]);var i={};if(o)for(var r=0;rt.length)&&(n=t.length);for(var e=0,o=new Array(n);e0?" ".concat(e.layer):""," {")),o+=e.css,i&&(o+="}"),e.media&&(o+="}"),e.supports&&(o+="}");var r=e.sourceMap;r&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),n.styleTagTransform(o,t,n.options)}(n,t,e)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(n)}}}},4589:function(t){"use strict";t.exports=function(t,n){if(n.styleSheet)n.styleSheet.cssText=t;else{for(;n.firstChild;)n.removeChild(n.firstChild);n.appendChild(document.createTextNode(t))}}},491:function(t,n,e){"use strict";var o=e(8940),i=e(4403),r=(e(7911),e(1900)),a=e(3184),s=e.n(a),c=(0,r.Z)(i.Z,o.s,o.x,!1,null,"ef50c406",null);"function"==typeof s()&&s()(c),n.Z=c.exports},4403:function(t,n,e){"use strict";var o=e(5938);n.Z=o.Z},7911:function(t,n,e){"use strict";e(1756)},3184:function(){},8940:function(t,n,e){"use strict";e.d(n,{s:function(){return o},x:function(){return i}});var o=function(){var t=this,n=t.$createElement,e=t._self._c||n;return e("li",{staticClass:"action",class:{"action--disabled":t.disabled}},[e("button",{staticClass:"action-button",class:{focusable:t.isFocusable},attrs:{"aria-label":t.ariaLabel,type:"button"},on:{click:t.onClick}},[t._t("icon",(function(){return[e("span",{staticClass:"action-button__icon",class:[t.isIconUrl?"action-button__icon--url":t.icon],style:{backgroundImage:t.isIconUrl?"url("+t.icon+")":null}})]})),t._v(" "),t.title?e("p",[e("strong",{staticClass:"action-button__title"},[t._v("\n\t\t\t\t"+t._s(t.title)+"\n\t\t\t")]),t._v(" "),e("br"),t._v(" "),e("span",{staticClass:"action-button__longtext",domProps:{textContent:t._s(t.text)}})]):t.isLongText?e("p",{staticClass:"action-button__longtext",domProps:{textContent:t._s(t.text)}}):e("span",{staticClass:"action-button__text"},[t._v(t._s(t.text))]),t._v(" "),t._e()],2)])},i=[]},1900:function(t,n,e){"use strict";function o(t,n,e,o,i,r,a,s){var c,l="function"==typeof t?t.options:t;if(n&&(l.render=n,l.staticRenderFns=e,l._compiled=!0),o&&(l.functional=!0),r&&(l._scopeId="data-v-"+r),a?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),i&&i.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},l._ssrRegister=c):i&&(c=s?function(){i.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:i),c)if(l.functional){l._injectStyles=c;var u=l.render;l.render=function(t,n){return c.call(n),u(t,n)}}else{var d=l.beforeCreate;l.beforeCreate=d?[].concat(d,c):[c]}return{exports:t,options:l}}e.d(n,{Z:function(){return o}})},2734:function(t){"use strict";t.exports=__webpack_require__(/*! vue */ "./node_modules/vue/dist/vue.runtime.esm.js")}},n={};function e(o){var i=n[o];if(void 0!==i)return i.exports;var r=n[o]={id:o,exports:{}};return t[o](r,r.exports,e),r.exports}e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,{a:n}),n},e.d=function(t,n){for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},e.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},e.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})};var o={};return function(){"use strict";e.r(o);var t=e(491);o.default=t.Z}(),o}()})); //# sourceMappingURL=ActionButton.js.map /***/ }), /***/ "./node_modules/@nextcloud/vue/dist/Components/Actions.js": /*!****************************************************************!*\ !*** ./node_modules/@nextcloud/vue/dist/Components/Actions.js ***! \****************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /*! For license information please see Actions.js.LICENSE.txt */ !function(e,t){ true?module.exports=t():0}(self,(function(){return function(){var e={858:function(e,t,n){"use strict";var a=n(3251),i=n.n(a),o=n(8104),r=n(9040),s=n(1205),l=n(932),c=n(8099);function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=new Array(t);n1},isValidSingleAction:function(){return 1===this.actions.length&&null!==this.firstActionElement},singleActionTitle:function(){return this.forceTitle?this.menuTitle:""},isDisabled:function(){var e,t;return this.disabled||1===this.actions.length&&(null===(e=this.firstAction)||void 0===e||null===(t=e.$props)||void 0===t?void 0:t.disabled)},firstActionVNode:function(){return this.actions[0]},firstActionBinding:function(){if(this.firstActionVNode&&this.firstActionVNode.componentOptions){var e=this.firstActionVNode.componentOptions.tag;if("ActionLink"===e)return m(m({is:"a",href:this.firstAction.href,target:this.firstAction.target,"aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props);if("ActionRouter"===e)return m(m({is:"router-link",to:this.firstAction.to,exact:this.firstAction.exact,"aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props);if("ActionButton"===e)return m(m({is:"button","aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props)}return null},firstActionEvent:function(){var e,t,n;return null===(e=this.firstActionVNode)||void 0===e||null===(t=e.componentOptions)||void 0===t||null===(n=t.listeners)||void 0===n?void 0:n.click},firstActionEventBinding:function(){return this.firstActionEvent?"click":null},firstActionIconSlot:function(){var e,t;return null===(e=this.firstAction)||void 0===e||null===(t=e.$slots)||void 0===t?void 0:t.icon},firstActionClass:function(){return((this.firstActionVNode&&this.firstActionVNode.data.staticClass)+" "+(this.firstActionVNode&&this.firstActionVNode.data.class)).trim()},iconSlotIsPopulated:function(){return!!this.$slots.icon}},watch:{open:function(e){e!==this.opened&&(this.opened=e)},children:function(){this.firstAction=this.children[0]?this.children[0]:{}}},beforeMount:function(){this.initActions()},beforeUpdate:function(){this.initActions()},methods:{openMenu:function(e){this.opened||(this.opened=!0,this.$emit("update:open",!0),this.$emit("open"))},closeMenu:function(e){this.opened&&(this.opened=!1,this.$emit("update:open",!1),this.$emit("close"),this.opened=!1,this.focusIndex=0,this.$refs.menuButton.focus())},onOpen:function(e){var t=this;this.$nextTick((function(){t.focusFirstAction(e)}))},onMouseFocusAction:function(e){if(document.activeElement!==e.target){var t=e.target.closest("li");if(t){var n=t.querySelector(p);if(n){var a=(i=this.$refs.menu.querySelectorAll(p),function(e){if(Array.isArray(e))return u(e)}(i)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(i)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?u(e,t):void 0}}(i)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).indexOf(n);a>-1&&(this.focusIndex=a,this.focusAction())}}}var i},removeCurrentActive:function(){var e=this.$refs.menu.querySelector("li.active");e&&e.classList.remove("active")},focusAction:function(){var e=this.$refs.menu.querySelectorAll(p)[this.focusIndex];if(e){this.removeCurrentActive();var t=e.closest("li.action");e.focus(),t&&t.classList.add("active")}},focusPreviousAction:function(e){this.opened&&(0===this.focusIndex?this.closeMenu():(this.preventIfEvent(e),this.focusIndex=this.focusIndex-1),this.focusAction())},focusNextAction:function(e){if(this.opened){var t=this.$refs.menu.querySelectorAll(p).length-1;this.focusIndex===t?this.closeMenu():(this.preventIfEvent(e),this.focusIndex=this.focusIndex+1),this.focusAction()}},focusFirstAction:function(e){this.opened&&(this.preventIfEvent(e),this.focusIndex=0,this.focusAction())},focusLastAction:function(e){this.opened&&(this.preventIfEvent(e),this.focusIndex=this.$el.querySelectorAll(p).length-1,this.focusAction())},preventIfEvent:function(e){e&&(e.preventDefault(),e.stopPropagation())},execFirstAction:function(e){this.firstActionEvent&&this.firstActionEvent(e)},initActions:function(){this.actions=(this.$slots.default||[]).filter((function(e){return!!e&&!!e.componentOptions}))},onFocus:function(e){this.$emit("focus",e)},onBlur:function(e){this.$emit("blur",e)}}}},5041:function(e,t){"use strict";t.Z={name:"VNodes",functional:!0,render:function(e,t){return t.props.vnodes}}},8099:function(e,t,n){"use strict";var a=n(7020);t.default=a.Z},9040:function(e,t,n){"use strict";n.d(t,{default:function(){return b}});var a=n(2965),i=n(3379),o=n.n(i),r=n(7795),s=n.n(r),l=n(569),c=n.n(l),u=n(3565),d=n.n(u),m=n(9216),g=n.n(m),p=n(4589),h=n.n(p),v=n(6051),A={};A.styleTagTransform=h(),A.setAttributes=d(),A.insert=c().bind(null,"head"),A.domAPI=s(),A.insertStyleElement=g(),o()(v.Z,A),v.Z&&v.Z.locals&&v.Z.locals,a.VTooltip.options.defaultTemplate=''),a.VTooltip.options.defaultHtml=!1,a.VTooltip.options.defaultDelay={show:500,hide:200};var b=a.VTooltip},932:function(e,t,n){"use strict";n.d(t,{t:function(){return o}});var a=(0,n(6036).getGettextBuilder)().detectLocale();[{locale:"ar",translations:{"{tag} (invisible)":"{tag} (غير مرئي)","{tag} (restricted)":"{tag} (مقيد)",Actions:"الإجراءات",Activities:"النشاطات","Animals & Nature":"الحيوانات والطبيعة","Avatar of {displayName}":"صورة {displayName} الرمزية","Avatar of {displayName}, {status}":"صورة {displayName} الرمزية، {status}","Cancel changes":"إلغاء التغييرات",Choose:"إختيار",Close:"أغلق","Close navigation":"إغلاق المتصفح","Confirm changes":"تأكيد التغييرات",Custom:"مخصص","Edit item":"تعديل عنصر","External documentation for {title}":"الوثائق الخارجية لـ{title}",Flags:"الأعلام","Food & Drink":"الطعام والشراب","Frequently used":"كثيرا ما تستخدم",Global:"عالمي","Go back to the list":"العودة إلى القائمة","Message limit of {count} characters reached":"تم الوصول إلى الحد الأقصى لعدد الأحرف في الرسالة: {count} حرف",Next:"التالي","No emoji found":"لم يتم العثور على أي رمز تعبيري","No results":"ليس هناك أية نتيجة",Objects:"الأشياء","Open navigation":"فتح المتصفح","Pause slideshow":"إيقاف العرض مؤقتًا","People & Body":"الناس والجسم","Pick an emoji":"اختر رمزًا تعبيريًا","Please select a time zone:":"الرجاء تحديد المنطقة الزمنية:",Previous:"السابق",Search:"بحث","Search results":"نتائج البحث","Select a tag":"اختر علامة",Settings:"الإعدادات","Settings navigation":"إعدادات المتصفح","Smileys & Emotion":"الوجوه و الرموز التعبيرية","Start slideshow":"بدء العرض",Submit:"إرسال",Symbols:"الرموز","Travel & Places":"السفر والأماكن","Type to search time zone":"اكتب للبحث عن منطقة زمنية","Unable to search the group":"تعذر البحث في المجموعة","Undo changes":"التراجع عن التغييرات","Write message, @ to mention someone, : for emoji autocompletion …":"اكتب رسالة، @ للإشارة إلى شخص ما، : للإكمال التلقائي للرموز التعبيرية ..."}},{locale:"br",translations:{"{tag} (invisible)":"{tag} (diwelus)","{tag} (restricted)":"{tag} (bevennet)",Actions:"Oberioù",Activities:"Oberiantizoù","Animals & Nature":"Loened & Natur",Choose:"Dibab",Close:"Serriñ",Custom:"Personelañ",Flags:"Bannieloù","Food & Drink":"Boued & Evajoù","Frequently used":"Implijet alies",Next:"Da heul","No emoji found":"Emoji ebet kavet","No results":"Disoc'h ebet",Objects:"Traoù","Pause slideshow":"Arsav an diaporama","People & Body":"Tud & Korf","Pick an emoji":"Choaz un emoji",Previous:"A-raok",Search:"Klask","Search results":"Disoc'hoù an enklask","Select a tag":"Choaz ur c'hlav",Settings:"Arventennoù","Smileys & Emotion":"Smileyioù & Fromoù","Start slideshow":"Kregiñ an diaporama",Symbols:"Arouezioù","Travel & Places":"Beaj & Lec'hioù","Unable to search the group":"Dibosupl eo klask ar strollad"}},{locale:"ca",translations:{"{tag} (invisible)":"{tag} (invisible)","{tag} (restricted)":"{tag} (restringit)",Actions:"Accions",Activities:"Activitats","Animals & Nature":"Animals i natura","Avatar of {displayName}":"Avatar de {displayName}","Avatar of {displayName}, {status}":"Avatar de {displayName}, {status}","Cancel changes":"Cancel·la els canvis",Choose:"Tria",Close:"Tanca","Close navigation":"Tancar la navegació","Confirm changes":"Confirmeu els canvis",Custom:"Personalitzat","Edit item":"Edita l'element","External documentation for {title}":"Documentació externa per a {title}",Flags:"Marques","Food & Drink":"Menjar i begudes","Frequently used":"Utilitzats recentment",Global:"Global","Go back to the list":"Torna a la llista","Message limit of {count} characters reached":"S'ha arribat al límit de {count} caràcters per missatge",Next:"Següent","No emoji found":"No s'ha trobat cap emoji","No results":"Sense resultats",Objects:"Objectes","Open navigation":"Obrir la navegació","Pause slideshow":"Atura la presentació","People & Body":"Persones i cos","Pick an emoji":"Trieu un emoji","Please select a time zone:":"Seleccioneu una zona horària:",Previous:"Anterior",Search:"Cerca","Search results":"Resultats de cerca","Select a tag":"Selecciona una etiqueta",Settings:"Paràmetres","Settings navigation":"Navegació d'opcions","Smileys & Emotion":"Cares i emocions","Start slideshow":"Inicia la presentació",Submit:"Envia",Symbols:"Símbols","Travel & Places":"Viatges i llocs","Type to search time zone":"Escriviu per cercar la zona horària","Unable to search the group":"No es pot cercar el grup","Undo changes":"Desfer canvis","Write message, @ to mention someone, : for emoji autocompletion …":"Escriu un missatge, @ per esmentar algú, : per a la compleció automàtica d'emojis..."}},{locale:"cs_CZ",translations:{"{tag} (invisible)":"{tag} (neviditelné)","{tag} (restricted)":"{tag} (omezené)",Actions:"Akce",Activities:"Aktivity","Animals & Nature":"Zvířata a příroda","Avatar of {displayName}":"Zástupný obrázek uživatele {displayName}","Avatar of {displayName}, {status}":"Zástupný obrázek uživatele {displayName}, {status}","Cancel changes":"Zrušit změny",Choose:"Zvolit",Close:"Zavřít","Close navigation":"Zavřít navigaci","Confirm changes":"Potvrdit změny",Custom:"Uživatelsky určené","Edit item":"Upravit položku","External documentation for {title}":"Externí dokumentace k {title}",Flags:"Příznaky","Food & Drink":"Jídlo a pití","Frequently used":"Často používané",Global:"Globální","Go back to the list":"Jít zpět na seznam","Message limit of {count} characters reached":"Dosaženo limitu počtu ({count}) znaků zprávy",Next:"Následující","No emoji found":"Nenalezeno žádné emoji","No results":"Nic nenalezeno",Objects:"Objekty","Open navigation":"Otevřít navigaci","Pause slideshow":"Pozastavit prezentaci","People & Body":"Lidé a tělo","Pick an emoji":"Vybrat emoji","Please select a time zone:":"Vyberte časovou zónu:",Previous:"Předchozí",Search:"Hledat","Search results":"Výsledky hledání","Select a tag":"Vybrat štítek",Settings:"Nastavení","Settings navigation":"Pohyb po nastavení","Smileys & Emotion":"Úsměvy a emoce","Start slideshow":"Spustit prezentaci",Submit:"Odeslat",Symbols:"Symboly","Travel & Places":"Cestování a místa","Type to search time zone":"Psaním vyhledejte časovou zónu","Unable to search the group":"Nedaří se hledat skupinu","Undo changes":"Vzít změny zpět","Write message, @ to mention someone, : for emoji autocompletion …":"Napište zprávu – pokud chcete někoho zmínit, napište před jeho uživatelským jménem @ (zavináč); automatické doplňování emotikonů zahájíte napsáním : (dvojtečky)…"}},{locale:"da",translations:{"{tag} (invisible)":"{tag} (usynlig)","{tag} (restricted)":"{tag} (begrænset)",Actions:"Handlinger",Activities:"Aktiviteter","Animals & Nature":"Dyr & Natur",Choose:"Vælg",Close:"Luk",Custom:"Brugerdefineret",Flags:"Flag","Food & Drink":"Mad & Drikke","Frequently used":"Ofte brugt","Message limit of {count} characters reached":"Begrænsning på {count} tegn er nået",Next:"Videre","No emoji found":"Ingen emoji fundet","No results":"Ingen resultater",Objects:"Objekter","Pause slideshow":"Suspender fremvisning","People & Body":"Mennesker & Menneskekroppen","Pick an emoji":"Vælg en emoji",Previous:"Forrige",Search:"Søg","Search results":"Søgeresultater","Select a tag":"Vælg et mærke",Settings:"Indstillinger","Settings navigation":"Naviger i indstillinger","Smileys & Emotion":"Smileys & Emotion","Start slideshow":"Start fremvisning",Symbols:"Symboler","Travel & Places":"Rejser & Rejsemål","Unable to search the group":"Kan ikke søge på denne gruppe","Write message, @ to mention someone …":"Skriv i meddelelse, @ for at nævne nogen …"}},{locale:"de",translations:{"{tag} (invisible)":"{tag} (unsichtbar)","{tag} (restricted)":"{tag} (eingeschränkt)",Actions:"Aktionen",Activities:"Aktivitäten","Animals & Nature":"Tiere & Natur","Avatar of {displayName}":"Avatar von {displayName}","Avatar of {displayName}, {status}":"Avatar von {displayName}, {status}","Cancel changes":"Änderungen verwerfen",Choose:"Auswählen",Close:"Schließen","Close navigation":"Navigation schließen","Confirm changes":"Änderungen bestätigen",Custom:"Benutzerdefiniert","Edit item":"Objekt bearbeiten","External documentation for {title}":"Externe Dokumentation für {title}",Flags:"Flaggen","Food & Drink":"Essen & Trinken","Frequently used":"Häufig verwendet",Global:"Global","Go back to the list":"Zurück zur Liste","Message limit of {count} characters reached":"Nachrichtenlimit von {count} Zeichen erreicht",Next:"Weiter","No emoji found":"Kein Emoji gefunden","No results":"Keine Ergebnisse",Objects:"Gegenstände","Open navigation":"Navigation öffnen","Pause slideshow":"Diashow pausieren","People & Body":"Menschen & Körper","Pick an emoji":"Ein Emoji auswählen","Please select a time zone:":"Bitte wählen Sie eine Zeitzone:",Previous:"Vorherige",Search:"Suche","Search results":"Suchergebnisse","Select a tag":"Schlagwort auswählen",Settings:"Einstellungen","Settings navigation":"Einstellungen für die Navigation","Smileys & Emotion":"Smileys & Emotionen","Start slideshow":"Diashow starten",Submit:"Einreichen",Symbols:"Symbole","Travel & Places":"Reisen & Orte","Type to search time zone":"Tippen, um Zeitzone zu suchen","Unable to search the group":"Die Gruppe konnte nicht durchsucht werden","Undo changes":"Änderungen rückgängig machen","Write message, @ to mention someone, : for emoji autocompletion …":"Nachricht schreiben, @, um jemanden zu erwähnen, : für die automatische Vervollständigung von Emojis … "}},{locale:"de_DE",translations:{"{tag} (invisible)":"{tag} (unsichtbar)","{tag} (restricted)":"{tag} (eingeschränkt)",Actions:"Aktionen",Activities:"Aktivitäten","Animals & Nature":"Tiere & Natur","Avatar of {displayName}":"Avatar von {displayName}","Avatar of {displayName}, {status}":"Avatar von {displayName}, {status}","Cancel changes":"Änderungen verwerfen",Choose:"Auswählen",Close:"Schließen","Close navigation":"Navigation schließen","Confirm changes":"Änderungen bestätigen",Custom:"Benutzerdefiniert","Edit item":"Objekt bearbeiten","External documentation for {title}":"Externe Dokumentation für {title}",Flags:"Flaggen","Food & Drink":"Essen & Trinken","Frequently used":"Häufig verwendet",Global:"Global","Go back to the list":"Zurück zur Liste","Message limit of {count} characters reached":"Nachrichtenlimit von {count} Zeichen erreicht",Next:"Weiter","No emoji found":"Kein Emoji gefunden","No results":"Keine Ergebnisse",Objects:"Objekte","Open navigation":"Navigation öffnen","Pause slideshow":"Diashow pausieren","People & Body":"Menschen & Körper","Pick an emoji":"Ein Emoji auswählen","Please select a time zone:":"Bitte eine Zeitzone auswählen:",Previous:"Vorherige",Search:"Suche","Search results":"Suchergebnisse","Select a tag":"Schlagwort auswählen",Settings:"Einstellungen","Settings navigation":"Einstellungen für die Navigation","Smileys & Emotion":"Smileys & Emotionen","Start slideshow":"Diashow starten",Submit:"Einreichen",Symbols:"Symbole","Travel & Places":"Reisen & Orte","Type to search time zone":"Tippen, um eine Zeitzone zu suchen","Unable to search the group":"Die Gruppe kann nicht durchsucht werden","Undo changes":"Änderungen rückgängig machen","Write message, @ to mention someone, : for emoji autocompletion …":"Nachricht schreiben, @, um jemanden zu erwähnen, : für die automatische Vervollständigung von Emojis …"}},{locale:"el",translations:{"{tag} (invisible)":"{tag} (αόρατο)","{tag} (restricted)":"{tag} (περιορισμένο)",Actions:"Ενέργειες",Activities:"Δραστηριότητες","Animals & Nature":"Ζώα & Φύση","Avatar of {displayName}":"Άβαταρ του {displayName}","Cancel changes":"Ακύρωση αλλαγών",Choose:"Επιλογή",Close:"Κλείσιμο","Close navigation":"Κλείσιμο πλοήγησης","Confirm changes":"Επιβεβαίωση αλλαγών",Custom:"Προσαρμογή","Edit item":"Επεξεργασία","External documentation for {title}":"Εξωτερική τεκμηρίωση για {title}",Flags:"Σημαίες","Food & Drink":"Φαγητό & Ποτό","Frequently used":"Συχνά χρησιμοποιούμενο",Global:"Καθολικό","Go back to the list":"Επιστροφή στην αρχική λίστα ","Message limit of {count} characters reached":"Συμπληρώθηκε το όριο των {count} χαρακτήρων του μηνύματος",Next:"Επόμενο","No emoji found":"Δεν βρέθηκε emoji","No results":"Κανένα αποτέλεσμα",Objects:"Αντικείμενα","Open navigation":"Άνοιγμα πλοήγησης","Pause slideshow":"Παύση προβολής διαφανειών","People & Body":"Άνθρωποι & Σώμα","Pick an emoji":"Επιλέξτε ένα emoji","Please select a time zone:":"Παρακαλούμε επιλέξτε μια ζώνη ώρας:",Previous:"Προηγούμενο",Search:"Αναζήτηση","Search results":"Αποτελέσματα αναζήτησης","Select a tag":"Επιλογή ετικέτας",Settings:"Ρυθμίσεις","Settings navigation":"Πλοήγηση ρυθμίσεων","Smileys & Emotion":"Φατσούλες & Συναίσθημα","Start slideshow":"Έναρξη προβολής διαφανειών",Submit:"Υποβολή",Symbols:"Σύμβολα","Travel & Places":"Ταξίδια & Τοποθεσίες","Type to search time zone":"Πληκτρολογήστε για αναζήτηση ζώνης ώρας","Unable to search the group":"Δεν είναι δυνατή η αναζήτηση της ομάδας","Undo changes":"Αναίρεση Αλλαγών","Write message, @ to mention someone …":"Γράψτε ένα μήνυμα, και με το σύμβολο @, μνημονεύστε κάποιον …"}},{locale:"eo",translations:{"{tag} (invisible)":"{tag} (kaŝita)","{tag} (restricted)":"{tag} (limigita)",Actions:"Agoj",Activities:"Aktiveco","Animals & Nature":"Bestoj & Naturo",Choose:"Elektu",Close:"Fermu",Custom:"Propra",Flags:"Flagoj","Food & Drink":"Manĝaĵo & Trinkaĵo","Frequently used":"Ofte uzataj","Message limit of {count} characters reached":"La limo je {count} da literoj atingita",Next:"Sekva","No emoji found":"La emoĝio forestas","No results":"La rezulto forestas",Objects:"Objektoj","Pause slideshow":"Payzi bildprezenton","People & Body":"Homoj & Korpo","Pick an emoji":"Elekti emoĝion ",Previous:"Antaŭa",Search:"Serĉi","Search results":"Serĉrezultoj","Select a tag":"Elektu etikedon",Settings:"Agordo","Settings navigation":"Agorda navigado","Smileys & Emotion":"Ridoj kaj Emocioj","Start slideshow":"Komenci bildprezenton",Symbols:"Signoj","Travel & Places":"Vojaĵoj & Lokoj","Unable to search the group":"Ne eblas serĉi en la grupo","Write message, @ to mention someone …":"Mesaĝi, uzu @ por mencii iun ..."}},{locale:"es",translations:{"{tag} (invisible)":"{tag} (invisible)","{tag} (restricted)":"{tag} (restringido)",Actions:"Acciones",Activities:"Actividades","Animals & Nature":"Animales y naturaleza","Avatar of {displayName}":"Avatar de {displayName}","Avatar of {displayName}, {status}":"Avatar de {displayName}, {status}","Cancel changes":"Cancelar cambios",Choose:"Elegir",Close:"Cerrar","Close navigation":"Cerrar navegación","Confirm changes":"Confirmar cambios",Custom:"Personalizado","Edit item":"Editar elemento","External documentation for {title}":"Documentacion externa de {title}",Flags:"Banderas","Food & Drink":"Comida y bebida","Frequently used":"Usado con frecuenca",Global:"Global","Go back to the list":"Volver a la lista","Message limit of {count} characters reached":"El mensaje ha alcanzado el límite de {count} caracteres",Next:"Siguiente","No emoji found":"No hay ningún emoji","No results":" Ningún resultado",Objects:"Objetos","Open navigation":"Abrir navegación","Pause slideshow":"Pausar la presentación ","People & Body":"Personas y cuerpos","Pick an emoji":"Elegir un emoji","Please select a time zone:":"Por favor elige un huso de horario:",Previous:"Anterior",Search:"Buscar","Search results":"Resultados de la búsqueda","Select a tag":"Seleccione una etiqueta",Settings:"Ajustes","Settings navigation":"Navegación por ajustes","Smileys & Emotion":"Smileys y emoticonos","Start slideshow":"Iniciar la presentación",Submit:"Enviar",Symbols:"Símbolos","Travel & Places":"Viajes y lugares","Type to search time zone":"Escribe para buscar un huso de horario","Unable to search the group":"No es posible buscar en el grupo","Undo changes":"Deshacer cambios","Write message, @ to mention someone …":"Escriba un mensaje, @ para mencionar a alguien..."}},{locale:"eu",translations:{"{tag} (invisible)":"{tag} (ikusezina)","{tag} (restricted)":"{tag} (mugatua)",Actions:"Ekintzak",Activities:"Jarduerak","Animals & Nature":"Animaliak eta Natura","Avatar of {displayName}":"{displayName}-(e)n irudia","Avatar of {displayName}, {status}":"{displayName} -(e)n irudia, {status}","Cancel changes":"Ezeztatu aldaketak",Choose:"Aukeratu",Close:"Itxi","Close navigation":"Itxi nabigazioa","Confirm changes":"Baieztatu aldaketak",Custom:"Pertsonalizatua","Edit item":"Editatu elementua","External documentation for {title}":"Kanpoko dokumentazioa {title}(r)entzat",Flags:"Banderak","Food & Drink":"Janaria eta edariak","Frequently used":"Askotan erabilia",Global:"Globala","Go back to the list":"Bueltatu zerrendara","Message limit of {count} characters reached":"Mezuaren {count} karaketere-limitera heldu zara",Next:"Hurrengoa","No emoji found":"Ez da emojirik aurkitu","No results":"Emaitzarik ez",Objects:"Objektuak","Open navigation":"Ireki nabigazioa","Pause slideshow":"Pausatu diaporama","People & Body":"Jendea eta gorputza","Pick an emoji":"Aukeratu emoji bat","Please select a time zone:":"Mesedez hautatu ordu-zona bat:",Previous:"Aurrekoa",Search:"Bilatu","Search results":"Bilaketa emaitzak","Select a tag":"Hautatu etiketa bat",Settings:"Ezarpenak","Settings navigation":"Nabigazio ezarpenak","Smileys & Emotion":"Smileyak eta emozioa","Start slideshow":"Hasi diaporama",Submit:"Bidali",Symbols:"Sinboloak","Travel & Places":"Bidaiak eta lekuak","Type to search time zone":"Idatzi ordu-zona bat bilatzeko","Unable to search the group":"Ezin izan da taldea bilatu","Undo changes":"Aldaketak desegin","Write message, @ to mention someone, : for emoji autocompletion …":"Idatzi mezua, @ norbait aipatzeko, : emojia automatikoki idazteko"}},{locale:"fi_FI",translations:{"{tag} (invisible)":"{tag} (näkymätön)","{tag} (restricted)":"{tag} (rajoitettu)",Actions:"Toiminnot",Activities:"Aktiviteetit","Animals & Nature":"Eläimet & luonto","Avatar of {displayName}":"Käyttäjän {displayName} avatar","Avatar of {displayName}, {status}":"Käyttäjän {displayName} avatar, {status}","Cancel changes":"Peruuta muutokset",Choose:"Valitse",Close:"Sulje","Close navigation":"Sulje navigaatio","Confirm changes":"Vahvista muutokset",Custom:"Mukautettu","Edit item":"Muokkaa kohdetta","External documentation for {title}":"Ulkoinen dokumentaatio kohteelle {title}",Flags:"Liput","Food & Drink":"Ruoka & juoma","Frequently used":"Usein käytetyt",Global:"Yleinen","Go back to the list":"Siirry takaisin listaan","Message limit of {count} characters reached":"Viestin merkken enimmäisimäärä {count} täynnä ",Next:"Seuraava","No emoji found":"Emojia ei löytynyt","No results":"Ei tuloksia",Objects:"Esineet & asiat","Open navigation":"Avaa navigaatio","Pause slideshow":"Keskeytä diaesitys","People & Body":"Ihmiset & keho","Pick an emoji":"Valitse emoji","Please select a time zone:":"Valitse aikavyöhyke:",Previous:"Edellinen",Search:"Etsi","Search results":"Hakutulokset","Select a tag":"Valitse tagi",Settings:"Asetukset","Settings navigation":"Asetusnavigaatio","Smileys & Emotion":"Hymiöt & tunteet","Start slideshow":"Aloita diaesitys",Submit:"Lähetä",Symbols:"Symbolit","Travel & Places":"Matkustus & kohteet","Type to search time zone":"Kirjoita etsiäksesi aikavyöhyke","Unable to search the group":"Ryhmää ei voi hakea","Undo changes":"Kumoa muutokset","Write message, @ to mention someone …":"Kirjoita viesti, @ mainitaksesi jonkun..."}},{locale:"fr",translations:{"{tag} (invisible)":"{tag} (invisible)","{tag} (restricted)":"{tag} (restreint)",Actions:"Actions",Activities:"Activités","Animals & Nature":"Animaux & Nature","Avatar of {displayName}":"Avatar de {displayName}","Avatar of {displayName}, {status}":"Avatar de {displayName}, {status}","Cancel changes":"Annuler les modifications",Choose:"Choisir",Close:"Fermer","Close navigation":"Fermer la navigation","Confirm changes":"Confirmer les modifications",Custom:"Personnalisé","Edit item":"Éditer l'élément","External documentation for {title}":"Documentation externe pour {title}",Flags:"Drapeaux","Food & Drink":"Nourriture & Boissons","Frequently used":"Utilisés fréquemment",Global:"Global","Go back to the list":"Retourner à la liste","Message limit of {count} characters reached":"Limite de messages de {count} caractères atteinte",Next:"Suivant","No emoji found":"Pas d’émoji trouvé","No results":"Aucun résultat",Objects:"Objets","Open navigation":"Ouvrir la navigation","Pause slideshow":"Mettre le diaporama en pause","People & Body":"Personnes & Corps","Pick an emoji":"Choisissez un émoji","Please select a time zone:":"Sélectionnez un fuseau horaire : ",Previous:"Précédent",Search:"Chercher","Search results":"Résultats de recherche","Select a tag":"Sélectionnez une balise",Settings:"Paramètres","Settings navigation":"Navigation dans les paramètres","Smileys & Emotion":"Smileys & Émotions","Start slideshow":"Démarrer le diaporama",Submit:"Valider",Symbols:"Symboles","Travel & Places":"Voyage & Lieux","Type to search time zone":"Saisissez les premiers lettres pour rechercher un fuseau horaire","Unable to search the group":"Impossible de chercher le groupe","Undo changes":"Annuler les changements","Write message, @ to mention someone, : for emoji autocompletion …":"Ecrire un message, @ pour mentionner quelqu'un, : pour l'auto-complétion des émoticônes"}},{locale:"gl",translations:{"{tag} (invisible)":"{tag} (invisíbel)","{tag} (restricted)":"{tag} (restrinxido)",Actions:"Accións",Activities:"Actividades","Animals & Nature":"Animais e natureza","Cancel changes":"Cancelar os cambios",Choose:"Escoller",Close:"Pechar","Confirm changes":"Confirma os cambios",Custom:"Personalizado","External documentation for {title}":"Documentación externa para {title}",Flags:"Bandeiras","Food & Drink":"Comida e bebida","Frequently used":"Usado con frecuencia","Message limit of {count} characters reached":"Acadouse o límite de {count} caracteres por mensaxe",Next:"Seguinte","No emoji found":"Non se atopou ningún «emoji»","No results":"Sen resultados",Objects:"Obxectos","Pause slideshow":"Pausar o diaporama","People & Body":"Persoas e corpo","Pick an emoji":"Escolla un «emoji»",Previous:"Anterir",Search:"Buscar","Search results":"Resultados da busca","Select a tag":"Seleccione unha etiqueta",Settings:"Axustes","Settings navigation":"Navegación polos axustes","Smileys & Emotion":"Sorrisos e emocións","Start slideshow":"Iniciar o diaporama",Submit:"Enviar",Symbols:"Símbolos","Travel & Places":"Viaxes e lugares","Unable to search the group":"Non foi posíbel buscar o grupo","Write message, @ to mention someone …":"Escriba a mensaxe, @ para mencionar a alguén…"}},{locale:"he",translations:{"{tag} (invisible)":"{tag} (נסתר)","{tag} (restricted)":"{tag} (מוגבל)",Actions:"פעולות",Activities:"פעילויות","Animals & Nature":"חיות וטבע",Choose:"בחירה",Close:"סגירה",Custom:"בהתאמה אישית",Flags:"דגלים","Food & Drink":"מזון ומשקאות","Frequently used":"בשימוש תדיר",Next:"הבא","No emoji found":"לא נמצא אמוג׳י","No results":"אין תוצאות",Objects:"חפצים","Pause slideshow":"השהיית מצגת","People & Body":"אנשים וגוף","Pick an emoji":"נא לבחור אמוג׳י",Previous:"הקודם",Search:"חיפוש","Search results":"תוצאות חיפוש","Select a tag":"בחירת תגית",Settings:"הגדרות","Smileys & Emotion":"חייכנים ורגשונים","Start slideshow":"התחלת המצגת",Symbols:"סמלים","Travel & Places":"טיולים ומקומות","Unable to search the group":"לא ניתן לחפש בקבוצה"}},{locale:"hu_HU",translations:{"{tag} (invisible)":"{tag} (láthatatlan)","{tag} (restricted)":"{tag} (korlátozott)",Actions:"Műveletek",Activities:"Tevékenységek","Animals & Nature":"Állatok és természet","Avatar of {displayName}":"{displayName} profilképe","Cancel changes":"Változtatások elvetése",Choose:"Válassszon",Close:"Bezárás","Confirm changes":"Változtatások megerősítése",Custom:"Egyéni","External documentation for {title}":"Külső dokumentáció ehhez: {title}",Flags:"Zászló","Food & Drink":"Étel és ital","Frequently used":"Gyakran használt",Global:"Globális","Message limit of {count} characters reached":"{count} karakteres üzenetkorlát elérve",Next:"Következő","No emoji found":"Nem található emodzsi","No results":"Nincs találat",Objects:"Tárgyak","Pause slideshow":"Diavetítés szüneteltetése","People & Body":"Emberek és test","Pick an emoji":"Válasszon egy emodzsit","Please select a time zone:":"Válasszon időzónát:",Previous:"Előző",Search:"Keresés","Search results":"Találatok","Select a tag":"Válasszon címkét",Settings:"Beállítások","Settings navigation":"Navigáció a beállításokban","Smileys & Emotion":"Mosolyok és érzelmek","Start slideshow":"Diavetítés indítása",Submit:"Beküldés",Symbols:"Szimbólumok","Travel & Places":"Utazás és helyek","Type to search time zone":"Gépeljen az időzóna kereséséhez","Unable to search the group":"A csoport nem kereshető","Write message, @ to mention someone …":"Írjon üzenetet, @ valaki megemlítéséhez…"}},{locale:"is",translations:{"{tag} (invisible)":"{tag} (ósýnilegt)","{tag} (restricted)":"{tag} (takmarkað)",Actions:"Aðgerðir",Activities:"Aðgerðir","Animals & Nature":"Dýr og náttúra",Choose:"Velja",Close:"Loka",Custom:"Sérsniðið",Flags:"Flögg","Food & Drink":"Matur og drykkur","Frequently used":"Oftast notað",Next:"Næsta","No emoji found":"Ekkert tjáningartákn fannst","No results":"Engar niðurstöður",Objects:"Hlutir","Pause slideshow":"Gera hlé á skyggnusýningu","People & Body":"Fólk og líkami","Pick an emoji":"Veldu tjáningartákn",Previous:"Fyrri",Search:"Leita","Search results":"Leitarniðurstöður","Select a tag":"Veldu merki",Settings:"Stillingar","Smileys & Emotion":"Broskallar og tilfinningar","Start slideshow":"Byrja skyggnusýningu",Symbols:"Tákn","Travel & Places":"Staðir og ferðalög","Unable to search the group":"Get ekki leitað í hópnum"}},{locale:"it",translations:{"{tag} (invisible)":"{tag} (invisibile)","{tag} (restricted)":"{tag} (limitato)",Actions:"Azioni",Activities:"Attività","Animals & Nature":"Animali e natura","Avatar of {displayName}":"Avatar di {displayName}","Avatar of {displayName}, {status}":"Avatar di {displayName}, {status}","Cancel changes":"Annulla modifiche",Choose:"Scegli",Close:"Chiudi","Close navigation":"Chiudi la navigazione","Confirm changes":"Conferma modifiche",Custom:"Personalizzato","Edit item":"Modifica l'elemento","External documentation for {title}":"Documentazione esterna per {title}",Flags:"Bandiere","Food & Drink":"Cibo e bevande","Frequently used":"Usati di frequente",Global:"Globale","Go back to the list":"Torna all'elenco","Message limit of {count} characters reached":"Limite dei messaggi di {count} caratteri raggiunto",Next:"Successivo","No emoji found":"Nessun emoji trovato","No results":"Nessun risultato",Objects:"Oggetti","Open navigation":"Apri la navigazione","Pause slideshow":"Presentazione in pausa","People & Body":"Persone e corpo","Pick an emoji":"Scegli un emoji","Please select a time zone:":"Si prega di selezionare un fuso orario:",Previous:"Precedente",Search:"Cerca","Search results":"Risultati di ricerca","Select a tag":"Seleziona un'etichetta",Settings:"Impostazioni","Settings navigation":"Navigazione delle impostazioni","Smileys & Emotion":"Faccine ed emozioni","Start slideshow":"Avvia presentazione",Submit:"Invia",Symbols:"Simboli","Travel & Places":"Viaggi e luoghi","Type to search time zone":"Digita per cercare un fuso orario","Unable to search the group":"Impossibile cercare il gruppo","Undo changes":"Cancella i cambiamenti","Write message, @ to mention someone, : for emoji autocompletion …":"Scrivi un messaggio, @ per menzionare qualcuno, : per il completamento automatico delle emoji ..."}},{locale:"ja_JP",translations:{"{tag} (invisible)":"{タグ} (不可視)","{tag} (restricted)":"{タグ} (制限付)",Actions:"操作",Activities:"アクティビティ","Animals & Nature":"動物と自然","Avatar of {displayName}":"{displayName} のアバター","Cancel changes":"変更をキャンセル",Choose:"選択",Close:"閉じる","Confirm changes":"変更を承認",Custom:"カスタム","External documentation for {title}":"{title} のための添付文書",Flags:"国旗","Food & Drink":"食べ物と飲み物","Frequently used":"よく使うもの",Global:"全体","Message limit of {count} characters reached":"{count} 文字のメッセージ上限に達しています",Next:"次","No emoji found":"絵文字が見つかりません","No results":"なし",Objects:"物","Pause slideshow":"スライドショーを一時停止","People & Body":"様々な人と体の部位","Pick an emoji":"絵文字を選択","Please select a time zone:":"タイムゾーンを選んで下さい:",Previous:"前",Search:"検索","Search results":"検索結果","Select a tag":"タグを選択",Settings:"設定","Settings navigation":"ナビゲーション設定","Smileys & Emotion":"感情表現","Start slideshow":"スライドショーを開始",Submit:"提出",Symbols:"記号","Travel & Places":"旅行と場所","Type to search time zone":"タイムゾーン検索のため入力してください","Unable to search the group":"グループを検索できません","Write message, @ to mention someone …":"メッセージを記入 @をつけるとその人に通知が行きます"}},{locale:"lt_LT",translations:{"{tag} (invisible)":"{tag} (nematoma)","{tag} (restricted)":"{tag} (apribota)",Actions:"Veiksmai",Activities:"Veiklos","Animals & Nature":"Gyvūnai ir gamta",Choose:"Pasirinkti",Close:"Užverti",Custom:"Tinkinti","External documentation for {title}":"Išorinė {title} dokumentacija",Flags:"Vėliavos","Food & Drink":"Maistas ir gėrimai","Frequently used":"Dažniausiai naudoti","Message limit of {count} characters reached":"Pasiekta {count} simbolių žinutės riba",Next:"Kitas","No emoji found":"Nerasta jaustukų","No results":"Nėra rezultatų",Objects:"Objektai","Pause slideshow":"Pristabdyti skaidrių rodymą","People & Body":"Žmonės ir kūnas","Pick an emoji":"Pasirinkti jaustuką",Previous:"Ankstesnis",Search:"Ieškoti","Search results":"Paieškos rezultatai","Select a tag":"Pasirinkti žymę",Settings:"Nustatymai","Settings navigation":"Naršymas nustatymuose","Smileys & Emotion":"Šypsenos ir emocijos","Start slideshow":"Pradėti skaidrių rodymą",Submit:"Pateikti",Symbols:"Simboliai","Travel & Places":"Kelionės ir vietos","Unable to search the group":"Nepavyko atlikti paiešką grupėje","Write message, @ to mention someone …":"Rašykite žinutę, naudokite @ norėdami kažką paminėti…"}},{locale:"lv",translations:{"{tag} (invisible)":"{tag} (neredzams)","{tag} (restricted)":"{tag} (ierobežots)",Choose:"Izvēlēties",Close:"Aizvērt",Next:"Nākamais","No results":"Nav rezultātu","Pause slideshow":"Pauzēt slaidrādi",Previous:"Iepriekšējais","Select a tag":"Izvēlēties birku",Settings:"Iestatījumi","Start slideshow":"Sākt slaidrādi"}},{locale:"mk",translations:{"{tag} (invisible)":"{tag} (невидливо)","{tag} (restricted)":"{tag} (ограничено)",Actions:"Акции",Activities:"Активности","Animals & Nature":"Животни & Природа",Choose:"Избери",Close:"Затвори",Custom:"Прилагодени",Flags:"Знамиња","Food & Drink":"Храна & Пијалоци","Frequently used":"Најчесто користени","Message limit of {count} characters reached":"Ограничувањето на должината на пораката од {count} карактери е надминато",Next:"Следно","No emoji found":"Не се пронајдени емотикони","No results":"Нема резултати",Objects:"Објекти","Pause slideshow":"Пузирај слајдшоу","People & Body":"Луѓе & Тело","Pick an emoji":"Избери емотикон",Previous:"Предходно",Search:"Барај","Search results":"Резултати од барувањето","Select a tag":"Избери ознака",Settings:"Параметри","Settings navigation":"Параметри за навигација","Smileys & Emotion":"Смешковци & Емотикони","Start slideshow":"Стартувај слајдшоу",Symbols:"Симболи","Travel & Places":"Патувања & Места","Unable to search the group":"Неможе да се принајде групата","Write message, @ to mention someone …":"Напиши порака, @ за да спомнеш некој …"}},{locale:"my",translations:{"{tag} (invisible)":"{tag} (ကွယ်ဝှက်ထား)","{tag} (restricted)":"{tag} (ကန့်သတ်)",Actions:"လုပ်ဆောင်ချက်များ",Activities:"ပြုလုပ်ဆောင်တာများ","Animals & Nature":"တိရစ္ဆာန်များနှင့် သဘာဝ","Avatar of {displayName}":"{displayName} ၏ ကိုယ်ပွား","Cancel changes":"ပြောင်းလဲမှုများ ပယ်ဖျက်ရန်",Choose:"ရွေးချယ်ရန်",Close:"ပိတ်ရန်","Confirm changes":"ပြောင်းလဲမှုများ အတည်ပြုရန်",Custom:"အလိုကျချိန်ညှိမှု","External documentation for {title}":"{title} အတွက် ပြင်ပ စာရွက်စာတမ်း",Flags:"အလံများ","Food & Drink":"အစားအသောက်","Frequently used":"မကြာခဏအသုံးပြုသော",Global:"ကမ္ဘာလုံးဆိုင်ရာ","Message limit of {count} characters reached":"ကန့်သတ် စာလုံးရေ {count} လုံး ပြည့်ပါပြီ",Next:"နောက်သို့ဆက်ရန်","No emoji found":"အီမိုဂျီ ရှာဖွေမတွေ့နိုင်ပါ","No results":"ရလဒ်မရှိပါ",Objects:"အရာဝတ္ထုများ","Pause slideshow":"စလိုက်ရှိုး ခေတ္တရပ်ရန်","People & Body":"လူပုဂ္ဂိုလ်များနှင့် ခန္ဓာကိုယ်","Pick an emoji":"အီမိုဂျီရွေးရန်","Please select a time zone:":"ဒေသစံတော်ချိန် ရွေးချယ်ပေးပါ",Previous:"ယခင်",Search:"ရှာဖွေရန်","Search results":"ရှာဖွေမှု ရလဒ်များ","Select a tag":"tag ရွေးချယ်ရန်",Settings:"ချိန်ညှိချက်များ","Settings navigation":"ချိန်ညှိချက်အညွှန်း","Smileys & Emotion":"စမိုင်လီများနှင့် အီမိုရှင်း","Start slideshow":"စလိုက်ရှိုးအား စတင်ရန်",Submit:"တင်သွင်းရန်",Symbols:"သင်္ကေတများ","Travel & Places":"ခရီးသွားလာခြင်းနှင့် နေရာများ","Type to search time zone":"ဒေသစံတော်ချိန်များ ရှာဖွေရန် စာရိုက်ပါ","Unable to search the group":"အဖွဲ့အား ရှာဖွေ၍ မရနိုင်ပါ","Write message, @ to mention someone …":"စာရေးသားရန်၊ တစ်စုံတစ်ဦးအား @ အသုံးပြု ရည်ညွှန်းရန်..."}},{locale:"nb_NO",translations:{"{tag} (invisible)":"{tag} (usynlig)","{tag} (restricted)":"{tag} (beskyttet)",Actions:"Handlinger",Activities:"Aktiviteter","Animals & Nature":"Dyr og natur","Avatar of {displayName}":"Avataren til {displayName}","Avatar of {displayName}, {status}":"{displayName}'s avatar, {status}","Cancel changes":"Avbryt endringer",Choose:"Velg",Close:"Lukk","Close navigation":"Lukk navigasjon","Confirm changes":"Bekreft endringer",Custom:"Tilpasset","Edit item":"Rediger","External documentation for {title}":"Ekstern dokumentasjon for {title}",Flags:"Flagg","Food & Drink":"Mat og drikke","Frequently used":"Ofte brukt",Global:"Global","Go back to the list":"Gå tilbake til listen","Message limit of {count} characters reached":"Karakter begrensing {count} nådd i melding",Next:"Neste","No emoji found":"Fant ingen emoji","No results":"Ingen resultater",Objects:"Objekter","Open navigation":"Åpne navigasjon","Pause slideshow":"Pause lysbildefremvisning","People & Body":"Mennesker og kropp","Pick an emoji":"Velg en emoji","Please select a time zone:":"Vennligst velg tidssone",Previous:"Forrige",Search:"Søk","Search results":"Søkeresultater","Select a tag":"Velg en merkelapp",Settings:"Innstillinger","Settings navigation":"Navigasjons instillinger","Smileys & Emotion":"Smilefjes og følelser","Start slideshow":"Start lysbildefremvisning",Submit:"Send",Symbols:"Symboler","Travel & Places":"Reise og steder","Type to search time zone":"Skriv for å søke etter tidssone","Unable to search the group":"Kunne ikke søke i gruppen","Undo changes":"Tilbakestill endringer","Write message, @ to mention someone …":"Bruk @ for å nevne noen i en melding"}},{locale:"nl",translations:{"{tag} (invisible)":"{tag} (onzichtbaar)","{tag} (restricted)":"{tag} (beperkt)",Actions:"Acties",Activities:"Activiteiten","Animals & Nature":"Dieren & Natuur","Avatar of {displayName}":"Avatar van {displayName}","Avatar of {displayName}, {status}":"Avatar van {displayName}, {status}","Cancel changes":"Wijzigingen annuleren",Choose:"Kies",Close:"Sluiten","Close navigation":"Navigatie sluiten","Confirm changes":"Wijzigingen bevestigen",Custom:"Aangepast","Edit item":"Item bewerken","External documentation for {title}":"Externe documentatie voor {title}",Flags:"Vlaggen","Food & Drink":"Eten & Drinken","Frequently used":"Vaak gebruikt",Global:"Globaal","Go back to the list":"Ga terug naar de lijst","Message limit of {count} characters reached":"Berichtlimiet van {count} karakters bereikt",Next:"Volgende","No emoji found":"Geen emoji gevonden","No results":"Geen resultaten",Objects:"Objecten","Open navigation":"Navigatie openen","Pause slideshow":"Pauzeer diavoorstelling","People & Body":"Mensen & Lichaam","Pick an emoji":"Kies een emoji","Please select a time zone:":"Selecteer een tijdzone:",Previous:"Vorige",Search:"Zoeken","Search results":"Zoekresultaten","Select a tag":"Selecteer een label",Settings:"Instellingen","Settings navigation":"Instellingen navigatie","Smileys & Emotion":"Smileys & Emotie","Start slideshow":"Start diavoorstelling",Submit:"Verwerken",Symbols:"Symbolen","Travel & Places":"Reizen & Plaatsen","Type to search time zone":"Type om de tijdzone te zoeken","Unable to search the group":"Kan niet in de groep zoeken","Undo changes":"Wijzigingen ongedaan maken","Write message, @ to mention someone, : for emoji autocompletion …":"Schrijf bericht, @ om iemand te noemen, : voor emoji auto-aanvullen ..."}},{locale:"oc",translations:{"{tag} (invisible)":"{tag} (invisible)","{tag} (restricted)":"{tag} (limit)",Actions:"Accions",Choose:"Causir",Close:"Tampar",Next:"Seguent","No results":"Cap de resultat","Pause slideshow":"Metre en pausa lo diaporama",Previous:"Precedent","Select a tag":"Seleccionar una etiqueta",Settings:"Paramètres","Start slideshow":"Lançar lo diaporama"}},{locale:"pl",translations:{"{tag} (invisible)":"{tag} (niewidoczna)","{tag} (restricted)":"{tag} (ograniczona)",Actions:"Działania",Activities:"Aktywność","Animals & Nature":"Zwierzęta i natura","Avatar of {displayName}":"Awatar {displayName}","Avatar of {displayName}, {status}":"Awatar {displayName}, {status}","Cancel changes":"Anuluj zmiany",Choose:"Wybierz",Close:"Zamknij","Close navigation":"Zamknij nawigację","Confirm changes":"Potwierdź zmiany",Custom:"Zwyczajne","Edit item":"Edytuj element","External documentation for {title}":"Dokumentacja zewnętrzna dla {title}",Flags:"Flagi","Food & Drink":"Jedzenie i picie","Frequently used":"Często używane",Global:"Globalnie","Go back to the list":"Powrót do listy","Message limit of {count} characters reached":"Przekroczono limit wiadomości wynoszący {count} znaków",Next:"Następny","No emoji found":"Nie znaleziono emotikonów","No results":"Brak wyników",Objects:"Obiekty","Open navigation":"Otwórz nawigację","Pause slideshow":"Wstrzymaj pokaz slajdów","People & Body":"Ludzie i ciało","Pick an emoji":"Wybierz emoji","Please select a time zone:":"Wybierz strefę czasową:",Previous:"Poprzedni",Search:"Szukaj","Search results":"Wyniki wyszukiwania","Select a tag":"Wybierz etykietę",Settings:"Ustawienia","Settings navigation":"Ustawienia nawigacji","Smileys & Emotion":"Buźki i emotikony","Start slideshow":"Rozpocznij pokaz slajdów",Submit:"Wyślij",Symbols:"Symbole","Travel & Places":"Podróże i miejsca","Type to search time zone":"Wpisz, aby wyszukać strefę czasową","Unable to search the group":"Nie można przeszukać grupy","Undo changes":"Cofnij zmiany","Write message, @ to mention someone, : for emoji autocompletion …":"Napisz wiadomość, @ aby o kimś wspomnieć, : dla autouzupełniania emotikonów…"}},{locale:"pt_BR",translations:{"{tag} (invisible)":"{tag} (invisível)","{tag} (restricted)":"{tag} (restrito) ",Actions:"Ações",Activities:"Atividades","Animals & Nature":"Animais & Natureza","Avatar of {displayName}":"Avatar de {displayName}","Avatar of {displayName}, {status}":"Avatar de {displayName}, {status}","Cancel changes":"Cancelar alterações",Choose:"Escolher",Close:"Fechar","Close navigation":"Fechar navegação","Confirm changes":"Confirmar alterações",Custom:"Personalizado","Edit item":"Editar item","External documentation for {title}":"Documentação externa para {title}",Flags:"Bandeiras","Food & Drink":"Comida & Bebida","Frequently used":"Mais usados",Global:"Global","Go back to the list":"Volte para a lista","Message limit of {count} characters reached":"Limite de mensagem de {count} caracteres atingido",Next:"Próximo","No emoji found":"Nenhum emoji encontrado","No results":"Sem resultados",Objects:"Objetos","Open navigation":"Abrir navegação","Pause slideshow":"Pausar apresentação de slides","People & Body":"Pessoas & Corpo","Pick an emoji":"Escolha um emoji","Please select a time zone:":"Selecione um fuso horário: ",Previous:"Anterior",Search:"Pesquisar","Search results":"Resultados da pesquisa","Select a tag":"Selecionar uma tag",Settings:"Configurações","Settings navigation":"Navegação de configurações","Smileys & Emotion":"Smiles & Emoções","Start slideshow":"Iniciar apresentação de slides",Submit:"Enviar",Symbols:"Símbolo","Travel & Places":"Viagem & Lugares","Type to search time zone":"Digite para pesquisar o fuso horário ","Unable to search the group":"Não foi possível pesquisar o grupo","Undo changes":"Desfazer modificações","Write message, @ to mention someone, : for emoji autocompletion …":"Escreva mensagem, @ para mencionar alguém, : para autocompleção emoji..."}},{locale:"pt_PT",translations:{"{tag} (invisible)":"{tag} (invisivel)","{tag} (restricted)":"{tag} (restrito)",Actions:"Ações",Choose:"Escolher",Close:"Fechar",Next:"Seguinte","No results":"Sem resultados","Pause slideshow":"Pausar diaporama",Previous:"Anterior","Select a tag":"Selecionar uma etiqueta",Settings:"Definições","Start slideshow":"Iniciar diaporama","Unable to search the group":"Não é possível pesquisar o grupo"}},{locale:"ru",translations:{"{tag} (invisible)":"{tag} (невидимое)","{tag} (restricted)":"{tag} (ограниченное)",Actions:"Действия ",Activities:"События","Animals & Nature":"Животные и природа ","Avatar of {displayName}":"Аватар {displayName}","Cancel changes":"Отменить изменения",Choose:"Выберите",Close:"Закрыть","Confirm changes":"Подтвердить изменения",Custom:"Пользовательское","External documentation for {title}":"Внешняя документация для {title}",Flags:"Флаги","Food & Drink":"Еда, напиток","Frequently used":"Часто используемый",Global:"Глобальный","Message limit of {count} characters reached":"Достигнуто ограничение на количество символов в {count}",Next:"Следующее","No emoji found":"Эмодзи не найдено","No results":"Результаты отсуствуют",Objects:"Объекты","Pause slideshow":"Приостановить показ слйдов","People & Body":"Люди и тело","Pick an emoji":"Выберите эмодзи","Please select a time zone:":"Пожалуйста, выберите часовой пояс:",Previous:"Предыдущее",Search:"Поиск","Search results":"Результаты поиска","Select a tag":"Выберите метку",Settings:"Параметры","Settings navigation":"Навигация по настройкам","Smileys & Emotion":"Смайлики и эмоции","Start slideshow":"Начать показ слайдов",Submit:"Утвердить",Symbols:"Символы","Travel & Places":"Путешествия и места","Type to search time zone":"Введите для поиска часового пояса","Unable to search the group":"Невозможно найти группу","Write message, @ to mention someone …":"Напишите сообщение, используйте @ чтобы упомянуть кого-то…"}},{locale:"sk_SK",translations:{"{tag} (invisible)":"{tag} (neviditeľný)","{tag} (restricted)":"{tag} (obmedzený)",Actions:"Akcie",Activities:"Aktivity","Animals & Nature":"Zvieratá a príroda","Avatar of {displayName}":"Avatar {displayName}","Avatar of {displayName}, {status}":"Avatar {displayName}, {status}","Cancel changes":"Zrušiť zmeny",Choose:"Vybrať",Close:"Zatvoriť","Close navigation":"Zavrieť navigáciu","Confirm changes":"Potvrdiť zmeny",Custom:"Zvyk","Edit item":"Upraviť položku","External documentation for {title}":"Externá dokumentácia pre {title}",Flags:"Vlajky","Food & Drink":"Jedlo a nápoje","Frequently used":"Často používané",Global:"Globálne","Go back to the list":"Naspäť na zoznam","Message limit of {count} characters reached":"Limit správy na {count} znakov dosiahnutý",Next:"Ďalší","No emoji found":"Nenašli sa žiadne emodži","No results":"Žiadne výsledky",Objects:"Objekty","Open navigation":"Otvoriť navigáciu","Pause slideshow":"Pozastaviť prezentáciu","People & Body":"Ľudia a telo","Pick an emoji":"Vyberte si emodži","Please select a time zone:":"Prosím vyberte časovú zónu:",Previous:"Predchádzajúci",Search:"Hľadať","Search results":"Výsledky vyhľadávania","Select a tag":"Vybrať štítok",Settings:"Nastavenia","Settings navigation":"Navigácia v nastaveniach","Smileys & Emotion":"Smajlíky a emócie","Start slideshow":"Začať prezentáciu",Submit:"Odoslať",Symbols:"Symboly","Travel & Places":"Cestovanie a miesta","Type to search time zone":"Začníte písať pre vyhľadávanie časovej zóny","Unable to search the group":"Skupinu sa nepodarilo nájsť","Undo changes":"Vrátiť zmeny","Write message, @ to mention someone, : for emoji autocompletion …":"Napíšte správu, @ ak chcete niekoho spomenúť, : pre automatické dopĺňanie emotikonov…"}},{locale:"sl",translations:{"{tag} (invisible)":"{tag} (nevidno)","{tag} (restricted)":"{tag} (omejeno)",Actions:"Dejanja",Activities:"Dejavnosti","Animals & Nature":"Živali in Narava","Avatar of {displayName}":"Podoba {displayName}","Cancel changes":"Prekliči spremembe",Choose:"Izbor",Close:"Zapri","Confirm changes":"Potrdi spremembe",Custom:"Po meri","External documentation for {title}":"Zunanja dokumentacija za {title}",Flags:"Zastavice","Food & Drink":"Hrana in Pijača","Frequently used":"Pogostost uporabe",Global:"Splošno","Message limit of {count} characters reached":"Dosežena omejitev {count} znakov na sporočilo.",Next:"Naslednji","No emoji found":"Ni najdenih izraznih ikon","No results":"Ni zadetkov",Objects:"Predmeti","Pause slideshow":"Ustavi predstavitev","People & Body":"Ljudje in Telo","Pick an emoji":"Izbor izrazne ikone","Please select a time zone:":"Izbor časovnega pasu:",Previous:"Predhodni",Search:"Iskanje","Search results":"Zadetki iskanja","Select a tag":"Izbor oznake",Settings:"Nastavitve","Settings navigation":"Krmarjenje nastavitev","Smileys & Emotion":"Izrazne ikone","Start slideshow":"Začni predstavitev",Submit:"Pošlji",Symbols:"Simboli","Travel & Places":"Potovanja in Kraji","Type to search time zone":"Vpišite niz za iskanje časovnega pasu","Unable to search the group":"Ni mogoče iskati po skupini","Write message, @ to mention someone …":"Napišite sporočilo, z @ omenite osebo ..."}},{locale:"sv",translations:{"{tag} (invisible)":"{tag} (osynlig)","{tag} (restricted)":"{tag} (begränsad)",Actions:"Åtgärder",Activities:"Aktiviteter","Animals & Nature":"Djur & Natur","Avatar of {displayName}":"{displayName}s avatar","Avatar of {displayName}, {status}":"{displayName}s avatar, {status}","Cancel changes":"Avbryt ändringar",Choose:"Välj",Close:"Stäng","Close navigation":"Stäng navigering","Confirm changes":"Bekräfta ändringar",Custom:"Anpassad","Edit item":"Ändra","External documentation for {title}":"Extern dokumentation för {title}",Flags:"Flaggor","Food & Drink":"Mat & Dryck","Frequently used":"Används ofta",Global:"Global","Go back to the list":"Gå tillbaka till listan","Message limit of {count} characters reached":"Meddelandegräns {count} tecken används",Next:"Nästa","No emoji found":"Hittade inga emojis","No results":"Inga resultat",Objects:"Objekt","Open navigation":"Öppna navigering","Pause slideshow":"Pausa bildspelet","People & Body":"Kropp & Själ","Pick an emoji":"Välj en emoji","Please select a time zone:":"Välj tidszon:",Previous:"Föregående",Search:"Sök","Search results":"Sökresultat","Select a tag":"Välj en tag",Settings:"Inställningar","Settings navigation":"Inställningsmeny","Smileys & Emotion":"Selfies & Känslor","Start slideshow":"Starta bildspelet",Submit:"Skicka",Symbols:"Symboler","Travel & Places":"Resor & Sevärdigheter","Type to search time zone":"Skriv för att välja tidszon","Unable to search the group":"Kunde inte söka i gruppen","Undo changes":"Ångra ändringar","Write message, @ to mention someone, : for emoji autocompletion …":"Skriv meddelande, @ för att nämna någon, : för automatiska emojiförslag ..."}},{locale:"tr",translations:{"{tag} (invisible)":"{tag} (görünmez)","{tag} (restricted)":"{tag} (kısıtlı)",Actions:"İşlemler",Activities:"Etkinlikler","Animals & Nature":"Hayvanlar ve Doğa","Avatar of {displayName}":"{displayName} avatarı","Avatar of {displayName}, {status}":"{displayName}, {status} avatarı","Cancel changes":"Değişiklikleri iptal et",Choose:"Seçin",Close:"Kapat","Close navigation":"Gezinmeyi kapat","Confirm changes":"Değişiklikleri onayla",Custom:"Özel","Edit item":"Ögeyi düzenle","External documentation for {title}":"{title} için dış belgeler",Flags:"Bayraklar","Food & Drink":"Yeme ve İçme","Frequently used":"Sık kullanılanlar",Global:"Evrensel","Go back to the list":"Listeye dön","Message limit of {count} characters reached":"{count} karakter ileti sınırına ulaşıldı",Next:"Sonraki","No emoji found":"Herhangi bir emoji bulunamadı","No results":"Herhangi bir sonuç bulunamadı",Objects:"Nesneler","Open navigation":"Gezinmeyi aç","Pause slideshow":"Slayt sunumunu duraklat","People & Body":"İnsanlar ve Beden","Pick an emoji":"Bir emoji seçin","Please select a time zone:":"Lütfen bir saat dilimi seçin:",Previous:"Önceki",Search:"Arama","Search results":"Arama sonuçları","Select a tag":"Bir etiket seçin",Settings:"Ayarlar","Settings navigation":"Gezinme ayarları","Smileys & Emotion":"İfadeler ve Duygular","Start slideshow":"Slayt sunumunu başlat",Submit:"Gönder",Symbols:"Simgeler","Travel & Places":"Gezi ve Yerler","Type to search time zone":"Saat dilimi aramak için yazmaya başlayın","Unable to search the group":"Grupta arama yapılamadı","Undo changes":"Değişiklikleri geri al","Write message, @ to mention someone, : for emoji autocompletion …":"İleti yazın, birini anmak için @, otomatik emoji tamamlamak için : kullanın…"}},{locale:"uk",translations:{"{tag} (invisible)":"{tag} (invisible)","{tag} (restricted)":"{tag} (restricted)",Actions:"Дії",Activities:"Діяльність","Animals & Nature":"Тварини та природа",Choose:"Виберіть",Close:"Закрити",Custom:"Власне",Flags:"Прапори","Food & Drink":"Їжа та напитки","Frequently used":"Найчастіші",Next:"Вперед","No emoji found":"Емоційки відсутні","No results":"Відсутні результати",Objects:"Об'єкти","Pause slideshow":"Пауза у показі слайдів","People & Body":"Люди та жести","Pick an emoji":"Виберіть емоційку",Previous:"Назад",Search:"Пошук","Search results":"Результати пошуку","Select a tag":"Виберіть позначку",Settings:"Налаштування","Smileys & Emotion":"Усміхайлики та емоційки","Start slideshow":"Почати показ слайдів",Symbols:"Символи","Travel & Places":"Поїздки та місця","Unable to search the group":"Неможливо шукати в групі"}},{locale:"zh_CN",translations:{"{tag} (invisible)":"{tag} (不可见)","{tag} (restricted)":"{tag} (受限)",Actions:"行为",Activities:"活动","Animals & Nature":"动物 & 自然","Avatar of {displayName}":"{displayName}的头像","Avatar of {displayName}, {status}":"{displayName}的头像,{status}","Cancel changes":"取消更改",Choose:"选择",Close:"关闭","Close navigation":"关闭导航","Confirm changes":"确认更改",Custom:"自定义","Edit item":"编辑项目","External documentation for {title}":"{title}的外部文档",Flags:"旗帜","Food & Drink":"食物 & 饮品","Frequently used":"经常使用",Global:"全局","Go back to the list":"返回至列表","Message limit of {count} characters reached":"已达到 {count} 个字符的消息限制",Next:"下一个","No emoji found":"表情未找到","No results":"无结果",Objects:"物体","Open navigation":"开启导航","Pause slideshow":"暂停幻灯片","People & Body":"人 & 身体","Pick an emoji":"选择一个表情","Please select a time zone:":"请选择一个时区:",Previous:"上一个",Search:"搜索","Search results":"搜索结果","Select a tag":"选择一个标签",Settings:"设置","Settings navigation":"设置向导","Smileys & Emotion":"笑脸 & 情感","Start slideshow":"开始幻灯片",Submit:"提交",Symbols:"符号","Travel & Places":"旅游 & 地点","Type to search time zone":"打字以搜索时区","Unable to search the group":"无法搜索分组","Undo changes":"撤销更改","Write message, @ to mention someone, : for emoji autocompletion …":"写信息,@ 提到某人,: 用于表情符号自动完成 ..."}},{locale:"zh_HK",translations:{"{tag} (invisible)":"{tag} (隱藏)","{tag} (restricted)":"{tag} (受限)",Actions:"動作",Activities:"活動","Animals & Nature":"動物與自然","Avatar of {displayName}":"{displayName} 的頭像","Avatar of {displayName}, {status}":"{displayName}的頭像,{status}","Cancel changes":"取消更改",Choose:"選擇",Close:"關閉","Close navigation":"關閉導航","Confirm changes":"確認更改",Custom:"自定義","Edit item":"編輯項目","External documentation for {title}":"{title} 的外部文檔",Flags:"旗幟","Food & Drink":"食物與飲料","Frequently used":"經常使用",Global:"全球的","Go back to the list":"返回清單","Message limit of {count} characters reached":"已達到訊息最多 {count} 字元限制",Next:"下一個","No emoji found":"未找到表情符號","No results":"無結果",Objects:"物件","Open navigation":"開啟導航","Pause slideshow":"暫停幻燈片","People & Body":"人物","Pick an emoji":"選擇表情符號","Please select a time zone:":"請選擇時區:",Previous:"上一個",Search:"搜尋","Search results":"搜尋結果","Select a tag":"選擇標籤",Settings:"設定","Settings navigation":"設定值導覽","Smileys & Emotion":"表情","Start slideshow":"開始幻燈片",Submit:"提交",Symbols:"標誌","Travel & Places":"旅遊與景點","Type to search time zone":"鍵入以搜索時區","Unable to search the group":"無法搜尋群組","Undo changes":"取消更改","Write message, @ to mention someone …":"輸入訊息時可使用 @ 來標示某人..."}},{locale:"zh_TW",translations:{"{tag} (invisible)":"{tag} (隱藏)","{tag} (restricted)":"{tag} (受限)",Actions:"動作",Activities:"活動","Animals & Nature":"動物與自然",Choose:"選擇",Close:"關閉",Custom:"自定義",Flags:"旗幟","Food & Drink":"食物與飲料","Frequently used":"最近使用","Message limit of {count} characters reached":"已達到訊息最多 {count} 字元限制",Next:"下一個","No emoji found":"未找到表情符號","No results":"無結果",Objects:"物件","Pause slideshow":"暫停幻燈片","People & Body":"人物","Pick an emoji":"選擇表情符號",Previous:"上一個",Search:"搜尋","Search results":"搜尋結果","Select a tag":"選擇標籤",Settings:"設定","Settings navigation":"設定值導覽","Smileys & Emotion":"表情","Start slideshow":"開始幻燈片",Symbols:"標誌","Travel & Places":"旅遊與景點","Unable to search the group":"無法搜尋群組","Write message, @ to mention someone …":"輸入訊息時可使用 @ 來標示某人..."}}].forEach((function(e){var t={};for(var n in e.translations)e.translations[n].pluralId?t[n]={msgid:n,msgid_plural:e.translations[n].pluralId,msgstr:e.translations[n].msgstr}:t[n]={msgid:n,msgstr:[e.translations[n]]};a.addTranslation(e.locale,{translations:{"":t}})}));var i=a.build(),o=(i.ngettext.bind(i),i.gettext.bind(i))},1205:function(e,t){"use strict";t.Z=function(e){return Math.random().toString(36).replace(/[^a-z]+/g,"").slice(0,e||5)}},6051:function(e,t,n){"use strict";var a=n(4015),i=n.n(a),o=n(3645),r=n.n(o)()(i());r.push([e.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.vue-tooltip[data-v-17fd6e1]{position:absolute;z-index:100000;right:auto;left:auto;display:block;margin:0;margin-top:-3px;padding:10px 0;text-align:left;text-align:start;opacity:0;line-height:1.6;line-break:auto;filter:drop-shadow(0 1px 10px var(--color-box-shadow))}.vue-tooltip[data-v-17fd6e1][x-placement^='top'] .tooltip-arrow{bottom:0;border-bottom-width:0;border-top-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='bottom'] .tooltip-arrow{top:0;border-top-width:0;border-bottom-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='right'] .tooltip-arrow{right:100%;border-left-width:0;border-right-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='left'] .tooltip-arrow{left:100%;border-right-width:0;border-left-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][aria-hidden='true']{visibility:hidden;transition:opacity .15s, visibility .15s;opacity:0}.vue-tooltip[data-v-17fd6e1][aria-hidden='false']{visibility:visible;transition:opacity .15s;opacity:1}.vue-tooltip[data-v-17fd6e1] .tooltip-inner{max-width:350px;padding:5px 8px;text-align:center;color:var(--color-main-text);border-radius:var(--border-radius);background-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1] .tooltip-arrow{position:absolute;z-index:1;width:0;height:0;margin:0;border-style:solid;border-color:transparent;border-width:10px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/directives/Tooltip/index.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCOxB,6BACC,iBAAkB,CAClB,cAAe,CACf,UAAW,CACX,SAAU,CACV,aAAc,CACd,QAAS,CAET,eAAgB,CAChB,cAAe,CACf,eAAgB,CAChB,gBAAiB,CACjB,SAAU,CACV,eAAgB,CAEhB,eAAgB,CAChB,sDAAuD,CAhBxD,gEAoBE,QAAS,CACT,qBAAsB,CACtB,6CAA8C,CAtBhD,mEA2BE,KAAM,CACN,kBAAmB,CACnB,gDAAiD,CA7BnD,kEAkCE,UAAW,CACX,mBAAoB,CACpB,+CAAgD,CApClD,iEAyCE,SAAU,CACV,oBAAqB,CACrB,8CAA+C,CA3CjD,iDAgDE,iBAAkB,CAClB,wCAAyC,CACzC,SAAU,CAlDZ,kDAqDE,kBAAmB,CACnB,uBAAwB,CACxB,SAAU,CAvDZ,4CA4DE,eAAgB,CAChB,eAAgB,CAChB,iBAAkB,CAClB,4BAA6B,CAC7B,kCAAmC,CACnC,6CAA8C,CAjEhD,4CAsEE,iBAAkB,CAClB,SAAU,CACV,OAAQ,CACR,QAAS,CACT,QAAS,CACT,kBAAmB,CACnB,wBAAyB,CACzB,iBA/EgB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n/**\n* @copyright Copyright (c) 2016, John Molakvoæ \n* @copyright Copyright (c) 2016, Robin Appelman \n* @copyright Copyright (c) 2016, Jan-Christoph Borchardt \n* @copyright Copyright (c) 2016, Erik Pellikka \n* @copyright Copyright (c) 2015, Vincent Petry \n*\n* Bootstrap v3.3.5 (http://getbootstrap.com)\n* Copyright 2011-2015 Twitter, Inc.\n* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n*/\n\n$arrow-width: 10px;\n\n.vue-tooltip[data-v-#{$scope_version}] {\n\tposition: absolute;\n\tz-index: 100000;\n\tright: auto;\n\tleft: auto;\n\tdisplay: block;\n\tmargin: 0;\n\t/* default to top */\n\tmargin-top: -3px;\n\tpadding: 10px 0;\n\ttext-align: left;\n\ttext-align: start;\n\topacity: 0;\n\tline-height: 1.6;\n\n\tline-break: auto;\n\tfilter: drop-shadow(0 1px 10px var(--color-box-shadow));\n\n\t// TOP\n\t&[x-placement^='top'] .tooltip-arrow {\n\t\tbottom: 0;\n\t\tborder-bottom-width: 0;\n\t\tborder-top-color: var(--color-main-background);\n\t}\n\n\t// BOTTOM\n\t&[x-placement^='bottom'] .tooltip-arrow {\n\t\ttop: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-color: var(--color-main-background);\n\t}\n\n\t// RIGHT\n\t&[x-placement^='right'] .tooltip-arrow {\n\t\tright: 100%;\n\t\tborder-left-width: 0;\n\t\tborder-right-color: var(--color-main-background);\n\t}\n\n\t// LEFT\n\t&[x-placement^='left'] .tooltip-arrow {\n\t\tleft: 100%;\n\t\tborder-right-width: 0;\n\t\tborder-left-color: var(--color-main-background);\n\t}\n\n\t// HIDDEN / SHOWN\n\t&[aria-hidden='true'] {\n\t\tvisibility: hidden;\n\t\ttransition: opacity .15s, visibility .15s;\n\t\topacity: 0;\n\t}\n\t&[aria-hidden='false'] {\n\t\tvisibility: visible;\n\t\ttransition: opacity .15s;\n\t\topacity: 1;\n\t}\n\n\t// CONTENT\n\t.tooltip-inner {\n\t\tmax-width: 350px;\n\t\tpadding: 5px 8px;\n\t\ttext-align: center;\n\t\tcolor: var(--color-main-text);\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-color: var(--color-main-background);\n\t}\n\n\t// ARROW\n\t.tooltip-arrow {\n\t\tposition: absolute;\n\t\tz-index: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\tborder-style: solid;\n\t\tborder-color: transparent;\n\t\tborder-width: $arrow-width;\n\t}\n}\n"],sourceRoot:""}]),t.Z=r},9224:function(e,t,n){"use strict";var a=n(4015),i=n.n(a),o=n(3645),r=n.n(o)()(i());r.push([e.id,".material-design-icon[data-v-2a98ba3b]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.action-item[data-v-2a98ba3b]{position:relative;display:inline-block}.action-item--single[data-v-2a98ba3b]:hover,.action-item--single[data-v-2a98ba3b]:focus,.action-item--single[data-v-2a98ba3b]:active,.action-item__menutoggle[data-v-2a98ba3b]:hover,.action-item__menutoggle[data-v-2a98ba3b]:focus,.action-item__menutoggle[data-v-2a98ba3b]:active{opacity:1;background-color:rgba(127,127,127,0.25) !important}.action-item__menutoggle[data-v-2a98ba3b]:disabled,.action-item--single[data-v-2a98ba3b]:disabled{opacity:.3 !important}.action-item.action-item--open .action-item__menutoggle[data-v-2a98ba3b]{opacity:1;background-color:rgba(127,127,127,0.25)}.action-item--single[data-v-2a98ba3b],.action-item__menutoggle[data-v-2a98ba3b]{box-sizing:border-box;width:auto;min-width:44px;height:44px;margin:0;padding:0;cursor:pointer;border:none;border-radius:22px;background-color:transparent}.action-item--single--with-title[data-v-2a98ba3b],.action-item__menutoggle--with-title[data-v-2a98ba3b]{position:relative;padding:0 14px;padding-left:44px;white-space:nowrap;opacity:1;border:1px solid var(--color-border-dark);background-color:var(--color-background-dark);background-position:14px center;font-size:inherit}.action-item--single--with-title[data-v-2a98ba3b] span,.action-item__menutoggle--with-title[data-v-2a98ba3b] span{width:24px;height:24px;line-height:16px;position:absolute;top:0;left:0}.action-item[data-v-2a98ba3b] .material-design-icon{width:44px;height:44px;opacity:1}.action-item[data-v-2a98ba3b] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-item__menutoggle[data-v-2a98ba3b]{display:flex;align-items:center;justify-content:center;opacity:.7;font-weight:bold;line-height:16px}.action-item__menutoggle--primary[data-v-2a98ba3b]{opacity:1;color:var(--color-primary-text);border:none;background-color:var(--color-primary-element)}.action-item--open .action-item__menutoggle--primary[data-v-2a98ba3b],.action-item__menutoggle--primary[data-v-2a98ba3b]:hover,.action-item__menutoggle--primary[data-v-2a98ba3b]:focus,.action-item__menutoggle--primary[data-v-2a98ba3b]:active{color:var(--color-primary-text) !important;background-color:var(--color-primary-element-light) !important}.action-item--single[data-v-2a98ba3b]{opacity:.7}.action-item--single[data-v-2a98ba3b]:hover,.action-item--single[data-v-2a98ba3b]:focus,.action-item--single[data-v-2a98ba3b]:active{opacity:1}.action-item--single>[hidden][data-v-2a98ba3b]{display:none}.ie .action-item__menu[data-v-2a98ba3b],.ie .action-item__menu .action-item__menu_arrow[data-v-2a98ba3b],.edge .action-item__menu[data-v-2a98ba3b],.edge .action-item__menu .action-item__menu_arrow[data-v-2a98ba3b]{border:1px solid var(--color-border)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Actions/Actions.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCopBxB,8BACC,iBAAkB,CAClB,oBAAqB,CAIrB,sRAMC,SC5nBc,CD8nBd,kDAA2C,CAC3C,kGAKA,qBAAsB,CApBxB,yEAwBE,SCxoBc,CDyoBd,uCCroBgD,CDsoBhD,gFAKA,qBAAsB,CACtB,UAAW,CACX,cCpqBmB,CDqqBnB,WCrqBmB,CDsqBnB,QAAS,CACT,SAAU,CACV,cAAe,CACf,WAAY,CACZ,kBAAkC,CAClC,4BAA6B,CAE7B,wGACC,iBAAkB,CAClB,cCvqB6C,CDwqB7C,iBChrBkB,CDirBlB,kBAAmB,CACnB,SC/pBa,CDgqBb,yCAA0C,CAE1C,6CAA8C,CAC9C,+BAAwC,CACxC,iBAAkB,CAVlB,oHAeC,UAAW,CACX,WAAY,CACZ,gBC1rBY,CD2rBZ,iBAAkB,CAClB,KAAM,CACN,MAAO,CA9DX,oDAoEE,UCvsBmB,CDwsBnB,WCxsBmB,CDysBnB,SCtrBc,CDgnBhB,+EAyEG,qBAAsB,CACtB,0CAMD,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,UCpsBiB,CDqsBjB,gBAAiB,CACjB,gBCptBc,CDstBd,mDACC,SCxsBa,CDysBb,+BAAgC,CAChC,WAAY,CACZ,6CAA8C,CAC9C,kPAIC,0CAA2C,CAC3C,8DAA+D,CAC/D,sCAKF,UCxtBiB,CDutBjB,qIAKC,SC3tBa,CDstBd,+CASC,YAAa,CACb,sNAQD,oCAAqC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.action-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\n\t// put a grey round background when menu is opened\n\t// or hover-focused\n\t&--single:hover,\n\t&--single:focus,\n\t&--single:active,\n\t&__menutoggle:hover,\n\t&__menutoggle:focus,\n\t&__menutoggle:active {\n\t\topacity: $opacity_full;\n\t\t// good looking on dark AND white bg, override server styling\n\t\tbackground-color: $icon-focus-bg !important;\n\t}\n\n\t// TODO: handle this in the future button component\n\t&__menutoggle:disabled,\n\t&--single:disabled {\n\t\topacity: .3 !important;\n\t}\n\n\t&.action-item--open .action-item__menutoggle {\n\t\topacity: $opacity_full;\n\t\tbackground-color: $action-background-hover;\n\t}\n\n\t// icons\n\t&--single,\n\t&__menutoggle {\n\t\tbox-sizing: border-box;\n\t\twidth: auto;\n\t\tmin-width: $clickable-area;\n\t\theight: $clickable-area;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tborder: none;\n\t\tborder-radius: $clickable-area / 2;\n\t\tbackground-color: transparent;\n\n\t\t&--with-title {\n\t\t\tposition: relative;\n\t\t\tpadding: 0 $icon-margin;\n\t\t\tpadding-left: $clickable-area;\n\t\t\twhite-space: nowrap;\n\t\t\topacity: $opacity_full;\n\t\t\tborder: 1px solid var(--color-border-dark);\n\t\t\t// with a title, we need to display this as a real button\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tfont-size: inherit;\n\n\t\t\t// non-background icon class\n\t\t\t// image slot\n\t\t\t::v-deep span {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tline-height: $icon-size;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t&::v-deep .material-design-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\topacity: $opacity_full;\n\n\t\t.material-design-icon__svg {\n\t\t\tvertical-align: middle;\n\t\t}\n\t}\n\n\t// icon-more\n\t&__menutoggle {\n\t\t// align menu icon in center\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\topacity: $opacity_normal;\n\t\tfont-weight: bold;\n\t\tline-height: $icon-size;\n\n\t\t&--primary {\n\t\t\topacity: $opacity_full;\n\t\t\tcolor: var(--color-primary-text);\n\t\t\tborder: none;\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t.action-item--open &,\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tcolor: var(--color-primary-text) !important;\n\t\t\t\tbackground-color: var(--color-primary-element-light) !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--single {\n\t\topacity: $opacity_normal;\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t\t// hide anything the slot is displaying\n\t\t& > [hidden] {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n.ie,\n.edge {\n\t.action-item__menu,\n\t.action-item__menu .action-item__menu_arrow {\n\t\tborder: 1px solid var(--color-border);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=r},5878:function(e,t,n){"use strict";var a=n(4015),i=n.n(a),o=n(3645),r=n.n(o)()(i());r.push([e.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.popover{z-index:100000;display:block !important;filter:drop-shadow(0 1px 10px var(--color-box-shadow))}.popover__inner{padding:0;color:var(--color-main-text);border-radius:var(--border-radius);background:var(--color-main-background)}.popover__arrow{position:absolute;z-index:1;width:0;height:0;margin:10px;border-style:solid;border-color:transparent;border-width:10px}.popover[x-placement^='top']{margin-bottom:10px}.popover[x-placement^='top'] .popover__arrow{bottom:-10px;left:calc(50% - $arrow-width);margin-top:0;margin-bottom:0;border-bottom-width:0;border-top-color:var(--color-main-background)}.popover[x-placement^='bottom']{margin-top:10px}.popover[x-placement^='bottom'] .popover__arrow{top:-10px;left:calc(50% - $arrow-width);margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-color:var(--color-main-background)}.popover[x-placement^='right']{margin-left:10px}.popover[x-placement^='right'] .popover__arrow{top:calc(50% - $arrow-width);left:-10px;margin-right:0;margin-left:0;border-left-width:0;border-right-color:var(--color-main-background)}.popover[x-placement^='left']{margin-right:10px}.popover[x-placement^='left'] .popover__arrow{top:calc(50% - $arrow-width);right:-10px;margin-right:0;margin-left:0;border-right-width:0;border-left-color:var(--color-main-background)}.popover[aria-hidden='true']{visibility:hidden;transition:opacity var(--animation-quick),visibility var(--animation-quick);opacity:0}.popover[aria-hidden='false']{visibility:visible;transition:opacity var(--animation-quick);opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Popover/Popover.vue"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCyGxB,SACC,cAAe,CACf,wBAAyB,CAEzB,sDAAuD,CAEvD,gBACC,SAAU,CACV,4BAA6B,CAC7B,kCAAmC,CACnC,uCAAwC,CACxC,gBAGA,iBAAkB,CAClB,SAAU,CACV,OAAQ,CACR,QAAS,CACT,WApBgB,CAqBhB,kBAAmB,CACnB,wBAAyB,CACzB,iBAvBgB,CAElB,6BAyBE,kBA3BgB,CAElB,6CA4BG,YA9Be,CA+Bf,6BAA8B,CAC9B,YAAa,CACb,eAAgB,CAChB,qBAAsB,CACtB,6CAA8C,CAjCjD,gCAsCE,eAxCgB,CAElB,gDAyCG,SA3Ce,CA4Cf,6BAA8B,CAC9B,YAAa,CACb,eAAgB,CAChB,kBAAmB,CACnB,gDAAiD,CA9CpD,+BAmDE,gBArDgB,CAElB,+CAsDG,4BAA6B,CAC7B,UAzDe,CA0Df,cAAe,CACf,aAAc,CACd,mBAAoB,CACpB,+CAAgD,CA3DnD,8BAgEE,iBAlEgB,CAElB,8CAmEG,4BAA6B,CAC7B,WAtEe,CAuEf,cAAe,CACf,aAAc,CACd,oBAAqB,CACrB,8CAA+C,CAxElD,6BA6EE,iBAAkB,CAClB,2EAA6E,CAC7E,SAAU,CA/EZ,8BAmFE,kBAAmB,CACnB,yCAA0C,CAC1C,SAAU",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$arrow-width: 10px;\n\n.popover {\n\tz-index: 100000;\n\tdisplay: block !important;\n\n\tfilter: drop-shadow(0 1px 10px var(--color-box-shadow));\n\n\t&__inner {\n\t\tpadding: 0;\n\t\tcolor: var(--color-main-text);\n\t\tborder-radius: var(--border-radius);\n\t\tbackground: var(--color-main-background);\n\t}\n\n\t&__arrow {\n\t\tposition: absolute;\n\t\tz-index: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tmargin: $arrow-width;\n\t\tborder-style: solid;\n\t\tborder-color: transparent;\n\t\tborder-width: $arrow-width;\n\t}\n\n\t&[x-placement^='top'] {\n\t\tmargin-bottom: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\tbottom: -$arrow-width;\n\t\t\tleft: calc(50% - $arrow-width);\n\t\t\tmargin-top: 0;\n\t\t\tmargin-bottom: 0;\n\t\t\tborder-bottom-width: 0;\n\t\t\tborder-top-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='bottom'] {\n\t\tmargin-top: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: -$arrow-width;\n\t\t\tleft: calc(50% - $arrow-width);\n\t\t\tmargin-top: 0;\n\t\t\tmargin-bottom: 0;\n\t\t\tborder-top-width: 0;\n\t\t\tborder-bottom-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='right'] {\n\t\tmargin-left: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: calc(50% - $arrow-width);\n\t\t\tleft: -$arrow-width;\n\t\t\tmargin-right: 0;\n\t\t\tmargin-left: 0;\n\t\t\tborder-left-width: 0;\n\t\t\tborder-right-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='left'] {\n\t\tmargin-right: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: calc(50% - $arrow-width);\n\t\t\tright: -$arrow-width;\n\t\t\tmargin-right: 0;\n\t\t\tmargin-left: 0;\n\t\t\tborder-right-width: 0;\n\t\t\tborder-left-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[aria-hidden='true'] {\n\t\tvisibility: hidden;\n\t\ttransition: opacity var(--animation-quick), visibility var(--animation-quick);\n\t\topacity: 0;\n\t}\n\n\t&[aria-hidden='false'] {\n\t\tvisibility: visible;\n\t\ttransition: opacity var(--animation-quick);\n\t\topacity: 1;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=r},3645:function(e){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=e(t);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,a){"string"==typeof e&&(e=[[null,e,""]]);var i={};if(a)for(var o=0;oe.length)&&(t=e.length);for(var n=0,a=new Array(t);n0?" ".concat(n.layer):""," {")),a+=n.css,i&&(a+="}"),n.media&&(a+="}"),n.supports&&(a+="}");var o=n.sourceMap;o&&"undefined"!=typeof btoa&&(a+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(o))))," */")),t.styleTagTransform(a,e,t.options)}(t,e,n)},remove:function(){!function(e){if(null===e.parentNode)return!1;e.parentNode.removeChild(e)}(t)}}}},4589:function(e){"use strict";e.exports=function(e,t){if(t.styleSheet)t.styleSheet.cssText=e;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(e))}}},3083:function(e,t,n){"use strict";var a=n(9125),i=n(613),o=(n(3822),n(1900)),r=n(2192),s=n.n(r),l=(0,o.Z)(i.Z,a.s,a.x,!1,null,"2a98ba3b",null);"function"==typeof s()&&s()(l),t.Z=l.exports},7020:function(e,t,n){"use strict";n.d(t,{Z:function(){return k}});var a={name:"Popover",components:{VPopover:n(2965).VPopover},mounted:function(){var e=this;this.$watch((function(){return e.$refs.popover.isOpen}),(function(t){t?e.$emit("after-show"):e.$emit("after-hide")}))}},i=n(3379),o=n.n(i),r=n(7795),s=n.n(r),l=n(569),c=n.n(l),u=n(3565),d=n.n(u),m=n(9216),g=n.n(m),p=n(4589),h=n.n(p),v=n(5878),A={};A.styleTagTransform=h(),A.setAttributes=d(),A.insert=c().bind(null,"head"),A.domAPI=s(),A.insertStyleElement=g(),o()(v.Z,A),v.Z&&v.Z.locals&&v.Z.locals;var b=n(1900),f=n(8733),y=n.n(f),C=(0,b.Z)(a,(function(){var e=this,t=e.$createElement;return(e._self._c||t)("VPopover",e._g(e._b({ref:"popover",attrs:{"popover-base-class":"popover","popover-wrapper-class":"popover__wrapper","popover-arrow-class":"popover__arrow","popover-inner-class":"popover__inner"},scopedSlots:e._u([{key:"popover",fn:function(){return[e._t("default")]},proxy:!0}],null,!0)},"VPopover",e.$attrs,!1),e.$listeners),[e._t("trigger")],2)}),[],!1,null,null,null);"function"==typeof y()&&y()(C);var k=C.exports},8104:function(e,t,n){"use strict";var a=n(5494),i=(0,n(1900).Z)(a.Z,void 0,void 0,!1,null,null,null);t.Z=i.exports},613:function(e,t,n){"use strict";var a=n(858);t.Z=a.Z},5494:function(e,t,n){"use strict";var a=n(5041);t.Z=a.Z},3822:function(e,t,n){"use strict";n(2694)},2192:function(){},8733:function(){},9125:function(e,t,n){"use strict";n.d(t,{s:function(){return a},x:function(){return i}});var a=function(){var e,t=this,n=t.$createElement,a=t._self._c||n;return t.isValidSingleAction&&!t.forceMenu?a("element",t._b({directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:t.firstAction.text,expression:"firstAction.text",modifiers:{auto:!0}}],staticClass:"action-item action-item--single",class:(e={},e[t.firstAction.icon]=t.firstAction.icon,e[t.firstActionClass]=t.firstActionClass,e["action-item--single--with-title"]=t.singleActionTitle,e),attrs:{rel:"nofollow noreferrer noopener",disabled:t.isDisabled},on:t._d({focus:t.onFocus,blur:t.onBlur},[t.firstActionEventBinding,t.execFirstAction])},"element",t.firstActionBinding,!1),[a("VNodes",{attrs:{vnodes:t.firstActionIconSlot}}),t._v("\n\n\t"+t._s(t.singleActionTitle)+"\n\n\t"),t._v(" "),a("span",{attrs:{"aria-hidden":!0,hidden:""}},[t._t("default")],2)],1):a("div",{directives:[{name:"show",rawName:"v-show",value:t.hasMultipleActions||t.forceMenu,expression:"hasMultipleActions || forceMenu"}],staticClass:"action-item",class:{"action-item--open":t.opened}},[a("Popover",{attrs:{delay:0,"handle-resize":!0,open:t.opened,placement:t.placement,"boundaries-element":t.boundariesElement,container:t.container},on:{"update:open":function(e){t.opened=e},show:t.openMenu,"after-show":t.onOpen,hide:t.closeMenu},scopedSlots:t._u([{key:"trigger",fn:function(){var e;return[a("button",{ref:"menuButton",staticClass:"icon vue-button action-item__menutoggle",class:(e={},e[t.defaultIcon]=!t.iconSlotIsPopulated,e["action-item__menutoggle--with-title"]=t.menuTitle,e["action-item__menutoggle--with-icon-slot"]=t.iconSlotIsPopulated,e["action-item__menutoggle--default-icon"]=!t.iconSlotIsPopulated&&""===t.defaultIcon,e["action-item__menutoggle--primary"]=t.primary,e),attrs:{disabled:t.disabled,"aria-haspopup":"true","aria-label":t.ariaLabel,"aria-controls":t.randomId,"aria-expanded":t.opened?"true":"false","test-attr":"1",type:"button"},on:{focus:t.onFocus,blur:t.onBlur}},[t.iconSlotIsPopulated?t._t("icon"):""===t.defaultIcon?a("DotsHorizontal",{attrs:{size:20,decorative:""}}):t._e(),t._v("\n\t\t\t\t"+t._s(t.menuTitle)+"\n\t\t\t")],2)]},proxy:!0}],null,!0)},[t._v(" "),a("div",{directives:[{name:"show",rawName:"v-show",value:t.opened,expression:"opened"}],ref:"menu",class:{open:t.opened},attrs:{tabindex:"-1"},on:{keydown:[function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"up",38,e.key,["Up","ArrowUp"])||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:t.focusPreviousAction.apply(null,arguments)},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"down",40,e.key,["Down","ArrowDown"])||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:t.focusNextAction.apply(null,arguments)},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"tab",9,e.key,"Tab")||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:t.focusNextAction.apply(null,arguments)},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"tab",9,e.key,"Tab")?null:e.shiftKey?e.ctrlKey||e.altKey||e.metaKey?null:t.focusPreviousAction.apply(null,arguments):null},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"page-up",void 0,e.key,void 0)||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:t.focusFirstAction.apply(null,arguments)},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"page-down",void 0,e.key,void 0)||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:t.focusLastAction.apply(null,arguments)},function(e){return!e.type.indexOf("key")&&t._k(e.keyCode,"esc",27,e.key,["Esc","Escape"])||e.ctrlKey||e.shiftKey||e.altKey||e.metaKey?null:(e.preventDefault(),t.closeMenu.apply(null,arguments))}],mousemove:t.onMouseFocusAction}},[a("ul",{attrs:{id:t.randomId,tabindex:"-1"}},[t.opened?[t._t("default")]:t._e()],2)])])],1)},i=[]},1900:function(e,t,n){"use strict";function a(e,t,n,a,i,o,r,s){var l,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=n,c._compiled=!0),a&&(c.functional=!0),o&&(c._scopeId="data-v-"+o),r?(l=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),i&&i.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(r)},c._ssrRegister=l):i&&(l=s?function(){i.call(this,(c.functional?this.parent:this).$root.$options.shadowRoot)}:i),l)if(c.functional){c._injectStyles=l;var u=c.render;c.render=function(e,t){return l.call(t),u(e,t)}}else{var d=c.beforeCreate;c.beforeCreate=d?[].concat(d,l):[l]}return{exports:e,options:c}}n.d(t,{Z:function(){return a}})},6036:function(e){"use strict";e.exports=__webpack_require__(/*! @nextcloud/l10n/dist/gettext */ "./node_modules/@nextcloud/l10n/dist/gettext.js")},2965:function(e){"use strict";e.exports=__webpack_require__(/*! v-tooltip */ "./node_modules/v-tooltip/dist/v-tooltip.esm.js")},3251:function(e){"use strict";e.exports=__webpack_require__(/*! vue-material-design-icons/DotsHorizontal */ "./node_modules/vue-material-design-icons/DotsHorizontal.vue")}},t={};function n(a){var i=t[a];if(void 0!==i)return i.exports;var o=t[a]={id:a,exports:{}};return e[a](o,o.exports,n),o.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var a in t)n.o(t,a)&&!n.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var a={};return function(){"use strict";n.r(a);var e=n(3083);a.default=e.Z}(),a}()})); //# sourceMappingURL=Actions.js.map /***/ }), /***/ "./node_modules/@nextcloud/vue/dist/ncvuecomponents.js": /*!*************************************************************!*\ !*** ./node_modules/@nextcloud/vue/dist/ncvuecomponents.js ***! \*************************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ "./node_modules/console-browserify/index.js"); /*! For license information please see ncvuecomponents.js.LICENSE.txt */ !function(n,t){ true?module.exports=t():0}(self,(function(){return function(){var n={5938:function(n,t,e){"use strict";var i=e(9156);t.Z={name:"ActionButton",mixins:[i.Z],props:{disabled:{type:Boolean,default:!1}},computed:{isFocusable:function(){return!this.disabled}}}},858:function(n,t,e){"use strict";var i=e(3251),a=e.n(i),r=e(8104),o=e(9040),s=e(1205),l=e(932),c=e(8099);function d(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,i=new Array(t);e1},isValidSingleAction:function(){return 1===this.actions.length&&null!==this.firstActionElement},singleActionTitle:function(){return this.forceTitle?this.menuTitle:""},isDisabled:function(){var n,t;return this.disabled||1===this.actions.length&&(null===(n=this.firstAction)||void 0===n||null===(t=n.$props)||void 0===t?void 0:t.disabled)},firstActionVNode:function(){return this.actions[0]},firstActionBinding:function(){if(this.firstActionVNode&&this.firstActionVNode.componentOptions){var n=this.firstActionVNode.componentOptions.tag;if("ActionLink"===n)return u(u({is:"a",href:this.firstAction.href,target:this.firstAction.target,"aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props);if("ActionRouter"===n)return u(u({is:"router-link",to:this.firstAction.to,exact:this.firstAction.exact,"aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props);if("ActionButton"===n)return u(u({is:"button","aria-label":this.firstAction.ariaLabel},this.firstAction.$attrs),this.firstAction.$props)}return null},firstActionEvent:function(){var n,t,e;return null===(n=this.firstActionVNode)||void 0===n||null===(t=n.componentOptions)||void 0===t||null===(e=t.listeners)||void 0===e?void 0:e.click},firstActionEventBinding:function(){return this.firstActionEvent?"click":null},firstActionIconSlot:function(){var n,t;return null===(n=this.firstAction)||void 0===n||null===(t=n.$slots)||void 0===t?void 0:t.icon},firstActionClass:function(){return((this.firstActionVNode&&this.firstActionVNode.data.staticClass)+" "+(this.firstActionVNode&&this.firstActionVNode.data.class)).trim()},iconSlotIsPopulated:function(){return!!this.$slots.icon}},watch:{open:function(n){n!==this.opened&&(this.opened=n)},children:function(){this.firstAction=this.children[0]?this.children[0]:{}}},beforeMount:function(){this.initActions()},beforeUpdate:function(){this.initActions()},methods:{openMenu:function(n){this.opened||(this.opened=!0,this.$emit("update:open",!0),this.$emit("open"))},closeMenu:function(n){this.opened&&(this.opened=!1,this.$emit("update:open",!1),this.$emit("close"),this.opened=!1,this.focusIndex=0,this.$refs.menuButton.focus())},onOpen:function(n){var t=this;this.$nextTick((function(){t.focusFirstAction(n)}))},onMouseFocusAction:function(n){if(document.activeElement!==n.target){var t=n.target.closest("li");if(t){var e=t.querySelector(m);if(e){var i=(a=this.$refs.menu.querySelectorAll(m),function(n){if(Array.isArray(n))return d(n)}(a)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(a)||function(n,t){if(n){if("string"==typeof n)return d(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?d(n,t):void 0}}(a)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).indexOf(e);i>-1&&(this.focusIndex=i,this.focusAction())}}}var a},removeCurrentActive:function(){var n=this.$refs.menu.querySelector("li.active");n&&n.classList.remove("active")},focusAction:function(){var n=this.$refs.menu.querySelectorAll(m)[this.focusIndex];if(n){this.removeCurrentActive();var t=n.closest("li.action");n.focus(),t&&t.classList.add("active")}},focusPreviousAction:function(n){this.opened&&(0===this.focusIndex?this.closeMenu():(this.preventIfEvent(n),this.focusIndex=this.focusIndex-1),this.focusAction())},focusNextAction:function(n){if(this.opened){var t=this.$refs.menu.querySelectorAll(m).length-1;this.focusIndex===t?this.closeMenu():(this.preventIfEvent(n),this.focusIndex=this.focusIndex+1),this.focusAction()}},focusFirstAction:function(n){this.opened&&(this.preventIfEvent(n),this.focusIndex=0,this.focusAction())},focusLastAction:function(n){this.opened&&(this.preventIfEvent(n),this.focusIndex=this.$el.querySelectorAll(m).length-1,this.focusAction())},preventIfEvent:function(n){n&&(n.preventDefault(),n.stopPropagation())},execFirstAction:function(n){this.firstActionEvent&&this.firstActionEvent(n)},initActions:function(){this.actions=(this.$slots.default||[]).filter((function(n){return!!n&&!!n.componentOptions}))},onFocus:function(n){this.$emit("focus",n)},onBlur:function(n){this.$emit("blur",n)}}}},5041:function(n,t){"use strict";t.Z={name:"VNodes",functional:!0,render:function(n,t){return t.props.vnodes}}},4828:function(n,t,e){"use strict";var i=e(491);t.default=i.Z},198:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"ActionCaption",props:{title:{type:String,required:!0}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(6429),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(5933),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("li",{staticClass:"app-navigation-caption"},[n._v("\n\t"+n._s(n.title)+"\n")])}),[],!1,null,"2fd4f3eb",null);"function"==typeof f()&&f()(v);var B=v.exports},3056:function(n,t,e){"use strict";e.d(t,{default:function(){return D}});var i=e(723),a=e(1205),r={name:"ActionCheckbox",mixins:[i.Z],props:{id:{type:String,default:function(){return"action-"+(0,a.Z)()},validator:function(n){return""!==n.trim()}},checked:{type:Boolean,default:!1},value:{type:[String,Number],default:""},disabled:{type:Boolean,default:!1}},computed:{isFocusable:function(){return!this.disabled}},methods:{checkInput:function(n){this.$refs.label.click()},onChange:function(n){this.$emit("update:checked",this.$refs.checkbox.checked),this.$emit("change",n),this.$refs.checkbox.checked?this.$emit("check"):this.$emit("uncheck")}}},o=e(3379),s=e.n(o),l=e(7795),c=e.n(l),d=e(569),A=e.n(d),u=e(3565),p=e.n(u),m=e(9216),T=e.n(m),h=e(4589),g=e.n(h),C=e(4105),b={};b.styleTagTransform=g(),b.setAttributes=p(),b.insert=A().bind(null,"head"),b.domAPI=c(),b.insertStyleElement=T(),s()(C.Z,b),C.Z&&C.Z.locals&&C.Z.locals;var f=e(1900),v=e(9012),B=e.n(v),E=(0,f.Z)(r,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action",class:{"action--disabled":n.disabled}},[e("span",{staticClass:"action-checkbox"},[e("input",{ref:"checkbox",staticClass:"checkbox action-checkbox__checkbox",class:{focusable:n.isFocusable},attrs:{id:n.id,disabled:n.disabled,type:"checkbox"},domProps:{checked:n.checked,value:n.value},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.checkInput.apply(null,arguments))},change:n.onChange}}),n._v(" "),e("label",{ref:"label",staticClass:"action-checkbox__label",attrs:{for:n.id}},[n._v(n._s(n.text))]),n._v(" "),n._e()],2)])}),[],!1,null,"cae5b47a",null);"function"==typeof B()&&B()(E);var D=E.exports},538:function(n,t,e){"use strict";e.d(t,{default:function(){return N}});var i=e(2533),a=e.n(i),r=e(723),o=e(1205),s=e(577),l=e(7316),c={name:"ActionInput",components:{ArrowRight:a(),DatetimePicker:s.default,Multiselect:l.default},mixins:[r.Z],props:{id:{type:String,default:function(){return"action-"+(0,o.Z)()},validator:function(n){return""!==n.trim()}},icon:{type:String,default:""},type:{type:String,default:"text",validator:function(n){return["date","datetime-local","month","multiselect","number","password","search","tel","text","time","url","week","color","email"].indexOf(n)>-1}},value:{type:[String,Date,Number],default:""},disabled:{type:Boolean,default:!1},ariaLabel:{type:String,default:""}},computed:{isIconUrl:function(){try{return new URL(this.icon)}catch(n){return!1}},isMultiselectType:function(){return"multiselect"===this.type},isDatePickerType:function(){switch(this.type){case"date":case"month":case"time":return this.type;case"datetime-local":return"datetime"}return!1},isFocusable:function(){return!this.disabled}},methods:{onLeave:function(){this.$refs.datetimepicker&&this.$refs.datetimepicker.$refs.datepicker&&this.$refs.datetimepicker.$refs.datepicker.closePopup()},onInput:function(n){this.$emit("input",n),this.$emit("update:value",n.target?n.target.value:n)},onSubmit:function(n){if(n.preventDefault(),n.stopPropagation(),this.disabled)return!1;this.$emit("submit",n)},onChange:function(n){this.$emit("change",n)}}},d=e(3379),A=e.n(d),u=e(7795),p=e.n(u),m=e(569),T=e.n(m),h=e(3565),g=e.n(h),C=e(9216),b=e.n(C),f=e(4589),v=e.n(f),B=e(3949),E={};E.styleTagTransform=v(),E.setAttributes=g(),E.insert=T().bind(null,"head"),E.domAPI=p(),E.insertStyleElement=b(),A()(B.Z,E),B.Z&&B.Z.locals&&B.Z.locals;var D=e(1900),S=e(2329),y=e.n(S),x=(0,D.Z)(c,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action",class:{"action--disabled":n.disabled}},[e("span",{staticClass:"action-input",class:{"action-input--picker":n.isDatePickerType,"action-input-picker--disabled":n.disabled},on:{mouseleave:n.onLeave}},[n._t("icon",(function(){return[e("span",{staticClass:"action-input__icon",class:[n.isIconUrl?"action-input__icon--url":n.icon],style:{backgroundImage:n.isIconUrl?"url("+n.icon+")":null}})]})),n._v(" "),e("form",{ref:"form",staticClass:"action-input__form",attrs:{disabled:n.disabled},on:{submit:function(t){return t.preventDefault(),n.onSubmit.apply(null,arguments)}}},[n.isDatePickerType?e("DatetimePicker",n._b({ref:"datetimepicker",staticClass:"action-input__picker",attrs:{value:n.value,placeholder:n.text,disabled:n.disabled,type:n.isDatePickerType,"input-class":["mx-input",{focusable:n.isFocusable}]},on:{input:n.onInput,change:n.onChange}},"DatetimePicker",n.$attrs,!1)):n.isMultiselectType?e("Multiselect",n._g(n._b({staticClass:"action-input__multi",class:{focusable:n.isFocusable},attrs:{value:n.value,placeholder:n.text,disabled:n.disabled}},"Multiselect",n.$attrs,!1),n.$listeners)):[e("input",{staticClass:"action-input__submit",attrs:{id:n.id,type:"submit"}}),n._v(" "),e("input",n._b({staticClass:"action-input__input",class:{focusable:n.isFocusable},attrs:{type:n.type,placeholder:n.text,disabled:n.disabled,"aria-label":n.ariaLabel},domProps:{value:n.value},on:{input:n.onInput,change:n.onChange}},"input",n.$attrs,!1)),n._v(" "),e("label",{directives:[{name:"show",rawName:"v-show",value:!n.disabled,expression:"!disabled"}],staticClass:"action-input__label",attrs:{for:n.id}},[e("ArrowRight",{attrs:{size:20,title:"",decorative:""}})],1)]],2)],2)])}),[],!1,null,"3a716b2a",null);"function"==typeof y()&&y()(x);var N=x.exports},1460:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"ActionLink",mixins:[e(9156).Z],props:{href:{type:String,default:"#",required:!0,validator:function(n){try{return new URL(n)}catch(t){return n.startsWith("#")||n.startsWith("/")}}},download:{type:String,default:null},target:{type:String,default:"_self",validator:function(n){return["_blank","_self","_parent","_top"].indexOf(n)>-1}}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(4975),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(1967),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action"},[e("a",{staticClass:"action-link focusable",attrs:{download:n.download,href:n.href,"aria-label":n.ariaLabel,target:n.target,rel:"nofollow noreferrer noopener"},on:{click:n.onClick}},[n._t("icon",(function(){return[e("span",{staticClass:"action-link__icon",class:[n.isIconUrl?"action-link__icon--url":n.icon],style:{backgroundImage:n.isIconUrl?"url("+n.icon+")":null}})]})),n._v(" "),n.title?e("p",[e("strong",{staticClass:"action-link__title"},[n._v("\n\t\t\t\t"+n._s(n.title)+"\n\t\t\t")]),n._v(" "),e("br"),n._v(" "),e("span",{staticClass:"action-link__longtext",domProps:{textContent:n._s(n.text)}})]):n.isLongText?e("p",{staticClass:"action-link__longtext",domProps:{textContent:n._s(n.text)}}):e("span",{staticClass:"action-link__text"},[n._v(n._s(n.text))]),n._v(" "),n._e()],2)])}),[],!1,null,"c8248868",null);"function"==typeof f()&&f()(v);var B=v.exports},5668:function(n,t,e){"use strict";e.d(t,{default:function(){return D}});var i=e(723),a=e(1205),r={name:"ActionRadio",mixins:[i.Z],props:{id:{type:String,default:function(){return"action-"+(0,a.Z)()},validator:function(n){return""!==n.trim()}},checked:{type:Boolean,default:!1},name:{type:String,required:!0},value:{type:[String,Number],default:""},disabled:{type:Boolean,default:!1}},computed:{isFocusable:function(){return!this.disabled}},methods:{toggleInput:function(n){this.$refs.label.click()},onChange:function(n){this.$emit("update:checked",this.$refs.radio.checked),this.$emit("change",n)}}},o=e(3379),s=e.n(o),l=e(7795),c=e.n(l),d=e(569),A=e.n(d),u=e(3565),p=e.n(u),m=e(9216),T=e.n(m),h=e(4589),g=e.n(h),C=e(8631),b={};b.styleTagTransform=g(),b.setAttributes=p(),b.insert=A().bind(null,"head"),b.domAPI=c(),b.insertStyleElement=T(),s()(C.Z,b),C.Z&&C.Z.locals&&C.Z.locals;var f=e(1900),v=e(4444),B=e.n(v),E=(0,f.Z)(r,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action",class:{"action--disabled":n.disabled}},[e("span",{staticClass:"action-radio"},[e("input",{ref:"radio",staticClass:"radio action-radio__radio",class:{focusable:n.isFocusable},attrs:{id:n.id,disabled:n.disabled,name:n.name,type:"radio"},domProps:{checked:n.checked,value:n.value},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.toggleInput.apply(null,arguments))},change:n.onChange}}),n._v(" "),e("label",{ref:"label",staticClass:"action-radio__label",attrs:{for:n.id}},[n._v(n._s(n.text))]),n._v(" "),n._e()],2)])}),[],!1,null,"9e294d1a",null);"function"==typeof B()&&B()(E);var D=E.exports},3434:function(n,t,e){"use strict";e.d(t,{default:function(){return b}});var i={name:"ActionRouter",mixins:[e(9156).Z],props:{to:{type:[String,Object],default:"",required:!0},exact:{type:Boolean,default:!1}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(8477),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=(0,e(1900).Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action"},[e("router-link",{staticClass:"action-router focusable",attrs:{to:n.to,exact:n.exact,"aria-label":n.ariaLabel,rel:"nofollow noreferrer noopener"},nativeOn:{click:function(t){return n.onClick.apply(null,arguments)}}},[n._t("icon",(function(){return[e("span",{staticClass:"action-router__icon",class:[n.isIconUrl?"action-router__icon--url":n.icon],style:{backgroundImage:n.isIconUrl?"url("+n.icon+")":null}})]})),n._v(" "),n.title?e("p",[e("strong",{staticClass:"action-router__title"},[n._v("\n\t\t\t\t"+n._s(n.title)+"\n\t\t\t")]),n._v(" "),e("br"),n._v(" "),e("span",{staticClass:"action-router__longtext",domProps:{textContent:n._s(n.text)}})]):n.isLongText?e("p",{staticClass:"action-router__longtext",domProps:{textContent:n._s(n.text)}}):e("span",{staticClass:"action-router__text"},[n._v(n._s(n.text))]),n._v(" "),n._e()],2)],1)}),[],!1,null,"0dbcc9ff",null),b=C.exports},2768:function(n,t,e){"use strict";e.d(t,{default:function(){return g}});var i=e(3379),a=e.n(i),r=e(7795),o=e.n(r),s=e(569),l=e.n(s),c=e(3565),d=e.n(c),A=e(9216),u=e.n(A),p=e(4589),m=e.n(p),T=e(2103),h={};h.styleTagTransform=m(),h.setAttributes=d(),h.insert=l().bind(null,"head"),h.domAPI=o(),h.insertStyleElement=u(),a()(T.Z,h),T.Z&&T.Z.locals&&T.Z.locals;var g=(0,e(1900).Z)({name:"ActionSeparator"},(function(){var n=this.$createElement;return(this._self._c||n)("li",{staticClass:"action action-separator action--disabled"})}),[],!1,null,"5339ba06",null).exports},1262:function(n,t,e){"use strict";e.d(t,{default:function(){return C}});var i={name:"ActionText",mixins:[e(9156).Z]},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(7727),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=(0,e(1900).Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action"},[e("span",{staticClass:"action-text",on:{click:n.onClick}},[n._t("icon",(function(){return[""!==n.icon?e("span",{staticClass:"action-text__icon",class:[n.isIconUrl?"action-text__icon--url":n.icon],style:{backgroundImage:n.isIconUrl?"url("+n.icon+")":null}}):n._e()]})),n._v(" "),n.title?e("p",[e("strong",{staticClass:"action-text__title"},[n._v("\n\t\t\t\t"+n._s(n.title)+"\n\t\t\t")]),n._v(" "),e("br"),n._v(" "),e("span",{staticClass:"action-text__longtext",domProps:{textContent:n._s(n.text)}})]):n.isLongText?e("p",{staticClass:"action-text__longtext",domProps:{textContent:n._s(n.text)}}):e("span",{staticClass:"action-text__text"},[n._v(n._s(n.text))]),n._v(" "),n._e()],2)])}),[],!1,null,"304eec30",null).exports},9975:function(n,t,e){"use strict";e.d(t,{default:function(){return y}});var i=e(2533),a=e.n(i),r=e(9156),o=e(1205),s={name:"ActionTextEditable",components:{ArrowRight:a()},mixins:[r.Z],props:{id:{type:String,default:function(){return"action-"+(0,o.Z)()},validator:function(n){return""!==n.trim()}},disabled:{type:Boolean,default:!1},value:{type:String,default:""}},computed:{isFocusable:function(){return!this.disabled}},methods:{onInput:function(n){this.$emit("input",n),this.$emit("update:value",n.target.value)},onSubmit:function(n){if(n.preventDefault(),n.stopPropagation(),this.disabled)return!1;this.$emit("submit",n)}}},l=e(3379),c=e.n(l),d=e(7795),A=e.n(d),u=e(569),p=e.n(u),m=e(3565),T=e.n(m),h=e(9216),g=e.n(h),C=e(4589),b=e.n(C),f=e(2476),v={};v.styleTagTransform=b(),v.setAttributes=T(),v.insert=p().bind(null,"head"),v.domAPI=A(),v.insertStyleElement=g(),c()(f.Z,v),f.Z&&f.Z.locals&&f.Z.locals;var B=e(1900),E=e(6616),D=e.n(E),S=(0,B.Z)(s,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"action",class:{"action--disabled":n.disabled}},[e("span",{staticClass:"action-text-editable",on:{click:n.onClick}},[e("span",{staticClass:"action-text-editable__icon",class:[n.isIconUrl?"action-text-editable__icon--url":n.icon],style:{backgroundImage:n.isIconUrl?"url("+n.icon+")":null}}),n._v(" "),e("form",{ref:"form",staticClass:"action-text-editable__form",attrs:{disabled:n.disabled},on:{submit:function(t){return t.preventDefault(),n.onSubmit.apply(null,arguments)}}},[e("input",{staticClass:"action-text-editable__submit",attrs:{id:n.id,type:"submit"}}),n._v(" "),n.title?e("strong",{staticClass:"action-text__title"},[n._v("\n\t\t\t\t"+n._s(n.title)+"\n\t\t\t")]):n._e(),n._v(" "),e("textarea",n._b({class:["action-text-editable__textarea",{focusable:n.isFocusable}],attrs:{disabled:n.disabled},domProps:{value:n.value},on:{input:n.onInput}},"textarea",n.$attrs,!1)),n._v(" "),e("label",{directives:[{name:"show",rawName:"v-show",value:!n.disabled,expression:"!disabled"}],staticClass:"action-text-editable__label",attrs:{for:n.id}},[e("ArrowRight",{attrs:{size:20,title:"",decorative:""}})],1)])])])}),[],!1,null,"b3a35a96",null);"function"==typeof D()&&D()(S);var y=S.exports},5860:function(n,t,e){"use strict";var i=e(3083);t.default=i.Z},1582:function(n,t,e){"use strict";e.d(t,{default:function(){return Z}}),__webpack_require__(/*! splitpanes/dist/splitpanes.css */ "./node_modules/splitpanes/dist/splitpanes.css");var i=e(542),a=e(7672),r=__webpack_require__(/*! splitpanes */ "./node_modules/splitpanes/dist/splitpanes.common.js"),o=e(2640),s=e.n(o),l=e(932),c={name:"AppDetailsToggle",computed:{title:function(){return(0,l.t)("Go back to the list")}},beforeMount:function(){this.toggleAppNavigationButton(!0)},beforeDestroy:function(){this.toggleAppNavigationButton(!1)},methods:{toggleAppNavigationButton:function(){var n=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=document.querySelector(".app-navigation .app-navigation-toggle");t&&(t.style.display=n?"none":null,!0===n&&(0,i.emit)("toggle-navigation",{open:!1}))}}},d=c,A=e(3379),u=e.n(A),p=e(7795),m=e.n(p),T=e(569),h=e.n(T),g=e(3565),C=e.n(g),b=e(9216),f=e.n(b),v=e(4589),B=e.n(v),E=e(4707),D={};D.styleTagTransform=B(),D.setAttributes=C(),D.insert=h().bind(null,"head"),D.domAPI=m(),D.insertStyleElement=f(),u()(E.Z,D),E.Z&&E.Z.locals&&E.Z.locals;var S=e(1900),y=(0,S.Z)(d,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("a",{directives:[{name:"tooltip",rawName:"v-tooltip",value:n.title,expression:"title"}],staticClass:"app-details-toggle icon-confirm",attrs:{href:"#"}})}),[],!1,null,"24f4ece3",null).exports,x=e(334),N=(0,a.getBuilder)("nextcloud").persist().build(),k={name:"AppContent",components:{AppDetailsToggle:y,Pane:r.Pane,Splitpanes:r.Splitpanes},mixins:[x.default],props:{allowSwipeNavigation:{type:Boolean,default:!0},listSize:{type:Number,default:20},listMinWidth:{type:Number,default:15},listMaxWidth:{type:Number,default:40},paneConfigKey:{type:String,default:""},showDetails:{type:Boolean,default:!0}},data:function(){return{contentHeight:0,hasList:!1,listPaneSize:this.restorePaneConfig()}},computed:{paneConfigID:function(){if(""!==this.paneConfigKey)return"pane-list-size-".concat(this.paneConfigKey);try{return"pane-list-size-".concat("photos")}catch(n){return console.info("[INFO] AppContent:","falling back to global nextcloud pane config"),"pane-list-size-nextcloud"}},detailsPaneSize:function(){return this.listPaneSize?100-this.listPaneSize:this.paneDefaults.details.size},paneDefaults:function(){return{list:{size:this.listSize,min:this.listMinWidth,max:this.listMaxWidth},details:{size:100-this.listSize,min:100-this.listMaxWidth,max:100-this.listMinWidth}}}},updated:function(){this.checkListSlot()},mounted:function(){this.allowSwipeNavigation&&(this.mc=new(s())(this.$el,{cssProps:{userSelect:"text"}}),this.mc.on("swipeleft swiperight",this.handleSwipe)),this.checkListSlot(),this.restorePaneConfig()},beforeDestroy:function(){this.mc.off("swipeleft swiperight",this.handleSwipe)},methods:{handleSwipe:function(n){var t=n.srcEvent.pageX-n.deltaX,e=Math.abs(n.deltaX)>70;e&&t<40?(0,i.emit)("toggle-navigation",{open:!0}):e&&t<340&&(0,i.emit)("toggle-navigation",{open:!1})},handlePaneResize:function(n){var t=parseInt(n[0].size,10);N.setItem(this.paneConfigID,JSON.stringify(t)),this.listPaneSize=t,console.debug("AppContent pane config",t)},checkListSlot:function(){var n=!!this.$slots.list;this.hasList!==n&&(this.hasList=n)},restorePaneConfig:function(){var n=parseInt(N.getItem(this.paneConfigID),10);if(!isNaN(n)&&n!==this.listPaneSize)return console.debug("AppContent pane config",n),this.listPaneSize=n,n},hideDetails:function(){this.$emit("update:showDetails",!1)}}},R=e(4247),F={};F.styleTagTransform=B(),F.setAttributes=C(),F.insert=h().bind(null,"head"),F.domAPI=m(),F.insertStyleElement=f(),u()(R.Z,F),R.Z&&R.Z.locals&&R.Z.locals;var w=e(1871),O=e.n(w),_=(0,S.Z)(k,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("main",{staticClass:"app-content no-snapper",attrs:{id:"app-content-vue"}},[n.hasList?[n.isMobile?e("div",{staticClass:"app-content-wrapper app-content-wrapper--mobile",class:n.showDetails?"app-content-wrapper--show-details":"app-content-wrapper--show-list"},[n.hasList&&n.showDetails?e("AppDetailsToggle",{nativeOn:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.hideDetails.apply(null,arguments)}}}):n._e(),n._v(" "),n._t("list"),n._v(" "),n._t("default")],2):e("div",{staticClass:"app-content-wrapper"},[e("Splitpanes",{staticClass:"default-theme",on:{resized:n.handlePaneResize}},[e("Pane",{staticClass:"splitpanes__pane-list",attrs:{size:n.listPaneSize||n.paneDefaults.list.size,"min-size":n.paneDefaults.list.min,"max-size":n.paneDefaults.list.max}},[n._t("list")],2),n._v(" "),e("Pane",{staticClass:"splitpanes__pane-details",attrs:{size:n.detailsPaneSize,"min-size":n.paneDefaults.details.min,"max-size":n.paneDefaults.details.max}},[n._t("default")],2)],1)],1)]:n._t("default")],2)}),[],!1,null,"61c97b1e",null);"function"==typeof O()&&O()(_);var Z=_.exports},7864:function(n,t,e){"use strict";e.d(t,{default:function(){return i}});var i=(0,e(1900).Z)({name:"AppContentDetails"},(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",{staticClass:"app-content-details"},[n._t("default")],2)}),[],!1,null,null,null).exports},637:function(n,t,e){"use strict";e.d(t,{default:function(){return a}});var i={name:"AppContentList",props:{selection:{type:Boolean,default:!1},showDetails:{type:Boolean,default:!1}}},a=(0,e(1900).Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",{staticClass:"app-content-list",class:{selection:n.selection,showdetails:n.showDetails}},[n._t("default")],2)}),[],!1,null,null,null).exports},8916:function(n,t,e){"use strict";e.d(t,{default:function(){return F}});var i=e(542),a=e(3083),r=e(491),o=e(932),s=__webpack_require__(/*! vue-material-design-icons/Menu */ "./node_modules/vue-material-design-icons/Menu.vue"),l=e.n(s),c={name:"AppNavigationToggle",components:{Actions:a.Z,ActionButton:r.Z,Menu:l()},props:{open:{type:Boolean,required:!0}},computed:{label:function(){return this.open?(0,o.t)("Close navigation"):(0,o.t)("Open navigation")}},methods:{toggleNavigation:function(){this.$emit("update:open",!this.open)}}},d=e(3379),A=e.n(d),u=e(7795),p=e.n(u),m=e(569),T=e.n(m),h=e(3565),g=e.n(h),C=e(9216),b=e.n(C),f=e(4589),v=e.n(f),B=e(805),E={};E.styleTagTransform=v(),E.setAttributes=g(),E.insert=T().bind(null,"head"),E.domAPI=p(),E.insertStyleElement=b(),A()(B.Z,E),B.Z&&B.Z.locals&&B.Z.locals;var D=e(1900),S={name:"AppNavigation",components:{AppNavigationToggle:(0,D.Z)(c,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("Actions",{staticClass:"app-navigation-toggle"},[e("ActionButton",{attrs:{"aria-expanded":n.open?"true":"false","aria-controls":"app-navigation-vue"},on:{click:n.toggleNavigation},scopedSlots:n._u([{key:"icon",fn:function(){return[e("Menu",{attrs:{size:20,title:"",decorative:""}})]},proxy:!0}])},[n._v("\n\t\t"+n._s(n.label)+"\n\t")])],1)}),[],!1,null,"31c70ec3",null).exports},mixins:[e(334).default],data:function(){return{open:!0}},watch:{isMobile:function(){this.open=!this.isMobile}},mounted:function(){(0,i.subscribe)("toggle-navigation",this.toggleNavigationByEventBus),(0,i.emit)("navigation-toggled",{open:this.open})},unmounted:function(){this.mc.off("swipeleft swiperight"),this.mc.destroy(),(0,i.unsubscribe)("toggle-navigation",this.toggleNavigationByEventBus)},methods:{toggleNavigation:function(n){var t=this;this.open=void 0===n?!this.open:n;var e=getComputedStyle(document.body),a=parseInt(e.getPropertyValue("--animation-quick"))||100;setTimeout((function(){(0,i.emit)("navigation-toggled",{open:t.open})}),1.5*a)},toggleNavigationByEventBus:function(n){var t=n.open;this.toggleNavigation(t)}}},y=e(2400),x={};x.styleTagTransform=v(),x.setAttributes=g(),x.insert=T().bind(null,"head"),x.domAPI=p(),x.insertStyleElement=b(),A()(y.Z,x),y.Z&&y.Z.locals&&y.Z.locals;var N=e(8347),k=e.n(N),R=(0,D.Z)(S,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"app-navigation",class:{"app-navigation--close":!n.open},attrs:{id:"app-navigation-vue",role:"navigation"}},[e("AppNavigationToggle",{attrs:{open:n.open},on:{"update:open":n.toggleNavigation}}),n._v(" "),n._t("default"),n._v(" "),e("ul",{staticClass:"app-navigation__list"},[n._t("list")],2),n._v(" "),n._t("footer")],2)}),[],!1,null,"146e0c06",null);"function"==typeof k()&&k()(R);var F=R.exports},5485:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"AppNavigationCaption",components:{Actions:e(3083).Z},props:{title:{type:String,required:!0}},computed:{hasActions:function(){return!!this.$slots.actions}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(4609),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(4795),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"app-navigation-caption"},[e("div",{staticClass:"app-navigation-caption__title"},[n._v("\n\t\t"+n._s(n.title)+"\n\t")]),n._v(" "),n.hasActions?e("div",{staticClass:"app-navigation-caption__actions"},[e("Actions",n._b({},"Actions",n.$attrs,!1),[n._t("actions")],2)],1):n._e()])}),[],!1,null,"45d39094",null);"function"==typeof f()&&f()(v);var B=v.exports},1599:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"AppNavigationCounter",props:{highlighted:{type:Boolean,default:!1}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(9325),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(7808),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",{staticClass:"app-navigation-entry__counter",class:{"app-navigation-entry__counter--highlighted":n.highlighted}},[n._t("default")],2)}),[],!1,null,"3e9952b7",null);"function"==typeof f()&&f()(v);var B=v.exports},1466:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"AppNavigationIconBullet",props:{color:{type:String,required:!0,validator:function(n){return/^#?([0-9A-F]{3}){1,2}$/i.test(n)}}},computed:{formattedColor:function(){return this.color.startsWith("#")?this.color:"#"+this.color}},methods:{onClick:function(n){this.$emit("click",n)}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(533),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(2930),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"app-navigation-entry__icon-bullet",on:{click:n.onClick}},[e("div",{style:{backgroundColor:n.formattedColor}})])}),[],!1,null,"71402848",null);"function"==typeof f()&&f()(v);var B=v.exports},3097:function(n,t,e){"use strict";e.d(t,{default:function(){return M}});var i=e(453),a=e(3083),r=e(491),o=__webpack_require__(/*! vue-material-design-icons/MenuDown */ "./node_modules/vue-material-design-icons/MenuDown.vue"),s={name:"AppNavigationIconCollapsible",components:{MenuDown:e.n(o)()},props:{open:{type:Boolean,default:!0}},methods:{onClick:function(n){this.$emit("click",n)}}},l=e(3379),c=e.n(l),d=e(7795),A=e.n(d),u=e(569),p=e.n(u),m=e(3565),T=e.n(m),h=e(9216),g=e.n(h),C=e(4589),b=e.n(C),f=e(6456),v={};v.styleTagTransform=b(),v.setAttributes=T(),v.insert=p().bind(null,"head"),v.domAPI=A(),v.insertStyleElement=g(),c()(f.Z,v),f.Z&&f.Z.locals&&f.Z.locals;var B=e(1900),E=(0,B.Z)(s,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("button",{staticClass:"icon-collapse",class:{"icon-collapse--rotated":n.open},attrs:{type:"button"},on:{click:n.onClick}},[e("MenuDown",{attrs:{size:20,title:"",decorative:""}})],1)}),[],!1,null,"4b0d387e",null).exports,D=e(334),S=e(2569),y=e(932),x=__webpack_require__(/*! vue-material-design-icons/Pencil */ "./node_modules/vue-material-design-icons/Pencil.vue"),N=e.n(x),k=__webpack_require__(/*! vue-material-design-icons/Undo */ "./node_modules/vue-material-design-icons/Undo.vue"),R=e.n(k),F={name:"AppNavigationItem",components:{Actions:a.Z,ActionButton:r.Z,AppNavigationIconCollapsible:E,InputConfirmCancel:S.Z,Pencil:N(),Undo:R()},directives:{ClickOutside:i.directive},mixins:[D.default],props:{title:{type:String,required:!0},icon:{type:String,default:""},loading:{type:Boolean,default:!1},to:{type:[String,Object],default:""},exact:{type:Boolean,default:!1},allowCollapse:{type:Boolean,default:!1},editable:{type:Boolean,default:!1},editLabel:{type:String,default:""},editPlaceholder:{type:String,default:""},pinned:{type:Boolean,default:!1},undo:{type:Boolean,default:!1},open:{type:Boolean,default:!1},menuOpen:{type:Boolean,default:!1},forceMenu:{type:Boolean,default:!1},menuIcon:{type:String,default:void 0},menuPlacement:{type:String,default:"bottom"},ariaDescription:{type:String,default:null}},data:function(){return{editingValue:"",opened:this.open,editingActive:!1,hasChildren:!1}},computed:{collapsible:function(){return this.allowCollapse&&!!this.$slots.default},isIconShown:function(){return!this.collapsible||this.collapsible&&!this.isMobile},canHaveChildren:function(){return"AppNavigationItem"!==this.$parent.$options._componentTag},hasUtils:function(){return!this.editing&&!!(this.$slots.actions||this.$slots.counter||this.editable||this.undo)},navElement:function(){return this.to?{is:"router-link",tag:"li",to:this.to,exact:this.exact}:{is:"li"}},isActive:function(){return this.to&&this.$route===this.to},editButtonAriaLabel:function(){return this.editLabel?this.editLabel:(0,y.t)("Edit item")},undoButtonAriaLabel:function(){return(0,y.t)("Undo changes")}},watch:{open:function(n){this.opened=n}},created:function(){this.updateSlotInfo()},beforeUpdate:function(){this.updateSlotInfo()},methods:{onMenuToggle:function(n){this.$emit("update:menuOpen",n)},toggleCollapse:function(){this.opened=!this.opened,this.$emit("update:open",this.opened)},onClick:function(n){this.$emit("click",n)},handleEdit:function(){var n=this;this.editingValue=this.title,this.editingActive=!0,this.onMenuToggle(!1),this.$nextTick((function(){n.$refs.editingInput.focusInput()}))},cancelEditing:function(){this.editingActive=!1},handleEditingDone:function(){this.$emit("update:title",this.editingValue),this.editingValue="",this.editingActive=!1},handleUndo:function(){this.$emit("undo")},updateSlotInfo:function(){this.hasChildren=!!this.$slots.default}}},w=e(183),O={};O.styleTagTransform=b(),O.setAttributes=T(),O.insert=p().bind(null,"head"),O.domAPI=A(),O.insertStyleElement=g(),c()(w.Z,O),w.Z&&w.Z.locals&&w.Z.locals;var _=e(7091),Z=e.n(_),Y=(0,B.Z)(F,(function(){var n,t=this,e=t.$createElement,i=t._self._c||e;return i("nav-element",t._b({staticClass:"app-navigation-entry",class:{"app-navigation-entry--no-icon":!t.isIconShown,"app-navigation-entry--opened":t.opened,"app-navigation-entry--pinned":t.pinned,"app-navigation-entry--editing":t.editingActive,"app-navigation-entry--deleted":t.undo,"app-navigation-entry--collapsible":t.collapsible,active:t.isActive}},"nav-element",t.navElement,!1),[t.undo?t._e():i("a",{staticClass:"app-navigation-entry-link",attrs:{"aria-description":t.ariaDescription,href:"#"},on:{click:t.onClick}},[i("div",{staticClass:"app-navigation-entry-icon",class:(n={"icon-loading-small":t.loading},n[t.icon]=t.icon&&t.isIconShown,n)},[t._t("icon")],2),t._v(" "),t.editingActive?t._e():i("span",{staticClass:"app-navigation-entry__title",attrs:{title:t.title}},[t._v("\n\t\t\t"+t._s(t.title)+"\n\t\t")]),t._v(" "),t.editingActive?i("div",{staticClass:"editingContainer"},[i("InputConfirmCancel",{ref:"editingInput",attrs:{placeholder:""!==t.editPlaceholder?t.editPlaceholder:t.title},on:{cancel:t.cancelEditing,confirm:t.handleEditingDone},model:{value:t.editingValue,callback:function(n){t.editingValue=n},expression:"editingValue"}})],1):t._e()]),t._v(" "),t.collapsible?i("AppNavigationIconCollapsible",{attrs:{open:t.opened},on:{click:function(n){return n.preventDefault(),n.stopPropagation(),t.toggleCollapse.apply(null,arguments)}}}):t._e(),t._v(" "),t.undo?i("div",{staticClass:"app-navigation-entry__deleted"},[i("div",{staticClass:"app-navigation-entry__deleted-description"},[t._v("\n\t\t\t"+t._s(t.title)+"\n\t\t")])]):t._e(),t._v(" "),t.hasUtils&&!t.editingActive?i("div",{staticClass:"app-navigation-entry__utils"},[t.$slots.counter?i("div",{staticClass:"app-navigation-entry__counter-wrapper"},[t._t("counter")],2):t._e(),t._v(" "),i("Actions",{attrs:{"menu-align":"right",placement:t.menuPlacement,open:t.menuOpen,"force-menu":t.forceMenu,"default-icon":t.menuIcon},on:{"update:open":t.onMenuToggle},scopedSlots:t._u([{key:"icon",fn:function(){return[t._t("menu-icon")]},proxy:!0}],null,!0)},[t._v(" "),t.editable&&!t.editingActive?i("ActionButton",{attrs:{"aria-label":t.editButtonAriaLabel},on:{click:t.handleEdit},scopedSlots:t._u([{key:"icon",fn:function(){return[i("Pencil",{attrs:{size:20,decorative:""}})]},proxy:!0}],null,!1,2864695315)},[t._v("\n\t\t\t\t"+t._s(t.editLabel)+"\n\t\t\t")]):t._e(),t._v(" "),t.undo?i("ActionButton",{attrs:{"aria-label":t.undoButtonAriaLabel},on:{click:t.handleUndo},scopedSlots:t._u([{key:"icon",fn:function(){return[i("Undo",{attrs:{size:20,decorative:""}})]},proxy:!0}],null,!1,4006107262)}):t._e(),t._v(" "),t._t("actions")],2)],1):t._e(),t._v(" "),t.canHaveChildren&&t.hasChildren?i("ul",{staticClass:"app-navigation-entry__children"},[t._t("default")],2):t._e(),t._v(" "),t._t("extra")],2)}),[],!1,null,null,null);"function"==typeof Z()&&Z()(Y);var M=Y.exports},9273:function(n,t,e){"use strict";e.d(t,{default:function(){return C}});var i={props:{buttonId:{type:String,required:!1,default:""},buttonClass:{type:[String,Array,Object],required:!1,default:""},disabled:{type:Boolean,required:!1,default:!1},text:{type:String,required:!0}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(7004),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=(0,e(1900).Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"app-navigation-new"},[e("button",{class:n.buttonClass,attrs:{id:n.buttonId,disabled:n.disabled,type:"button"},on:{click:function(t){return n.$emit("click")}}},[n._v("\n\t\t"+n._s(n.text)+"\n\t")])])}),[],!1,null,"7286e935",null).exports},5240:function(n,t,e){"use strict";e.d(t,{default:function(){return D}});var i=e(453),a=e(334),r={name:"AppNavigationNewItem",components:{InputConfirmCancel:e(2569).Z},directives:{ClickOutside:i.directive},mixins:[a.default],props:{title:{type:String,required:!0},icon:{type:String,default:""},loading:{type:Boolean,default:!1},editLabel:{type:String,default:""},editPlaceholder:{type:String,default:""}},data:function(){return{newItemValue:"",newItemActive:!1}},methods:{handleNewItem:function(){var n=this;this.loading||(this.newItemActive=!0,this.$nextTick((function(){n.$refs.newItemInput.focusInput()})))},cancelNewItem:function(){this.newItemActive=!1},handleNewItemDone:function(){this.$emit("new-item",this.newItemValue),this.newItemValue="",this.newItemActive=!1}}},o=e(3379),s=e.n(o),l=e(7795),c=e.n(l),d=e(569),A=e.n(d),u=e(3565),p=e.n(u),m=e(9216),T=e.n(m),h=e(4589),g=e.n(h),C=e(8704),b={};b.styleTagTransform=g(),b.setAttributes=p(),b.insert=A().bind(null,"head"),b.domAPI=c(),b.insertStyleElement=T(),s()(C.Z,b),C.Z&&C.Z.locals&&C.Z.locals;var f=e(1900),v=e(4773),B=e.n(v),E=(0,f.Z)(r,(function(){var n,t=this,e=t.$createElement,i=t._self._c||e;return i("li",{staticClass:"app-navigation-entry",class:{"app-navigation-entry--newItemActive":t.newItemActive}},[i("div",{staticClass:"app-navigation-entry-div",on:{click:t.handleNewItem}},[i("div",{staticClass:"app-navigation-entry-icon",class:(n={"icon-loading-small":t.loading},n[t.icon]=!t.loading,n)},[t.loading?t._e():t._t("icon")],2),t._v(" "),t.newItemActive?t._e():i("span",{staticClass:"app-navigation-new-item__title",attrs:{title:t.title}},[t._v("\n\t\t\t"+t._s(t.title)+"\n\t\t")]),t._v(" "),t.newItemActive?i("div",{staticClass:"newItemContainer"},[i("InputConfirmCancel",{ref:"newItemInput",attrs:{placeholder:""!==t.editPlaceholder?t.editPlaceholder:t.title},on:{cancel:t.cancelNewItem,confirm:t.handleNewItemDone},model:{value:t.newItemValue,callback:function(n){t.newItemValue=n},expression:"newItemValue"}})],1):t._e()])])}),[],!1,null,null,null);"function"==typeof B()&&B()(E);var D=E.exports},8906:function(n,t,e){"use strict";e.d(t,{default:function(){return E}});var i=e(453),a=e(932),r=e(3351),o=__webpack_require__(/*! vue-material-design-icons/Cog */ "./node_modules/vue-material-design-icons/Cog.vue"),s=e.n(o),l={directives:{ClickOutside:i.directive},components:{Cog:s()},mixins:[r.yd],props:{title:{type:String,required:!1,default:(0,a.t)("Settings")}},data:function(){return{open:!1,clickOutsideConfig:{handler:this.closeMenu,middleware:this.clickOutsideMiddleware}}},methods:{toggleMenu:function(){this.open=!this.open},closeMenu:function(){this.open=!1}}},c=e(3379),d=e.n(c),A=e(7795),u=e.n(A),p=e(569),m=e.n(p),T=e(3565),h=e.n(T),g=e(9216),C=e.n(g),b=e(4589),f=e.n(b),v=e(8323),B={};B.styleTagTransform=f(),B.setAttributes=h(),B.insert=m().bind(null,"head"),B.domAPI=u(),B.insertStyleElement=C(),d()(v.Z,B),v.Z&&v.Z.locals&&v.Z.locals;var E=(0,e(1900).Z)(l,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{directives:[{name:"click-outside",rawName:"v-click-outside",value:n.clickOutsideConfig,expression:"clickOutsideConfig"}],class:{open:n.open},attrs:{id:"app-settings"}},[e("div",{attrs:{id:"app-settings__header"}},[e("button",{staticClass:"settings-button",attrs:{type:"button"},on:{click:n.toggleMenu}},[e("Cog",{staticClass:"settings-button__icon",attrs:{size:20,decorative:""}}),n._v(" "),e("span",{staticClass:"settings-button__label"},[n._v(n._s(n.title))])],1)]),n._v(" "),e("transition",{attrs:{name:"slide-up"}},[e("div",{directives:[{name:"show",rawName:"v-show",value:n.open,expression:"open"}],attrs:{id:"app-settings__content"}},[n._t("default")],2)])],1)}),[],!1,null,"20bf47dc",null).exports},6005:function(n,t,e){"use strict";e.d(t,{default:function(){return g}});var i=e(3379),a=e.n(i),r=e(7795),o=e.n(r),s=e(569),l=e.n(s),c=e(3565),d=e.n(c),A=e(9216),u=e.n(A),p=e(4589),m=e.n(p),T=e(6381),h={};h.styleTagTransform=m(),h.setAttributes=d(),h.insert=l().bind(null,"head"),h.domAPI=o(),h.insertStyleElement=u(),a()(T.Z,h),T.Z&&T.Z.locals&&T.Z.locals;var g=(0,e(1900).Z)({name:"AppNavigationSpacer"},(function(){var n=this.$createElement;return(this._self._c||n)("li",{staticClass:"app-navigation-spacer"})}),[],!1,null,"42195cc8",null).exports},3257:function(n,t,e){"use strict";e.d(t,{default:function(){return k}});var i=e(4113),a=e(334),r=e(932),o=e(3465),s=e.n(o);function l(n){return function(n){if(Array.isArray(n))return c(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,t){if(n){if("string"==typeof n)return c(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?c(n,t):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,i=new Array(t);e1},currentTabIndex:function(){var n=this;return this.tabs.findIndex((function(t){return t.id===n.activeTab}))}},watch:{active:function(n){n!==this.activeTab&&this.updateActive()},children:function(){this.updateTabs()}},mounted:function(){this.updateTabs(),this.children=this.$children},methods:{setActive:function(n){this.activeTab=n,this.$emit("update:active",this.activeTab)},focusPreviousTab:function(){this.currentTabIndex>0&&this.setActive(this.tabs[this.currentTabIndex-1].id),this.focusActiveTab()},focusNextTab:function(){this.currentTabIndex0?this.tabs[0].id:""},hasMdIcon:function(n){var t;return null==n||null===(t=n.$slots)||void 0===t?void 0:t.icon},updateTabs:function(){if(this.$slots.default){var n=this.$slots.default.filter((function(n){return n.tag||n.text.trim()})),t=[],e=n.reduce((function(n,e){var i,a=e.componentInstance;return d(null==a?void 0:a.name)&&A(null==a?void 0:a.id)&&(A(null==a?void 0:a.icon)||null!=a&&null!==(i=a.$slots)&&void 0!==i&&i.icon)?n.push(a):t.push(e),n}),[]);0!==e.length&&e.length!==n.length&&(l().util.warn("Mixing tabs and non-tab-content is not possible."),t.map((function(n){return console.debug("Ignoring invalid tab",n)}))),this.tabs=e.sort((function(n,t){var e=n.order||0,i=t.order||0;return e===i?OC.Util.naturalSortCompare(n.name,t.name):e-i})),this.tabs.length>0&&this.updateActive()}else this.tabs=[]}}},p=e(3379),m=e.n(p),T=e(7795),h=e.n(T),g=e(569),C=e.n(g),b=e(3565),f=e.n(b),v=e(9216),B=e.n(v),E=e(4589),D=e.n(E),S=e(1128),y={};y.styleTagTransform=D(),y.setAttributes=f(),y.insert=C().bind(null,"head"),y.domAPI=h(),y.insertStyleElement=B(),m()(S.Z,y),S.Z&&S.Z.locals&&S.Z.locals;var x=e(1900),N=(0,x.Z)(u,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"app-sidebar-tabs"},[n.hasMultipleTabs?e("nav",{staticClass:"app-sidebar-tabs__nav",on:{keydown:[function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"left",37,t.key,["Left","ArrowLeft"])||"button"in t&&0!==t.button||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.focusPreviousTab.apply(null,arguments))},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"right",39,t.key,["Right","ArrowRight"])||"button"in t&&2!==t.button||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.focusNextTab.apply(null,arguments))},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"tab",9,t.key,"Tab")||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.focusActiveTabContent.apply(null,arguments))},function(t){return t.type.indexOf("key")||33===t.keyCode?t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.focusFirstTab.apply(null,arguments)):null},function(t){return t.type.indexOf("key")||34===t.keyCode?t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:(t.preventDefault(),n.focusLastTab.apply(null,arguments)):null}]}},[e("ul",n._l(n.tabs,(function(t){return e("li",{key:t.id,staticClass:"app-sidebar-tabs__tab"},[e("a",{class:{active:n.activeTab===t.id},attrs:{id:t.id,"aria-controls":"tab-"+t.id,"aria-selected":n.activeTab===t.id,"data-id":t.id,href:"#tab-"+t.id,tabindex:n.activeTab===t.id?null:-1,role:"tab"},on:{click:function(e){return e.preventDefault(),n.setActive(t.id)}}},[e("span",{staticClass:"app-sidebar-tabs__tab-icon"},[n.hasMdIcon(t)?e("VNodes",{attrs:{vnodes:t.$slots.icon[0]}}):e("span",{class:t.icon})],1),n._v("\n\t\t\t\t\t"+n._s(t.name)+"\n\t\t\t\t")])])})),0)]):n._e(),n._v(" "),e("div",{staticClass:"app-sidebar-tabs__content",class:{"app-sidebar-tabs__content--multiple":n.hasMultipleTabs}},[n._t("default")],2)])}),[],!1,null,"15932673",null),k=N.exports,R=e(5576),F=e(932),w=e(453),O=e(5978),_=e.n(O),Z=__webpack_require__(/*! vue-material-design-icons/Star */ "./node_modules/vue-material-design-icons/Star.vue"),Y=e.n(Z),M={name:"AppSidebar",components:{Actions:i.default,AppSidebarTabs:k,EmptyContent:R.Z,Close:_(),Star:Y()},directives:{focus:a.default,linkify:r.default,ClickOutside:w.directive,Tooltip:o.default},props:{active:{type:String,default:""},title:{type:String,default:"",required:!0},titleEditable:{type:Boolean,default:!1},titlePlaceholder:{type:String,default:""},subtitle:{type:String,default:""},subtitleTooltip:{type:String,default:""},background:{type:String,default:""},starred:{type:Boolean,default:null},starLoading:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},empty:{type:Boolean,default:!1},forceMenu:{type:Boolean,default:!1},linkifyTitle:{type:Boolean,default:!1},titleTooltip:{type:String,default:""}},data:function(){return{closeTranslated:(0,F.t)("Close"),isStarred:this.starred}},computed:{canStar:function(){return null!==this.isStarred},hasFigure:function(){return this.$slots.header||this.background},hasFigureClickListener:function(){return this.$listeners["figure-click"]}},watch:{starred:function(){this.isStarred=this.starred}},beforeDestroy:function(){this.$emit("closed")},methods:{onBeforeEnter:function(n){this.$emit("opening",n)},onAfterEnter:function(n){this.$emit("opened",n)},onBeforeLeave:function(n){this.$emit("closing",n)},onAfterLeave:function(n){this.$emit("closed",n)},closeSidebar:function(n){this.$emit("close",n)},onFigureClick:function(n){this.$emit("figure-click",n)},toggleStarred:function(){this.isStarred=!this.isStarred,this.$emit("update:starred",this.isStarred)},editTitle:function(){var n=this;this.$emit("update:titleEditable",!0),this.titleEditable&&this.$nextTick((function(){return n.$refs.titleInput.focus()}))},onTitleInput:function(n){this.$emit("update:title",n.target.value)},onSubmitTitle:function(n){this.$emit("update:titleEditable",!1),this.$emit("submit-title",n)},onDismissEditing:function(){this.$emit("update:titleEditable",!1),this.$emit("dismiss-editing")},onUpdateActive:function(n){this.$emit("update:active",n)}}},I=e(8711),G={};G.styleTagTransform=D(),G.setAttributes=f(),G.insert=C().bind(null,"head"),G.domAPI=h(),G.insertStyleElement=B(),m()(I.Z,G),I.Z&&I.Z.locals&&I.Z.locals;var L=e(7464),$={};$.styleTagTransform=D(),$.setAttributes=f(),$.insert=C().bind(null,"head"),$.domAPI=h(),$.insertStyleElement=B(),m()(L.Z,$),L.Z&&L.Z.locals&&L.Z.locals;var U=e(9976),j=e.n(U),P=(0,x.Z)(M,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("transition",{attrs:{appear:"",name:"slide-right"},on:{"before-enter":n.onBeforeEnter,"after-enter":n.onAfterEnter,"before-leave":n.onBeforeLeave,"after-leave":n.onAfterLeave}},[e("aside",{staticClass:"app-sidebar",attrs:{id:"app-sidebar-vue"}},[e("header",{staticClass:"app-sidebar-header",class:{"app-sidebar-header--with-figure":n.hasFigure,"app-sidebar-header--compact":n.compact}},[e("a",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.closeTranslated,expression:"closeTranslated",modifiers:{auto:!0}}],staticClass:"app-sidebar__close",attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),n.closeSidebar.apply(null,arguments)}}},[e("Close",{staticClass:"app-sidebar__close-icon",attrs:{size:20,decorative:""}})],1),n._v(" "),e("div",{staticClass:"app-sidebar-header__info"},[n.hasFigure&&!n.empty?e("div",{staticClass:"app-sidebar-header__figure",class:{"app-sidebar-header__figure--with-action":n.hasFigureClickListener},style:{backgroundImage:"url("+n.background+")"},on:{click:n.onFigureClick}},[n._t("header")],2):n._e(),n._v(" "),n.empty?n._e():e("div",{staticClass:"app-sidebar-header__desc",class:{"app-sidebar-header__desc--with-tertiary-action":n.canStar||n.$slots["tertiary-actions"],"app-sidebar-header__desc--editable":n.titleEditable&&!n.subtitle,"app-sidebar-header__desc--with-subtitle--editable":n.titleEditable&&n.subtitle,"app-sidebar-header__desc--without-actions":!n.$slots["secondary-actions"]}},[n.canStar||n.$slots["tertiary-actions"]?e("div",{staticClass:"app-sidebar-header__tertiary-actions"},[n._t("tertiary-actions",(function(){return[n.canStar?e("a",{staticClass:"app-sidebar-header__star",on:{click:function(t){return t.preventDefault(),n.toggleStarred.apply(null,arguments)}}},[n.starLoading?e("span",{staticClass:"icon-loading-small"}):e("Star",{staticClass:"star",class:{"star--starred":n.isStarred,"star--star":!n.isStarred},attrs:{size:20,decorative:""}})],1):n._e()]}))],2):n._e(),n._v(" "),e("div",{staticClass:"app-sidebar-header__title-container"},[e("div",{staticClass:"app-sidebar-header__maintitle-container"},[e("h2",{directives:[{name:"show",rawName:"v-show",value:!n.titleEditable,expression:"!titleEditable"},{name:"linkify",rawName:"v-linkify",value:{text:n.title,linkify:n.linkifyTitle},expression:"{text: title, linkify: linkifyTitle}"},{name:"tooltip",rawName:"v-tooltip.auto",value:n.titleTooltip,expression:"titleTooltip",modifiers:{auto:!0}}],staticClass:"app-sidebar-header__maintitle",on:{click:function(t){return t.target!==t.currentTarget?null:n.editTitle.apply(null,arguments)}}},[n._v("\n\t\t\t\t\t\t\t\t"+n._s(n.title)+"\n\t\t\t\t\t\t\t")]),n._v(" "),n.titleEditable?[e("form",{directives:[{name:"click-outside",rawName:"v-click-outside",value:function(){return n.onSubmitTitle()},expression:"() => onSubmitTitle()"}],staticClass:"app-sidebar-header__maintitle-form",on:{submit:function(t){return t.preventDefault(),n.onSubmitTitle.apply(null,arguments)}}},[e("input",{directives:[{name:"focus",rawName:"v-focus"}],ref:"titleInput",staticClass:"app-sidebar-header__maintitle-input",attrs:{type:"text",placeholder:n.titlePlaceholder},domProps:{value:n.title},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"esc",27,t.key,["Esc","Escape"])?null:n.onDismissEditing.apply(null,arguments)},input:n.onTitleInput}}),n._v(" "),e("button",{staticClass:"icon-confirm",attrs:{type:"submit"}})])]:n._e(),n._v(" "),n.$slots["secondary-actions"]?e("Actions",{staticClass:"app-sidebar-header__menu",attrs:{"force-menu":n.forceMenu}},[n._t("secondary-actions")],2):n._e()],2),n._v(" "),""!==n.subtitle.trim()?e("p",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.subtitleTooltip,expression:"subtitleTooltip",modifiers:{auto:!0}}],staticClass:"app-sidebar-header__subtitle"},[n._v("\n\t\t\t\t\t\t\t"+n._s(n.subtitle)+"\n\t\t\t\t\t\t")]):n._e()])])]),n._v(" "),n.$slots.description&&!n.empty?e("div",{staticClass:"app-sidebar-header__description"},[n._t("description")],2):n._e()]),n._v(" "),e("AppSidebarTabs",{directives:[{name:"show",rawName:"v-show",value:!n.loading,expression:"!loading"}],ref:"tabs",attrs:{active:n.active},on:{"update:active":n.onUpdateActive}},[n._t("default")],2),n._v(" "),n.loading?e("EmptyContent",{attrs:{icon:"icon-loading"}}):n._e()],1)])}),[],!1,null,"68d5c99c",null);"function"==typeof j()&&j()(P);var z=P.exports},1060:function(n,t,e){"use strict";e.d(t,{default:function(){return C}});var i={name:"AppSidebarTab",props:{id:{type:String,required:!0},name:{type:String,required:!0},icon:{type:String,default:""},order:{type:Number,default:0}},computed:{isActive:function(){return this.$parent.activeTab===this.id}},methods:{onScroll:function(n){this.$el.scrollHeight-this.$el.scrollTop===this.$el.clientHeight&&this.$emit("bottomReached",n),this.$emit("scroll",n)}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(3126),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=(0,e(1900).Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("section",{staticClass:"app-sidebar__tab",class:{"app-sidebar__tab--active":n.isActive},attrs:{id:"tab-"+n.id,"aria-hidden":!n.isActive,"aria-labelledby":n.id,tabindex:"0",role:"tabpanel"},on:{scroll:n.onScroll}},[n._t("default")],2)}),[],!1,null,"28609fd2",null).exports},167:function(n,t,e){"use strict";e.d(t,{default:function(){return j}});var i=e(3251),a=e.n(i),r=e(453),o=e(4262),s=e(7672),l=e(3607),c=e(542),d=e(768),A=e.n(d),u=e(6996),p=e(9040),m=e(7993),T=e(3351),h=e(932),g=e(7020);function C(n,t,e,i,a,r,o){try{var s=n[r](o),l=s.value}catch(n){return void e(n)}s.done?t(l):Promise.resolve(l).then(i,a)}function b(n){return function(){var t=this,e=arguments;return new Promise((function(i,a){var r=n.apply(t,e);function o(n){C(r,i,a,o,s,"next",n)}function s(n){C(r,i,a,o,s,"throw",n)}o(void 0)}))}}var f=(0,s.getBuilder)("nextcloud").persist().build();function v(n){var t=f.getItem("user-has-avatar."+n);return"string"==typeof t?Boolean(t):null}function B(n,t){n&&f.setItem("user-has-avatar."+n,t)}var E={name:"Avatar",directives:{tooltip:p.default,ClickOutside:r.directive},components:{DotsHorizontal:a(),Popover:g.Z,PopoverMenu:u.default},mixins:[T.iQ],props:{url:{type:String,default:void 0},iconClass:{type:String,default:void 0},user:{type:String,default:void 0},showUserStatus:{type:Boolean,default:!0},showUserStatusCompact:{type:Boolean,default:!0},preloadedUserStatus:{type:Object,default:void 0},isGuest:{type:Boolean,default:!1},displayName:{type:String,default:void 0},size:{type:Number,default:32},allowPlaceholder:{type:Boolean,default:!0},disableTooltip:{type:Boolean,default:!1},disableMenu:{type:Boolean,default:!1},tooltipMessage:{type:String,default:null},isNoUser:{type:Boolean,default:!1},menuPosition:{type:String,default:"center"},menuContainer:{type:String,default:"body"},ariaLabel:{type:String,default:null}},data:function(){return{avatarUrlLoaded:null,avatarSrcSetLoaded:null,userDoesNotExist:!1,isAvatarLoaded:!1,isMenuLoaded:!1,contactsMenuLoading:!1,contactsMenuActions:[],contactsMenuOpenState:!1}},computed:{avatarAriaLabel:function(){return null!==this.ariaLabel?this.ariaLabel:this.hasStatus&&this.showUserStatus&&this.showUserStatusCompact?(0,h.t)("Avatar of {displayName}, {status}",{displayName:this.displayName||this.userId,status:this.userStatus.status}):(0,h.t)("Avatar of {displayName}",{displayName:this.displayName||this.userId})},canDisplayUserStatus:function(){return this.showUserStatus&&this.hasStatus&&["online","away","dnd"].includes(this.userStatus.status)},showUserStatusIconOnAvatar:function(){return this.showUserStatus&&this.showUserStatusCompact&&this.hasStatus&&"dnd"!==this.userStatus.status&&this.userStatus.icon},getUserIdentifier:function(){return this.isDisplayNameDefined?this.displayName:this.isUserDefined?this.user:""},isUserDefined:function(){return void 0!==this.user},isDisplayNameDefined:function(){return void 0!==this.displayName},isUrlDefined:function(){return void 0!==this.url},hasMenu:function(){var n;return!this.disableMenu&&(this.isMenuLoaded?this.menu.length>0:!(this.user===(null===(n=(0,l.getCurrentUser)())||void 0===n?void 0:n.uid)||this.userDoesNotExist||this.url))},shouldShowPlaceholder:function(){return this.allowPlaceholder&&this.userDoesNotExist},avatarStyle:function(){var n={"--size":this.size+"px",lineHeight:this.size+"px",fontSize:Math.round(.55*this.size)+"px"};if(!this.iconClass&&!this.avatarSrcSetLoaded){var t=(0,m.default)(this.getUserIdentifier);n.backgroundColor="rgb("+t.r+", "+t.g+", "+t.b+")"}return n},tooltip:function(){return!this.disableTooltip&&(this.tooltipMessage?this.tooltipMessage:this.displayName)},initials:function(){var n;if(this.shouldShowPlaceholder){var t=this.getUserIdentifier,e=t.indexOf(" ");""===t?n="?":(n=String.fromCodePoint(t.codePointAt(0)),-1!==e&&(n=n.concat(String.fromCodePoint(t.codePointAt(e+1)))))}return n.toUpperCase()},menu:function(){var n,t,e,i=this.contactsMenuActions.map((function(n){return{href:n.hyperlink,icon:n.icon,longtext:n.title}}));return this.showUserStatus&&(this.userStatus.icon||this.userStatus.message)?[{href:"#",icon:"data:image/svg+xml;utf8,".concat((n=this.userStatus.icon,t=document.createTextNode(n),e=document.createElement("p"),e.appendChild(t),e.innerHTML),""),text:"".concat(this.userStatus.message)}].concat(i):i}},watch:{url:function(){this.userDoesNotExist=!1,this.loadAvatarUrl()},user:function(){this.userDoesNotExist=!1,this.isMenuLoaded=!1,this.loadAvatarUrl()}},mounted:function(){this.loadAvatarUrl(),this.showUserStatus&&this.user&&!this.isNoUser&&(this.preloadedUserStatus?(this.userStatus.status=this.preloadedUserStatus.status||"",this.userStatus.message=this.preloadedUserStatus.message||"",this.userStatus.icon=this.preloadedUserStatus.icon||"",this.hasStatus=null!==this.preloadedUserStatus.status):this.fetchUserStatus(this.user),(0,c.subscribe)("user_status:status.updated",this.handleUserStatusUpdated))},beforeDestroyed:function(){this.showUserStatus&&this.user&&!this.isNoUser&&(0,c.unsubscribe)("user_status:status.updated",this.handleUserStatusUpdated)},methods:{handlePopoverAfterShow:function(){var n=this.$refs.popoverMenu.$el.getElementsByTagName("a");n.length&&n[0].focus()},handlePopoverAfterHide:function(){this.$refs.main.focus()},handleUserStatusUpdated:function(n){this.user===n.userId&&(this.userStatus={status:n.status,icon:n.icon,message:n.message})},toggleMenu:function(){var n=this;return b(regeneratorRuntime.mark((function t(){return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n.hasMenu){t.next=2;break}return t.abrupt("return");case 2:if(n.contactsMenuOpenState){t.next=5;break}return t.next=5,n.fetchContactsMenu();case 5:n.contactsMenuOpenState=!n.contactsMenuOpenState;case 6:case"end":return t.stop()}}),t)})))()},closeMenu:function(){this.contactsMenuOpenState=!1},fetchContactsMenu:function(){var n=this;return b(regeneratorRuntime.mark((function t(){var e,i,a;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return n.contactsMenuLoading=!0,t.prev=1,e=encodeURIComponent(n.user),t.next=5,A().post((0,o.generateUrl)("contactsmenu/findOne"),"shareType=0&shareWith=".concat(e));case 5:i=t.sent,a=i.data,n.contactsMenuActions=a.topAction?[a.topAction].concat(a.actions):a.actions,t.next=13;break;case 10:t.prev=10,t.t0=t.catch(1),n.contactsMenuOpenState=!1;case 13:n.contactsMenuLoading=!1,n.isMenuLoaded=!0;case 15:case"end":return t.stop()}}),t,null,[[1,10]])})))()},loadAvatarUrl:function(){if(this.isAvatarLoaded=!1,!this.isUrlDefined&&(!this.isUserDefined||this.isNoUser))return this.isAvatarLoaded=!0,void(this.userDoesNotExist=!0);if(this.isUrlDefined)this.updateImageIfValid(this.url);else if(this.size<=64){var n=this.avatarUrlGenerator(this.user,64),t=[n+" 1x",this.avatarUrlGenerator(this.user,512)+" 8x"].join(", ");this.updateImageIfValid(n,t)}else{var e=this.avatarUrlGenerator(this.user,512);this.updateImageIfValid(e)}},avatarUrlGenerator:function(n,t){var e,i="/avatar/{user}/{size}";this.isGuest&&(i="/avatar/guest/{user}/{size}");var a=(0,o.generateUrl)(i,{user:n,size:t});return n===(null===(e=(0,l.getCurrentUser)())||void 0===e?void 0:e.uid)&&"undefined"!=typeof oc_userconfig&&(a+="?v="+oc_userconfig.avatar.version),a},updateImageIfValid:function(n){var t=this,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,i=v(this.user);if(this.isUserDefined&&"boolean"==typeof i)return this.isAvatarLoaded=!0,this.avatarUrlLoaded=n,e&&(this.avatarSrcSetLoaded=e),void(!1===i&&(this.userDoesNotExist=!0));var a=new Image;a.onload=function(){t.avatarUrlLoaded=n,e&&(t.avatarSrcSetLoaded=e),t.isAvatarLoaded=!0,B(t.user,!0)},a.onerror=function(){console.debug("Invalid avatar url",n),t.avatarUrlLoaded=null,t.avatarSrcSetLoaded=null,t.userDoesNotExist=!0,t.isAvatarLoaded=!1,B(t.user,!1)},e&&(a.srcset=e),a.src=n}}},D=E,S=e(3379),y=e.n(S),x=e(7795),N=e.n(x),k=e(569),R=e.n(k),F=e(3565),w=e.n(F),O=e(9216),_=e.n(O),Z=e(4589),Y=e.n(Z),M=e(6016),I={};I.styleTagTransform=Y(),I.setAttributes=w(),I.insert=R().bind(null,"head"),I.domAPI=N(),I.insertStyleElement=_(),y()(M.Z,I),M.Z&&M.Z.locals&&M.Z.locals;var G=e(1900),L=e(995),$=e.n(L),U=(0,G.Z)(D,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",n._g({directives:[{name:"tooltip",rawName:"v-tooltip",value:n.tooltip,expression:"tooltip"},{name:"click-outside",rawName:"v-click-outside",value:n.closeMenu,expression:"closeMenu"}],ref:"main",staticClass:"avatardiv popovermenu-wrapper",class:{"avatardiv--unknown":n.userDoesNotExist,"avatardiv--with-menu":n.hasMenu},style:n.avatarStyle,attrs:{tabindex:n.disableMenu?"-1":"0","aria-label":n.avatarAriaLabel,role:n.disableMenu?"":"button"},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.toggleMenu.apply(null,arguments)}}},n.disableMenu?{}:{click:n.toggleMenu}),[n.iconClass?e("div",{staticClass:"avatar-class-icon",class:n.iconClass}):n.isAvatarLoaded&&!n.userDoesNotExist?e("img",{attrs:{src:n.avatarUrlLoaded,srcset:n.avatarSrcSetLoaded,alt:""}}):n._e(),n._v(" "),n.hasMenu?e("Popover",{attrs:{placement:"auto",container:n.menuContainer,open:n.contactsMenuOpenState},on:{"after-show":n.handlePopoverAfterShow,"after-hide":n.handlePopoverAfterHide},scopedSlots:n._u([{key:"trigger",fn:function(){return[n.contactsMenuLoading?e("div",{staticClass:"icon-loading"}):e("DotsHorizontal",{staticClass:"icon-more",attrs:{size:20,title:"",decorative:""}})]},proxy:!0}],null,!1,2015540072)},[e("PopoverMenu",{ref:"popoverMenu",attrs:{menu:n.menu}})],1):n._e(),n._v(" "),n.showUserStatusIconOnAvatar?e("div",{staticClass:"avatardiv__user-status avatardiv__user-status--icon"},[n._v("\n\t\t"+n._s(n.userStatus.icon)+"\n\t")]):n.canDisplayUserStatus?e("div",{staticClass:"avatardiv__user-status",class:"avatardiv__user-status--"+n.userStatus.status}):n._e(),n._v(" "),n.userDoesNotExist&&!n.iconClass?e("div",{staticClass:"unknown"},[n._v("\n\t\t"+n._s(n.initials)+"\n\t")]):n._e()],1)}),[],!1,null,"41fc3610",null);"function"==typeof $()&&$()(U);var j=U.exports},3792:function(n,t,e){"use strict";e.d(t,{default:function(){return y}});var i=e(5860),a=e(1205),r=e(9605),o=e.n(r),s={name:"Breadcrumb",components:{Actions:i.default,ChevronRight:o()},props:{title:{type:String,required:!0},to:{type:[String,Object],default:void 0},href:{type:String,default:void 0},icon:{type:String,default:""},disableDrop:{type:Boolean,default:!1},forceMenu:{type:Boolean,default:!1},open:{type:Boolean,default:!1}},data:function(){return{hovering:!1,crumbId:"crumb-id-".concat((0,a.Z)())}},computed:{tag:function(){return this.to?"router-link":"a"}},methods:{onOpenChange:function(n){this.$emit("update:open",n)},dropped:function(n){return this.disableDrop||(this.$emit("dropped",n,this.to||this.href),this.$parent.$emit("dropped",n,this.to||this.href),this.hovering=!1),!1},dragEnter:function(n){this.disableDrop||(this.hovering=!0)},dragLeave:function(n){this.disableDrop||n.target.contains(n.relatedTarget)||this.$refs.crumb.contains(n.relatedTarget)||(this.hovering=!1)}}},l=e(3379),c=e.n(l),d=e(7795),A=e.n(d),u=e(569),p=e.n(u),m=e(3565),T=e.n(m),h=e(9216),g=e.n(h),C=e(4589),b=e.n(C),f=e(430),v={};v.styleTagTransform=b(),v.setAttributes=T(),v.insert=p().bind(null,"head"),v.domAPI=A(),v.insertStyleElement=g(),c()(f.Z,v),f.Z&&f.Z.locals&&f.Z.locals;var B=e(1900),E=e(9352),D=e.n(E),S=(0,B.Z)(s,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",n._b({ref:"crumb",staticClass:"vue-crumb",class:{"vue-crumb--hovered":n.hovering},attrs:{draggable:"false"},on:{dragstart:function(n){return n.preventDefault(),function(){}.apply(null,arguments)},drop:function(t){return t.preventDefault(),n.dropped.apply(null,arguments)},dragover:function(n){return n.preventDefault(),function(){}.apply(null,arguments)},dragenter:n.dragEnter,dragleave:n.dragLeave}},"div",n._d({},[n.crumbId,""])),[!n.title&&!n.icon||n.$slots.default?n._e():e(n.tag,{tag:"element",attrs:{to:n.to,href:n.href}},[n._t("icon",(function(){return[n.icon?e("span",{staticClass:"icon",class:n.icon}):e("span",[n._v(n._s(n.title))])]}))],2),n._v(" "),n.$slots.default?e("Actions",{ref:"actions",attrs:{"force-menu":n.forceMenu,open:n.open,"menu-title":n.title,"force-title":!0,container:".vue-crumb["+n.crumbId+"]"},on:{"update:open":n.onOpenChange},scopedSlots:n._u([{key:"icon",fn:function(){return[n._t("menu-icon")]},proxy:!0}],null,!0)},[n._v(" "),n._t("default")],2):n._e(),n._v(" "),e("ChevronRight",{staticClass:"vue-crumb__separator",attrs:{size:20}})],1)}),[],!1,null,"771b8b5f",null);"function"==typeof D()&&D()(S);var y=S.exports},6669:function(n,t,e){"use strict";e.d(t,{default:function(){return Y}});var i=e(2734),a=e.n(i),r=e(3465),o=e.n(r),s=e(5860),l=e(3434),c=e(1460),d=function(n,t,e){if(void 0!==n)for(var i=n.length-1;i>=0;i--){var r=n[i],o=!r.componentOptions&&r.tag&&-1===t.indexOf(r.tag),s=!!r.componentOptions&&"string"==typeof r.componentOptions.tag,l=s&&-1===t.indexOf(r.componentOptions.tag);(o||!s||l)&&((o||l)&&a().util.warn("".concat(o?r.tag:r.componentOptions.tag," is not allowed inside the ").concat(e.$options.name," component"),e),n.splice(i,1))}},A=e(3792),u=e(542),p=__webpack_require__(/*! vue-material-design-icons/Folder */ "./node_modules/vue-material-design-icons/Folder.vue"),m=e.n(p),T="vue-crumb",h={name:"Breadcrumbs",components:{Actions:s.default,ActionRouter:l.default,ActionLink:c.default,Breadcrumb:A.default,IconFolder:m()},props:{rootIcon:{type:String,default:"icon-home"}},data:function(){return{hiddenCrumbs:[],hiddenIndices:[],menuBreadcrumbProps:{title:"",forceMenu:!0,disableDrop:!0,open:!1}}},beforeMount:function(){d(this.$slots.default,["Breadcrumb"],this)},beforeUpdate:function(){d(this.$slots.default,["Breadcrumb"],this)},created:function(){var n=this;window.addEventListener("resize",o()((function(){n.handleWindowResize()}),100)),(0,u.subscribe)("navigation-toggled",this.delayedResize)},mounted:function(){this.handleWindowResize()},updated:function(){this.delayedResize(),this.delayedHideCrumbs()},beforeDestroy:function(){window.removeEventListener("resize",this.handleWindowResize),(0,u.unsubscribe)("navigation-toggled",this.delayedResize)},methods:{delayedHideCrumbs:function(){var n=this;this.$nextTick((function(){var t=n.$slots.default||[];n.hideCrumbs(t)}))},closeActions:function(n){this.$refs.actionsBreadcrumb.$el.contains(n.relatedTarget)||(this.menuBreadcrumbProps.open=!1)},delayedResize:function(){var n=this;this.$nextTick((function(){n.handleWindowResize()}))},handleWindowResize:function(){var n=this.$slots.default||[];if(this.$refs.container){var t=n.length,e=[],i=this.$refs.container.offsetWidth,a=this.getTotalWidth(n);this.$refs.breadcrumb__actions&&(a+=this.$refs.breadcrumb__actions.offsetWidth);var r=a-i;r+=r>0?64:0;for(var o=0,s=Math.floor(t/2);r>0&&o1&&void 0!==arguments[1]?arguments[1]:0;n.forEach((function(n,i){var a;null!=n&&null!==(a=n.elm)&&void 0!==a&&a.classList&&(t.hiddenIndices.includes(i+e)?n.elm.classList.add("".concat(T,"--hidden")):n.elm.classList.remove("".concat(T,"--hidden")))}))}},render:function(n){var t=this,e=this.$slots.default||[];if(0!==e.length){a().set(e[0].componentOptions.propsData,"icon",this.rootIcon);var i=[],r=this.hiddenCrumbs.length?e.slice(0,Math.round(e.length/2)):e;i=i.concat(r),this.hideCrumbs(r),this.hiddenCrumbs.length&&i.push(n("Breadcrumb",{class:"dropdown",props:this.menuBreadcrumbProps,ref:"actionsBreadcrumb",key:"actions-breadcrumb-1",nativeOn:{dragstart:this.dragStart,dragenter:function(){t.menuBreadcrumbProps.open=!0},dragleave:this.closeActions},on:{"update:open":function(n){t.menuBreadcrumbProps.open=n}}},this.hiddenCrumbs.map((function(e){var i=e.componentOptions.propsData.to,a=e.componentOptions.propsData.href,r=e.componentOptions.propsData.disableDrop,o="ActionLink",s=a;i&&(o="ActionRouter",s=i);var l=n("IconFolder",{props:{size:20},slot:"icon"});return n(o,{class:T,props:{to:i,href:a},attrs:{draggable:!1},nativeOn:{dragstart:t.dragStart,drop:function(n){return t.dropped(n,s,r)},dragover:t.dragOver,dragenter:function(n){return t.dragEnter(n,r)},dragleave:function(n){return t.dragLeave(n,r)}}},[e.componentOptions.propsData.title,l])}))));var o=this.hiddenCrumbs.length?e.slice(Math.round(e.length/2)):[];i=i.concat(o),this.hideCrumbs(o,r.length);var s=[];return s.push(n("div",{class:"breadcrumb__crumbs"},i)),this.$slots.actions&&s.push(n("div",{class:"breadcrumb__actions",ref:"breadcrumb__actions"},this.$slots.actions)),n("div",{class:["breadcrumb",{"breadcrumb--collapsed":this.hiddenCrumbs.length===e.length-2}],ref:"container"},s)}}},g=h,C=e(3379),b=e.n(C),f=e(7795),v=e.n(f),B=e(569),E=e.n(B),D=e(3565),S=e.n(D),y=e(9216),x=e.n(y),N=e(4589),k=e.n(N),R=e(9474),F={};F.styleTagTransform=k(),F.setAttributes=S(),F.insert=E().bind(null,"head"),F.domAPI=v(),F.insertStyleElement=x(),b()(R.Z,F),R.Z&&R.Z.locals&&R.Z.locals;var w=e(1900),O=e(2418),_=e.n(O),Z=(0,w.Z)(g,void 0,void 0,!1,null,"2d7b61fe",null);"function"==typeof _()&&_()(Z);var Y=Z.exports},519:function(n,t,e){"use strict";function i(n,t,e){return t in n?Object.defineProperty(n,t,{value:e,enumerable:!0,configurable:!0,writable:!0}):n[t]=e,n}e.d(t,{default:function(){return E}});var a={name:"Button",props:{disabled:{type:Boolean,default:!1},type:{type:String,validator:function(n){return-1!==["primary","secondary","tertiary","tertiary-no-background","error","warning","success"].indexOf(n)},default:"secondary"},nativeType:{type:String,validator:function(n){return-1!==["submit","reset","button"].indexOf(n)},default:"button"},wide:{type:Boolean,default:!1},ariaLabel:{type:String,default:null}},data:function(){return{tabbed:!1,slots:this.$slots}},computed:{hasText:function(){var n,t,e;return void 0!==(null===(n=this.slots)||void 0===n?void 0:n.default)&&(null===(t=this.slots)||void 0===t||null===(e=t.default[0])||void 0===e?void 0:e.text)},hasIcon:function(){return void 0!==this.slots.icon},iconOnly:function(){return this.hasIcon&&!this.hasText},textOnly:function(){return!this.hasIcon&&this.hasText},iconAndText:function(){return this.hasIcon&&this.hasText},text:function(){return this.hasText?this.slots.default[0].text.trim():null},buttonClassObject:function(){var n;return i(n={"button-vue--icon-only":this.iconOnly,"button-vue--text-only":this.textOnly,"button-vue--icon-and-text":this.iconAndText},"button-vue--vue-".concat(this.type),this.type),i(n,"button-vue--wide",this.wide),i(n,"button-vue--tabbed",this.tabbed),n}},beforeUpdate:function(){this.slots=this.$slots},mounted:function(){this.text||this.ariaLabel||console.warn("You need to fill either the text or the ariaLabel props in the button component.",{text:this.text,ariaLabel:this.ariaLabel},this)},methods:{handleClick:function(){this.tabbed=!1},handleTabUp:function(){this.tabbed=!0},handleBlur:function(){this.tabbed=!1},makeActive:function(){this.tabbed=!1},makeInactive:function(){this.tabbed=!0}}},r=e(3379),o=e.n(r),s=e(7795),l=e.n(s),c=e(569),d=e.n(c),A=e(3565),u=e.n(A),p=e(9216),m=e.n(p),T=e(4589),h=e.n(T),g=e(3352),C={};C.styleTagTransform=h(),C.setAttributes=u(),C.insert=d().bind(null,"head"),C.domAPI=l(),C.insertStyleElement=m(),o()(g.Z,C),g.Z&&g.Z.locals&&g.Z.locals;var b=e(1900),f=e(9182),v=e.n(f),B=(0,b.Z)(a,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("button",n._g(n._b({staticClass:"button-vue",class:n.buttonClassObject,attrs:{"aria-label":n.ariaLabel,type:n.nativeType,disabled:n.disabled},on:{keydown:function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.makeActive.apply(null,arguments)},keyup:[function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:n.makeInactive.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"tab",9,t.key,"Tab")||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:n.handleTabUp.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"tab",9,t.key,"Tab")?null:t.shiftKey?n.handleTabUp.apply(null,arguments):null}],click:n.handleClick,blur:n.handleBlur}},"button",n.$attrs,!1),n.$listeners),[e("span",{staticClass:"button-vue__wrapper"},[n.hasIcon?e("span",{staticClass:"button-vue__icon"},[n._t("icon")],2):n._e(),n._v(" "),n.hasText?e("span",{staticClass:"button-vue__text"},[n._t("default")],2):n._e()])])}),[],!1,null,"27e36536",null);"function"==typeof v()&&v()(B);var E=B.exports},2528:function(n,t,e){"use strict";e.d(t,{default:function(){return j}});var i=__webpack_require__(/*! vue-material-design-icons/CheckboxBlankOutline */ "./node_modules/vue-material-design-icons/CheckboxBlankOutline.vue"),a=e.n(i),r=__webpack_require__(/*! vue-material-design-icons/MinusBox */ "./node_modules/vue-material-design-icons/MinusBox.vue"),o=e.n(r),s=__webpack_require__(/*! vue-material-design-icons/CheckboxMarked */ "./node_modules/vue-material-design-icons/CheckboxMarked.vue"),l=e.n(s),c=__webpack_require__(/*! vue-material-design-icons/RadioboxMarked */ "./node_modules/vue-material-design-icons/RadioboxMarked.vue"),d=e.n(c),A=__webpack_require__(/*! vue-material-design-icons/RadioboxBlank */ "./node_modules/vue-material-design-icons/RadioboxBlank.vue"),u=e.n(A),p=__webpack_require__(/*! vue-material-design-icons/ToggleSwitchOff */ "./node_modules/vue-material-design-icons/ToggleSwitchOff.vue"),m=e.n(p),T=__webpack_require__(/*! vue-material-design-icons/ToggleSwitch */ "./node_modules/vue-material-design-icons/ToggleSwitch.vue"),h=e.n(T),g=e(1205),C=e(3648);function b(n){return function(n){if(Array.isArray(n))return f(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,t){if(n){if("string"==typeof n)return f(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?f(n,t):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function f(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,i=new Array(t);e-1:this.checked===this.value:!0===this.checked},checkboxRadioIconElement:function(){return this.type===B?this.isChecked?d():u():this.type===E?this.isChecked?h():m():this.indeterminate?o():this.isChecked?l():a()}},mounted:function(){if(this.name&&this.type===v&&!Array.isArray(this.checked))throw new Error("When using groups of checkboxes, the updated value will be an array.");if(this.name&&this.type===E)throw new Error("Switches are not made to be used for data sets. Please use checkboxes instead.");if("boolean"!=typeof this.checked&&this.type===E)throw new Error("Switches can only be used with boolean as checked prop.")},methods:{onToggle:function(){if(!this.disabled)if(this.type!==B)if(this.type!==E)if("boolean"!=typeof this.checked){var n=this.getInputsSet().filter((function(n){return n.checked})).map((function(n){return n.value}));this.$emit("update:checked",n)}else this.$emit("update:checked",!this.isChecked);else this.$emit("update:checked",!this.isChecked);else this.$emit("update:checked",this.value)},getInputsSet:function(){return b(document.getElementsByName(this.name))}}},S=e(3379),y=e.n(S),x=e(7795),N=e.n(x),k=e(569),R=e.n(k),F=e(3565),w=e.n(F),O=e(9216),_=e.n(O),Z=e(4589),Y=e.n(Z),M=e(2778),I={};I.styleTagTransform=Y(),I.setAttributes=w(),I.insert=R().bind(null,"head"),I.domAPI=N(),I.insertStyleElement=_(),y()(M.Z,I),M.Z&&M.Z.locals&&M.Z.locals;var G=e(1900),L=e(7160),$=e.n(L),U=(0,G.Z)(D,(function(){var n,t=this,e=t.$createElement,i=t._self._c||e;return i(t.wrapperElement,{tag:"element",staticClass:"checkbox-radio-switch",class:(n={},n["checkbox-radio-switch-"+t.type]=t.type,n["checkbox-radio-switch--checked"]=t.isChecked,n["checkbox-radio-switch--disabled"]=t.disabled,n["checkbox-radio-switch--indeterminate"]=t.indeterminate,n),style:t.cssVars},[i("input",{staticClass:"checkbox-radio-switch__input",attrs:{id:t.id,disabled:t.disabled,indeterminate:t.indeterminate,name:t.name,type:t.inputType},domProps:{checked:t.isChecked,value:t.value},on:{change:t.onToggle}}),t._v(" "),i("label",{staticClass:"checkbox-radio-switch__label",attrs:{for:t.id}},[t.loading?i("div",{staticClass:"icon-loading-small checkbox-radio-switch__icon"}):i(t.checkboxRadioIconElement,{tag:"icon",staticClass:"checkbox-radio-switch__icon",attrs:{size:t.size,title:"",decorative:""}}),t._v(" "),t._t("default")],2)])}),[],!1,null,"036397c2",null);"function"==typeof $()&&$()(U);var j=U.exports},9793:function(n,t,e){"use strict";e.d(t,{default:function(){return w}});var i=__webpack_require__(/*! vue-material-design-icons/ArrowLeft */ "./node_modules/vue-material-design-icons/ArrowLeft.vue"),a=e.n(i),r=__webpack_require__(/*! vue-material-design-icons/Check */ "./node_modules/vue-material-design-icons/Check.vue"),o=e.n(r),s=e(3251),l=e.n(s),c=__webpack_require__(/*! vue-color */ "./node_modules/vue-color/dist/vue-color.min.js"),d=e(6609),A=e(3648),u=e(8099),p={name:"ColorPicker",components:{ArrowLeft:a(),Check:o(),Chrome:c.Chrome,DotsHorizontal:l(),Popover:u.default},mixins:[A.Z],props:{value:{type:String,required:!0}},data:function(){var n=this;return{currentColor:this.value,advanced:!1,palette:(0,d.Z)(4).map((function(t){return"#"+n.rgbToHex(t.r)+n.rgbToHex(t.g)+n.rgbToHex(t.b)}))}},watch:{value:function(n){this.currentColor=n}},methods:{handleConfirm:function(){this.$emit("submit",this.currentColor),this.handleClose(),this.advanced=!1},handleClose:function(){this.$emit("close"),this.$emit("update:open",!1)},handleBack:function(){this.advanced=!1},handleMoreSettings:function(){this.advanced=!0},pickColor:function(n){"string"!=typeof n&&(n=this.currentColor.hex),this.currentColor=n,this.$emit("update:value",n),this.$emit("input",n)},rgbToHex:function(n){var t=n.toString(16);return 1===t.length?"0"+t:t}}},m=e(3379),T=e.n(m),h=e(7795),g=e.n(h),C=e(569),b=e.n(C),f=e(3565),v=e.n(f),B=e(9216),E=e.n(B),D=e(4589),S=e.n(D),y=e(5682),x={};x.styleTagTransform=S(),x.setAttributes=v(),x.insert=b().bind(null,"head"),x.domAPI=g(),x.insertStyleElement=E(),T()(y.Z,x),y.Z&&y.Z.locals&&y.Z.locals;var N=e(1900),k=e(3095),R=e.n(k),F=(0,N.Z)(p,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("Popover",n._g(n._b({on:{"apply-hide":n.handleClose},scopedSlots:n._u([{key:"trigger",fn:function(){return[n._t("default")]},proxy:!0}],null,!0)},"Popover",n.$attrs,!1),n.$listeners),[n._v(" "),e("div",{staticClass:"color-picker"},[e("transition",{attrs:{name:"slide",mode:"out-in"}},[n.advanced?n._e():e("div",{staticClass:"color-picker__simple"},n._l(n.palette,(function(t,i){return e("button",{key:i,staticClass:"color-picker__simple-color-circle",class:{"color-picker__simple-color-circle--active":t===n.currentColor},style:{"background-color":t},attrs:{type:"button"},on:{click:function(e){return n.pickColor(t)}}},[t===n.currentColor?e("Check",{attrs:{size:20,title:"",decorative:""}}):n._e()],1)})),0),n._v(" "),n.advanced?e("Chrome",{staticClass:"color-picker__advanced",attrs:{"disable-alpha":!0,"disable-fields":!0},on:{input:n.pickColor},model:{value:n.currentColor,callback:function(t){n.currentColor=t},expression:"currentColor"}}):n._e()],1),n._v(" "),e("div",{staticClass:"color-picker__navigation"},[n.advanced?e("button",{staticClass:"color-picker__navigation-button back",attrs:{type:"button"},on:{click:n.handleBack}},[e("ArrowLeft",{attrs:{size:20,title:"",decorative:""}})],1):n._e(),n._v(" "),n.advanced?n._e():e("button",{staticClass:"color-picker__navigation-button more-settings",attrs:{type:"button"},on:{click:n.handleMoreSettings}},[e("DotsHorizontal",{attrs:{size:20,title:"",decorative:""}})],1),n._v(" "),n.advanced?e("button",{staticClass:"color-picker__navigation-button confirm",attrs:{type:"button"},on:{click:n.handleConfirm}},[n._v("\n\t\t\t\t"+n._s(n.t("Choose"))+"\n\t\t\t")]):n._e()])],1)])}),[],!1,null,"146dc9d9",null);"function"==typeof R()&&R()(F);var w=F.exports},6198:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={props:{appName:{type:String,required:!0}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(6919),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(9908),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",{staticClass:"content",class:"app-"+n.appName.toLowerCase(),attrs:{id:"content-vue"}},[n._t("default")],2)}),[],!1,null,"4d37098a",null);"function"==typeof f()&&f()(v);var B=v.exports},1988:function(n,t,e){"use strict";e.d(t,{default:function(){return B}});var i={name:"CounterBubble",props:{type:{type:String,default:"",validator:function(n){return-1!==["highlighted","outlined",""].indexOf(n)}}},computed:{counterClassObject:function(){return{"counter-bubble__counter--highlighted":"highlighted"===this.type,"counter-bubble__counter--outlined":"outlined"===this.type}}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(8560),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(1900),b=e(5693),f=e.n(b),v=(0,C.Z)(i,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",{staticClass:"counter-bubble__counter",class:n.counterClassObject},[n._t("default")],2)}),[],!1,null,"0f57a605",null);"function"==typeof f()&&f()(v);var B=v.exports},577:function(n,t,e){"use strict";e.d(t,{default:function(){return O}});var i=e(7645),a=__webpack_require__(/*! @nextcloud/l10n */ "./node_modules/@nextcloud/l10n/dist/index.js"),r=__webpack_require__(/*! vue2-datepicker */ "./node_modules/vue2-datepicker/index.esm.js"),o=e.n(r),s=e(8099),l=e(9460),c=e(3648),d={date:"YYYY-MM-DD",datetime:"YYYY-MM-DD H:mm:ss",year:"YYYY",month:"YYYY-MM",time:"H:mm:ss",week:"w"},A={name:"DatetimePicker",components:{DatePicker:o(),Popover:s.default,TimezonePicker:l.default},mixins:[c.Z],inheritAttrs:!1,props:{clearable:{type:Boolean,default:!1},minuteStep:{type:Number,default:10},type:{type:String,default:"date"},format:{type:String,default:null},formatter:{type:Object,default:null},value:{default:function(){return new Date}},timezoneId:{type:String,default:"UTC"},showTimezoneSelect:{type:Boolean,default:!1},highlightTimezone:{type:Boolean,default:!1},appendToBody:{type:Boolean,default:!1},showWeekNumber:{type:Boolean,default:!1}},data:function(){return{showTimezonePopover:!1,tzVal:this.timezoneId}},computed:{lang:function(){return{formatLocale:{months:(0,a.getMonthNames)(),monthsShort:(0,a.getMonthNamesShort)(),weekdays:(0,a.getDayNames)(),weekdaysShort:(0,a.getDayNamesShort)(),weekdaysMin:(0,a.getDayNamesMin)(),firstDayOfWeek:(0,a.getFirstDay)()},monthFormat:"MMM"}},placeholder:function(){return"time"===this.type?this.t("Pick a time"):"month"===this.type?this.t("Pick a month"):"year"===this.type?this.t("Pick a year"):"week"===this.type?this.t("Pick a week"):"date"===this.type?this.t("Pick a date"):this.t("Pick a date and a time")},formatTypeMap:function(){var n;return null!==(n=d[this.type])&&void 0!==n?n:d.date}},methods:{handleSelectYear:function(n){var t=this.$refs.datepicker.currentValue;if(t)try{var e=new Date(new Date(t).setFullYear(n));this.$refs.datepicker.selectDate(e)}catch(e){console.error("Invalid value",t,n)}},handleSelectMonth:function(n){var t=this.$refs.datepicker.currentValue;if(t)try{var e=new Date(new Date(t).setMonth(n));this.$refs.datepicker.selectDate(e)}catch(e){console.error("Invalid value",t,n)}},toggleTimezonePopover:function(){this.showTimezoneSelect&&(this.showTimezonePopover=!this.showTimezonePopover)}}},u=e(3379),p=e.n(u),m=e(7795),T=e.n(m),h=e(569),g=e.n(h),C=e(3565),b=e.n(C),f=e(9216),v=e.n(f),B=e(4589),E=e.n(B),D=e(8004),S={};S.styleTagTransform=E(),S.setAttributes=b(),S.insert=g().bind(null,"head"),S.domAPI=T(),S.insertStyleElement=v(),p()(D.Z,S),D.Z&&D.Z.locals&&D.Z.locals;var y=e(1900),x=e(3489),N=e.n(x),k=(0,y.Z)(A,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("DatePicker",n._g(n._b({ref:"datepicker",attrs:{"append-to-body":n.appendToBody,clearable:n.clearable,format:n.format?n.format:n.formatTypeMap,formatter:n.formatter,lang:n.lang,"minute-step":n.minuteStep,placeholder:n.placeholder,"popup-class":{"show-week-number":n.showWeekNumber},"show-week-number":n.showWeekNumber,type:n.type,value:n.value},on:{"select-year":n.handleSelectYear,"select-month":n.handleSelectMonth,"update:value":function(t){return n.$emit("update:value",n.value)}},scopedSlots:n._u([n.showTimezoneSelect?{key:"icon-calendar",fn:function(){return[e("Popover",{attrs:{open:n.showTimezonePopover,"open-class":"timezone-popover-wrapper"},on:{"update:open":function(t){n.showTimezonePopover=t}},scopedSlots:n._u([{key:"trigger",fn:function(){return[e("button",{staticClass:"datetime-picker-inline-icon icon-timezone icon",class:{"datetime-picker-inline-icon--highlighted":n.highlightTimezone},on:{mousedown:function(n){return n.stopPropagation(),n.preventDefault(),function(){}.apply(null,arguments)}}})]},proxy:!0}],null,!1,3706780037)},[n._v(" "),e("div",{staticClass:"timezone-popover-wrapper__title"},[e("strong",[n._v("\n\t\t\t\t\t"+n._s(n.t("Please select a time zone:"))+"\n\t\t\t\t")])]),n._v(" "),e("TimezonePicker",{staticClass:"timezone-popover-wrapper__timezone-select",on:{input:function(t){return n.$emit("update:timezone-id",arguments[0])}},model:{value:n.tzVal,callback:function(t){n.tzVal=t},expression:"tzVal"}})],1)]},proxy:!0}:null,n._l(n.$scopedSlots,(function(t,e){return{key:e,fn:function(t){return[n._t(e,null,null,t)]}}}))],null,!0)},"DatePicker",n.$attrs,!1),n.$listeners))}),[],!1,null,"6e184da2",null);"function"==typeof N()&&N()(k);var R=k.exports,F=e(7695),w={};w.styleTagTransform=E(),w.setAttributes=b(),w.insert=g().bind(null,"head"),w.domAPI=T(),w.insertStyleElement=v(),p()(F.Z,w),F.Z&&F.Z.locals&&F.Z.locals,(0,i.Z)(R);var O=R},8263:function(n,t,e){"use strict";var i=e(5576);t.default=i.Z},7185:function(n,t,e){"use strict";e.d(t,{default:function(){return u}});var i=e(1336);function a(n,t){var e=Object.keys(n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(n);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(n,t).enumerable}))),e.push.apply(e,i)}return e}function r(n){for(var t=1;t0?this.highlight:(0,i.Z)(this.text,this.search)).forEach((function(n,e){n.end0&&t.push({start:e.start<0?0:e.start,end:e.end>n.text.length?n.text.length:e.end}),t}),[])).sort((function(n,t){return n.start-t.start})),t=t.reduce((function(n,t){if(n.length){var e=n.length-1;n[e].end>=t.start?n[e]={start:n[e].start,end:Math.max(n[e].end,t.end)}:n.push(t)}else n.push(t);return n}),[])):t},chunks:function(){if(0===this.ranges.length)return[{start:0,end:this.text.length,highlight:!1,text:this.text}];for(var n=[],t=0,e=0;t=this.ranges.length&&t=32},cssVars:function(){var n=this.noMargin?0:this.margin;return{"--height":this.avatarSize+2*n+"px","--margin":this.margin+"px"}}},beforeMount:function(){this.isNoUser||this.subtitle||this.fetchUserStatus(this.user)}},s=e(3379),l=e.n(s),c=e(7795),d=e.n(c),A=e(569),u=e.n(A),p=e(3565),m=e.n(p),T=e(9216),h=e.n(T),g=e(4589),C=e.n(g),b=e(9863),f={};f.styleTagTransform=C(),f.setAttributes=m(),f.insert=u().bind(null,"head"),f.domAPI=d(),f.insertStyleElement=h(),l()(b.Z,f),b.Z&&b.Z.locals&&b.Z.locals;var v=e(1900),B=e(7772),E=e.n(B),D=(0,v.Z)(o,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("span",n._g({staticClass:"option",style:n.cssVars,attrs:{id:n.id}},n.$listeners),[e("Avatar",n._b({staticClass:"option__avatar",attrs:{"disable-menu":!0,"disable-tooltip":!0,"display-name":n.displayName||n.title,"is-no-user":n.isNoUser,size:n.avatarSize}},"Avatar",n.$attrs,!1)),n._v(" "),e("div",{staticClass:"option__details"},[e("Highlight",{staticClass:"option__lineone",attrs:{text:n.title,search:n.search}}),n._v(" "),n.isValidSubtitle&&n.isSizeBigEnough?e("Highlight",{staticClass:"option__linetwo",attrs:{text:n.subtitle,search:n.search}}):n.hasStatus?e("span",[e("span",[n._v(n._s(n.userStatus.icon))]),n._v(" "),e("span",[n._v(n._s(n.userStatus.message))])]):n._e()],1),n._v(" "),n._t("default"),n._v(" "),n.hasIcon&&!n.hasSlot?e("span",{staticClass:"icon option__icon",class:n.icon}):n._e()],2)}),[],!1,null,"1e7d5981",null);"function"==typeof E()&&E()(D);var S=D.exports},4113:function(n,t,e){"use strict";e.d(t,{default:function(){return U}});var i=e(7645),a=e(2640),r=e.n(a),o=__webpack_require__(/*! vue-material-design-icons/ChevronLeft */ "./node_modules/vue-material-design-icons/ChevronLeft.vue"),s=e.n(o),l=e(9605),c=e.n(l),d=e(5978),A=e.n(d),u=__webpack_require__(/*! vue-material-design-icons/Pause */ "./node_modules/vue-material-design-icons/Pause.vue"),p=e.n(u),m=__webpack_require__(/*! vue-material-design-icons/Play */ "./node_modules/vue-material-design-icons/Play.vue"),T=e.n(m),h=e(5860),g=e(4828),C=e(3648),b=e(932),f=e(9040);function v(n,t){var e,i,a,r=t;this.start=function(){a=!0,i=new Date,e=setTimeout(n,r)},this.pause=function(){a=!1,clearTimeout(e),r-=new Date-i},this.clear=function(){a=!1,clearTimeout(e),r=0},this.getTimeLeft=function(){return a&&(this.pause(),this.start()),r},this.getStateRunning=function(){return a},this.start()}var B={name:"Modal",components:{ActionButton:g.default,Actions:h.default,ChevronLeft:s(),ChevronRight:c(),Close:A(),Pause:p(),Play:T()},directives:{tooltip:f.default},mixins:[C.Z],props:{title:{type:String,default:""},hasPrevious:{type:Boolean,default:!1},hasNext:{type:Boolean,default:!1},outTransition:{type:Boolean,default:!1},enableSlideshow:{type:Boolean,default:!1},clearViewDelay:{type:Number,default:5e3},slideshowDelay:{type:Number,default:5e3},slideshowPaused:{type:Boolean,default:!1},enableSwipe:{type:Boolean,default:!0},spreadNavigation:{type:Boolean,default:!1},size:{type:String,default:"normal",validator:function(n){return["small","normal","large","full"].includes(n)}},canClose:{type:Boolean,default:!0},dark:{type:Boolean,default:!1},container:{type:String,default:"body"}},data:function(){return{mc:null,showModal:!1,clearView:!1,clearViewTimeout:null,playing:!1,slideshowTimeout:null,iconSize:24}},computed:{modalTransitionName:function(){return"modal-".concat(this.outTransition?"out":"in")},playPauseTitle:function(){return this.playing?(0,b.t)("Pause slideshow"):(0,b.t)("Start slideshow")},cssVariables:function(){return{"--slideshow-duration":this.slideshowDelay+"ms","--icon-size":this.iconSize+"px"}}},watch:{slideshowPaused:function(n){this.slideshowTimeout&&(n?this.slideshowTimeout.pause():this.slideshowTimeout.start())}},beforeMount:function(){window.addEventListener("keydown",this.handleKeydown)},beforeDestroy:function(){window.removeEventListener("keydown",this.handleKeydown),this.mc.off("swipeleft swiperight"),this.mc.destroy()},mounted:function(){var n=this;this.showModal=!0,this.handleMouseMove(),this.mc=new(r())(this.$refs.mask),this.mc.on("swipeleft swiperight",(function(t){n.handleSwipe(t)})),"body"===this.container?document.body.insertBefore(this.$el,document.body.lastChild):document.querySelector(this.container).appendChild(this.$el)},destroyed:function(){this.$el.remove()},methods:{previous:function(n){this.hasPrevious&&(n&&this.resetSlideshow(),this.$emit("previous",n))},next:function(n){this.hasNext&&(n&&this.resetSlideshow(),this.$emit("next",n))},close:function(n){var t=this;this.canClose&&(this.showModal=!1,setTimeout((function(){t.$emit("close",n)}),300))},handleKeydown:function(n){switch(n.keyCode){case 37:this.previous(n);break;case 13:case 39:this.next(n);break;case 27:this.close(n)}},handleSwipe:function(n){this.enableSwipe&&("swipeleft"===n.type?this.next(n):"swiperight"===n.type&&this.previous(n))},handleMouseMove:function(){var n=this;this.clearViewDelay>0&&(this.clearView=!1,clearTimeout(this.clearViewTimeout),this.clearViewTimeout=setTimeout((function(){n.clearView=!0}),this.clearViewDelay))},togglePlayPause:function(){this.playing=!this.playing,this.playing?this.handleSlideshow():this.clearSlideshowTimeout()},resetSlideshow:function(){this.playing=!this.playing,this.clearSlideshowTimeout(),this.$nextTick((function(){this.togglePlayPause()}))},handleSlideshow:function(){var n=this;this.playing=!0,this.hasNext?this.slideshowTimeout=new v((function(){n.next(),n.handleSlideshow()}),this.slideshowDelay):(this.playing=!1,this.clearSlideshowTimeout())},clearSlideshowTimeout:function(){this.slideshowTimeout&&this.slideshowTimeout.clear()}}},E=e(3379),D=e.n(E),S=e(7795),y=e.n(S),x=e(569),N=e.n(x),k=e(3565),R=e.n(k),F=e(9216),w=e.n(F),O=e(4589),_=e.n(O),Z=e(1309),Y={};Y.styleTagTransform=_(),Y.setAttributes=R(),Y.insert=N().bind(null,"head"),Y.domAPI=y(),Y.insertStyleElement=w(),D()(Z.Z,Y),Z.Z&&Z.Z.locals&&Z.Z.locals;var M=e(1900),I=e(8575),G=e.n(I),L=(0,M.Z)(B,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("transition",{attrs:{name:"fade"}},[e("div",{ref:"mask",staticClass:"modal-mask",class:{"modal-mask--dark":n.dark},style:n.cssVariables,on:{click:n.handleMouseMove,mousemove:n.handleMouseMove,touchmove:n.handleMouseMove}},[e("transition",{attrs:{name:"fade-visibility"}},[e("div",{directives:[{name:"show",rawName:"v-show",value:!n.clearView,expression:"!clearView"}],staticClass:"modal-header",class:{invisible:n.clearView}},[""!==n.title.trim()?e("div",{staticClass:"modal-title"},[n._v("\n\t\t\t\t\t"+n._s(n.title)+"\n\t\t\t\t")]):n._e(),n._v(" "),e("div",{staticClass:"icons-menu"},[n.hasNext&&n.enableSlideshow?e("button",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.playPauseTitle,expression:"playPauseTitle",modifiers:{auto:!0}}],staticClass:"play-pause-icons",class:{"play-pause-icons--paused":n.slideshowPaused},attrs:{type:"button"},on:{click:n.togglePlayPause}},[n.playing?e("Pause",{staticClass:"play-pause-icons__pause",attrs:{size:n.iconSize,title:"",decorative:""}}):e("Play",{staticClass:"play-pause-icons__play",attrs:{size:n.iconSize,title:"",decorative:""}}),n._v(" "),e("span",{staticClass:"hidden-visually"},[n._v("\n\t\t\t\t\t\t\t"+n._s(n.playPauseTitle)+"\n\t\t\t\t\t\t")]),n._v(" "),n.playing?e("svg",{staticClass:"progress-ring",attrs:{height:"50",width:"50"}},[e("circle",{staticClass:"progress-ring__circle",attrs:{stroke:"white","stroke-width":"2",fill:"transparent",r:"15",cx:"25",cy:"25"}})]):n._e()],1):n._e(),n._v(" "),e("Actions",{staticClass:"header-actions"},[n._t("actions")],2),n._v(" "),n.canClose?e("Actions",{staticClass:"header-close"},[e("ActionButton",{on:{click:n.close},scopedSlots:n._u([{key:"icon",fn:function(){return[e("Close",{attrs:{size:n.iconSize,title:"",decorative:""}})]},proxy:!0}],null,!1,1372351874)},[n._v("\n\t\t\t\t\t\t\t"+n._s(n.t("Close"))+"\n\t\t\t\t\t\t")])],1):n._e()],1)])]),n._v(" "),e("transition",{attrs:{name:n.modalTransitionName}},[e("div",{directives:[{name:"show",rawName:"v-show",value:n.showModal,expression:"showModal"}],staticClass:"modal-wrapper",class:["modal-wrapper--"+n.size,n.spreadNavigation?"modal-wrapper--spread-navigation":""],on:{mousedown:function(t){return t.target!==t.currentTarget?null:n.close.apply(null,arguments)}}},[e("transition",{attrs:{name:"fade-visibility"}},[e("a",{directives:[{name:"show",rawName:"v-show",value:n.hasPrevious&&!n.clearView,expression:"hasPrevious && !clearView"}],staticClass:"prev",class:{invisible:n.clearView||!n.hasPrevious},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),n.previous.apply(null,arguments)}}},[e("span",{staticClass:"icon-previous"},[e("ChevronLeft",{attrs:{size:40,title:"",decorative:""}}),n._v(" "),e("span",{staticClass:"hidden-visually"},[n._v("\n\t\t\t\t\t\t\t\t"+n._s(n.t("Previous"))+"\n\t\t\t\t\t\t\t")])],1)])]),n._v(" "),e("div",{staticClass:"modal-container"},[n._t("default")],2),n._v(" "),e("transition",{attrs:{name:"fade-visibility"}},[e("a",{directives:[{name:"show",rawName:"v-show",value:n.hasNext&&!n.clearView,expression:"hasNext && !clearView"}],staticClass:"next",class:{invisible:n.clearView||!n.hasNext},attrs:{href:"#"},on:{click:function(t){return t.preventDefault(),t.stopPropagation(),n.next.apply(null,arguments)}}},[e("span",{staticClass:"icon-next"},[e("ChevronRight",{attrs:{size:40,title:"",decorative:""}}),n._v(" "),e("span",{staticClass:"hidden-visually"},[n._v("\n\t\t\t\t\t\t\t\t"+n._s(n.t("Next"))+"\n\t\t\t\t\t\t\t")])],1)])])],1)])],1)])}),[],!1,null,"2da14a6a",null);"function"==typeof G()&&G()(L);var $=L.exports;(0,i.Z)($);var U=$},7316:function(n,t,e){"use strict";e.d(t,{default:function(){return M}});var i=e(7645),a=__webpack_require__(/*! vue-multiselect */ "./node_modules/vue-multiselect/dist/vue-multiselect.min.js"),r=e.n(a),o=e(7185),s=e(1336),l={name:"EllipsisedOption",components:{Highlight:o.default},props:{option:{type:[String,Object],required:!0,default:""},label:{type:String,default:""},search:{type:String,default:""},name:{type:String,default:""}},computed:{needsTruncate:function(){return this.name&&this.name.length>=10},split:function(){return this.name.length-Math.min(Math.floor(this.name.length/2),10)},part1:function(){return this.needsTruncate?this.name.slice(0,this.split):this.name},part2:function(){return this.needsTruncate?this.name.slice(this.split):""},highlight1:function(){return this.search?(0,s.Z)(this.name,this.search):[]},highlight2:function(){var n=this;return this.highlight1.map((function(t){return{start:t.start-n.split,end:t.end-n.split}}))}}},c=e(3379),d=e.n(c),A=e(7795),u=e.n(A),p=e(569),m=e.n(p),T=e(3565),h=e.n(T),g=e(9216),C=e.n(g),b=e(4589),f=e.n(b),v=e(9814),B={};B.styleTagTransform=f(),B.setAttributes=h(),B.insert=m().bind(null,"head"),B.domAPI=u(),B.insertStyleElement=C(),d()(v.Z,B),v.Z&&v.Z.locals&&v.Z.locals;var E=e(1900),D=(0,E.Z)(l,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"name-parts",attrs:{title:n.name}},[e("Highlight",{staticClass:"name-parts__first",attrs:{text:n.part1,search:n.search,highlight:n.highlight1}}),n._v(" "),n.part2?e("Highlight",{staticClass:"name-parts__last",attrs:{text:n.part2,search:n.search,highlight:n.highlight2}}):n._e()],1)}),[],!1,null,"0f132242",null).exports,S=e(3648),y=e(6982),x=e(9040);function N(n){return N="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},N(n)}var k={name:"Multiselect",components:{EllipsisedOption:D,ListItemIcon:y.default,VueMultiselect:r()},directives:{tooltip:x.default},mixins:[S.Z],inheritAttrs:!1,props:{value:{default:function(){return[]}},closeOnSelect:{type:Boolean,default:void 0},multiple:{type:Boolean,default:!1},limit:{type:Number,default:99999},label:{type:String,default:""},trackBy:{type:String,default:""},options:{type:Array,required:!0},userSelect:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},autoLimit:{type:Boolean,default:!0},tagWidth:{type:Number,default:150,validator:function(n){return n>0}}},data:function(){return{elWidth:0}},computed:{maxOptions:function(){if(this.autoLimit&&this.elWidth>0&&0!==this.tagWidth){var n=Math.floor(this.elWidth/this.tagWidth);return n>0?n:1}return this.limit?this.limit:9999},limitString:function(){return"+".concat(this.value.length-this.maxOptions)},localValue:{get:function(){return this.trackBy&&this.options&&"object"!==N(this.value)&&this.options[this.value]?this.options[this.value]:this.value},set:function(n){this.$emit("update:value",n),this.$emit("change",n)}},willCloseOnSelect:function(){return void 0===this.closeOnSelect?!this.multiple:this.closeOnSelect}},watch:{value:function(){this.updateWidth()}},mounted:function(){this.updateWidth(),window.addEventListener("resize",this.updateWidth)},beforeDestroy:function(){window.removeEventListener("resize",this.updateWidth)},methods:{getOptionLabel:function(n){var t;return String(null===(t=this.$refs.VueMultiselect)||void 0===t?void 0:t.getOptionLabel(n))},formatLimitTitle:function(n){var t=this;if(Array.isArray(n)&&n.length>0){var e=n;return"object"===N(n[0])&&(e=n.map((function(n){return n[t.label]}))),e.slice(this.maxOptions).join(", ")}return""},updateWidth:function(){this.$el&&this.$el.querySelector(".multiselect__tags-wrap")&&(this.elWidth=this.$el.querySelector(".multiselect__tags-wrap").offsetWidth-10)}}},R=k,F=e(7827),w=e.n(F),O=(0,E.Z)(R,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("VueMultiselect",n._g(n._b({ref:"VueMultiselect",class:[{"icon-loading-small":n.loading},n.multiple?"multiselect--multiple":"multiselect--single"],attrs:{options:n.options,limit:n.maxOptions,"close-on-select":n.willCloseOnSelect,multiple:n.multiple,label:n.label,"track-by":n.trackBy,"tag-placeholder":"create"},scopedSlots:n._u([{key:"option",fn:function(t){return[n.userSelect&&!n.$scopedSlots.option?e("ListItemIcon",n._b({attrs:{title:t.option[n.label],search:t.search}},"ListItemIcon",t.option,!1)):n.$scopedSlots.option?n._t("option",null,null,t):e("EllipsisedOption",{attrs:{name:n.getOptionLabel(t.option),option:t.option,search:t.search,label:n.label}})]}},n.multiple?{key:"limit",fn:function(){return[e("span",{directives:[{name:"tooltip",rawName:"v-tooltip.auto",value:n.formatLimitTitle(n.value),expression:"formatLimitTitle(value)",modifiers:{auto:!0}}],staticClass:"multiselect__limit"},[n._v("\n\t\t\t"+n._s(n.limitString)+"\n\t\t")])]},proxy:!0}:null,n._l(n.$scopedSlots,(function(t,e){return{key:e,fn:function(t){return[n._t(e,null,null,t)]}}})),{key:"noResult",fn:function(){return[e("span",[n._v(n._s(n.t("No results")))])]},proxy:!0}],null,!0),model:{value:n.localValue,callback:function(t){n.localValue=t},expression:"localValue"}},"VueMultiselect",n.$attrs,!1),n.$listeners))}),[],!1,null,null,null);"function"==typeof w()&&w()(O);var _=O.exports,Z=e(5850),Y={};Y.styleTagTransform=f(),Y.setAttributes=h(),Y.insert=m().bind(null,"head"),Y.domAPI=u(),Y.insertStyleElement=C(),d()(Z.Z,Y),Z.Z&&Z.Z.locals&&Z.Z.locals,(0,i.Z)(_);var M=_},7838:function(n,t,e){"use strict";e.d(t,{default:function(){return f}});var i=e(3648),a=e(7316),r=e(768),o=e.n(r),s=e(4262);function l(n,t,e,i,a,r,o){try{var s=n[r](o),l=s.value}catch(n){return void e(n)}s.done?t(l):Promise.resolve(l).then(i,a)}var c=function n(t){var e={};if(1===t.nodeType){if(t.attributes.length>0){e["@attributes"]={};for(var i=0;i\n\t\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t \n\t\t\t\t\t'});case 4:return t=n.sent,n.abrupt("return",d(t.data));case 6:case"end":return n.stop()}}),n)})),function(){var t=this,e=arguments;return new Promise((function(i,a){var r=n.apply(t,e);function o(n){l(r,i,a,o,s,"next",n)}function s(n){l(r,i,a,o,s,"throw",n)}o(void 0)}))});return function(){return t.apply(this,arguments)}}(),u=e(932);function p(n,t,e,i,a,r,o){try{var s=n[r](o),l=s.value}catch(n){return void e(n)}s.done?t(l):Promise.resolve(l).then(i,a)}var m={name:"MultiselectTags",components:{Multiselect:a.default},mixins:[i.Z],props:{label:{type:String,default:(0,u.t)("Select a tag")},value:{type:[Number,Array],required:!0},disabled:{type:Boolean,default:!1},multiple:{type:Boolean,default:!0}},data:function(){return{tags:[]}},computed:{inputValue:function(){return this.getValueObject()}},beforeCreate:function(){var n,t=this;return(n=regeneratorRuntime.mark((function n(){var e;return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:return n.prev=0,n.next=3,A();case 3:e=n.sent,t.tags=e,n.next=10;break;case 7:n.prev=7,n.t0=n.catch(0),console.error("Loading systemtags failed",n.t0);case 10:case"end":return n.stop()}}),n,null,[[0,7]])})),function(){var t=this,e=arguments;return new Promise((function(i,a){var r=n.apply(t,e);function o(n){p(r,i,a,o,s,"next",n)}function s(n){p(r,i,a,o,s,"throw",n)}o(void 0)}))})()},methods:{getValueObject:function(){var n=this;return 0===this.tags.length?[]:this.multiple?this.value.filter((function(n){return""!==n})).map((function(t){return n.tags.find((function(n){return n.id===t}))})):this.tags.find((function(t){return t.id===n.value}))},update:function(n){this.multiple?this.$emit("input",n.map((function(n){return n.id}))):null===n?this.$emit("input",null):this.$emit("input",n.id)},tagLabel:function(n){var t=n.displayName,e=n.userVisible,i=n.userAssignable;return!1===e?(0,u.t)("{tag} (invisible)",{tag:t}):!1===i?(0,u.t)("{tag} (restricted)",{tag:t}):t}}},T=m,h=e(1900),g=e(590),C=e.n(g),b=(0,h.Z)(T,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("Multiselect",{attrs:{value:n.inputValue,options:n.tags,"options-limit":5,placeholder:n.label,"track-by":"id","custom-label":n.tagLabel,multiple:n.multiple,"close-on-select":n.multiple,"tag-width":60,disabled:n.disabled},on:{input:n.update},scopedSlots:n._u([{key:"noResult",fn:function(){return[e("span",[n._v(n._s(n.t("No results")))])]},proxy:!0},{key:"option",fn:function(t){return[n._v("\n\t\t"+n._s(n.tagLabel(t.option))+"\n\t")]}}])})}),[],!1,null,null,null);"function"==typeof C()&&C()(b);var f=b.exports},8099:function(n,t,e){"use strict";var i=e(7020);t.default=i.Z},6996:function(n,t,e){"use strict";e.d(t,{default:function(){return N}});var i={name:"PopoverMenuItem",props:{item:{type:Object,required:!0,default:function(){return{key:"nextcloud-link",href:"https://nextcloud.com",icon:"icon-links",text:"Nextcloud"}},validator:function(n){return!n.input||-1!==["text","checkbox"].indexOf(n.input)}}},computed:{key:function(){return this.item.key?this.item.key:Math.round(16*Math.random()*1e6).toString(16)},iconIsUrl:function(){try{return new URL(this.item.icon),!0}catch(n){return!1}}},methods:{action:function(n){this.item.action&&this.item.action(n)}}},a=e(3379),r=e.n(a),o=e(7795),s=e.n(o),l=e(569),c=e.n(l),d=e(3565),A=e.n(d),u=e(9216),p=e.n(u),m=e(4589),T=e.n(m),h=e(1852),g={};g.styleTagTransform=T(),g.setAttributes=A(),g.insert=c().bind(null,"head"),g.domAPI=s(),g.insertStyleElement=p(),r()(h.Z,g),h.Z&&h.Z.locals&&h.Z.locals;var C=e(3530),b={};b.styleTagTransform=T(),b.setAttributes=A(),b.insert=c().bind(null,"head"),b.domAPI=s(),b.insertStyleElement=p(),r()(C.Z,b),C.Z&&C.Z.locals&&C.Z.locals;var f=e(1900),v=(0,f.Z)(i,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("li",{staticClass:"popover__menuitem"},[n.item.href?e("a",{staticClass:"focusable",attrs:{href:n.item.href?n.item.href:"#",target:n.item.target?n.item.target:"",download:n.item.download,rel:"nofollow noreferrer noopener"},on:{click:n.action}},[n.iconIsUrl?e("img",{attrs:{src:n.item.icon}}):e("span",{class:n.item.icon}),n._v(" "),n.item.text&&n.item.longtext?e("p",[e("strong",{staticClass:"menuitem-text"},[n._v("\n\t\t\t\t"+n._s(n.item.text)+"\n\t\t\t")]),e("br"),n._v(" "),e("span",{staticClass:"menuitem-text-detail"},[n._v("\n\t\t\t\t"+n._s(n.item.longtext)+"\n\t\t\t")])]):n.item.text?e("span",[n._v("\n\t\t\t"+n._s(n.item.text)+"\n\t\t")]):n.item.longtext?e("p",[n._v("\n\t\t\t"+n._s(n.item.longtext)+"\n\t\t")]):n._e()]):n.item.input?e("span",{staticClass:"menuitem",class:{active:n.item.active}},["checkbox"!==n.item.input?e("span",{class:n.item.icon}):n._e(),n._v(" "),"text"===n.item.input?e("form",{class:n.item.input,on:{submit:function(t){return t.preventDefault(),n.item.action.apply(null,arguments)}}},[e("input",{attrs:{type:n.item.input,placeholder:n.item.text,required:""},domProps:{value:n.item.value}}),n._v(" "),e("input",{staticClass:"icon-confirm",attrs:{type:"submit",value:""}})]):["checkbox"===n.item.input?e("input",{directives:[{name:"model",rawName:"v-model",value:n.item.model,expression:"item.model"}],class:n.item.input,attrs:{id:n.key,type:"checkbox"},domProps:{checked:Array.isArray(n.item.model)?n._i(n.item.model,null)>-1:n.item.model},on:{change:[function(t){var e=n.item.model,i=t.target,a=!!i.checked;if(Array.isArray(e)){var r=n._i(e,null);i.checked?r<0&&n.$set(n.item,"model",e.concat([null])):r>-1&&n.$set(n.item,"model",e.slice(0,r).concat(e.slice(r+1)))}else n.$set(n.item,"model",a)},n.item.action]}}):"radio"===n.item.input?e("input",{directives:[{name:"model",rawName:"v-model",value:n.item.model,expression:"item.model"}],class:n.item.input,attrs:{id:n.key,type:"radio"},domProps:{checked:n._q(n.item.model,null)},on:{change:[function(t){return n.$set(n.item,"model",null)},n.item.action]}}):e("input",{directives:[{name:"model",rawName:"v-model",value:n.item.model,expression:"item.model"}],class:n.item.input,attrs:{id:n.key,type:n.item.input},domProps:{value:n.item.model},on:{change:n.item.action,input:function(t){t.target.composing||n.$set(n.item,"model",t.target.value)}}}),n._v(" "),e("label",{attrs:{for:n.key},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.item.action.apply(null,arguments)}}},[n._v("\n\t\t\t\t"+n._s(n.item.text)+"\n\t\t\t")])]],2):n.item.action?e("button",{staticClass:"menuitem focusable",class:{active:n.item.active},attrs:{disabled:n.item.disabled,type:"button"},on:{click:function(t){return t.stopPropagation(),t.preventDefault(),n.item.action.apply(null,arguments)}}},[e("span",{class:n.item.icon}),n._v(" "),n.item.text&&n.item.longtext?e("p",[e("strong",{staticClass:"menuitem-text"},[n._v("\n\t\t\t\t"+n._s(n.item.text)+"\n\t\t\t")]),e("br"),n._v(" "),e("span",{staticClass:"menuitem-text-detail"},[n._v("\n\t\t\t\t"+n._s(n.item.longtext)+"\n\t\t\t")])]):n.item.text?e("span",[n._v("\n\t\t\t"+n._s(n.item.text)+"\n\t\t")]):n.item.longtext?e("p",[n._v("\n\t\t\t"+n._s(n.item.longtext)+"\n\t\t")]):n._e()]):e("span",{staticClass:"menuitem",class:{active:n.item.active}},[e("span",{class:n.item.icon}),n._v(" "),n.item.text&&n.item.longtext?e("p",[e("strong",{staticClass:"menuitem-text"},[n._v("\n\t\t\t\t"+n._s(n.item.text)+"\n\t\t\t")]),e("br"),n._v(" "),e("span",{staticClass:"menuitem-text-detail"},[n._v("\n\t\t\t\t"+n._s(n.item.longtext)+"\n\t\t\t")])]):n.item.text?e("span",[n._v("\n\t\t\t"+n._s(n.item.text)+"\n\t\t")]):n.item.longtext?e("p",[n._v("\n\t\t\t"+n._s(n.item.longtext)+"\n\t\t")]):n._e()])])}),[],!1,null,"79bc7480",null),B={name:"PopoverMenu",components:{PopoverMenuItem:v.exports},props:{menu:{type:Array,default:function(){return[{href:"https://nextcloud.com",icon:"icon-links",text:"Nextcloud"}]},required:!0}}},E=e(7816),D={};D.styleTagTransform=T(),D.setAttributes=A(),D.insert=c().bind(null,"head"),D.domAPI=s(),D.insertStyleElement=p(),r()(E.Z,D),E.Z&&E.Z.locals&&E.Z.locals;var S=e(26),y=e.n(S),x=(0,f.Z)(B,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("ul",{staticClass:"popover__menu"},n._l(n.menu,(function(n,t){return e("PopoverMenuItem",{key:t,attrs:{item:n}})})),1)}),[],!1,null,"4dae360a",null);"function"==typeof y()&&y()(x);var N=x.exports},1102:function(n,t,e){"use strict";e.d(t,{default:function(){return L}});var i=__webpack_require__(/*! tributejs/dist/tribute.esm */ "./node_modules/tributejs/dist/tribute.esm.js"),a=e.n(i),r=e(3465),o=e.n(r),s=__webpack_require__(/*! string-length */ "./node_modules/string-length/index.js"),l=e.n(s),c=e(932),d=e(4262),A={name:"AutoCompleteResult",props:{label:{type:String,required:!0},subline:{type:String,default:null},id:{type:String,default:null},icon:{type:String,required:!0},source:{type:String,required:!0},status:{type:[Object,Array],default:function(){return{}}}},computed:{avatarUrl:function(){return this.id&&"users"===this.source?this.getAvatarUrl(this.id,44):null},haveStatus:function(){var n,t;return(null===(n=this.status)||void 0===n?void 0:n.icon)||(null===(t=this.status)||void 0===t?void 0:t.status)}},methods:{getAvatarUrl:function(n,t){return(0,d.generateUrl)("/avatar/{user}/{size}",{user:n,size:t})}}},u=e(3379),p=e.n(u),m=e(7795),T=e.n(m),h=e(569),g=e.n(h),C=e(3565),b=e.n(C),f=e(9216),v=e.n(f),B=e(4589),E=e.n(B),D=e(1142),S={};S.styleTagTransform=E(),S.setAttributes=b(),S.insert=g().bind(null,"head"),S.domAPI=T(),S.insertStyleElement=v(),p()(D.Z,S),D.Z&&D.Z.locals&&D.Z.locals;var y=e(1900),x=(0,y.Z)(A,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"autocomplete-result"},[e("div",{staticClass:"autocomplete-result__icon",class:[n.icon,"autocomplete-result__icon--"+(n.avatarUrl?"with-avatar":"")],style:n.avatarUrl?{backgroundImage:"url("+n.avatarUrl+")"}:null},[n.haveStatus?e("div",{staticClass:"autocomplete-result__status",class:["autocomplete-result__status--"+(n.status&&n.status.icon?"icon":n.status.status)]},[n._v("\n\t\t\t"+n._s(n.status&&n.status.icon||"")+"\n\t\t")]):n._e()]),n._v(" "),e("span",{staticClass:"autocomplete-result__content"},[e("span",{staticClass:"autocomplete-result__title"},[n._v("\n\t\t\t"+n._s(n.label)+"\n\t\t")]),n._v(" "),n.subline?e("span",{staticClass:"autocomplete-result__subline"},[n._v("\n\t\t\t"+n._s(n.subline)+"\n\t\t")]):n._e()])])}),[],!1,null,"c5738294",null).exports,N=e(1088),k=e(7791);function R(n,t,e,i,a,r,o){try{var s=n[r](o),l=s.value}catch(n){return void e(n)}s.done?t(l):Promise.resolve(l).then(i,a)}var F={name:"RichContenteditable",mixins:[N.default],props:{value:{type:String,default:"",required:!0},placeholder:{type:String,default:(0,c.t)("Write message, @ to mention someone, : for emoji autocompletion …")},autoComplete:{type:Function,required:!0},menuContainer:{type:Element,default:function(){return document.body}},multiline:{type:Boolean,default:!1},contenteditable:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},maxlength:{type:Number,default:null},emojiAutocomplete:{type:Boolean,default:!0}},data:function(){var n=this;return{tribute:null,autocompleteOptions:{fillAttr:"id",lookup:function(n){return"".concat(n.id," ").concat(n.label)},menuContainer:this.menuContainer,menuItemTemplate:function(t){return n.renderComponentHtml(t.original,x)},noMatchTemplate:function(){return''},selectTemplate:function(t){var e;return n.genSelectTemplate(null==t||null===(e=t.original)||void 0===e?void 0:e.id)},values:this.debouncedAutoComplete},emojiOptions:{trigger:":",lookup:function(n,t){return t},menuContainer:this.menuContainer,menuItemTemplate:function(n){return''.concat(n.original.native," :").concat(n.original.short_name)},noMatchTemplate:function(){return(0,c.t)("No emoji found")},selectTemplate:function(n){return(0,k.addRecent)(n.original),n.original.native},values:function(n,t){return t((0,k.emojiSearch)(n))},containerClass:"tribute-container-emoji",itemClass:"tribute-container-emoji__item"},localValue:this.value}},computed:{isEmptyValue:function(){return!this.localValue||this.localValue&&""===this.localValue.trim()},isFF:function(){return!!navigator.userAgent.match(/firefox/i)},isOverMaxlength:function(){return!(this.isEmptyValue||!this.maxlength)&&l()(this.localValue)>this.maxlength},tooltip:function(){return this.isOverMaxlength?{content:(0,c.t)("Message limit of {count} characters reached",{count:this.maxlength}),show:!0,trigger:"manual"}:null},canEdit:function(){return this.contenteditable&&!this.disabled}},watch:{value:function(){var n=this.$refs.contenteditable.innerHTML;this.value.trim()!==this.parseContent(n).trim()&&this.updateContent(this.value)}},mounted:function(){this.autocompleteTribute=new(a())(this.autocompleteOptions),this.autocompleteTribute.attach(this.$el),this.emojiAutocomplete&&(this.emojiTribute=new(a())(this.emojiOptions),this.emojiTribute.attach(this.$el)),this.updateContent(this.value),this.$refs.contenteditable.contentEditable=this.canEdit},beforeDestroy:function(){this.autocompleteTribute&&this.autocompleteTribute.detach(this.$el),this.emojiTribute&&this.emojiTribute.detach(this.$el)},methods:{onInput:function(n){this.updateValue(n.target.innerHTML)},onPaste:function(n){if(this.canEdit){n.preventDefault();var t=n.clipboardData;if(this.$emit("paste",n),0===t.files.length&&Object.values(t.items).find((function(n){return null==n?void 0:n.type.startsWith("text")}))){var e=t.getData("text"),i=window.getSelection();i.rangeCount||this.updateValue(e);var a=this.parseContent(e),r=i.getRangeAt(0);i.deleteFromDocument(),r.insertNode(document.createTextNode(a));var o=document.createRange();o.setStart(n.target,r.endOffset),o.collapse(!0),i.removeAllRanges(),i.addRange(o),this.updateValue(n.target.innerHTML)}}},updateValue:function(n){var t=this.parseContent(n);this.localValue=t,this.$emit("update:value",t)},updateContent:function(n){var t=this.renderContent(n);this.$refs.contenteditable.innerHTML=t,this.localValue=n},onDelete:function(n){if(this.isFF&&window.getSelection&&this.canEdit){var t=window.getSelection(),e=n.target;if(t.isCollapsed&&t.rangeCount){var i=t.getRangeAt(t.rangeCount-1);if(!(3===i.commonAncestorContainer.nodeType&&i.startOffset>0)){var a=document.createRange();if(t.anchorNode!==e)a.selectNodeContents(e),a.setEndBefore(t.anchorNode);else{if(!(t.anchorOffset>0))return;a.setEnd(e,t.anchorOffset)}a.setStart(e,a.endOffset-1);var r=a.cloneContents().lastChild;r&&"false"===r.contentEditable&&(a.deleteContents(),n.preventDefault())}}}},onEnter:function(n){this.multiline||this.isOverMaxlength||this.autocompleteTribute.isActive||this.emojiTribute.isActive||(n.preventDefault(),n.stopPropagation(),this.$emit("submit",n))},onCtrlEnter:function(n){this.isOverMaxlength||this.$emit("submit",n)},debouncedAutoComplete:o()(function(){var n,t=(n=regeneratorRuntime.mark((function n(t,e){return regeneratorRuntime.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:this.autoComplete(t,e);case 1:case"end":return n.stop()}}),n,this)})),function(){var t=this,e=arguments;return new Promise((function(i,a){var r=n.apply(t,e);function o(n){R(r,i,a,o,s,"next",n)}function s(n){R(r,i,a,o,s,"throw",n)}o(void 0)}))});return function(n,e){return t.apply(this,arguments)}}(),100)}},w=F,O=e(2305),_={};_.styleTagTransform=E(),_.setAttributes=b(),_.insert=g().bind(null,"head"),_.domAPI=T(),_.insertStyleElement=v(),p()(O.Z,_),O.Z&&O.Z.locals&&O.Z.locals;var Z=e(4398),Y={};Y.styleTagTransform=E(),Y.setAttributes=b(),Y.insert=g().bind(null,"head"),Y.domAPI=T(),Y.insertStyleElement=v(),p()(Z.Z,Y),Z.Z&&Z.Z.locals&&Z.Z.locals;var M=e(1164),I=e.n(M),G=(0,y.Z)(w,(function(){var n=this,t=n.$createElement;return(n._self._c||t)("div",n._g({directives:[{name:"tooltip",rawName:"v-tooltip",value:n.tooltip,expression:"tooltip"}],ref:"contenteditable",staticClass:"rich-contenteditable__input",class:{"rich-contenteditable__input--empty":n.isEmptyValue,"rich-contenteditable__input--multiline":n.multiline,"rich-contenteditable__input--overflow":n.isOverMaxlength,"rich-contenteditable__input--disabled":n.disabled},attrs:{contenteditable:n.canEdit,placeholder:n.placeholder,"aria-multiline":"true",role:"textbox"},on:{input:n.onInput,keydown:[function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"delete",[8,46],t.key,["Backspace","Delete","Del"])?null:n.onDelete.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")||t.ctrlKey||t.shiftKey||t.altKey||t.metaKey?null:n.onEnter.apply(null,arguments)},function(t){return!t.type.indexOf("key")&&n._k(t.keyCode,"enter",13,t.key,"Enter")?null:t.ctrlKey?t.shiftKey||t.altKey||t.metaKey?null:(t.stopPropagation(),t.preventDefault(),n.onCtrlEnter.apply(null,arguments)):null}],paste:n.onPaste}},n.$listeners))}),[],!1,null,"6d5a0150",null);"function"==typeof I()&&I()(G);var L=G.exports},3325:function(n,t,e){"use strict";e.d(t,{default:function(){return S}});var i=__webpack_require__(/*! vue-material-design-icons/HelpCircle */ "./node_modules/vue-material-design-icons/HelpCircle.vue"),a=e.n(i),r=e(932),o={name:"SettingsSection",components:{HelpCircle:a()},props:{title:{type:String,required:!0},description:{type:String,default:""},docUrl:{type:String,default:""}},data:function(){return{docTitleTranslated:(0,r.t)("External documentation for {title}",{title:this.title})}},computed:{hasDescription:function(){return this.description.length>0},hasDocUrl:function(){return this.docUrl.length>0}}},s=e(3379),l=e.n(s),c=e(7795),d=e.n(c),A=e(569),u=e.n(A),p=e(3565),m=e.n(p),T=e(9216),h=e.n(T),g=e(4589),C=e.n(g),b=e(1305),f={};f.styleTagTransform=C(),f.setAttributes=m(),f.insert=u().bind(null,"head"),f.domAPI=d(),f.insertStyleElement=h(),l()(b.Z,f),b.Z&&b.Z.locals&&b.Z.locals;var v=e(1900),B=e(7862),E=e.n(B),D=(0,v.Z)(o,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",{staticClass:"settings-section"},[e("h2",{staticClass:"settings-section__title"},[n._v("\n\t\t"+n._s(n.title)+"\n\t\t"),n.hasDocUrl?e("a",{staticClass:"settings-section__info",attrs:{href:n.docUrl,role:"note",title:n.docTitleTranslated}},[e("HelpCircle",{attrs:{size:20,decorative:"",title:""}})],1):n._e()]),n._v(" "),n.hasDescription?e("p",{staticClass:"settings-section__desc"},[n._v("\n\t\t"+n._s(n.description)+"\n\t")]):n._e(),n._v(" "),n._t("default")],2)}),[],!1,null,"548823d7",null);"function"==typeof E()&&E()(D);var S=D.exports},9460:function(n,t,e){"use strict";e.d(t,{default:function(){return Z}});var i=e(7316),a=e(932);function r(n,t){var e="undefined"!=typeof Symbol&&n[Symbol.iterator]||n["@@iterator"];if(!e){if(Array.isArray(n)||(e=function(n,t){if(n){if("string"==typeof n)return o(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?o(n,t):void 0}}(n))||t&&n&&"number"==typeof n.length){e&&(n=e);var i=0,a=function(){};return{s:a,n:function(){return i>=n.length?{done:!0}:{done:!1,value:n[i++]}},e:function(n){throw n},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,s=!0,l=!1;return{s:function(){e=e.call(n)},n:function(){var n=e.next();return s=n.done,n},e:function(n){l=!0,r=n},f:function(){try{s||null==e.return||e.return()}finally{if(l)throw r}}}}function o(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,i=new Array(t);en.length)&&(t=n.length);for(var e=0,i=new Array(t);en.length)&&(t=n.length);for(var e=0,i=new Array(t);e=n.length?{done:!0}:{done:!1,value:n[i++]}},e:function(n){throw n},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,s=!1;return{s:function(){e=e.call(n)},n:function(){var n=e.next();return o=n.done,n},e:function(n){s=!0,r=n},f:function(){try{o||null==e.return||e.return()}finally{if(s)throw r}}}}(this.additionalTimezones);try{for(t.s();!(n=t.n()).done;){var e=n.value;if(e.timezoneId===this.value)return e}}catch(n){t.e(n)}finally{t.f()}return{label:s(this.value),timezoneId:this.value}},options:function(){return function(){var n,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],e={},i=[],o=r(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]);try{for(o.s();!(n=o.n()).done;){var l=n.value,c=l.split("/"),d=[c.shift(),c.join("/")],A=d[0],u=d[1];u||(u=A,A=(0,a.t)("Global")),e[A]=e[A]||{continent:A,regions:[]},e[A].regions.push({label:s(u),cities:[],timezoneId:l})}}catch(n){o.e(n)}finally{o.f()}var p,m=r(t);try{for(m.s();!(p=m.n()).done;){var T=p.value,h=T.continent,g=T.label,C=T.timezoneId;e[h]=e[h]||{continent:h,regions:[]},e[h].regions.push({label:g,cities:[],timezoneId:C})}}catch(n){m.e(n)}finally{m.f()}for(var b in e)Object.prototype.hasOwnProperty.call(e,b)&&(e[b].regions.sort((function(n,t){return n.label
'),i.VTooltip.options.defaultHtml=!1,i.VTooltip.options.defaultDelay={show:500,hide:200};var C=i.VTooltip},7791:function(n,t,e){"use strict";e.d(t,{addRecent:function(){return s},emojiSearch:function(){return o}});var i=__webpack_require__(/*! emoji-mart-vue-fast/data/all.json */ "./node_modules/emoji-mart-vue-fast/data/all.json"),a=e.n(i),r=__webpack_require__(/*! emoji-mart-vue-fast */ "./node_modules/emoji-mart-vue-fast/dist/emoji-mart.js"),o=function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:10,e=new r.EmojiIndex(a());return n?e.search(n,t)||[]:r.frequently.get(t).map((function(n){return e.emoji(n)}))||[]},s=function(n){r.frequently.add(n)}},7993:function(n,t,e){"use strict";e.d(t,{default:function(){return o}});var i=__webpack_require__(/*! md5 */ "./node_modules/md5/md5.js"),a=e.n(i),r=e(6609),o=function(n){var t=n.toLowerCase();return null===t.match(/^([0-9a-f]{4}-?){8}$/)&&(t=a()(t)),t=t.replace(/[^0-9a-f]/g,""),(0,r.Z)(6)[function(n,t){for(var e=0,i=[],a=0;a20}},methods:{getText:function(){return this.$slots.default?this.$slots.default[0].text.trim():""}}}},9156:function(n,t,e){"use strict";var i=e(723),a=e(6021);t.Z={mixins:[i.Z],props:{icon:{type:String,default:""},title:{type:String,default:""},closeAfterClick:{type:Boolean,default:!1},ariaLabel:{type:String,default:""}},computed:{isIconUrl:function(){try{return new URL(this.icon)}catch(n){return!1}}},methods:{onClick:function(n){if(this.$emit("click",n),this.closeAfterClick){var t=(0,a.Z)(this,"Actions");t&&t.closeMenu&&t.closeMenu()}}}}},9150:function(n,t){"use strict";function e(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,i=new Array(t);e=n.length?{done:!0}:{done:!1,value:n[a++]}},e:function(n){throw n},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,s=!0,l=!1;return{s:function(){i=i.call(n)},n:function(){var n=i.next();return s=n.done,n},e:function(n){l=!0,o=n},f:function(){try{s||null==i.return||i.return()}finally{if(l)throw o}}}}(t);try{for(a.s();!(i=a.n()).done;){var r,o=i.value;if(null!=n&&null!==(r=n.classList)&&void 0!==r&&r.contains(o))return!0}}catch(n){a.e(n)}finally{a.f()}return!!n.parentElement&&this.hasNodeOrAnyParentClass(n.parentElement,t)}}}},3351:function(n,t,e){"use strict";e.d(t,{yd:function(){return i.default},rm:function(){return a.default},tq:function(){return r.default},bf:function(){return o.default},iQ:function(){return p}});var i=e(9150),a=e(8136),r=e(334),o=e(1088),s=e(768),l=e.n(s),c=e(4262),d=__webpack_require__(/*! @nextcloud/capabilities */ "./node_modules/@nextcloud/capabilities/dist/index.js"),A=e(3607);function u(n,t,e,i,a,r,o){try{var s=n[r](o),l=s.value}catch(n){return void e(n)}s.done?t(l):Promise.resolve(l).then(i,a)}var p={data:function(){return{hasStatus:!1,userStatus:{status:null,message:null,icon:null}}},methods:{fetchUserStatus:function(n){var t,e=this;return(t=regeneratorRuntime.mark((function t(){var i,a,r,o,s,u,p,m,T;return regeneratorRuntime.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(n){t.next=2;break}return t.abrupt("return");case 2:if(i=(0,d.getCapabilities)(),Object.prototype.hasOwnProperty.call(i,"user_status")&&i.user_status.enabled){t.next=5;break}return t.abrupt("return");case 5:if((0,A.getCurrentUser)()){t.next=7;break}return t.abrupt("return");case 7:return t.prev=7,t.next=10,l().get((0,c.generateOcsUrl)("apps/user_status/api/v1/statuses/{userId}",{userId:n}));case 10:a=t.sent,r=a.data,o=r.ocs.data,s=o.status,u=o.message,p=o.icon,e.userStatus.status=s,e.userStatus.message=u||"",e.userStatus.icon=p||"",e.hasStatus=!0,t.next=24;break;case 19:if(t.prev=19,t.t0=t.catch(7),404!==t.t0.response.status||0!==(null===(m=t.t0.response.data.ocs)||void 0===m||null===(T=m.data)||void 0===T?void 0:T.length)){t.next=23;break}return t.abrupt("return");case 23:console.error(t.t0);case 24:case"end":return t.stop()}}),t,null,[[7,19]])})),function(){var n=this,e=arguments;return new Promise((function(i,a){var r=t.apply(n,e);function o(n){u(r,i,a,o,s,"next",n)}function s(n){u(r,i,a,o,s,"throw",n)}o(void 0)}))})()}}}},8136:function(n,t){"use strict";t.default={data:function(){return{isFullscreen:this._isFullscreen()}},beforeMount:function(){window.addEventListener("resize",this._onResize)},beforeDestroy:function(){window.removeEventListener("resize",this._onResize)},methods:{_onResize:function(){this.isFullscreen=this._isFullscreen()},_isFullscreen:function(){return window.outerHeight===screen.height}}}},334:function(n,t,e){"use strict";e.d(t,{default:function(){return r}});var i=e(2734),a=new(e.n(i)())({data:function(){return{isMobile:!1}},watch:{isMobile:function(n){this.$emit("changed",n)}},created:function(){window.addEventListener("resize",this.handleWindowResize),this.handleWindowResize()},beforeDestroy:function(){window.removeEventListener("resize",this.handleWindowResize)},methods:{handleWindowResize:function(){this.isMobile=document.documentElement.clientWidth<1024}}}),r={data:function(){return{isMobile:!1}},mounted:function(){a.$on("changed",this.onIsMobileChanged),this.isMobile=a.isMobile},beforeDestroy:function(){a.$off("changed",this.onIsMobileChanged)},methods:{onIsMobileChanged:function(n){this.isMobile=n}}}},3648:function(n,t,e){"use strict";var i=e(932);t.Z={methods:{n:i.n,t:i.t}}},1088:function(n,t,e){"use strict";e.d(t,{default:function(){return F}});var i=__webpack_require__(/*! escape-html */ "./node_modules/escape-html/index.js"),a=e.n(i),r=e(1390),o=__webpack_require__(/*! striptags */ "./node_modules/striptags/src/striptags.js"),s=e.n(o),l=e(2734),c=e.n(l),d=e(4262),A={name:"MentionBubble",props:{id:{type:String,required:!0},label:{type:String,required:!0},icon:{type:String,required:!0},source:{type:String,required:!0},primary:{type:Boolean,default:!1}},computed:{avatarUrl:function(){return this.id&&"users"===this.source?this.getAvatarUrl(this.id,44):null},mentionText:function(){return-1===this.id.indexOf(" ")?"@".concat(this.id):'@"'.concat(this.id,'"')}},methods:{getAvatarUrl:function(n,t){return(0,d.generateUrl)("/avatar/{user}/{size}",{user:n,size:t})}}},u=e(3379),p=e.n(u),m=e(7795),T=e.n(m),h=e(569),g=e.n(h),C=e(3565),b=e.n(C),f=e(9216),v=e.n(f),B=e(4589),E=e.n(B),D=e(4388),S={};S.styleTagTransform=E(),S.setAttributes=b(),S.insert=g().bind(null,"head"),S.domAPI=T(),S.insertStyleElement=v(),p()(D.Z,S),D.Z&&D.Z.locals&&D.Z.locals;var y=(0,e(1900).Z)(A,(function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("span",{staticClass:"mention-bubble",class:{"mention-bubble--primary":n.primary},attrs:{contenteditable:"false"}},[e("span",{staticClass:"mention-bubble__wrapper"},[e("span",{staticClass:"mention-bubble__content"},[e("span",{staticClass:"mention-bubble__icon",class:[n.icon,"mention-bubble__icon--"+(n.avatarUrl?"with-avatar":"")],style:n.avatarUrl?{backgroundImage:"url("+n.avatarUrl+")"}:null}),n._v(" "),e("span",{staticClass:"mention-bubble__title",attrs:{role:"heading",title:n.label}})]),n._v(" "),e("span",{staticClass:"mention-bubble__select",attrs:{role:"none"}},[n._v(n._s(n.mentionText))])])])}),[],!1,null,"724f9d58",null).exports,x="(?:^|\\s)",N="(?:[^a-z]|$)",k=new RegExp("".concat(x,"(@[a-zA-Z0-9_.@\\-']+)(").concat(N,")"),"gi"),R=new RegExp("".concat(x,"(@"[a-zA-Z0-9 _.@\\-']+")(").concat(N,")"),"gi"),F={props:{userData:{type:Object,default:function(){return{}}}},methods:{renderContent:function(n){var t=this;return a()(n).split(k).map((function(n){return n.split(R)})).flat().map((function(n){if(!n.startsWith("@"))return(0,r.Z)(n);var e=n.replace(/@|"/gi,"");return" "+t.genSelectTemplate(e)})).join("").replace(/\n/gim,"
").replace(/&/gim,"&")},parseContent:function(n){var t=n.replace(/
/gim,"\n");return t=(t=(t=t.replace(/ /gim," ")).replace(/&/gim,"&")).replace(/<\/div>/gim,"\n"),t=s()(t,"
"),s()(t)},genSelectTemplate:function(n){var t=this.userData[n];return t?this.renderComponentHtml(t,y).replace(/[\n\t]/gim,""):-1===n.indexOf(" ")?"@".concat(n):'@"'.concat(n,'"')},renderComponentHtml:function(n,t){var e=new(c().extend(t))({propsData:n}),i=document.createElement("div"),a=document.createElement("div");i.style.display="none",i.appendChild(a),document.body.appendChild(i),e.$mount(a);var r=i.innerHTML;return e.$destroy(),i.remove(),r}}}},1336:function(n,t){"use strict";t.Z=function(n,t){for(var e=[],i=0,a=n.toLowerCase().indexOf(t.toLowerCase(),i),r=0;a>-1&&rtr>th{text-align:center;opacity:.5;color:var(--color-text-lighter)}.mx-datepicker-main .mx-table tr:focus,.mx-datepicker-main .mx-table tr:hover,.mx-datepicker-main .mx-table tr:active{background-color:transparent}.mx-datepicker-main .mx-table .cell{transition:all 100ms ease-in-out;text-align:center;opacity:.7;border-radius:50px}.mx-datepicker-main .mx-table .cell>*{cursor:pointer}.mx-datepicker-main .mx-table .cell.today{opacity:1;color:var(--color-primary-element);font-weight:bold}.mx-datepicker-main .mx-table .cell.today:hover,.mx-datepicker-main .mx-table .cell.today:focus{color:var(--color-primary-text)}.mx-datepicker-main .mx-table .cell.in-range,.mx-datepicker-main .mx-table .cell.disabled{border-radius:0;font-weight:normal}.mx-datepicker-main .mx-table .cell.in-range{opacity:.7}.mx-datepicker-main .mx-table .cell.not-current-month{opacity:.5;color:var(--color-text-lighter)}.mx-datepicker-main .mx-table .cell.not-current-month:hover,.mx-datepicker-main .mx-table .cell.not-current-month:focus{opacity:1}.mx-datepicker-main .mx-table .cell:hover,.mx-datepicker-main .mx-table .cell:focus,.mx-datepicker-main .mx-table .cell.actived,.mx-datepicker-main .mx-table .cell.active,.mx-datepicker-main .mx-table .cell.in-range{opacity:1;color:var(--color-primary-text);background-color:var(--color-primary-element);font-weight:bold}.mx-datepicker-main .mx-table .cell.disabled{opacity:.5;color:var(--color-text-lighter);border-radius:0;background-color:var(--color-background-darker)}.mx-datepicker-main .mx-table .mx-week-number{text-align:center;opacity:.7;border-radius:50px}.mx-datepicker-main .mx-table span.mx-week-number,.mx-datepicker-main .mx-table li.mx-week-number,.mx-datepicker-main .mx-table span.cell,.mx-datepicker-main .mx-table li.cell{min-height:32px}.mx-datepicker-main .mx-table.mx-table-date thead,.mx-datepicker-main .mx-table.mx-table-date tbody,.mx-datepicker-main .mx-table.mx-table-year,.mx-datepicker-main .mx-table.mx-table-month{display:flex;flex-direction:column;justify-content:space-around}.mx-datepicker-main .mx-table.mx-table-date thead tr,.mx-datepicker-main .mx-table.mx-table-date tbody tr,.mx-datepicker-main .mx-table.mx-table-year tr,.mx-datepicker-main .mx-table.mx-table-month tr{display:inline-flex;align-items:center;flex:1 1 32px;justify-content:space-around;min-height:32px}.mx-datepicker-main .mx-table.mx-table-date thead th,.mx-datepicker-main .mx-table.mx-table-date thead td,.mx-datepicker-main .mx-table.mx-table-date tbody th,.mx-datepicker-main .mx-table.mx-table-date tbody td,.mx-datepicker-main .mx-table.mx-table-year th,.mx-datepicker-main .mx-table.mx-table-year td,.mx-datepicker-main .mx-table.mx-table-month th,.mx-datepicker-main .mx-table.mx-table-month td{display:flex;align-items:center;flex:0 1 32%;justify-content:center;min-width:32px;height:95%;min-height:32px;transition:background 100ms ease-in-out}.mx-datepicker-main .mx-table.mx-table-year tr th,.mx-datepicker-main .mx-table.mx-table-year tr td{flex-basis:48%}.mx-datepicker-main .mx-table.mx-table-date tr th,.mx-datepicker-main .mx-table.mx-table-date tr td{flex-basis:32px}.mx-datepicker-main .mx-btn{min-width:32px;height:32px;margin:0 auto;padding:7px 10px;cursor:pointer;text-decoration:none;opacity:.5;color:var(--color-text-lighter);border-radius:32px;line-height:20px}.mx-datepicker-main .mx-btn:hover,.mx-datepicker-main .mx-btn:focus{opacity:1;color:var(--color-main-text);background-color:var(--color-background-darker)}.mx-datepicker-main .mx-calendar-header,.mx-datepicker-main .mx-time-header{display:inline-flex;align-items:center;justify-content:space-between;width:100%;height:44px;margin-bottom:4px}.mx-datepicker-main .mx-calendar-header button,.mx-datepicker-main .mx-time-header button{min-width:32px;min-height:32px;margin:0;cursor:pointer;text-align:center;text-decoration:none;opacity:.7;color:var(--color-main-text);border-radius:32px;line-height:20px}.mx-datepicker-main .mx-calendar-header button:hover,.mx-datepicker-main .mx-time-header button:hover,.mx-datepicker-main .mx-calendar-header button:focus,.mx-datepicker-main .mx-time-header button:focus{opacity:1;color:var(--color-main-text);background-color:var(--color-background-darker)}.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-double-left,.mx-datepicker-main .mx-time-header button.mx-btn-icon-double-left,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-left,.mx-datepicker-main .mx-time-header button.mx-btn-icon-left,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-right,.mx-datepicker-main .mx-time-header button.mx-btn-icon-right,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-double-right,.mx-datepicker-main .mx-time-header button.mx-btn-icon-double-right{align-items:center;justify-content:center;width:32px;padding:0;background-repeat:no-repeat;background-size:16px;background-position:center}.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-double-left>i,.mx-datepicker-main .mx-time-header button.mx-btn-icon-double-left>i,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-left>i,.mx-datepicker-main .mx-time-header button.mx-btn-icon-left>i,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-right>i,.mx-datepicker-main .mx-time-header button.mx-btn-icon-right>i,.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-double-right>i,.mx-datepicker-main .mx-time-header button.mx-btn-icon-double-right>i{display:none}.mx-datepicker-main .mx-calendar-header .mx-calendar-header-label,.mx-datepicker-main .mx-time-header .mx-calendar-header-label{display:flex}.mx-datepicker-main .mx-calendar-header .mx-btn-icon-double-left,.mx-datepicker-main .mx-time-header .mx-btn-icon-double-left{background-image:url("+C+")}body.theme--dark .mx-datepicker-main .mx-calendar-header .mx-btn-icon-double-left,body.theme--dark .mx-datepicker-main .mx-time-header .mx-btn-icon-double-left{background-image:url("+b+")}.mx-datepicker-main .mx-calendar-header .mx-btn-icon-left,.mx-datepicker-main .mx-time-header .mx-btn-icon-left{background-image:url("+f+")}body.theme--dark .mx-datepicker-main .mx-calendar-header .mx-btn-icon-left,body.theme--dark .mx-datepicker-main .mx-time-header .mx-btn-icon-left{background-image:url("+v+")}.mx-datepicker-main .mx-calendar-header .mx-btn-icon-right,.mx-datepicker-main .mx-time-header .mx-btn-icon-right{background-image:url("+B+")}body.theme--dark .mx-datepicker-main .mx-calendar-header .mx-btn-icon-right,body.theme--dark .mx-datepicker-main .mx-time-header .mx-btn-icon-right{background-image:url("+E+")}.mx-datepicker-main .mx-calendar-header .mx-btn-icon-double-right,.mx-datepicker-main .mx-time-header .mx-btn-icon-double-right{background-image:url("+D+")}body.theme--dark .mx-datepicker-main .mx-calendar-header .mx-btn-icon-double-right,body.theme--dark .mx-datepicker-main .mx-time-header .mx-btn-icon-double-right{background-image:url("+S+")}.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-right,.mx-datepicker-main .mx-time-header button.mx-btn-icon-right{order:2}.mx-datepicker-main .mx-calendar-header button.mx-btn-icon-double-right,.mx-datepicker-main .mx-time-header button.mx-btn-icon-double-right{order:3}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row .mx-week-number{font-weight:bold}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row:hover,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week{opacity:1;border-radius:50px;background-color:var(--color-background-dark)}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row:hover td,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week td{background-color:transparent}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row:hover td,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row:hover td:hover,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row:hover td:focus,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week td,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week td:hover,.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week td:focus{color:inherit}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week{color:var(--color-primary-text);background-color:var(--color-primary-element)}.mx-datepicker-main .mx-calendar-week-mode .mx-date-row.mx-active-week td{opacity:.7;font-weight:normal}.mx-datepicker-main .mx-time{background-color:var(--color-main-background)}.mx-datepicker-main .mx-time .mx-time-header{justify-content:center;border-bottom:1px solid var(--color-border)}.mx-datepicker-main .mx-time .mx-time-column{border-left:1px solid var(--color-border)}.mx-datepicker-main .mx-time .mx-time-option.active,.mx-datepicker-main .mx-time .mx-time-option:hover,.mx-datepicker-main .mx-time .mx-time-item.active,.mx-datepicker-main .mx-time .mx-time-item:hover{color:var(--color-primary-text);background-color:var(--color-primary-element)}.mx-datepicker-main .mx-time .mx-time-option.disabled,.mx-datepicker-main .mx-time .mx-time-item.disabled{cursor:not-allowed;opacity:.5;color:var(--color-main-text);background-color:var(--color-main-background)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./node_modules/vue2-datepicker/scss/icon.scss","webpack://./node_modules/vue2-datepicker/scss/btn.scss","webpack://./node_modules/vue2-datepicker/scss/var.scss","webpack://./node_modules/vue2-datepicker/scss/scrollbar.scss","webpack://./node_modules/vue2-datepicker/scss/animation.scss","webpack://./node_modules/vue2-datepicker/scss/index.scss","webpack://./src/components/DatetimePicker/index.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2JCDC,UAAW,CACX,iBAAkB,CAClB,QAAS,CACT,oBAAqB,CACrB,UAAW,CACX,WAAY,CACZ,qBAAsB,CACtB,kBAAmB,CACnB,yBAA0B,CAC1B,wBAAyB,CACzB,iBAAkB,CAClB,qBAAsB,CACtB,uBAAwB,CACxB,mCAAoC,CACrC,2BAGC,SAAU,CACX,6BAGC,QAAS,CACV,+EAKC,mCAAoC,CACrC,QCjCC,qBAAsB,CACtB,aAAc,CACd,cAAe,CACf,eAAgB,CAChB,gBAAiB,CACjB,QAAS,CACT,cAAe,CACf,4BAA6B,CAC7B,YAAa,CACb,gCAAoC,CACpC,iBAAkB,CAClB,aCZqB,CDarB,kBAAmB,CAbrB,cAeI,oBCdmB,CDenB,aCfmB,CDgBpB,aAID,QAAS,CACT,aAAc,CACd,eAAgB,CAChB,mBAAoB,CACrB,cExBC,WAAY,CADd,wCAIM,SAAU,CACX,mBAKH,WAAY,CACZ,iBAAkB,CAClB,eAAgB,CACjB,oBAGC,iBAAkB,CAClB,OAAQ,CACR,SAAU,CACV,UAAW,CACX,SAAU,CACV,SAAU,CACV,iBAAkB,CAClB,SAAU,CACV,iCAAkC,CATpC,wCAWI,iBAAkB,CAClB,UAAW,CACX,QAAS,CACT,cAAe,CACf,qBAAsB,CACtB,sCAA0C,CAC1C,gCAAiC,CAClC,4DC/BD,SAAU,CACV,mBAAoB,CACpB,oGAC6C,CAC7C,2BAA4B,CAC7B,6EAKC,SAAU,CACV,mBAAoB,CCTtB,eACE,iBAAkB,CAClB,oBAAqB,CACrB,WAAY,CAHd,mBAKI,SAAU,CACV,UAAW,CACX,sBAAuB,CACvB,iBAAkB,CAClB,eAAgB,CACjB,qBAID,WAAY,CACb,sBAGC,UAAW,CACZ,kBAGC,iBAAkB,CADpB,iCAGI,YAAa,CAHjB,uCAOM,aAAc,CAPpB,yDAUM,YAAa,CACd,UAKH,oBAAqB,CACrB,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,gBAAiB,CACjB,iBAAkB,CAClB,cAAe,CACf,eAAgB,CAChB,UHzCgB,CG0ChB,qBAAsB,CACtB,qBH5CuB,CG6CvB,iBHrBuB,CGsBvB,4CAAgD,CAblD,gCAiBI,oBHhD8B,CG+BlC,sCAqBI,UHlDiB,CGmDjB,wBHlD+B,CGmD/B,iBHxDqB,CGyDrB,kBAAmB,CAxBvB,gBA2BI,YAAa,CA3BjB,qBA8BI,YAAa,CACd,iCAKD,iBAAkB,CAClB,OAAQ,CACR,SAAU,CACV,0BAA2B,CAC3B,cAAe,CACf,aAAc,CACd,qBAAyB,CACzB,qBAAsB,CACvB,eAGC,cAAe,CADjB,qBAGI,qBAAyB,CAC1B,oBAID,+EAAgF,CAChF,aH/FqB,CGgGrB,qBAAsB,CACtB,wBHnFoB,CGoFrB,qBAGC,iBAAkB,CAClB,cAAe,CACf,iBAAkB,CAClB,uCAA2C,CAC3C,YHpGkB,CGqGnB,uBAGC,UAAW,CACX,qBAAsB,CACtB,WH/EyB,CGgFzB,WAAY,CACZ,aAAc,CACf,8CAGC,iBHrFyB,CGsFzB,6BHxGoB,CGyGrB,oBAGC,iBAAkB,CAClB,gBAAiB,CAClB,iBAGC,aAAc,CACd,aAAc,CACd,gBAAiB,CAClB,kBAGC,YAAa,CACb,0BAFF,kBAGI,qBAAsB,CAEzB,CAED,sBACE,eAAgB,CAChB,+BH/HoB,CGgIrB,sBAGC,eAAgB,CAChB,gBAAiB,CACjB,4BHrIoB,CGsIrB,aAGC,qBAAsB,CACtB,WAAY,CACZ,gBAAiB,CAHnB,0BAKI,6BH7IkB,CG8InB,oCAID,qBAAsB,CACtB,WAAY,CACZ,gBAAiB,CACjB,iBAAkB,CAClB,eAAgB,CACjB,2CAIC,UAAW,CACZ,6CAGC,WAAY,CACb,0BAGC,cAAe,CAChB,8BAGC,YAAa,CADf,oCAGI,WAAY,CACb,qBAID,iBAAkB,CAClB,YAAa,CACb,qBAAsB,CAHxB,2BAKI,cAAe,CALnB,iCAOM,aHlMiB,CGmMjB,wBH/K6E,CGuKnF,kCAWM,UHtLsB,CGuLtB,wBHtMiB,CG0LvB,8EAgBM,aH3MiB,CG4MjB,wBHrLgF,CGoKtF,oCAoBM,kBAAmB,CACnB,UHrMe,CGsMf,wBHrM6B,CGsM9B,oCAMD,cAAe,CAFnB,0CAIM,wBHtM6E,CGkMnF,mDAOM,wBHtMgF,CG+LtF,gDAWQ,aAAc,CACd,4BAA6B,CAZrC,iDAeQ,aAAc,CACd,4BAA6B,CAC9B,gBAML,WAAY,CACb,UAGC,kBAAmB,CACnB,wBAAyB,CACzB,gBAAiB,CACjB,UAAW,CACX,WAAY,CACZ,qBAAsB,CACtB,iBAAkB,CAPpB,aAUI,SAAU,CACV,eAAgB,CAChB,qBAAsB,CAZ1B,aAeI,SAAU,CACV,qBAAsB,CACvB,oCAMC,WAAY,CACZ,cAAe,CAJnB,sBAQI,aHzQwC,CGiQ5C,uCAWI,UAAW,CACX,eAAgB,CACjB,SAID,MAAO,CACP,WAAY,CACZ,eAAgB,CAHlB,kBAKI,6BH3QkB,CG4QnB,kBAGD,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACb,gBAGC,+BHvRoB,CGwRrB,iBAGC,YAAa,CACb,qBAAsB,CACtB,eAAgB,CACjB,iBAGC,YAAa,CACb,UAAW,CACX,WAAY,CACZ,eAAgB,CACjB,gBAGC,MAAO,CACP,iBAAkB,CAClB,6BH1SoB,CG2SpB,iBAAkB,CAJpB,4BAOI,aAAc,CAPlB,8BAUI,QAAS,CACT,SAAU,CACV,eAAgB,CAZpB,qCAcM,UAAW,CACX,aAAc,CACd,YAAgB,CAhBtB,8BAoBI,cAAe,CACf,cAAe,CACf,WAAY,CACZ,gBAAiB,CAvBrB,oCAyBM,aH9UiB,CG+UjB,wBHlTyE,CGwR/E,qCA6BM,aHjViB,CGkVjB,8BHzToC,CG0TpC,eAAgB,CA/BtB,uCAkCM,kBAAmB,CACnB,UH7Ue,CG8Uf,wBH7U6B,CG8U9B,gBAKH,cAAe,CACf,gBAAiB,CACjB,cAAe,CACf,gBAAiB,CAJnB,sBAMI,aHpWmB,CGqWnB,wBHxU2E,CGiU/E,uBAUI,aHvWmB,CGwWnB,8BH/UsC,CGgVtC,eAAgB,CAZpB,yBAeI,kBAAmB,CACnB,UHnWiB,CGoWjB,wBHnW+B,CITnC,+BACC,gBAAiB,CACjB,4BAA6B,CAF9B,mCAKE,2BAA4B,CAL9B,2DAYG,UAAW,CACX,oCAAqC,CACrC,6CAA8C,CAC9C,2BAA4B,CAf/B,oHAoBG,kBAAmB,CACnB,UCiBgB,CDtCnB,mIA0BG,+BAAgC,CAChC,oBAMF,4BAA6B,CAC7B,oCAAqC,CACrC,6CAA8C,CAC9C,uCAAwC,CACxC,eAAgB,CALjB,wBAQE,2BAA4B,CAR9B,wCAYE,YAAa,CACb,eAAgB,CAblB,sFAgBG,yCAA0C,CAhB7C,kDAqBE,WAAiC,CArBnC,0CAyBE,2CAA4C,CAzB9C,0CA6BE,wCAAyC,CA7B3C,iCAkCE,WAAiC,CACjC,WAAY,CAnCd,uDAqCG,WAAiC,CArCpC,oFA2CE,yCAA0C,CA3C5C,sCA+CE,YAAa,CACb,eAAgB,CAhDlB,uFAqDI,2DAA4D,CArDhE,sGAyDI,2DAA4D,CAzDhE,8BAgEE,iBAAkB,CAhEpB,0CAmEG,iBAAkB,CAClB,UC/DkB,CDgElB,+BAAgC,CArEnC,sHA4EG,4BAA6B,CA5EhC,oCAiFG,gCAAiC,CACjC,iBAAkB,CAClB,UC7EgB,CD8EhB,kBAAmB,CApFtB,sCAwFI,cAAe,CAxFnB,0CA6FI,SCtFY,CDuFZ,kCAAmC,CACnC,gBAAiB,CA/FrB,gGAkGK,+BAAgC,CAlGrC,0FAuGI,eAAgB,CAChB,kBAAmB,CAxGvB,6CA2GI,UCrGe,CDNnB,sDA8GI,UCzGiB,CD0GjB,+BAAgC,CA/GpC,wHAkHK,SC3GW,CDPhB,wNA4HI,SCrHY,CDsHZ,+BAAgC,CAChC,6CAA8C,CAC9C,gBAAiB,CA/HrB,6CAkII,UC7HiB,CD8HjB,+BAAgC,CAChC,eAAgB,CAChB,+CAAgD,CArIpD,8CA0IG,iBAAkB,CAClB,UCrIgB,CDsIhB,kBAAmB,CA5ItB,gLAoJG,eAxLe,CAoClB,6LA4JG,YAAa,CACb,qBAAsB,CACtB,4BAA6B,CA9JhC,yMAgKI,mBAAoB,CACpB,kBAAmB,CACnB,aAtMc,CAuMd,4BAA6B,CAC7B,eAxMc,CAoClB,kZAyKI,YAAa,CACb,kBAAmB,CAEnB,YAAa,CACb,sBAAuB,CACvB,cAlNc,CAoNd,UAAW,CACX,eArNc,CAsNd,uCAAwC,CAlL5C,oGAyLI,cAAe,CAzLnB,oGAgMI,eApOc,CAoClB,4BAuME,cA3OgB,CA4OhB,WA5OgB,CA6OhB,aAAc,CACd,gBAAiB,CACjB,cAAe,CACf,oBAAqB,CACrB,UCxMmB,CDyMnB,+BAAgC,CAChC,kBAnPgB,CAoPhB,gBAAgC,CAhNlC,oEAoNG,SC7Ma,CD8Mb,4BAA6B,CAC7B,+CAAgD,CAtNnD,4EA4NE,mBAAoB,CACpB,kBAAmB,CACnB,6BAA8B,CAC9B,UAAW,CACX,WC5OmB,CD6OnB,iBAAkB,CAjOpB,0FAoOG,cAxQe,CAyQf,eAzQe,CA0Qf,QAAS,CACT,cAAe,CACf,iBAAkB,CAClB,oBAAqB,CACrB,UCpOgB,CDqOhB,4BAA6B,CAC7B,kBAhRe,CAiRf,gBAAgC,CA7OnC,4MAkPI,SC3OY,CD4OZ,4BAA6B,CAC7B,+CAAgD,CApPpD,ghBA4PI,kBAAmB,CACnB,sBAAuB,CACvB,UAlSc,CAmSd,SAAU,CACV,2BAA4B,CAC5B,oBAAqB,CACrB,0BAA2B,CAlQ/B,giBAsQK,YAAa,CAtQlB,gIA4QG,YAAa,CA5QhB,8HAgRG,wDAAkD,CAClD,gKACC,wDAAwD,CAlR5D,gHAuRG,wDAA2C,CAC3C,kJACC,wDAAiD,CAzRrD,kHA8RG,wDAA4C,CAC5C,oJACC,wDAAkD,CAhStD,gIAqSG,wDAAmD,CACnD,kKACC,wDAAyD,CAvS7D,8HA4SG,OAAQ,CA5SX,4IAgTG,OAAQ,CAhTX,wEAyTI,gBAAiB,CAzTrB,qIA6TI,SCtTY,CDuTZ,kBAAmB,CACnB,6CAA8C,CA/TlD,2IAiUK,4BAA6B,CAjUlC,ybAmUM,aAAc,CAnUpB,uEAwUI,+BAAgC,CAChC,6CAA8C,CAzUlD,0EA4UK,UCtUc,CDuUd,kBAAmB,CA7UxB,6BAqVE,6CAA8C,CArVhD,6CAyVG,sBAAuB,CACvB,2CAA4C,CA1V/C,6CA8VG,yCAA0C,CA9V7C,0MAqWI,+BAAgC,CAChC,6CAA8C,CAtWlD,0GA0WI,kBAAmB,CACnB,UCtWiB,CDuWjB,4BAA6B,CAC7B,6CAA8C",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","@import './var.scss';\n\n.#{$namespace}-icon-left:before,\n.#{$namespace}-icon-right:before,\n.#{$namespace}-icon-double-left:before,\n.#{$namespace}-icon-double-right:before,\n.#{$namespace}-icon-double-left:after,\n.#{$namespace}-icon-double-right:after {\n content: '';\n position: relative;\n top: -1px;\n display: inline-block;\n width: 10px;\n height: 10px;\n vertical-align: middle;\n border-style: solid;\n border-color: currentColor;\n border-width: 2px 0 0 2px;\n border-radius: 1px;\n box-sizing: border-box;\n transform-origin: center;\n transform: rotate(-45deg) scale(0.7);\n}\n\n.#{$namespace}-icon-double-left:after {\n left: -4px;\n}\n\n.#{$namespace}-icon-double-right:before {\n left: 4px;\n}\n\n.#{$namespace}-icon-right:before,\n.#{$namespace}-icon-double-right:before,\n.#{$namespace}-icon-double-right:after {\n transform: rotate(135deg) scale(0.7);\n}\n","@import './var.scss';\n\n.#{$namespace}-btn {\n box-sizing: border-box;\n line-height: 1;\n font-size: 14px;\n font-weight: 500;\n padding: 7px 15px;\n margin: 0;\n cursor: pointer;\n background-color: transparent;\n outline: none;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n color: $default-color;\n white-space: nowrap;\n &:hover {\n border-color: $primary-color;\n color: $primary-color;\n }\n}\n\n.#{$namespace}-btn-text {\n border: 0;\n padding: 0 4px;\n text-align: left;\n line-height: inherit;\n}\n","$namespace: 'mx' !default;\n\n$default-color: #73879c !default;\n$primary-color: #1284e7 !default;\n\n$today-color: mix(#fff, $primary-color, 10%) !default;\n\n$popup-z-index: 2001 !default;\n\n$input-border-color: #ccc !default;\n$input-color: #555 !default;\n$input-hover-border-color: #409aff !default;\n\n$disabled-color: #ccc !default;\n$disabled-background-color: #f3f3f3 !default;\n\n$border-color: #e8e8e8 !default;\n\n$calendar-active-color: #fff !default;\n$calendar-active-background-color: $primary-color !default;\n\n$calendar-hover-color: $default-color !default;\n$calendar-hover-background-color: mix(#fff, $calendar-active-background-color, 95%) !default;\n\n$calendar-in-range-color: $default-color !default;\n$calendar-in-range-background-color: mix(#fff, $calendar-active-background-color, 85%) !default;\n\n$time-active-color: $primary-color !default;\n$time-active-background-color: transparent !default;\n\n$time-hover-color: $default-color !default;\n$time-hover-background-color: mix(#fff, $calendar-active-background-color, 95%) !default;\n\n$input-border-radius: 4px !default;\n$sidebar-margin-left: 100px !default;\n","@import './var.scss';\n\n.#{$namespace}-scrollbar {\n height: 100%;\n &:hover {\n .#{$namespace}-scrollbar-track {\n opacity: 1;\n }\n }\n}\n\n.#{$namespace}-scrollbar-wrap {\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n.#{$namespace}-scrollbar-track {\n position: absolute;\n top: 2px;\n right: 2px;\n bottom: 2px;\n width: 6px;\n z-index: 1;\n border-radius: 4px;\n opacity: 0;\n transition: opacity 0.24s ease-out;\n .#{$namespace}-scrollbar-thumb {\n position: absolute;\n width: 100%;\n height: 0;\n cursor: pointer;\n border-radius: inherit;\n background-color: rgba(144, 147, 153, 0.3);\n transition: background-color 0.3s;\n }\n}\n","@import './var.scss';\n\n.#{$namespace}-zoom-in-down-enter-active,\n.#{$namespace}-zoom-in-down-leave-active {\n opacity: 1;\n transform: scaleY(1);\n transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1),\n opacity 0.3s cubic-bezier(0.23, 1, 0.32, 1);\n transform-origin: center top;\n}\n\n.#{$namespace}-zoom-in-down-enter,\n.#{$namespace}-zoom-in-down-enter-from,\n.#{$namespace}-zoom-in-down-leave-to {\n opacity: 0;\n transform: scaleY(0);\n}\n","@import './var.scss';\n@import './icon.scss';\n@import './btn.scss';\n@import './scrollbar.scss';\n@import './animation.scss';\n\n.#{$namespace}-datepicker {\n position: relative;\n display: inline-block;\n width: 210px;\n svg {\n width: 1em;\n height: 1em;\n vertical-align: -0.15em;\n fill: currentColor;\n overflow: hidden;\n }\n}\n\n.#{$namespace}-datepicker-range {\n width: 320px;\n}\n\n.#{$namespace}-datepicker-inline {\n width: auto;\n}\n\n.#{$namespace}-input-wrapper {\n position: relative;\n .#{$namespace}-icon-clear {\n display: none;\n }\n &:hover {\n .#{$namespace}-icon-clear {\n display: block;\n }\n .#{$namespace}-icon-clear + .#{$namespace}-icon-calendar {\n display: none;\n }\n }\n}\n\n.#{$namespace}-input {\n display: inline-block;\n box-sizing: border-box;\n width: 100%;\n height: 34px;\n padding: 6px 30px;\n padding-left: 10px;\n font-size: 14px;\n line-height: 1.4;\n color: $input-color;\n background-color: #fff;\n border: 1px solid $input-border-color;\n border-radius: $input-border-radius;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n\n &:hover,\n &:focus {\n border-color: $input-hover-border-color;\n }\n &:disabled,\n &.disabled {\n color: $disabled-color;\n background-color: $disabled-background-color;\n border-color: $input-border-color;\n cursor: not-allowed;\n }\n &:focus {\n outline: none;\n }\n &::-ms-clear {\n display: none;\n }\n}\n\n.#{$namespace}-icon-calendar,\n.#{$namespace}-icon-clear {\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n font-size: 16px;\n line-height: 1;\n color: rgba(0, 0, 0, 0.5);\n vertical-align: middle;\n}\n\n.#{$namespace}-icon-clear {\n cursor: pointer;\n &:hover {\n color: rgba(0, 0, 0, 0.8);\n }\n}\n\n.#{$namespace}-datepicker-main {\n font: 14px/1.5 'Helvetica Neue', Helvetica, Arial, 'Microsoft Yahei', sans-serif;\n color: $default-color;\n background-color: #fff;\n border: 1px solid $border-color;\n}\n\n.#{$namespace}-datepicker-popup {\n position: absolute;\n margin-top: 1px;\n margin-bottom: 1px;\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n z-index: $popup-z-index;\n}\n\n.#{$namespace}-datepicker-sidebar {\n float: left;\n box-sizing: border-box;\n width: $sidebar-margin-left;\n padding: 6px;\n overflow: auto;\n}\n\n.#{$namespace}-datepicker-sidebar + .#{$namespace}-datepicker-content {\n margin-left: $sidebar-margin-left;\n border-left: 1px solid $border-color;\n}\n\n.#{$namespace}-datepicker-body {\n position: relative;\n user-select: none;\n}\n\n.#{$namespace}-btn-shortcut {\n display: block;\n padding: 0 6px;\n line-height: 24px;\n}\n\n.#{$namespace}-range-wrapper {\n display: flex;\n @media (max-width: 750px) {\n flex-direction: column;\n }\n}\n\n.#{$namespace}-datepicker-header {\n padding: 6px 8px;\n border-bottom: 1px solid $border-color;\n}\n\n.#{$namespace}-datepicker-footer {\n padding: 6px 8px;\n text-align: right;\n border-top: 1px solid $border-color;\n}\n\n.#{$namespace}-calendar {\n box-sizing: border-box;\n width: 248px;\n padding: 6px 12px;\n & + & {\n border-left: 1px solid $border-color;\n }\n}\n\n.#{$namespace}-calendar-header {\n box-sizing: border-box;\n height: 34px;\n line-height: 34px;\n text-align: center;\n overflow: hidden;\n}\n\n.#{$namespace}-btn-icon-left,\n.#{$namespace}-btn-icon-double-left {\n float: left;\n}\n.#{$namespace}-btn-icon-right,\n.#{$namespace}-btn-icon-double-right {\n float: right;\n}\n\n.#{$namespace}-calendar-header-label {\n font-size: 14px;\n}\n\n.#{$namespace}-calendar-decade-separator {\n margin: 0 2px;\n &:after {\n content: '~';\n }\n}\n\n.#{$namespace}-calendar-content {\n position: relative;\n height: 224px;\n box-sizing: border-box;\n .cell {\n cursor: pointer;\n &:hover {\n color: $calendar-hover-color;\n background-color: $calendar-hover-background-color;\n }\n &.active {\n color: $calendar-active-color;\n background-color: $calendar-active-background-color;\n }\n &.in-range,\n &.hover-in-range {\n color: $calendar-in-range-color;\n background-color: $calendar-in-range-background-color;\n }\n &.disabled {\n cursor: not-allowed;\n color: $disabled-color;\n background-color: $disabled-background-color;\n }\n }\n}\n\n.#{$namespace}-calendar-week-mode {\n .#{$namespace}-date-row {\n cursor: pointer;\n &:hover {\n background-color: $calendar-hover-background-color;\n }\n &.#{$namespace}-active-week {\n background-color: $calendar-in-range-background-color;\n }\n .cell {\n &:hover {\n color: inherit;\n background-color: transparent;\n }\n &.active {\n color: inherit;\n background-color: transparent;\n }\n }\n }\n}\n\n.#{$namespace}-week-number {\n opacity: 0.5;\n}\n\n.#{$namespace}-table {\n table-layout: fixed;\n border-collapse: separate;\n border-spacing: 0;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n text-align: center;\n\n th {\n padding: 0;\n font-weight: 500;\n vertical-align: middle;\n }\n td {\n padding: 0;\n vertical-align: middle;\n }\n}\n\n.#{$namespace}-table-date {\n td,\n th {\n height: 32px;\n font-size: 12px;\n }\n\n .today {\n color: $today-color;\n }\n .cell.not-current-month {\n color: #ccc;\n background: none; // cover the in-range style\n }\n}\n\n.#{$namespace}-time {\n flex: 1;\n width: 224px;\n background: #fff;\n & + & {\n border-left: 1px solid $border-color;\n }\n}\n.#{$namespace}-calendar-time {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n.#{$namespace}-time-header {\n @extend .#{$namespace}-calendar-header;\n border-bottom: 1px solid $border-color;\n}\n\n.#{$namespace}-time-content {\n height: 224px;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n.#{$namespace}-time-columns {\n display: flex;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.#{$namespace}-time-column {\n flex: 1;\n position: relative;\n border-left: 1px solid $border-color;\n text-align: center;\n\n &:first-child {\n border-left: 0;\n }\n .#{$namespace}-time-list {\n margin: 0;\n padding: 0;\n list-style: none;\n &::after {\n content: '';\n display: block;\n height: 32 * 6px;\n }\n }\n .#{$namespace}-time-item {\n cursor: pointer;\n font-size: 12px;\n height: 32px;\n line-height: 32px;\n &:hover {\n color: $time-hover-color;\n background-color: $time-hover-background-color;\n }\n &.active {\n color: $time-active-color;\n background-color: $time-active-background-color;\n font-weight: 700;\n }\n &.disabled {\n cursor: not-allowed;\n color: $disabled-color;\n background-color: $disabled-background-color;\n }\n }\n}\n\n.#{$namespace}-time-option {\n cursor: pointer;\n padding: 8px 10px;\n font-size: 14px;\n line-height: 20px;\n &:hover {\n color: $time-hover-color;\n background-color: $time-hover-background-color;\n }\n &.active {\n color: $time-active-color;\n background-color: $time-active-background-color;\n font-weight: 700;\n }\n &.disabled {\n cursor: not-allowed;\n color: $disabled-color;\n background-color: $disabled-background-color;\n }\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n$cell_height: 32px;\n\n@import '~vue2-datepicker/scss/index';\n\n.mx-datepicker[data-v-#{$scope_version}] {\n\tuser-select: none;\n\tcolor: var(--color-main-text);\n\n\tsvg {\n\t\tfill: var(--color-main-text);\n\t}\n\n\t/* INPUT CONTAINER */\n\t.mx-input-wrapper {\n\t\t// input\n\t\t.mx-input {\n\t\t\twidth: 100%;\n\t\t\tborder: 1px solid var(--color-border);\n\t\t\tbackground-color: var(--color-main-background);\n\t\t\tbackground-clip: content-box;\n\t\t}\n\n\t\t&:disabled,\n\t\t&.disabled {\n\t\t\tcursor: not-allowed;\n\t\t\topacity: $opacity_normal;\n\t\t}\n\n\t\t.mx-icon-calendar,\n\t\t.mx-icon-clear {\n\t\t\tcolor: var(--color-text-lighter);\n\t\t}\n\t}\n}\n\n// Datepicker popup wrapper\n.mx-datepicker-main {\n\tcolor: var(--color-main-text);\n\tborder: 1px solid var(--color-border);\n\tbackground-color: var(--color-main-background);\n\tfont-family: var(--font-face) !important;\n\tline-height: 1.5;\n\n\tsvg {\n\t\tfill: var(--color-main-text);\n\t}\n\n\t&.mx-datepicker-popup {\n\t\tz-index: 2000;\n\t\tbox-shadow: none;\n\n\t\t.mx-datepicker-sidebar + .mx-datepicker-content {\n\t\t\tborder-left: 1px solid var(--color-border);\n\t\t}\n\t}\n\t\n\t&.show-week-number .mx-calendar {\n\t\twidth: $cell_height * 8 + 2 * 5px; // week number + 7 days + padding\n\t}\n\n\t.mx-datepicker-header {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t.mx-datepicker-footer {\n\t\tborder-top: 1px solid var(--color-border);\n\t}\n\n\t// default popup styles\n\t.mx-calendar {\n\t\twidth: $cell_height * 7 + 2 * 5px; // 7 days + padding\n\t\tpadding: 5px;\n\t\t&.mx-calendar-week-mode {\n\t\t\twidth: $cell_height * 8 + 2 * 5px; // week number + 7 days + padding\n\t\t}\n\t}\n\n\t.mx-time + .mx-time,\n\t.mx-calendar + .mx-calendar {\n\t\tborder-left: 1px solid var(--color-border);\n\t}\n\n\t.mx-range-wrapper {\n\t\tdisplay: flex;\n\t\toverflow: hidden;\n\n\t\t// first active cell, range style on day picker panel only\n\t\t.mx-calendar-content .mx-table-date .cell {\n\t\t\t&.active {\n\t\t\t\tborder-radius: var(--border-radius) 0 0 var(--border-radius);\n\t\t\t}\n\t\t\t// second selected cell\n\t\t\t&.in-range + .cell.active {\n\t\t\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Various panels\n\t.mx-table {\n\t\ttext-align: center;\n\n\t\tthead > tr > th {\n\t\t\ttext-align: center;\n\t\t\topacity: $opacity_disabled;\n\t\t\tcolor: var(--color-text-lighter);\n\t\t}\n\n\t\t// Override table rule from server\n\t\ttr:focus,\n\t\ttr:hover,\n\t\ttr:active {\n\t\t\tbackground-color: transparent;\n\t\t}\n\n\t\t// regular cell style\n\t\t.cell {\n\t\t\ttransition: all 100ms ease-in-out;\n\t\t\ttext-align: center;\n\t\t\topacity: $opacity_normal;\n\t\t\tborder-radius: 50px;\n\n\t\t\t// force pointer on all content\n\t\t\t> * {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\n\t\t\t// Selected and mouse event\n\t\t\t&.today {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\tcolor: var(--color-primary-element);\n\t\t\t\tfont-weight: bold;\n\t\t\t\t&:hover,\n\t\t\t\t&:focus {\n\t\t\t\t\tcolor: var(--color-primary-text);\n\t\t\t\t}\n\t\t\t}\n\t\t\t&.in-range,\n\t\t\t&.disabled {\n\t\t\t\tborder-radius: 0;\n\t\t\t\tfont-weight: normal;\n\t\t\t}\n\t\t\t&.in-range {\n\t\t\t\topacity: $opacity_normal;\n\t\t\t}\n\t\t\t&.not-current-month {\n\t\t\t\topacity: $opacity_disabled;\n\t\t\t\tcolor: var(--color-text-lighter);\n\t\t\t\t&:hover,\n\t\t\t\t&:focus {\n\t\t\t\t\topacity: $opacity_full;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// hover-/focus after the other rules\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&.actived,\n\t\t\t&.active,\n\t\t\t&.in-range {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\tcolor: var(--color-primary-text);\n\t\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t\t&.disabled {\n\t\t\t\topacity: $opacity_disabled;\n\t\t\t\tcolor: var(--color-text-lighter);\n\t\t\t\tborder-radius: 0;\n\t\t\t\tbackground-color: var(--color-background-darker);\n\t\t\t}\n\t\t}\n\n\t\t.mx-week-number {\n\t\t\ttext-align: center;\n\t\t\topacity: $opacity_normal;\n\t\t\tborder-radius: 50px;\n\t\t}\n\n\t\t// cell that are not in a table\n\t\tspan.mx-week-number,\n\t\tli.mx-week-number,\n\t\tspan.cell,\n\t\tli.cell {\n\t\t\tmin-height: $cell_height;\n\t\t}\n\n\t\t// Standard grid/flex layout for day/month/year panels\n\t\t&.mx-table-date thead,\n\t\t&.mx-table-date tbody,\n\t\t&.mx-table-year,\n\t\t&.mx-table-month {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tjustify-content: space-around;\n\t\t\ttr {\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tflex: 1 1 $cell_height;\n\t\t\t\tjustify-content: space-around;\n\t\t\t\tmin-height: $cell_height;\n\t\t\t}\n\t\t\t// Default cell style\n\t\t\tth,\n\t\t\ttd {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\t// 3 rows with a little spacing\n\t\t\t\tflex: 0 1 32%;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-width: $cell_height;\n\t\t\t\t// spacing between rows\n\t\t\t\theight: 95%;\n\t\t\t\tmin-height: $cell_height;\n\t\t\t\ttransition: background 100ms ease-in-out;\n\t\t\t}\n\t\t}\n\t\t&.mx-table-year {\n\t\t\ttr th,\n\t\t\ttr td {\n\t\t\t\t// only two rows in year panel\n\t\t\t\tflex-basis: 48%;\n\t\t\t}\n\t\t}\n\t\t&.mx-table-date {\n\t\t\ttr th,\n\t\t\ttr td {\n\t\t\t\t// only two rows in year panel\n\t\t\t\tflex-basis: $cell_height;\n\t\t\t}\n\t\t}\n\t}\n\n\t// default buttons: header...\n\t.mx-btn {\n\t\tmin-width: $cell_height;\n\t\theight: $cell_height;\n\t\tmargin: 0 auto; // center also single element\n\t\tpadding: 7px 10px;\n\t\tcursor: pointer;\n\t\ttext-decoration: none;\n\t\topacity: $opacity_disabled;\n\t\tcolor: var(--color-text-lighter);\n\t\tborder-radius: $cell_height;\n\t\tline-height: $cell_height - 12px; // padding minus 2px for better visual\n\t\t// Mouse feedback\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t\tcolor: var(--color-main-text);\n\t\t\tbackground-color: var(--color-background-darker);\n\t\t}\n\t}\n\n\t// Header, arrows, years, months\n\t.mx-calendar-header {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\theight: $clickable-area;\n\t\tmargin-bottom: 4px;\n\n\t\tbutton {\n\t\t\tmin-width: $cell_height;\n\t\t\tmin-height: $cell_height;\n\t\t\tmargin: 0;\n\t\t\tcursor: pointer;\n\t\t\ttext-align: center;\n\t\t\ttext-decoration: none;\n\t\t\topacity: $opacity_normal;\n\t\t\tcolor: var(--color-main-text);\n\t\t\tborder-radius: $cell_height;\n\t\t\tline-height: $cell_height - 12px; // padding minus 2px for better visual\n\n\t\t\t// Mouse feedback\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\tcolor: var(--color-main-text);\n\t\t\t\tbackground-color: var(--color-background-darker);\n\t\t\t}\n\n\t\t\t// Header arrows\n\t\t\t&.mx-btn-icon-double-left,\n\t\t\t&.mx-btn-icon-left,\n\t\t\t&.mx-btn-icon-right,\n\t\t\t&.mx-btn-icon-double-right {\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\twidth: $cell_height;\n\t\t\t\tpadding: 0; // leave the centering to flex\n\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\tbackground-size: 16px;\n\t\t\t\tbackground-position: center;\n\n\t\t\t\t// Hide original icons\n\t\t\t\t> i {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t.mx-calendar-header-label {\n\t\t\tdisplay: flex;\n\t\t}\n\n\t\t.mx-btn-icon-double-left {\n\t\t\tbackground-image: url('./chevron-double-left.svg');\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: url('./chevron-double-left-light.svg');\n\t\t\t}\n\t\t}\n\n\t\t.mx-btn-icon-left {\n\t\t\tbackground-image: url('./chevron-left.svg');\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: url('./chevron-left-light.svg');\n\t\t\t}\n\t\t}\n\n\t\t.mx-btn-icon-right {\n\t\t\tbackground-image: url('./chevron-right.svg');\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: url('./chevron-right-light.svg');\n\t\t\t}\n\t\t}\n\n\t\t.mx-btn-icon-double-right {\n\t\t\tbackground-image: url('./chevron-double-right.svg');\n\t\t\tbody.theme--dark & {\n\t\t\t\tbackground-image: url('./chevron-double-right-light.svg');\n\t\t\t}\n\t\t}\n\n\t\tbutton.mx-btn-icon-right {\n\t\t\torder: 2;\n\t\t}\n\n\t\tbutton.mx-btn-icon-double-right {\n\t\t\torder: 3;\n\t\t}\n\t}\n\n\t// Week panel\n\t.mx-calendar-week-mode {\n\t\t// move focus on row and not on cell\n\t\t.mx-date-row {\n\t\t\t.mx-week-number {\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t\t&:hover,\n\t\t\t&.mx-active-week {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\tborder-radius: 50px;\n\t\t\t\tbackground-color: var(--color-background-dark);\n\t\t\t\ttd {\n\t\t\t\t\tbackground-color: transparent;\n\t\t\t\t\t&, &:hover, &:focus {\n\t\t\t\t\t\tcolor: inherit;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t&.mx-active-week {\n\t\t\t\tcolor: var(--color-primary-text);\n\t\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t\t// Remove cell feedback on selected rows\n\t\t\t\ttd {\n\t\t\t\t\topacity: $opacity_normal;\n\t\t\t\t\tfont-weight: normal;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Time panel\n\t.mx-time {\n\t\tbackground-color: var(--color-main-background);\n\n\t\t.mx-time-header {\n\t\t\t// only one button, center it\n\t\t\tjustify-content: center;\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\t\t}\n\n\t\t.mx-time-column {\n\t\t\tborder-left: 1px solid var(--color-border);\n\t\t}\n\n\t\t.mx-time-option,\n\t\t.mx-time-item {\n\t\t\t&.active,\n\t\t\t&:hover {\n\t\t\t\tcolor: var(--color-primary-text);\n\t\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t}\n\n\t\t\t&.disabled {\n\t\t\t\tcursor: not-allowed;\n\t\t\t\topacity: $opacity_disabled;\n\t\t\t\tcolor: var(--color-main-text);\n\t\t\t\tbackground-color: var(--color-main-background);\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=g},5850:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.multiselect[data-v-17fd6e1]{margin:0;padding:0 !important;display:inline-block;min-width:160px;position:relative;background-color:var(--color-main-background)}.multiselect[data-v-17fd6e1]:not(.multiselect--active) .multiselect__single{width:100%;z-index:2 !important}.multiselect[data-v-17fd6e1].multiselect--active input.multiselect__input{opacity:1 !important;cursor:text !important;border-radius:var(--border-radius) var(--border-radius) 0 0;display:block !important}.multiselect[data-v-17fd6e1].multiselect--active .multiselect__limit{display:none}.multiselect[data-v-17fd6e1].multiselect--active.multiselect--above input.multiselect__input{border-radius:0 0 var(--border-radius) var(--border-radius)}.multiselect[data-v-17fd6e1].multiselect--disabled,.multiselect[data-v-17fd6e1].multiselect--disabled .multiselect__single{background-color:var(--color-background-dark) !important}.multiselect[data-v-17fd6e1].icon-loading-small::after{left:100%;margin-left:-24px}.multiselect[data-v-17fd6e1] .multiselect__tags{display:flex;flex-wrap:nowrap;overflow:hidden;border:1px solid var(--color-border-dark);cursor:pointer;position:relative;border-radius:3px;min-height:34px;height:100%}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap{align-items:center;display:inline-flex;overflow:hidden;max-width:100%;position:relative;padding:3px 5px;flex:1 1;flex-wrap:nowrap}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap:empty ~ input.multiselect__input{opacity:1 !important;display:block !important}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap:empty ~ input.multiselect__input+span:not(.multiselect__single){display:none}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap .multiselect__tag{line-height:20px;padding:3px 5px;background-image:none;color:var(--color-main-text);border:1px solid var(--color-border-dark);display:inline-flex;align-items:center;border-radius:3px;min-width:0;max-width:fit-content;max-width:-moz-fit-content;margin:2px 1px}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap .multiselect__tag:only-child{flex:0 1 auto}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap .multiselect__tag:not(:last-child){margin-right:5px}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__tags-wrap .multiselect__tag>span{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__single,.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__placeholder{padding:7px 6px;flex:0 0 100%;z-index:1;background-color:var(--color-main-background);line-height:18px;color:var(--color-text-lighter);display:flex;align-items:center}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__single,.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__single *,.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__placeholder,.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__placeholder *{cursor:pointer}.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__strong,.multiselect[data-v-17fd6e1] .multiselect__tags .multiselect__limit{line-height:20px;color:var(--color-text-lighter);display:inline-flex;align-items:center;opacity:.7;margin-right:5px;z-index:5}.multiselect[data-v-17fd6e1] .multiselect__tags input.multiselect__input{width:100% !important;position:relative !important;margin:0;opacity:0;height:100% !important;border:none;cursor:pointer;padding:7px 6px !important;display:none}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper{position:absolute;width:100%;margin-top:-1px;border:1px solid var(--color-border-dark);background:var(--color-main-background);z-index:50;max-height:250px;overflow-y:auto;border-radius:0 0 var(--border-radius) var(--border-radius)}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper .multiselect__content{width:100%;padding:0}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li{position:relative;display:flex;align-items:center;background-color:transparent}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li,.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li span{cursor:pointer}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span{padding:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0;height:auto;min-height:1em;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:inline-flex;align-items:center;background-color:transparent;color:var(--color-text-lighter);width:100%}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span::before{content:' ';background-repeat:no-repeat;background-position:center;min-width:16px;min-height:16px;display:block;opacity:.5;margin-right:5px;visibility:hidden}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span.multiselect__option--disabled{background-color:var(--color-background-dark);opacity:.5}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span.multiselect__option--highlight{color:var(--color-main-text);background-color:var(--color-background-dark)}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span:not(.multiselect__option--disabled):hover::before{opacity:.3}.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span.multiselect__option--selected::before,.multiselect[data-v-17fd6e1] .multiselect__content-wrapper li>span:not(.multiselect__option--disabled):hover::before{visibility:visible}.multiselect[data-v-17fd6e1].multiselect--above .multiselect__content-wrapper{bottom:100%;margin-bottom:-1px}.multiselect[data-v-17fd6e1].multiselect--multiple .multiselect__tags{flex-wrap:wrap}.multiselect[data-v-17fd6e1].multiselect--multiple .multiselect__content-wrapper li>span::before{background-image:var(--icon-checkmark-000)}.multiselect[data-v-17fd6e1].multiselect--multiple .multiselect__content-wrapper li>span[data-select='create']::before{background-image:var(--icon-add-000);visibility:visible}.multiselect[data-v-17fd6e1].multiselect--single .multiselect__content-wrapper li>span::before{display:none}.multiselect[data-v-17fd6e1]:hover .multiselect__placeholder,.multiselect[data-v-17fd6e1] input.multiselect__input .multiselect__placeholder{color:var(--color-main-text)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Multiselect/index.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCJxB,6BACC,QAAS,CACT,oBAAqB,CACrB,oBAAqB,CAErB,eAAgB,CAChB,iBAAkB,CAClB,6CAA8C,CAP/C,4EAWE,UAAW,CACX,oBAAqB,CAZvB,0EAoBG,oBAAiC,CACjC,sBAAuB,CAEvB,2DAA4D,CAC5D,wBAAyB,CAxB5B,qEA6BG,YAAa,CA7BhB,6FAoCG,2DAA4D,CApC/D,2HA2CE,wDAAyD,CA3C3D,uDAgDE,SAAU,CACV,iBAAkB,CAjDpB,gDAwDE,YAAa,CACb,gBAAiB,CACjB,eAAgB,CAChB,yCAA0C,CAC1C,cAAe,CACf,iBAAkB,CAClB,iBAAkB,CAClB,eAAgB,CAChB,WAAY,CAhEd,wEAoEG,kBAAmB,CACnB,mBAAoB,CACpB,eAAgB,CAChB,cAAe,CACf,iBAAkB,CAClB,eAlBkB,CAmBlB,QAAS,CACT,gBAAiB,CA3EpB,yGA+EI,oBAAiC,CACjC,wBAAyB,CAhF7B,wIAqFK,YAAa,CArFlB,0FA0FI,gBAAiB,CACjB,eAAgB,CAChB,qBAAsB,CACtB,4BAA6B,CAC7B,yCAA0C,CAC1C,mBAAoB,CACpB,kBAAmB,CACnB,iBAAkB,CAGlB,WAAY,CACZ,qBAAsB,CACtB,0BAA2B,CAC3B,cAAe,CAvGnB,qGA2GK,aAAc,CA3GnB,2GA8GK,gBAvDgB,CAvDrB,+FAmHK,kBAAmB,CACnB,sBAAuB,CACvB,eAAgB,CArHrB,+IA8HG,eAAgB,CAChB,aAAc,CACd,SAAU,CACV,6CAA8C,CAC9C,gBAAiB,CACjB,+BAAgC,CAEhC,YAAa,CACb,kBAAmB,CAtItB,kSA0II,cAAe,CA1InB,yIAgJG,gBAAiB,CACjB,+BAAgC,CAChC,mBAAoB,CACpB,kBAAmB,CACnB,UC7GgB,CD8GhB,gBA9FkB,CAgGlB,SAAU,CAvJb,yEA2JG,qBAAsB,CACtB,4BAA6B,CAC7B,QAAS,CACT,SAAU,CAEV,sBAAuB,CACvB,WAAY,CAGZ,cAAe,CAEf,0BAA2B,CAC3B,YAAa,CAvKhB,2DA6KE,iBAAkB,CAClB,UAAW,CACX,eAAgB,CAChB,yCAA0C,CAC1C,uCAAwC,CACxC,UAAW,CACX,gBAAiB,CACjB,eAAgB,CAChB,2DAA4D,CArL9D,iFAuLG,UAAW,CACX,SAAU,CAxLb,8DA2LG,iBAAkB,CAClB,YAAa,CACb,kBAAmB,CACnB,4BAA6B,CA9LhC,iIAiMI,cAAe,CAjMnB,mEAoMI,WAAY,CACZ,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB,CACvB,QAAS,CACT,WAAY,CACZ,cAAe,CACf,0BAA2B,CAC3B,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CACjB,mBAAoB,CACpB,kBAAmB,CACnB,4BAA6B,CAC7B,+BAAgC,CAChC,UAAW,CApNf,2EAuNK,WAAY,CACZ,2BAA4B,CAC5B,0BAA2B,CAC3B,cAAe,CACf,eAAgB,CAChB,aAAc,CACd,UCvLgB,CDwLhB,gBAAiB,CACjB,iBAAkB,CA/NvB,iGAkOK,6CAA8C,CAC9C,UC7LgB,CDtCrB,kGAsOK,4BAA6B,CAC7B,6CAA8C,CAvOnD,qHA0OK,UAAW,CA1OhB,8NA+OM,kBAAmB,CA/OzB,8EAuPE,WAAY,CACZ,kBAAmB,CAxPrB,sEA+PG,cAAe,CA/PlB,iGAoQI,0CAA2C,CApQ/C,uHA2QK,oCAAqC,CACrC,kBAAmB,CA5QxB,+FAoRE,YAAa,CApRf,6IA2RG,4BAA6B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n// scoping is not working inside the Multiselect.vue component\n// as the nested properties are not inside it\n// Therefore we need to use an external scoping\n.multiselect[data-v-#{$scope_version}] {\n\tmargin: 0;\n\tpadding: 0 !important;\n\tdisplay: inline-block;\n\t/* override this rule with your width styling if you need */\n\tmin-width: 160px;\n\tposition: relative;\n\tbackground-color: var(--color-main-background);\n\n\t/* Force single multiselect value to be shown when not active */\n\t&:not(.multiselect--active) .multiselect__single {\n\t\twidth: 100%;\n\t\tz-index: 2 !important;\n\t}\n\n\t// active state, force the input to be shown, we don't want\n\t// the placeholder or the currently selected options\n\t&.multiselect--active {\n\t\t/* Opened: force display the input */\n\t\tinput.multiselect__input {\n\t\t\topacity: $opacity_full !important;\n\t\t\tcursor: text !important;\n\t\t\t// remove border radius on bottom opening\n\t\t\tborder-radius: var(--border-radius) var(--border-radius) 0 0;\n\t\t\tdisplay: block !important;\n\t\t}\n\n\t\t/* multiselect__limit hidden if active */\n\t\t.multiselect__limit {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t// Remove radius on top opening\n\t&.multiselect--active.multiselect--above {\n\t\tinput.multiselect__input {\n\t\t\tborder-radius: 0 0 var(--border-radius) var(--border-radius);\n\t\t}\n\t}\n\n\t// disabled state background\n\t&.multiselect--disabled,\n\t&.multiselect--disabled .multiselect__single {\n\t\tbackground-color: var(--color-background-dark) !important;\n\t}\n\n\t// loading state\n\t&.icon-loading-small::after {\n\t\tleft: 100%;\n\t\tmargin-left: -24px;\n\t}\n\n\t// multiple selected options display\n\t.multiselect__tags {\n\t\t/* space between tags and limit tag */\n\t\t$space-between: 5px;\n\t\tdisplay: flex;\n\t\tflex-wrap: nowrap;\n\t\toverflow: hidden;\n\t\tborder: 1px solid var(--color-border-dark);\n\t\tcursor: pointer;\n\t\tposition: relative;\n\t\tborder-radius: 3px;\n\t\tmin-height: 34px;\n\t\theight: 100%;\n\n\t\t/* tag wrapper */\n\t\t.multiselect__tags-wrap {\n\t\t\talign-items: center;\n\t\t\tdisplay: inline-flex;\n\t\t\toverflow: hidden;\n\t\t\tmax-width: 100%;\n\t\t\tposition: relative;\n\t\t\tpadding: 3px $space-between;\n\t\t\tflex: 1 1;\n\t\t\tflex-wrap: nowrap;\n\t\t\t/* no tags or simple select? Show input directly\n\t\t\tinput is used to display single value */\n\t\t\t&:empty ~ input.multiselect__input {\n\t\t\t\topacity: $opacity_full !important;\n\t\t\t\tdisplay: block !important;\n\t\t\t\t/* hide default empty text like .multiselect__placeholder,\n\t\t\t\tand show input instead. It looks better without a transition between\n\t\t\t\ta span and the input that have different styling */\n\t\t\t\t+ span:not(.multiselect__single) {\n\t\t\t\t\tdisplay: none;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* selected tag */\n\t\t\t.multiselect__tag {\n\t\t\t\tline-height: 20px;\n\t\t\t\tpadding: 3px 5px;\n\t\t\t\tbackground-image: none;\n\t\t\t\tcolor: var(--color-main-text);\n\t\t\t\tborder: 1px solid var(--color-border-dark);\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tborder-radius: 3px;\n\t\t\t\t/* require to override the default width\n\t\t\t\tand force the tag to shring properly */\n\t\t\t\tmin-width: 0;\n\t\t\t\tmax-width: fit-content;\n\t\t\t\tmax-width: -moz-fit-content;\n\t\t\t\tmargin: 2px 1px;\n\t\t\t\t/* css hack, detect if more than two tags\n\t\t\t\tif so, flex-basis is set to half */\n\t\t\t\t&:only-child {\n\t\t\t\t\tflex: 0 1 auto;\n\t\t\t\t}\n\t\t\t\t&:not(:last-child) {\n\t\t\t\t\tmargin-right: $space-between;\n\t\t\t\t}\n\t\t\t\t/* ellipsis the groups to be sure\n\t\t\t\twe display at least two of them */\n\t\t\t\t> span {\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t/* Single select default value\n\t\tor default placeholder if search disabled*/\n\t\t.multiselect__single,\n\t\t.multiselect__placeholder {\n\t\t\tpadding: 7px 6px; // like the input\n\t\t\tflex: 0 0 100%;\n\t\t\tz-index: 1; /* above input */\n\t\t\tbackground-color: var(--color-main-background);\n\t\t\tline-height: 18px; // 32px - 2*6px (padding) - 2*1px (border)\n\t\t\tcolor: var(--color-text-lighter); // like the input\n\t\t\t// Align content and make the flow smoother\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\n\t\t\t// Anything inside will trigger the select opening\n\t\t\t&, * {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\t\t/* displayed text if tag limit reached */\n\t\t.multiselect__strong,\n\t\t.multiselect__limit {\n\t\t\tline-height: 20px;\n\t\t\tcolor: var(--color-text-lighter);\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\topacity: $opacity_normal;\n\t\t\tmargin-right: $space-between;\n\t\t\t/* above the input */\n\t\t\tz-index: 5;\n\t\t}\n\t\t/* default multiselect input for search and placeholder */\n\t\tinput.multiselect__input {\n\t\t\twidth: 100% !important;\n\t\t\tposition: relative !important;\n\t\t\tmargin: 0;\n\t\t\topacity: 0;\n\t\t\t/* let's leave it on top of tags but hide it */\n\t\t\theight: 100% !important;\n\t\t\tborder: none;\n\t\t\t/* override hide to force show the placeholder */\n\t\t\t/* only when not active */\n\t\t\tcursor: pointer;\n\t\t\t/* override inline styling of the lib */\n\t\t\tpadding: 7px 6px !important;\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t/* results wrapper */\n\t.multiselect__content-wrapper {\n\t\tposition: absolute;\n\t\twidth: 100%;\n\t\tmargin-top: -1px;\n\t\tborder: 1px solid var(--color-border-dark);\n\t\tbackground: var(--color-main-background);\n\t\tz-index: 50;\n\t\tmax-height: 250px;\n\t\toverflow-y: auto;\n\t\tborder-radius: 0 0 var(--border-radius) var(--border-radius);\n\t\t.multiselect__content {\n\t\t\twidth: 100%;\n\t\t\tpadding: 0;\n\t\t}\n\t\tli {\n\t\t\tposition: relative;\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tbackground-color: transparent;\n\t\t\t&,\n\t\t\tspan {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t\t> span {\n\t\t\t\tpadding: 8px;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\tmargin: 0;\n\t\t\t\theight: auto;\n\t\t\t\tmin-height: 1em;\n\t\t\t\t-webkit-touch-callout: none;\n\t\t\t\t-webkit-user-select: none;\n\t\t\t\t-moz-user-select: none;\n\t\t\t\t-ms-user-select: none;\n\t\t\t\tuser-select: none;\n\t\t\t\tdisplay: inline-flex;\n\t\t\t\talign-items: center;\n\t\t\t\tbackground-color: transparent;\n\t\t\t\tcolor: var(--color-text-lighter);\n\t\t\t\twidth: 100%;\n\t\t\t\t/* selected checkmark icon */\n\t\t\t\t&::before {\n\t\t\t\t\tcontent: ' ';\n\t\t\t\t\tbackground-repeat: no-repeat;\n\t\t\t\t\tbackground-position: center;\n\t\t\t\t\tmin-width: 16px;\n\t\t\t\t\tmin-height: 16px;\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\topacity: $opacity_disabled;\n\t\t\t\t\tmargin-right: 5px;\n\t\t\t\t\tvisibility: hidden;\n\t\t\t\t}\n\t\t\t\t&.multiselect__option--disabled {\n\t\t\t\t\tbackground-color: var(--color-background-dark);\n\t\t\t\t\topacity: $opacity_disabled;\n\t\t\t\t}\n\t\t\t\t&.multiselect__option--highlight {\n\t\t\t\t\tcolor: var(--color-main-text);\n\t\t\t\t\tbackground-color: var(--color-background-dark);\n\t\t\t\t}\n\t\t\t\t&:not(.multiselect__option--disabled):hover::before {\n\t\t\t\t\topacity: .3;\n\t\t\t\t}\n\t\t\t\t&.multiselect__option--selected,\n\t\t\t\t&:not(.multiselect__option--disabled):hover {\n\t\t\t\t\t&::before {\n\t\t\t\t\t\tvisibility: visible;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t/* ABOVE display */\n\t&.multiselect--above .multiselect__content-wrapper {\n\t\tbottom: 100%;\n\t\tmargin-bottom: -1px;\n\t}\n\n\t/* Icon before option select */\n\t&.multiselect--multiple {\n\t\t// push the input after the tag list\n\t\t.multiselect__tags {\n\t\t\tflex-wrap: wrap;\n\t\t}\n\n\t\t.multiselect__content-wrapper li > span {\n\t\t\t&::before {\n\t\t\t\tbackground-image: var(--icon-checkmark-000);\n\t\t\t}\n\n\t\t\t/* add the prop tag-placeholder=\"create\" to add the +\n\t\t\ticon on top of an unknown-and-ready-to-be-created entry */\n\t\t\t&[data-select='create'] {\n\t\t\t\t&::before {\n\t\t\t\t\tbackground-image: var(--icon-add-000);\n\t\t\t\t\tvisibility: visible;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/* No need for an icon here */\n\t&.multiselect--single .multiselect__content-wrapper li > span::before {\n\t\tdisplay: none;\n\t}\n\n\t/* Mouse feedback */\n\t&:hover,\n\tinput.multiselect__input {\n\t\t.multiselect__placeholder {\n\t\t\tcolor: var(--color-main-text);\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},6051:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.vue-tooltip[data-v-17fd6e1]{position:absolute;z-index:100000;right:auto;left:auto;display:block;margin:0;margin-top:-3px;padding:10px 0;text-align:left;text-align:start;opacity:0;line-height:1.6;line-break:auto;filter:drop-shadow(0 1px 10px var(--color-box-shadow))}.vue-tooltip[data-v-17fd6e1][x-placement^='top'] .tooltip-arrow{bottom:0;border-bottom-width:0;border-top-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='bottom'] .tooltip-arrow{top:0;border-top-width:0;border-bottom-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='right'] .tooltip-arrow{right:100%;border-left-width:0;border-right-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][x-placement^='left'] .tooltip-arrow{left:100%;border-right-width:0;border-left-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1][aria-hidden='true']{visibility:hidden;transition:opacity .15s, visibility .15s;opacity:0}.vue-tooltip[data-v-17fd6e1][aria-hidden='false']{visibility:visible;transition:opacity .15s;opacity:1}.vue-tooltip[data-v-17fd6e1] .tooltip-inner{max-width:350px;padding:5px 8px;text-align:center;color:var(--color-main-text);border-radius:var(--border-radius);background-color:var(--color-main-background)}.vue-tooltip[data-v-17fd6e1] .tooltip-arrow{position:absolute;z-index:1;width:0;height:0;margin:0;border-style:solid;border-color:transparent;border-width:10px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/directives/Tooltip/index.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCOxB,6BACC,iBAAkB,CAClB,cAAe,CACf,UAAW,CACX,SAAU,CACV,aAAc,CACd,QAAS,CAET,eAAgB,CAChB,cAAe,CACf,eAAgB,CAChB,gBAAiB,CACjB,SAAU,CACV,eAAgB,CAEhB,eAAgB,CAChB,sDAAuD,CAhBxD,gEAoBE,QAAS,CACT,qBAAsB,CACtB,6CAA8C,CAtBhD,mEA2BE,KAAM,CACN,kBAAmB,CACnB,gDAAiD,CA7BnD,kEAkCE,UAAW,CACX,mBAAoB,CACpB,+CAAgD,CApClD,iEAyCE,SAAU,CACV,oBAAqB,CACrB,8CAA+C,CA3CjD,iDAgDE,iBAAkB,CAClB,wCAAyC,CACzC,SAAU,CAlDZ,kDAqDE,kBAAmB,CACnB,uBAAwB,CACxB,SAAU,CAvDZ,4CA4DE,eAAgB,CAChB,eAAgB,CAChB,iBAAkB,CAClB,4BAA6B,CAC7B,kCAAmC,CACnC,6CAA8C,CAjEhD,4CAsEE,iBAAkB,CAClB,SAAU,CACV,OAAQ,CACR,QAAS,CACT,QAAS,CACT,kBAAmB,CACnB,wBAAyB,CACzB,iBA/EgB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n/**\n* @copyright Copyright (c) 2016, John Molakvoæ \n* @copyright Copyright (c) 2016, Robin Appelman \n* @copyright Copyright (c) 2016, Jan-Christoph Borchardt \n* @copyright Copyright (c) 2016, Erik Pellikka \n* @copyright Copyright (c) 2015, Vincent Petry \n*\n* Bootstrap v3.3.5 (http://getbootstrap.com)\n* Copyright 2011-2015 Twitter, Inc.\n* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n*/\n\n$arrow-width: 10px;\n\n.vue-tooltip[data-v-#{$scope_version}] {\n\tposition: absolute;\n\tz-index: 100000;\n\tright: auto;\n\tleft: auto;\n\tdisplay: block;\n\tmargin: 0;\n\t/* default to top */\n\tmargin-top: -3px;\n\tpadding: 10px 0;\n\ttext-align: left;\n\ttext-align: start;\n\topacity: 0;\n\tline-height: 1.6;\n\n\tline-break: auto;\n\tfilter: drop-shadow(0 1px 10px var(--color-box-shadow));\n\n\t// TOP\n\t&[x-placement^='top'] .tooltip-arrow {\n\t\tbottom: 0;\n\t\tborder-bottom-width: 0;\n\t\tborder-top-color: var(--color-main-background);\n\t}\n\n\t// BOTTOM\n\t&[x-placement^='bottom'] .tooltip-arrow {\n\t\ttop: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-color: var(--color-main-background);\n\t}\n\n\t// RIGHT\n\t&[x-placement^='right'] .tooltip-arrow {\n\t\tright: 100%;\n\t\tborder-left-width: 0;\n\t\tborder-right-color: var(--color-main-background);\n\t}\n\n\t// LEFT\n\t&[x-placement^='left'] .tooltip-arrow {\n\t\tleft: 100%;\n\t\tborder-right-width: 0;\n\t\tborder-left-color: var(--color-main-background);\n\t}\n\n\t// HIDDEN / SHOWN\n\t&[aria-hidden='true'] {\n\t\tvisibility: hidden;\n\t\ttransition: opacity .15s, visibility .15s;\n\t\topacity: 0;\n\t}\n\t&[aria-hidden='false'] {\n\t\tvisibility: visible;\n\t\ttransition: opacity .15s;\n\t\topacity: 1;\n\t}\n\n\t// CONTENT\n\t.tooltip-inner {\n\t\tmax-width: 350px;\n\t\tpadding: 5px 8px;\n\t\ttext-align: center;\n\t\tcolor: var(--color-main-text);\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-color: var(--color-main-background);\n\t}\n\n\t// ARROW\n\t.tooltip-arrow {\n\t\tposition: absolute;\n\t\tz-index: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tmargin: 0;\n\t\tborder-style: solid;\n\t\tborder-color: transparent;\n\t\tborder-width: $arrow-width;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},7087:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-ef50c406]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-ef50c406]{background-color:var(--color-background-hover)}.action--disabled[data-v-ef50c406]{pointer-events:none;opacity:.5}.action--disabled[data-v-ef50c406]:hover,.action--disabled[data-v-ef50c406]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-ef50c406]{opacity:1 !important}.action-button[data-v-ef50c406]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;padding-right:14px;box-sizing:border-box;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;font-size:var(--default-font-size);line-height:44px}.action-button[data-v-ef50c406]:hover,.action-button[data-v-ef50c406]:focus{opacity:1}.action-button>span[data-v-ef50c406]{cursor:pointer;white-space:nowrap}.action-button__icon[data-v-ef50c406]{width:44px;height:44px;opacity:1;background-position:14px center;background-size:16px;background-repeat:no-repeat}.action-button[data-v-ef50c406] .material-design-icon{width:44px;height:44px;opacity:1}.action-button[data-v-ef50c406] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-button p[data-v-ef50c406]{max-width:220px;line-height:1.6em;padding:10.8px 0;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis}.action-button__longtext[data-v-ef50c406]{cursor:pointer;white-space:pre-wrap}.action-button__title[data-v-ef50c406]{font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline-block}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB,CACrB,gCAOD,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBCtB8C,CDuB9C,qBAAsB,CAEtB,cAAe,CACf,kBAAmB,CAEnB,UClBiB,CDmBjB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,kCAAmC,CACnC,gBC7CmB,CDsBpB,4EA2BE,SC9Ba,CDGf,qCA+BE,cAAe,CACf,kBAAmB,CACnB,sCAGA,UC1DkB,CD2DlB,WC3DkB,CD4DlB,SCzCa,CD0Cb,+BAAwC,CACxC,oBC1Da,CD2Db,2BAA4B,CAzC9B,sDA6CE,UCnEkB,CDoElB,WCpEkB,CDqElB,SClDa,CDGf,iFAkDG,qBAAsB,CAlDzB,kCAwDE,eAAgB,CAChB,iBAAkB,CAGlB,gBAAgD,CAEhD,cAAe,CACf,eAAgB,CAGhB,eAAgB,CAChB,sBAAuB,CACvB,0CAGA,cAAe,CAEf,oBAAqB,CACrB,uCAGA,gBAAiB,CACjB,sBAAuB,CACvB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,oBAAqB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},6429:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-2fd4f3eb]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-caption[data-v-2fd4f3eb]{color:var(--color-text-maxcontrast);line-height:44px;white-space:nowrap;text-overflow:ellipsis;box-shadow:none !important;user-select:none;pointer-events:none;margin-left:12px;padding-right:14px;height:44px;display:flex;align-items:center}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/ActionCaption/ActionCaption.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC8CxB,yCACC,mCAAoC,CACpC,gBC/BoB,CDgCpB,kBAAmB,CACnB,sBAAuB,CACvB,0BAA2B,CAC3B,gBAAiB,CACjB,mBAAoB,CACpB,gBAAiB,CACjB,kBAAmB,CACnB,WCvCoB,CDwCpB,YAAa,CACb,kBAAmB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-caption {\n\tcolor: var(--color-text-maxcontrast);\n\tline-height: $clickable-area;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\tbox-shadow: none !important;\n\tuser-select: none;\n\tpointer-events: none;\n\tmargin-left: 12px;\n\tpadding-right: 14px;\n\theight: $clickable-area;\n\tdisplay: flex;\n\talign-items: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},4105:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-cae5b47a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-cae5b47a]{background-color:var(--color-background-hover)}.action--disabled[data-v-cae5b47a]{pointer-events:none;opacity:.5}.action--disabled[data-v-cae5b47a]:hover,.action--disabled[data-v-cae5b47a]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-cae5b47a]{opacity:1 !important}.action-checkbox[data-v-cae5b47a]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;cursor:pointer;white-space:nowrap;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;line-height:44px}.action-checkbox__checkbox[data-v-cae5b47a]{position:absolute;top:auto;left:-10000px;overflow:hidden;width:1px;height:1px}.action-checkbox__checkbox:focus+.action-checkbox__label[data-v-cae5b47a]{opacity:1}.action-checkbox__label[data-v-cae5b47a]{display:flex;align-items:center;width:100%;padding:0 !important;padding-right:14px !important;opacity:.7}.action-checkbox__label[data-v-cae5b47a]::before{margin:0 14px 0 !important}.action-checkbox--disabled[data-v-cae5b47a],.action-checkbox--disabled .action-checkbox__label[data-v-cae5b47a]{cursor:pointer}.action-checkbox:not(.action-checkbox--disabled):hover .action-checkbox__label[data-v-cae5b47a],.action-checkbox:not(.action-checkbox--disabled):focus .action-checkbox__label[data-v-cae5b47a]{opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss","webpack://./src/components/ActionCheckbox/ActionCheckbox.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB,CEsHxB,kCACC,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CAEV,cAAe,CACf,kBAAmB,CAEnB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,gBDxJoB,CC2JpB,4CACC,iBAAkB,CAClB,QAAS,CACT,aAAc,CAEd,eAAgB,CAEhB,SAAU,CACV,UAAW,CARX,0EAUC,SDlJa,CCmJb,yCAID,YAAa,CACb,kBAAmB,CAEnB,UAAW,CACX,oBAAqB,CACrB,6BAAsC,CAEtC,UD/JiB,CCuJjB,iDAYC,0BAA2B,CAC3B,gHAMA,cAAe,CAvDlB,gMA8DG,SDhLa",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@import '../../assets/action';\n@include action-active;\n@include action--disabled;\n\n.action-checkbox {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0;\n\tpadding: 0;\n\n\tcursor: pointer;\n\twhite-space: nowrap;\n\n\tcolor: var(--color-main-text);\n\tborder: 0;\n\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\tbackground-color: transparent;\n\tbox-shadow: none;\n\n\tfont-weight: normal;\n\tline-height: $clickable-area;\n\n\t/* checkbox/radio fixes */\n\t&__checkbox {\n\t\tposition: absolute;\n\t\ttop: auto;\n\t\tleft: -10000px;\n\n\t\toverflow: hidden;\n\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\t&:focus + .action-checkbox__label {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center; // align checkbox to text\n\n\t\twidth: 100%;\n\t\tpadding: 0 !important;\n\t\tpadding-right: $icon-margin !important;\n\n\t\topacity: $opacity_normal;\n\t\t// checkbox-width is 12px, border is 2\n\t\t// (44 - 14 - 2) / 2 = 14\n\t\t&::before {\n\t\t\tmargin: 0 14px 0 !important;\n\t\t}\n\t}\n\n\t&--disabled {\n\t\t&,\n\t\t.action-checkbox__label {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t&:not(.action-checkbox--disabled):hover,\n\t&:not(.action-checkbox--disabled):focus {\n\t\t.action-checkbox__label {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},3949:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-3a716b2a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}button[data-v-3a716b2a]:not(.button-vue),input[data-v-3a716b2a]:not([type='range']),textarea[data-v-3a716b2a]{margin:0;padding:7px 6px;cursor:text;color:var(--color-text-lighter);border:1px solid var(--color-border-dark);border-radius:var(--border-radius);outline:none;background-color:var(--color-main-background);font-size:13px}button[data-v-3a716b2a]:not(.button-vue):not(:disabled):not(.primary):hover,button[data-v-3a716b2a]:not(.button-vue):not(:disabled):not(.primary):focus,button:not(.button-vue):not(:disabled):not(.primary).active[data-v-3a716b2a],input[data-v-3a716b2a]:not([type='range']):not(:disabled):not(.primary):hover,input[data-v-3a716b2a]:not([type='range']):not(:disabled):not(.primary):focus,input:not([type='range']):not(:disabled):not(.primary).active[data-v-3a716b2a],textarea[data-v-3a716b2a]:not(:disabled):not(.primary):hover,textarea[data-v-3a716b2a]:not(:disabled):not(.primary):focus,textarea:not(:disabled):not(.primary).active[data-v-3a716b2a]{border-color:var(--color-primary-element);outline:none}button[data-v-3a716b2a]:not(.button-vue):not(:disabled):not(.primary):active,input[data-v-3a716b2a]:not([type='range']):not(:disabled):not(.primary):active,textarea[data-v-3a716b2a]:not(:disabled):not(.primary):active{color:var(--color-text-light);outline:none;background-color:var(--color-main-background)}button[data-v-3a716b2a]:not(.button-vue):disabled,input[data-v-3a716b2a]:not([type='range']):disabled,textarea[data-v-3a716b2a]:disabled{cursor:default;opacity:.5;color:var(--color-text-maxcontrast);background-color:var(--color-background-dark)}button[data-v-3a716b2a]:not(.button-vue):required,input[data-v-3a716b2a]:not([type='range']):required,textarea[data-v-3a716b2a]:required{box-shadow:none}button[data-v-3a716b2a]:not(.button-vue):invalid,input[data-v-3a716b2a]:not([type='range']):invalid,textarea[data-v-3a716b2a]:invalid{border-color:var(--color-error);box-shadow:none !important}button:not(.button-vue).primary[data-v-3a716b2a],input:not([type='range']).primary[data-v-3a716b2a],textarea.primary[data-v-3a716b2a]{cursor:pointer;color:var(--color-primary-text);border-color:var(--color-primary-element);background-color:var(--color-primary-element)}button:not(.button-vue).primary[data-v-3a716b2a]:not(:disabled):hover,button:not(.button-vue).primary[data-v-3a716b2a]:not(:disabled):focus,button:not(.button-vue).primary[data-v-3a716b2a]:not(:disabled):active,input:not([type='range']).primary[data-v-3a716b2a]:not(:disabled):hover,input:not([type='range']).primary[data-v-3a716b2a]:not(:disabled):focus,input:not([type='range']).primary[data-v-3a716b2a]:not(:disabled):active,textarea.primary[data-v-3a716b2a]:not(:disabled):hover,textarea.primary[data-v-3a716b2a]:not(:disabled):focus,textarea.primary[data-v-3a716b2a]:not(:disabled):active{border-color:var(--color-primary-element-light);background-color:var(--color-primary-element-light)}button:not(.button-vue).primary[data-v-3a716b2a]:not(:disabled):active,input:not([type='range']).primary[data-v-3a716b2a]:not(:disabled):active,textarea.primary[data-v-3a716b2a]:not(:disabled):active{color:var(--color-primary-text-dark)}button:not(.button-vue).primary[data-v-3a716b2a]:disabled,input:not([type='range']).primary[data-v-3a716b2a]:disabled,textarea.primary[data-v-3a716b2a]:disabled{cursor:default;color:var(--color-primary-text-dark);background-color:var(--color-primary-element)}li.active[data-v-3a716b2a]{background-color:var(--color-background-hover)}.action--disabled[data-v-3a716b2a]{pointer-events:none;opacity:.5}.action--disabled[data-v-3a716b2a]:hover,.action--disabled[data-v-3a716b2a]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-3a716b2a]{opacity:1 !important}.action-input[data-v-3a716b2a]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;cursor:pointer;white-space:nowrap;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal}.action-input[data-v-3a716b2a] .material-design-icon{width:44px;height:44px;opacity:1}.action-input[data-v-3a716b2a] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-input[data-v-3a716b2a]:not(.action-input--picker){opacity:.7}.action-input[data-v-3a716b2a]:not(.action-input--picker):hover,.action-input[data-v-3a716b2a]:not(.action-input--picker):focus{opacity:1}.action-input--picker .action-input__icon[data-v-3a716b2a]{opacity:.7}.action-input--picker:hover .action-input__icon[data-v-3a716b2a],.action-input--picker:focus .action-input__icon[data-v-3a716b2a]{opacity:1}.action-input>span[data-v-3a716b2a]{cursor:pointer;white-space:nowrap}.action-input__icon[data-v-3a716b2a]{min-width:0;min-height:0;padding:22px 0 22px 44px;background-position:14px center;background-size:16px}.action-input__form[data-v-3a716b2a]{display:flex;align-items:center;flex:1 1 auto;margin:4px 0;padding-right:14px}.action-input__submit[data-v-3a716b2a]{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.action-input__label[data-v-3a716b2a]{display:flex;align-items:center;justify-content:center;width:36px;height:36px;box-sizing:border-box;margin:0 0 0 -8px;padding:7px 6px;opacity:1;color:var(--color-text-lighter);border:1px solid var(--color-border-dark);border-left-color:transparent;border-radius:0 var(--border-radius) var(--border-radius) 0;background-color:var(--color-main-background);background-clip:padding-box}.action-input__label[data-v-3a716b2a],.action-input__label *[data-v-3a716b2a]{cursor:pointer}.action-input__input[data-v-3a716b2a]{flex:1 1 auto;min-width:132px;min-height:36px;max-height:36px;margin:0}.action-input__input[data-v-3a716b2a]:disabled{cursor:default}.action-input__input:not(:active):not(:hover):not(:focus):invalid+.action-input__label[data-v-3a716b2a]{border-color:var(--color-error);border-left-color:transparent}.action-input__input:not(:active):not(:hover):not(:focus):not(:disabled)+.action-input__label[data-v-3a716b2a]:active,.action-input__input:not(:active):not(:hover):not(:focus):not(:disabled)+.action-input__label[data-v-3a716b2a]:hover,.action-input__input:not(:active):not(:hover):not(:focus):not(:disabled)+.action-input__label[data-v-3a716b2a]:focus{border-color:var(--color-primary-element);border-radius:var(--border-radius)}.action-input__input:active:not(:disabled)+.action-input__label[data-v-3a716b2a],.action-input__input:hover:not(:disabled)+.action-input__label[data-v-3a716b2a],.action-input__input:focus:not(:disabled)+.action-input__label[data-v-3a716b2a]{z-index:2;border-color:var(--color-primary-element);border-left-color:transparent}.action-input__picker[data-v-3a716b2a] .mx-input{margin:0}.action-input__multi[data-v-3a716b2a]{width:100%}li:last-child>.action-input[data-v-3a716b2a]{padding-bottom:10px}li:first-child>.action-input[data-v-3a716b2a]{padding-top:10px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/inputs.scss","webpack://./src/assets/variables.scss","webpack://./src/assets/action.scss","webpack://./src/components/ActionInput/ActionInput.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,8GCuBA,QAAS,CACT,eAAgB,CAEhB,WAAY,CAEZ,+BAAgC,CAChC,yCAA0C,CAC1C,kCAAmC,CACnC,YAAa,CACb,6CAA8C,CAE9C,cAAe,CAdhB,woBAqBG,yCAA0C,CAC1C,YAAa,CAtBhB,0NA0BG,6BAA8B,CAC9B,YAAa,CACb,6CAA8C,CA5BjD,yIAiCE,cAAe,CACf,UCrBmB,CDsBnB,mCAAoC,CACpC,6CAA8C,CApChD,yIAwCE,eAAgB,CAxClB,sIA4CE,+BAAgC,CAChC,0BAA2B,CA7C7B,sIAkDE,cAAe,CACf,+BAAgC,CAChC,yCAA0C,CAC1C,6CAA8C,CArDhD,klBA2DI,+CAAgD,CAChD,mDAAoD,CA5DxD,wMA+DI,oCAAqC,CA/DzC,iKAoEG,cAAe,CACf,oCAAqC,CAErC,6CAA8C,CAC9C,2BE3EA,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UDQmB,CCVpB,kFAIE,cAAe,CACf,UDKkB,CCVpB,qCAQE,oBAAqB,CCiOxB,+BACC,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CAEV,cAAe,CACf,kBAAmB,CAEnB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CAlBpB,qDAqBE,UFrQmB,CEsQnB,WFtQmB,CEuQnB,SFpPc,CE6NhB,gFA0BG,qBAAsB,CA1BzB,0DAgCE,UF9PiB,CE8NnB,gIAmCG,SFhQa,CEiQb,2DAMA,UFxQgB,CEsQjB,kIAMC,SF3Qa,CE6NhB,oCAmDE,cAAe,CACf,kBAAmB,CACnB,qCAGA,WAAY,CACZ,YAAa,CAGb,wBF5SmB,CE8SnB,+BAA2C,CAC3C,oBF3Sc,CE4Sd,qCAIA,YAAa,CACb,kBAAmB,CACnB,aAAc,CAEd,YAAuB,CACvB,kBFjT8C,CEkT9C,uCAGA,iBAAkB,CAClB,aAAc,CACd,QAAS,CACT,SAAU,CACV,UAAW,CACX,eAAgB,CAChB,sCAGA,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CAEvB,UAAO,CACP,WAAQ,CACR,qBAAsB,CACtB,iBAAkB,CAClB,eAAgB,CAEhB,SF7Tc,CE8Td,+BAAgC,CAChC,yCAA0C,CAC1C,6BAA8B,CAC9B,2DAA4D,CAE5D,6CAA8C,CAC9C,2BAA4B,CAlB5B,8EAqBC,cAAe,CACf,sCAKD,aAAc,CAEd,eAA8B,CAC9B,eAAY,CACZ,eAAY,CACZ,QAAS,CANT,+CAUC,cAAe,CAVhB,wGAiBG,+BAAgC,CAChC,6BAA8B,CAlBjC,gWAyBG,yCAA0C,CAC1C,kCAAmC,CA1BtC,iPAmCE,SAAU,CAEV,yCAA0C,CAC1C,6BAA8B,CAC9B,iDAMD,QAAS,CACT,sCAID,UAAW,CACX,6CAOD,mBAA4C,CAC5C,8CAIA,gBAAyC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n/**\n * color-text-lighter\t\tnormal state\n * color-text-lighter\t\tactive state\n * color-text-maxcontrast \tdisabled state\n */\n\n/* Default global values */\nbutton:not(.button-vue),\ninput:not([type='range']),\ntextarea {\n\tmargin: 0;\n\tpadding: 7px 6px;\n\n\tcursor: text;\n\n\tcolor: var(--color-text-lighter);\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius);\n\toutline: none;\n\tbackground-color: var(--color-main-background);\n\n\tfont-size: 13px;\n\n\t&:not(:disabled):not(.primary) {\n\t\t&:hover,\n\t\t&:focus,\n\t\t&.active {\n\t\t\t/* active class used for multiselect */\n\t\t\tborder-color: var(--color-primary-element);\n\t\t\toutline: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcolor: var(--color-text-light);\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: $opacity_disabled;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&:required {\n\t\tbox-shadow: none;\n\t}\n\n\t&:invalid {\n\t\tborder-color: var(--color-error);\n\t\tbox-shadow: none !important;\n\t}\n\n\t/* Primary action button, use sparingly */\n\t&.primary {\n\t\tcursor: pointer;\n\t\tcolor: var(--color-primary-text);\n\t\tborder-color: var(--color-primary-element);\n\t\tbackground-color: var(--color-primary-element);\n\n\t\t&:not(:disabled) {\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tborder-color: var(--color-primary-element-light);\n\t\t\t\tbackground-color: var(--color-primary-element-light);\n\t\t\t}\n\t\t\t&:active {\n\t\t\t\tcolor: var(--color-primary-text-dark);\n\t\t\t}\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcursor: default;\n\t\t\tcolor: var(--color-primary-text-dark);\n\t\t\t// opacity is already defined to .5 if disabled\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@import '../../assets/inputs';\n@import '../../assets/action';\n@include action-active;\n@include action--disabled;\n\n$input-margin: 4px;\n\n.action-input {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0;\n\tpadding: 0;\n\n\tcursor: pointer;\n\twhite-space: nowrap;\n\n\tcolor: var(--color-main-text);\n\tborder: 0;\n\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\tbackground-color: transparent;\n\tbox-shadow: none;\n\n\tfont-weight: normal;\n\n\t&::v-deep .material-design-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\topacity: $opacity_full;\n\n\t\t.material-design-icon__svg {\n\t\t\tvertical-align: middle;\n\t\t}\n\t}\n\n\t// do not change the opacity of the datepicker\n\t&:not(.action-input--picker) {\n\t\topacity: $opacity_normal;\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n\n\t// only change for the icon then\n\t&--picker {\n\t\t.action-input__icon {\n\t\t\topacity: $opacity_normal;\n\t\t}\n\t\t&:hover .action-input__icon,\n\t\t&:focus .action-input__icon {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n\n\t& > span {\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t}\n\n\t&__icon {\n\t\tmin-width: 0; /* Overwrite icons*/\n\t\tmin-height: 0;\n\t\t/* Keep padding to define the width to\n\t\t\tassure correct position of a possible text */\n\t\tpadding: #{$clickable-area / 2} 0 #{$clickable-area / 2} $clickable-area;\n\n\t\tbackground-position: #{$icon-margin} center;\n\t\tbackground-size: $icon-size;\n\t}\n\n\t// Forms & text inputs\n\t&__form {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tflex: 1 1 auto;\n\n\t\tmargin: $input-margin 0;\n\t\tpadding-right: $icon-margin;\n\t}\n\n\t&__submit {\n\t\tposition: absolute;\n\t\tleft: -10000px;\n\t\ttop: auto;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\toverflow: hidden;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\twidth: #{$clickable-area - $input-margin * 2};\n\t\theight: #{$clickable-area - $input-margin * 2};\n\t\tbox-sizing: border-box;\n\t\tmargin: 0 0 0 -8px;\n\t\tpadding: 7px 6px;\n\n\t\topacity: $opacity_full;\n\t\tcolor: var(--color-text-lighter);\n\t\tborder: 1px solid var(--color-border-dark);\n\t\tborder-left-color: transparent;\n\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0;\n\t\t/* Avoid background under border */\n\t\tbackground-color: var(--color-main-background);\n\t\tbackground-clip: padding-box;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t/* Inputs inside popover supports text, submit & reset */\n\t&__input {\n\t\tflex: 1 1 auto;\n\n\t\tmin-width: $clickable-area * 3;\n\t\tmin-height: #{$clickable-area - $input-margin * 2}; /* twice the element margin-y */\n\t\tmax-height: #{$clickable-area - $input-margin * 2}; /* twice the element margin-y */\n\t\tmargin: 0;\n\n\t\t// if disabled, change cursor\n\t\t&:disabled {\n\t\t\tcursor: default;\n\t\t}\n\n\t\t/* only show confirm borders if input is not focused */\n\t\t&:not(:active):not(:hover):not(:focus) {\n\t\t\t&:invalid {\n\t\t\t\t& + .action-input__label {\n\t\t\t\t\tborder-color: var(--color-error);\n\t\t\t\t\tborder-left-color: transparent;\n\t\t\t\t}\n\t\t\t}\n\t\t\t&:not(:disabled) + .action-input__label {\n\t\t\t\t&:active,\n\t\t\t\t&:hover,\n\t\t\t\t&:focus {\n\t\t\t\t\tborder-color: var(--color-primary-element);\n\t\t\t\t\tborder-radius: var(--border-radius);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t&:not(:disabled) + .action-input__label {\n\t\t\t\t/* above previous input */\n\t\t\t\tz-index: 2;\n\n\t\t\t\tborder-color: var(--color-primary-element);\n\t\t\t\tborder-left-color: transparent;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__picker::v-deep {\n\t\t.mx-input {\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\n\t&__multi {\n\t\twidth: 100%;\n\t}\n}\n\n// if a form is the last of the list\n// add the same bottomMargin as the right padding\n// for visual balance\nli:last-child > .action-input {\n\tpadding-bottom: $icon-margin - $input-margin;\n}\n\n// same for first item\nli:first-child > .action-input {\n\tpadding-top: $icon-margin - $input-margin;\n}\n\n"],sourceRoot:""}]),t.Z=o},4975:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-c8248868]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-c8248868]{background-color:var(--color-background-hover)}.action-link[data-v-c8248868]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;padding-right:14px;box-sizing:border-box;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;font-size:var(--default-font-size);line-height:44px}.action-link[data-v-c8248868]:hover,.action-link[data-v-c8248868]:focus{opacity:1}.action-link>span[data-v-c8248868]{cursor:pointer;white-space:nowrap}.action-link__icon[data-v-c8248868]{width:44px;height:44px;opacity:1;background-position:14px center;background-size:16px;background-repeat:no-repeat}.action-link[data-v-c8248868] .material-design-icon{width:44px;height:44px;opacity:1}.action-link[data-v-c8248868] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-link p[data-v-c8248868]{max-width:220px;line-height:1.6em;padding:10.8px 0;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis}.action-link__longtext[data-v-c8248868]{cursor:pointer;white-space:pre-wrap}.action-link__title[data-v-c8248868]{font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline-block}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,8BAqBD,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBCtB8C,CDuB9C,qBAAsB,CAEtB,cAAe,CACf,kBAAmB,CAEnB,UClBiB,CDmBjB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,kCAAmC,CACnC,gBC7CmB,CDsBpB,wEA2BE,SC9Ba,CDGf,mCA+BE,cAAe,CACf,kBAAmB,CACnB,oCAGA,UC1DkB,CD2DlB,WC3DkB,CD4DlB,SCzCa,CD0Cb,+BAAwC,CACxC,oBC1Da,CD2Db,2BAA4B,CAzC9B,oDA6CE,UCnEkB,CDoElB,WCpEkB,CDqElB,SClDa,CDGf,+EAkDG,qBAAsB,CAlDzB,gCAwDE,eAAgB,CAChB,iBAAkB,CAGlB,gBAAgD,CAEhD,cAAe,CACf,eAAgB,CAGhB,eAAgB,CAChB,sBAAuB,CACvB,wCAGA,cAAe,CAEf,oBAAqB,CACrB,qCAGA,gBAAiB,CACjB,sBAAuB,CACvB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,oBAAqB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},8631:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-9e294d1a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-9e294d1a]{background-color:var(--color-background-hover)}.action--disabled[data-v-9e294d1a]{pointer-events:none;opacity:.5}.action--disabled[data-v-9e294d1a]:hover,.action--disabled[data-v-9e294d1a]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-9e294d1a]{opacity:1 !important}.action-radio[data-v-9e294d1a]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;cursor:pointer;white-space:nowrap;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;line-height:44px}.action-radio__radio[data-v-9e294d1a]{position:absolute;top:auto;left:-10000px;overflow:hidden;width:1px;height:1px}.action-radio__radio:focus+.action-radio__label[data-v-9e294d1a]{opacity:1}.action-radio__label[data-v-9e294d1a]{display:flex;align-items:center;width:100%;padding:0 !important;padding-right:14px !important;opacity:.7}.action-radio__label[data-v-9e294d1a]::before{margin:0 14px 0 !important}.action-radio--disabled[data-v-9e294d1a],.action-radio--disabled .action-radio__label[data-v-9e294d1a]{cursor:pointer}.action-radio:not(.action-radio--disabled):hover .action-radio__label[data-v-9e294d1a],.action-radio:not(.action-radio--disabled):focus .action-radio__label[data-v-9e294d1a]{opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss","webpack://./src/components/ActionRadio/ActionRadio.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB,CEmHxB,+BACC,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CAEV,cAAe,CACf,kBAAmB,CAEnB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,gBDrJoB,CCwJpB,sCACC,iBAAkB,CAClB,QAAS,CACT,aAAc,CAEd,eAAgB,CAEhB,SAAU,CACV,UAAW,CARX,iEAUC,SD/Ia,CCgJb,sCAID,YAAa,CACb,kBAAmB,CAEnB,UAAW,CACX,oBAAqB,CACrB,6BAAsC,CAEtC,UD5JiB,CCoJjB,8CAYC,0BAA2B,CAC3B,uGAMA,cAAe,CAvDlB,8KA8DG,SD7Ka",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@import '../../assets/action';\n@include action-active;\n@include action--disabled;\n\n.action-radio {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0;\n\tpadding: 0;\n\n\tcursor: pointer;\n\twhite-space: nowrap;\n\n\tcolor: var(--color-main-text);\n\tborder: 0;\n\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\tbackground-color: transparent;\n\tbox-shadow: none;\n\n\tfont-weight: normal;\n\tline-height: $clickable-area;\n\n\t/* checkbox/radio fixes */\n\t&__radio {\n\t\tposition: absolute;\n\t\ttop: auto;\n\t\tleft: -10000px;\n\n\t\toverflow: hidden;\n\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\t&:focus + .action-radio__label {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center; // align radio to text\n\n\t\twidth: 100%;\n\t\tpadding: 0 !important;\n\t\tpadding-right: $icon-margin !important;\n\n\t\topacity: $opacity_normal;\n\t\t// radio-width is 12px, border is 2\n\t\t// (44 - 14 - 2) / 2 = 14\n\t\t&::before {\n\t\t\tmargin: 0 14px 0 !important;\n\t\t}\n\t}\n\n\t&--disabled {\n\t\t&,\n\t\t.action-radio__label {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t&:not(.action-radio--disabled):hover,\n\t&:not(.action-radio--disabled):focus {\n\t\t.action-radio__label {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},8477:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-0dbcc9ff]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-0dbcc9ff]{background-color:var(--color-background-hover)}.action-router[data-v-0dbcc9ff]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;padding-right:14px;box-sizing:border-box;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;font-size:var(--default-font-size);line-height:44px}.action-router[data-v-0dbcc9ff]:hover,.action-router[data-v-0dbcc9ff]:focus{opacity:1}.action-router>span[data-v-0dbcc9ff]{cursor:pointer;white-space:nowrap}.action-router__icon[data-v-0dbcc9ff]{width:44px;height:44px;opacity:1;background-position:14px center;background-size:16px;background-repeat:no-repeat}.action-router[data-v-0dbcc9ff] .material-design-icon{width:44px;height:44px;opacity:1}.action-router[data-v-0dbcc9ff] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-router p[data-v-0dbcc9ff]{max-width:220px;line-height:1.6em;padding:10.8px 0;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis}.action-router__longtext[data-v-0dbcc9ff]{cursor:pointer;white-space:pre-wrap}.action-router__title[data-v-0dbcc9ff]{font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline-block}.action--disabled[data-v-0dbcc9ff]{pointer-events:none;opacity:.5}.action--disabled[data-v-0dbcc9ff]:hover,.action--disabled[data-v-0dbcc9ff]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-0dbcc9ff]{opacity:1 !important}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,gCAqBD,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBCtB8C,CDuB9C,qBAAsB,CAEtB,cAAe,CACf,kBAAmB,CAEnB,UClBiB,CDmBjB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,kCAAmC,CACnC,gBC7CmB,CDsBpB,4EA2BE,SC9Ba,CDGf,qCA+BE,cAAe,CACf,kBAAmB,CACnB,sCAGA,UC1DkB,CD2DlB,WC3DkB,CD4DlB,SCzCa,CD0Cb,+BAAwC,CACxC,oBC1Da,CD2Db,2BAA4B,CAzC9B,sDA6CE,UCnEkB,CDoElB,WCpEkB,CDqElB,SClDa,CDGf,iFAkDG,qBAAsB,CAlDzB,kCAwDE,eAAgB,CAChB,iBAAkB,CAGlB,gBAAgD,CAEhD,cAAe,CACf,eAAgB,CAGhB,eAAgB,CAChB,sBAAuB,CACvB,0CAGA,cAAe,CAEf,oBAAqB,CACrB,uCAGA,gBAAiB,CACjB,sBAAuB,CACvB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,oBAAqB,CAjGvB,mCACC,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},2103:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-5339ba06]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.action-separator[data-v-5339ba06]{height:0;margin:5px 10px 5px 15px;border-bottom:1px solid var(--color-border-dark);cursor:default}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/ActionSeparator/ActionSeparator.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC6BxB,mCACC,QAAS,CACT,wBAAyB,CACzB,gDAAiD,CACjD,cAAe",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.action-separator {\n\theight: 0;\n\tmargin: 5px 10px 5px 15px;\n\tborder-bottom: 1px solid var(--color-border-dark);\n\tcursor: default;\n}\n"],sourceRoot:""}]),t.Z=o},7727:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-304eec30]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li.active[data-v-304eec30]{background-color:var(--color-background-hover)}.action-text[data-v-304eec30]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;padding-right:14px;box-sizing:border-box;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;font-size:var(--default-font-size);line-height:44px}.action-text[data-v-304eec30]:hover,.action-text[data-v-304eec30]:focus{opacity:1}.action-text>span[data-v-304eec30]{cursor:pointer;white-space:nowrap}.action-text__icon[data-v-304eec30]{width:44px;height:44px;opacity:1;background-position:14px center;background-size:16px;background-repeat:no-repeat}.action-text[data-v-304eec30] .material-design-icon{width:44px;height:44px;opacity:1}.action-text[data-v-304eec30] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-text p[data-v-304eec30]{max-width:220px;line-height:1.6em;padding:10.8px 0;cursor:pointer;text-align:left;overflow:hidden;text-overflow:ellipsis}.action-text__longtext[data-v-304eec30]{cursor:pointer;white-space:pre-wrap}.action-text__title[data-v-304eec30]{font-weight:bold;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;max-width:100%;display:inline-block}.action--disabled[data-v-304eec30]{pointer-events:none;opacity:.5}.action--disabled[data-v-304eec30]:hover,.action--disabled[data-v-304eec30]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-304eec30]{opacity:1 !important}.action-text[data-v-304eec30],.action-text span[data-v-304eec30]{cursor:default}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/action.scss","webpack://./src/assets/variables.scss","webpack://./src/components/ActionText/ActionText.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,2BCiBE,8CAA+C,CAC/C,8BAqBD,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBCtB8C,CDuB9C,qBAAsB,CAEtB,cAAe,CACf,kBAAmB,CAEnB,UClBiB,CDmBjB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,kCAAmC,CACnC,gBC7CmB,CDsBpB,wEA2BE,SC9Ba,CDGf,mCA+BE,cAAe,CACf,kBAAmB,CACnB,oCAGA,UC1DkB,CD2DlB,WC3DkB,CD4DlB,SCzCa,CD0Cb,+BAAwC,CACxC,oBC1Da,CD2Db,2BAA4B,CAzC9B,oDA6CE,UCnEkB,CDoElB,WCpEkB,CDqElB,SClDa,CDGf,+EAkDG,qBAAsB,CAlDzB,gCAwDE,eAAgB,CAChB,iBAAkB,CAGlB,gBAAgD,CAEhD,cAAe,CACf,eAAgB,CAGhB,eAAgB,CAChB,sBAAuB,CACvB,wCAGA,cAAe,CAEf,oBAAqB,CACrB,qCAGA,gBAAiB,CACjB,sBAAuB,CACvB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,oBAAqB,CAjGvB,mCACC,mBAAoB,CACpB,UCQmB,CDVpB,kFAIE,cAAe,CACf,UCKkB,CDVpB,qCAQE,oBAAqB,CEwCxB,iEAGE,cAAe",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@import '../../assets/action';\n@include action-active;\n@include action-item('text');\n@include action--disabled;\n\n.action-text {\n\t&,\n\tspan {\n\t\tcursor: default;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},2476:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-b3a35a96]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}button[data-v-b3a35a96]:not(.button-vue),input[data-v-b3a35a96]:not([type='range']),textarea[data-v-b3a35a96]{margin:0;padding:7px 6px;cursor:text;color:var(--color-text-lighter);border:1px solid var(--color-border-dark);border-radius:var(--border-radius);outline:none;background-color:var(--color-main-background);font-size:13px}button[data-v-b3a35a96]:not(.button-vue):not(:disabled):not(.primary):hover,button[data-v-b3a35a96]:not(.button-vue):not(:disabled):not(.primary):focus,button:not(.button-vue):not(:disabled):not(.primary).active[data-v-b3a35a96],input[data-v-b3a35a96]:not([type='range']):not(:disabled):not(.primary):hover,input[data-v-b3a35a96]:not([type='range']):not(:disabled):not(.primary):focus,input:not([type='range']):not(:disabled):not(.primary).active[data-v-b3a35a96],textarea[data-v-b3a35a96]:not(:disabled):not(.primary):hover,textarea[data-v-b3a35a96]:not(:disabled):not(.primary):focus,textarea:not(:disabled):not(.primary).active[data-v-b3a35a96]{border-color:var(--color-primary-element);outline:none}button[data-v-b3a35a96]:not(.button-vue):not(:disabled):not(.primary):active,input[data-v-b3a35a96]:not([type='range']):not(:disabled):not(.primary):active,textarea[data-v-b3a35a96]:not(:disabled):not(.primary):active{color:var(--color-text-light);outline:none;background-color:var(--color-main-background)}button[data-v-b3a35a96]:not(.button-vue):disabled,input[data-v-b3a35a96]:not([type='range']):disabled,textarea[data-v-b3a35a96]:disabled{cursor:default;opacity:.5;color:var(--color-text-maxcontrast);background-color:var(--color-background-dark)}button[data-v-b3a35a96]:not(.button-vue):required,input[data-v-b3a35a96]:not([type='range']):required,textarea[data-v-b3a35a96]:required{box-shadow:none}button[data-v-b3a35a96]:not(.button-vue):invalid,input[data-v-b3a35a96]:not([type='range']):invalid,textarea[data-v-b3a35a96]:invalid{border-color:var(--color-error);box-shadow:none !important}button:not(.button-vue).primary[data-v-b3a35a96],input:not([type='range']).primary[data-v-b3a35a96],textarea.primary[data-v-b3a35a96]{cursor:pointer;color:var(--color-primary-text);border-color:var(--color-primary-element);background-color:var(--color-primary-element)}button:not(.button-vue).primary[data-v-b3a35a96]:not(:disabled):hover,button:not(.button-vue).primary[data-v-b3a35a96]:not(:disabled):focus,button:not(.button-vue).primary[data-v-b3a35a96]:not(:disabled):active,input:not([type='range']).primary[data-v-b3a35a96]:not(:disabled):hover,input:not([type='range']).primary[data-v-b3a35a96]:not(:disabled):focus,input:not([type='range']).primary[data-v-b3a35a96]:not(:disabled):active,textarea.primary[data-v-b3a35a96]:not(:disabled):hover,textarea.primary[data-v-b3a35a96]:not(:disabled):focus,textarea.primary[data-v-b3a35a96]:not(:disabled):active{border-color:var(--color-primary-element-light);background-color:var(--color-primary-element-light)}button:not(.button-vue).primary[data-v-b3a35a96]:not(:disabled):active,input:not([type='range']).primary[data-v-b3a35a96]:not(:disabled):active,textarea.primary[data-v-b3a35a96]:not(:disabled):active{color:var(--color-primary-text-dark)}button:not(.button-vue).primary[data-v-b3a35a96]:disabled,input:not([type='range']).primary[data-v-b3a35a96]:disabled,textarea.primary[data-v-b3a35a96]:disabled{cursor:default;color:var(--color-primary-text-dark);background-color:var(--color-primary-element)}li.active[data-v-b3a35a96]{background-color:var(--color-background-hover)}.action--disabled[data-v-b3a35a96]{pointer-events:none;opacity:.5}.action--disabled[data-v-b3a35a96]:hover,.action--disabled[data-v-b3a35a96]:focus{cursor:default;opacity:.5}.action--disabled *[data-v-b3a35a96]{opacity:1 !important}.action-text-editable[data-v-b3a35a96]{display:flex;align-items:flex-start;width:100%;height:auto;margin:0;padding:0;cursor:pointer;white-space:nowrap;opacity:.7;color:var(--color-main-text);border:0;border-radius:0;background-color:transparent;box-shadow:none;font-weight:normal;line-height:44px}.action-text-editable[data-v-b3a35a96]:hover,.action-text-editable[data-v-b3a35a96]:focus{opacity:1}.action-text-editable>span[data-v-b3a35a96]{cursor:pointer;white-space:nowrap}.action-text-editable__icon[data-v-b3a35a96]{min-width:0;min-height:0;padding:22px 0 22px 44px;background-position:14px center;background-size:16px}.action-text-editable__form[data-v-b3a35a96]{display:flex;flex:1 1 auto;flex-direction:column;position:relative;margin:4px 0;padding-right:14px}.action-text-editable__submit[data-v-b3a35a96]{position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}.action-text-editable__label[data-v-b3a35a96]{display:flex;align-items:center;justify-content:center;position:absolute;right:15px;bottom:1px;width:36px;height:36px;box-sizing:border-box;margin:0;padding:7px 6px;opacity:1;color:var(--color-text-lighter);border:0;border-radius:50%;background-color:var(--color-main-background);background-clip:padding-box}.action-text-editable__label[data-v-b3a35a96],.action-text-editable__label *[data-v-b3a35a96]{cursor:pointer}.action-text-editable__textarea[data-v-b3a35a96]{flex:1 1 auto;min-height:80px;max-height:124px;min-width:176px;width:100% !important;margin:0}.action-text-editable__textarea[data-v-b3a35a96]:disabled{cursor:default}.action-text-editable__textarea:not(:active):not(:hover):not(:focus):invalid+.action-text-editable__label[data-v-b3a35a96]{background-color:var(--color-error)}.action-text-editable__textarea:not(:active):not(:hover):not(:focus):not(:disabled)+.action-text-editable__label[data-v-b3a35a96]:active,.action-text-editable__textarea:not(:active):not(:hover):not(:focus):not(:disabled)+.action-text-editable__label[data-v-b3a35a96]:hover,.action-text-editable__textarea:not(:active):not(:hover):not(:focus):not(:disabled)+.action-text-editable__label[data-v-b3a35a96]:focus{background-color:var(--color-primary-element);color:var(--color-primary-text)}.action-text-editable__textarea:active:not(:disabled)+.action-text-editable__label[data-v-b3a35a96],.action-text-editable__textarea:hover:not(:disabled)+.action-text-editable__label[data-v-b3a35a96],.action-text-editable__textarea:focus:not(:disabled)+.action-text-editable__label[data-v-b3a35a96]{z-index:2;border-color:var(--color-primary-element);border-left-color:transparent}li:last-child>.action-text-editable[data-v-b3a35a96]{margin-bottom:10px}li:first-child>.action-text-editable[data-v-b3a35a96]{margin-top:10px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/assets/inputs.scss","webpack://./src/assets/variables.scss","webpack://./src/assets/action.scss","webpack://./src/components/ActionTextEditable/ActionTextEditable.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,8GCuBA,QAAS,CACT,eAAgB,CAEhB,WAAY,CAEZ,+BAAgC,CAChC,yCAA0C,CAC1C,kCAAmC,CACnC,YAAa,CACb,6CAA8C,CAE9C,cAAe,CAdhB,woBAqBG,yCAA0C,CAC1C,YAAa,CAtBhB,0NA0BG,6BAA8B,CAC9B,YAAa,CACb,6CAA8C,CA5BjD,yIAiCE,cAAe,CACf,UCrBmB,CDsBnB,mCAAoC,CACpC,6CAA8C,CApChD,yIAwCE,eAAgB,CAxClB,sIA4CE,+BAAgC,CAChC,0BAA2B,CA7C7B,sIAkDE,cAAe,CACf,+BAAgC,CAChC,yCAA0C,CAC1C,6CAA8C,CArDhD,klBA2DI,+CAAgD,CAChD,mDAAoD,CA5DxD,wMA+DI,oCAAqC,CA/DzC,iKAoEG,cAAe,CACf,oCAAqC,CAErC,6CAA8C,CAC9C,2BE3EA,8CAA+C,CAC/C,mCAMD,mBAAoB,CACpB,UDQmB,CCVpB,kFAIE,cAAe,CACf,UDKkB,CCVpB,qCAQE,oBAAqB,CC8HxB,uCACC,YAAa,CACb,sBAAuB,CAEvB,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CAEV,cAAe,CACf,kBAAmB,CAEnB,UFvIkB,CEwIlB,4BAA6B,CAC7B,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,eAAgB,CAEhB,kBAAmB,CACnB,gBFjKoB,CE6IrB,0FAwBE,SFlJc,CE0HhB,4CA4BE,cAAe,CACf,kBAAmB,CACnB,6CAGA,WAAY,CACZ,YAAa,CAGb,wBFlLmB,CEoLnB,+BAA2C,CAC3C,oBFjLc,CEkLd,6CAIA,YAAa,CACb,aAAc,CACd,qBAAsB,CAEtB,iBAAkB,CAClB,YAAuB,CACvB,kBFxL8C,CEyL9C,+CAGA,iBAAkB,CAClB,aAAc,CACd,QAAS,CACT,SAAU,CACV,UAAW,CACX,eAAgB,CAChB,8CAGA,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CAGvB,iBAAkB,CAClB,UAAuB,CACvB,UAAW,CACX,UAAO,CACP,WAAQ,CACR,qBAAsB,CACtB,QAAS,CACT,eAAgB,CAEhB,SFxMc,CEyMd,+BAAgC,CAChC,QAAS,CACT,iBAAkB,CAElB,6CAA8C,CAC9C,2BAA4B,CArB5B,8FAwBC,cAAe,CACf,iDAKD,aAAc,CAEd,eAAY,CACZ,gBAAY,CAEZ,eAA8B,CAC9B,qBAAsB,CACtB,QAAS,CART,0DAYC,cAAe,CAZhB,2HAmBG,mCAAoC,CAnBvC,yZA0BG,6CAA8C,CAC9C,+BAAgC,CA3BnC,0SAoCE,SAAU,CAEV,yCAA0C,CAC1C,6BAA8B,CAC9B,qDASH,kBAA2C,CAC3C,sDAIA,eAAwC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n/**\n * color-text-lighter\t\tnormal state\n * color-text-lighter\t\tactive state\n * color-text-maxcontrast \tdisabled state\n */\n\n/* Default global values */\nbutton:not(.button-vue),\ninput:not([type='range']),\ntextarea {\n\tmargin: 0;\n\tpadding: 7px 6px;\n\n\tcursor: text;\n\n\tcolor: var(--color-text-lighter);\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius);\n\toutline: none;\n\tbackground-color: var(--color-main-background);\n\n\tfont-size: 13px;\n\n\t&:not(:disabled):not(.primary) {\n\t\t&:hover,\n\t\t&:focus,\n\t\t&.active {\n\t\t\t/* active class used for multiselect */\n\t\t\tborder-color: var(--color-primary-element);\n\t\t\toutline: none;\n\t\t}\n\n\t\t&:active {\n\t\t\tcolor: var(--color-text-light);\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t\topacity: $opacity_disabled;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&:required {\n\t\tbox-shadow: none;\n\t}\n\n\t&:invalid {\n\t\tborder-color: var(--color-error);\n\t\tbox-shadow: none !important;\n\t}\n\n\t/* Primary action button, use sparingly */\n\t&.primary {\n\t\tcursor: pointer;\n\t\tcolor: var(--color-primary-text);\n\t\tborder-color: var(--color-primary-element);\n\t\tbackground-color: var(--color-primary-element);\n\n\t\t&:not(:disabled) {\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tborder-color: var(--color-primary-element-light);\n\t\t\t\tbackground-color: var(--color-primary-element-light);\n\t\t\t}\n\t\t\t&:active {\n\t\t\t\tcolor: var(--color-primary-text-dark);\n\t\t\t}\n\t\t}\n\n\t\t&:disabled {\n\t\t\tcursor: default;\n\t\t\tcolor: var(--color-primary-text-dark);\n\t\t\t// opacity is already defined to .5 if disabled\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n * @author Marco Ambrosini \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n@mixin action-active {\n\tli {\n\t\t&.active {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n}\n\n@mixin action--disabled {\n\t.action--disabled {\n\t\tpointer-events: none;\n\t\topacity: $opacity_disabled;\n\t\t&:hover, &:focus {\n\t\t\tcursor: default;\n\t\t\topacity: $opacity_disabled;\n\t\t}\n\t\t& * {\n\t\t\topacity: 1 !important;\n\t\t}\n\t}\n}\n\n\n@mixin action-item($name) {\n\t.action-#{$name} {\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tpadding-right: $icon-margin;\n\t\tbox-sizing: border-box; // otherwise router-link overflows in Firefox\n\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\n\t\topacity: $opacity_normal;\n\t\tcolor: var(--color-main-text);\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tbox-shadow: none;\n\n\t\tfont-weight: normal;\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: $clickable-area;\n\n\t\t&:hover,\n\t\t&:focus {\n\t\t\topacity: $opacity_full;\n\t\t}\n\n\t\t& > span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t&__icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tbackground-size: $icon-size;\n\t\t\tbackground-repeat: no-repeat;\n\t\t}\n\n\t\t&::v-deep .material-design-icon {\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_full;\n\n\t\t\t.material-design-icon__svg {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\t\t// long text area\n\t\tp {\n\t\t\tmax-width: 220px;\n\t\t\tline-height: 1.6em;\n\n\t\t\t// 14px are currently 1em line-height. Mixing units as '44px - 1.6em' does not work.\n\t\t\tpadding: #{($clickable-area - 1.6 * 14px) / 2} 0;\n\n\t\t\tcursor: pointer;\n\t\t\ttext-align: left;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t&__longtext {\n\t\t\tcursor: pointer;\n\t\t\t// allow the use of `\\n`\n\t\t\twhite-space: pre-wrap;\n\t\t}\n\n\t\t&__title {\n\t\t\tfont-weight: bold;\n\t\t\ttext-overflow: ellipsis;\n\t\t\toverflow: hidden;\n\t\t\twhite-space: nowrap;\n\t\t\tmax-width: 100%;\n\t\t\tdisplay: inline-block;\n\t\t}\n\t}\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n@import '../../assets/inputs';\n@import '../../assets/action';\n@include action-active;\n@include action--disabled;\n\n$input-margin: 4px;\n\n.action-text-editable {\n\tdisplay: flex;\n\talign-items: flex-start;\n\n\twidth: 100%;\n\theight: auto;\n\tmargin: 0;\n\tpadding: 0;\n\n\tcursor: pointer;\n\twhite-space: nowrap;\n\n\topacity: $opacity_normal;\n\tcolor: var(--color-main-text);\n\tborder: 0;\n\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\tbackground-color: transparent;\n\tbox-shadow: none;\n\n\tfont-weight: normal;\n\tline-height: $clickable-area;\n\n\t&:hover,\n\t&:focus {\n\t\topacity: $opacity_full;\n\t}\n\n\t& > span {\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t}\n\n\t&__icon {\n\t\tmin-width: 0; /* Overwrite icons*/\n\t\tmin-height: 0;\n\t\t/* Keep padding to define the width to\n\t\t\tassure correct position of a possible text */\n\t\tpadding: #{$clickable-area / 2} 0 #{$clickable-area / 2} $clickable-area;\n\n\t\tbackground-position: #{$icon-margin} center;\n\t\tbackground-size: $icon-size;\n\t}\n\n\t// Forms & text inputs\n\t&__form {\n\t\tdisplay: flex;\n\t\tflex: 1 1 auto;\n\t\tflex-direction: column;\n\n\t\tposition: relative;\n\t\tmargin: $input-margin 0;\n\t\tpadding-right: $icon-margin;\n\t}\n\n\t&__submit {\n\t\tposition: absolute;\n\t\tleft: -10000px;\n\t\ttop: auto;\n\t\twidth: 1px;\n\t\theight: 1px;\n\t\toverflow: hidden;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\t// bottom-right corner\n\t\tposition: absolute;\n\t\tright: $icon-margin + 1;\n\t\tbottom: 1px;\n\t\twidth: #{$clickable-area - $input-margin * 2};\n\t\theight: #{$clickable-area - $input-margin * 2};\n\t\tbox-sizing: border-box;\n\t\tmargin: 0;\n\t\tpadding: 7px 6px;\n\n\t\topacity: $opacity_full;\n\t\tcolor: var(--color-text-lighter);\n\t\tborder: 0;\n\t\tborder-radius: 50%;\n\t\t/* Avoid background under border */\n\t\tbackground-color: var(--color-main-background);\n\t\tbackground-clip: padding-box;\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t/* Inputs inside popover supports text, submit & reset */\n\t&__textarea {\n\t\tflex: 1 1 auto;\n\n\t\tmin-height: #{$clickable-area * 2 - $input-margin * 2}; /* twice the element margin-y */\n\t\tmax-height: #{$clickable-area * 3 - $input-margin * 2}; /* twice the element margin-y */\n\t\t// block width widening\n\t\tmin-width: $clickable-area * 4;\n\t\twidth: 100% !important;\n\t\tmargin: 0;\n\n\t\t// if disabled, change cursor\n\t\t&:disabled {\n\t\t\tcursor: default;\n\t\t}\n\n\t\t/* only show confirm borders if input is not focused */\n\t\t&:not(:active):not(:hover):not(:focus) {\n\t\t\t&:invalid {\n\t\t\t\t& + .action-text-editable__label {\n\t\t\t\t\tbackground-color: var(--color-error);\n\t\t\t\t}\n\t\t\t}\n\t\t\t&:not(:disabled) + .action-text-editable__label {\n\t\t\t\t&:active,\n\t\t\t\t&:hover,\n\t\t\t\t&:focus {\n\t\t\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t\t\tcolor: var(--color-primary-text);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t&:active,\n\t\t&:hover,\n\t\t&:focus {\n\t\t\t&:not(:disabled) + .action-text-editable__label {\n\t\t\t\t/* above previous input */\n\t\t\t\tz-index: 2;\n\n\t\t\t\tborder-color: var(--color-primary-element);\n\t\t\t\tborder-left-color: transparent;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// if a form is the last of the list\n// add the same bottomMargin as the right padding\n// for visual balance\nli:last-child > .action-text-editable {\n\tmargin-bottom: $icon-margin - $input-margin;\n}\n\n// same for first item\nli:first-child > .action-text-editable {\n\tmargin-top: $icon-margin - $input-margin;\n}\n\n"],sourceRoot:""}]),t.Z=o},9224:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-2a98ba3b]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.action-item[data-v-2a98ba3b]{position:relative;display:inline-block}.action-item--single[data-v-2a98ba3b]:hover,.action-item--single[data-v-2a98ba3b]:focus,.action-item--single[data-v-2a98ba3b]:active,.action-item__menutoggle[data-v-2a98ba3b]:hover,.action-item__menutoggle[data-v-2a98ba3b]:focus,.action-item__menutoggle[data-v-2a98ba3b]:active{opacity:1;background-color:rgba(127,127,127,0.25) !important}.action-item__menutoggle[data-v-2a98ba3b]:disabled,.action-item--single[data-v-2a98ba3b]:disabled{opacity:.3 !important}.action-item.action-item--open .action-item__menutoggle[data-v-2a98ba3b]{opacity:1;background-color:rgba(127,127,127,0.25)}.action-item--single[data-v-2a98ba3b],.action-item__menutoggle[data-v-2a98ba3b]{box-sizing:border-box;width:auto;min-width:44px;height:44px;margin:0;padding:0;cursor:pointer;border:none;border-radius:22px;background-color:transparent}.action-item--single--with-title[data-v-2a98ba3b],.action-item__menutoggle--with-title[data-v-2a98ba3b]{position:relative;padding:0 14px;padding-left:44px;white-space:nowrap;opacity:1;border:1px solid var(--color-border-dark);background-color:var(--color-background-dark);background-position:14px center;font-size:inherit}.action-item--single--with-title[data-v-2a98ba3b] span,.action-item__menutoggle--with-title[data-v-2a98ba3b] span{width:24px;height:24px;line-height:16px;position:absolute;top:0;left:0}.action-item[data-v-2a98ba3b] .material-design-icon{width:44px;height:44px;opacity:1}.action-item[data-v-2a98ba3b] .material-design-icon .material-design-icon__svg{vertical-align:middle}.action-item__menutoggle[data-v-2a98ba3b]{display:flex;align-items:center;justify-content:center;opacity:.7;font-weight:bold;line-height:16px}.action-item__menutoggle--primary[data-v-2a98ba3b]{opacity:1;color:var(--color-primary-text);border:none;background-color:var(--color-primary-element)}.action-item--open .action-item__menutoggle--primary[data-v-2a98ba3b],.action-item__menutoggle--primary[data-v-2a98ba3b]:hover,.action-item__menutoggle--primary[data-v-2a98ba3b]:focus,.action-item__menutoggle--primary[data-v-2a98ba3b]:active{color:var(--color-primary-text) !important;background-color:var(--color-primary-element-light) !important}.action-item--single[data-v-2a98ba3b]{opacity:.7}.action-item--single[data-v-2a98ba3b]:hover,.action-item--single[data-v-2a98ba3b]:focus,.action-item--single[data-v-2a98ba3b]:active{opacity:1}.action-item--single>[hidden][data-v-2a98ba3b]{display:none}.ie .action-item__menu[data-v-2a98ba3b],.ie .action-item__menu .action-item__menu_arrow[data-v-2a98ba3b],.edge .action-item__menu[data-v-2a98ba3b],.edge .action-item__menu .action-item__menu_arrow[data-v-2a98ba3b]{border:1px solid var(--color-border)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Actions/Actions.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCopBxB,8BACC,iBAAkB,CAClB,oBAAqB,CAIrB,sRAMC,SC5nBc,CD8nBd,kDAA2C,CAC3C,kGAKA,qBAAsB,CApBxB,yEAwBE,SCxoBc,CDyoBd,uCCroBgD,CDsoBhD,gFAKA,qBAAsB,CACtB,UAAW,CACX,cCpqBmB,CDqqBnB,WCrqBmB,CDsqBnB,QAAS,CACT,SAAU,CACV,cAAe,CACf,WAAY,CACZ,kBAAkC,CAClC,4BAA6B,CAE7B,wGACC,iBAAkB,CAClB,cCvqB6C,CDwqB7C,iBChrBkB,CDirBlB,kBAAmB,CACnB,SC/pBa,CDgqBb,yCAA0C,CAE1C,6CAA8C,CAC9C,+BAAwC,CACxC,iBAAkB,CAVlB,oHAeC,UAAW,CACX,WAAY,CACZ,gBC1rBY,CD2rBZ,iBAAkB,CAClB,KAAM,CACN,MAAO,CA9DX,oDAoEE,UCvsBmB,CDwsBnB,WCxsBmB,CDysBnB,SCtrBc,CDgnBhB,+EAyEG,qBAAsB,CACtB,0CAMD,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,UCpsBiB,CDqsBjB,gBAAiB,CACjB,gBCptBc,CDstBd,mDACC,SCxsBa,CDysBb,+BAAgC,CAChC,WAAY,CACZ,6CAA8C,CAC9C,kPAIC,0CAA2C,CAC3C,8DAA+D,CAC/D,sCAKF,UCxtBiB,CDutBjB,qIAKC,SC3tBa,CDstBd,+CASC,YAAa,CACb,sNAQD,oCAAqC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.action-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\n\t// put a grey round background when menu is opened\n\t// or hover-focused\n\t&--single:hover,\n\t&--single:focus,\n\t&--single:active,\n\t&__menutoggle:hover,\n\t&__menutoggle:focus,\n\t&__menutoggle:active {\n\t\topacity: $opacity_full;\n\t\t// good looking on dark AND white bg, override server styling\n\t\tbackground-color: $icon-focus-bg !important;\n\t}\n\n\t// TODO: handle this in the future button component\n\t&__menutoggle:disabled,\n\t&--single:disabled {\n\t\topacity: .3 !important;\n\t}\n\n\t&.action-item--open .action-item__menutoggle {\n\t\topacity: $opacity_full;\n\t\tbackground-color: $action-background-hover;\n\t}\n\n\t// icons\n\t&--single,\n\t&__menutoggle {\n\t\tbox-sizing: border-box;\n\t\twidth: auto;\n\t\tmin-width: $clickable-area;\n\t\theight: $clickable-area;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tcursor: pointer;\n\t\tborder: none;\n\t\tborder-radius: $clickable-area / 2;\n\t\tbackground-color: transparent;\n\n\t\t&--with-title {\n\t\t\tposition: relative;\n\t\t\tpadding: 0 $icon-margin;\n\t\t\tpadding-left: $clickable-area;\n\t\t\twhite-space: nowrap;\n\t\t\topacity: $opacity_full;\n\t\t\tborder: 1px solid var(--color-border-dark);\n\t\t\t// with a title, we need to display this as a real button\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t\tbackground-position: $icon-margin center;\n\t\t\tfont-size: inherit;\n\n\t\t\t// non-background icon class\n\t\t\t// image slot\n\t\t\t::v-deep span {\n\t\t\t\twidth: 24px;\n\t\t\t\theight: 24px;\n\t\t\t\tline-height: $icon-size;\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t&::v-deep .material-design-icon {\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\topacity: $opacity_full;\n\n\t\t.material-design-icon__svg {\n\t\t\tvertical-align: middle;\n\t\t}\n\t}\n\n\t// icon-more\n\t&__menutoggle {\n\t\t// align menu icon in center\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\topacity: $opacity_normal;\n\t\tfont-weight: bold;\n\t\tline-height: $icon-size;\n\n\t\t&--primary {\n\t\t\topacity: $opacity_full;\n\t\t\tcolor: var(--color-primary-text);\n\t\t\tborder: none;\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t\t.action-item--open &,\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tcolor: var(--color-primary-text) !important;\n\t\t\t\tbackground-color: var(--color-primary-element-light) !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&--single {\n\t\topacity: $opacity_normal;\n\t\t&:hover,\n\t\t&:focus,\n\t\t&:active {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t\t// hide anything the slot is displaying\n\t\t& > [hidden] {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n\n.ie,\n.edge {\n\t.action-item__menu,\n\t.action-item__menu .action-item__menu_arrow {\n\t\tborder: 1px solid var(--color-border);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},4247:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-61c97b1e]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-content[data-v-61c97b1e]{position:relative;z-index:1000;flex-basis:100vw;min-width:0;min-height:100%;margin:0 !important;background-color:var(--color-main-background)}.app-content-wrapper--mobile.app-content-wrapper--show-list[data-v-61c97b1e] .app-content-list{display:block}.app-content-wrapper--mobile.app-content-wrapper--show-list[data-v-61c97b1e] .app-content-details{display:none}.app-content-wrapper--mobile.app-content-wrapper--show-details[data-v-61c97b1e] .app-content-list{display:none}.app-content-wrapper--mobile.app-content-wrapper--show-details[data-v-61c97b1e] .app-content-details{display:block}[data-v-61c97b1e] .splitpanes.default-theme .app-content-list{max-width:none}[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__pane{background-color:transparent;transition:none}[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__pane-list{min-width:200px;position:sticky;top:var(--header-height)}@media only screen and (max-width: 1024px){[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__pane-list{display:none}}[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__pane-details{overflow-y:scroll}@media only screen and (max-width: 1024px){[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__pane-details{min-width:100%}}[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__splitter{width:9px;margin-left:-5px;background-color:transparent;border-left:none}[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__splitter:before,[data-v-61c97b1e] .splitpanes.default-theme .splitpanes__splitter:after{display:none}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppContent/AppContent.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCuTxB,8BACC,iBAAkB,CAClB,YAAa,CACb,gBAAiB,CACjB,WAAY,CACZ,eAAgB,CAEhB,mBAAoB,CACpB,6CAA8C,CAC9C,gGAME,aAAc,CAHjB,mGAMG,YAAa,CANhB,mGAWG,YAAa,CAXhB,sGAcG,aAAc,CACd,8DAMD,cAAe,CAFjB,8DAME,4BAA6B,CAC7B,eAAgB,CAPlB,mEAUG,eAAgB,CAChB,eAAgB,CAChB,wBAAyB,CAEzB,2CAdH,mEAeI,YAAa,CAEd,CAjBH,sEAoBG,iBAAkB,CAElB,2CAtBH,sEAuBI,cAAe,CAEhB,CAzBH,kEA6BE,SAAU,CACV,gBAAiB,CACjB,4BAA6B,CAC7B,gBAAiB,CAhCnB,iJAoCG,YAAa",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-content {\n\tposition: relative;\n\tz-index: 1000;\n\tflex-basis: 100vw;\n\tmin-width: 0;\n\tmin-height: 100%;\n\t// Overriding server styles TODO: cleanup!\n\tmargin: 0 !important;\n\tbackground-color: var(--color-main-background);\n}\n\n// Mobile list/details handling\n.app-content-wrapper--mobile {\n\t&.app-content-wrapper--show-list ::v-deep {\n\t\t.app-content-list {\n\t\t\tdisplay: block;\n\t\t}\n\t\t.app-content-details {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\t&.app-content-wrapper--show-details ::v-deep {\n\t\t.app-content-list {\n\t\t\tdisplay: none;\n\t\t}\n\t\t.app-content-details {\n\t\t\tdisplay: block;\n\t\t}\n\t}\n}\n\n::v-deep .splitpanes.default-theme {\n\t.app-content-list {\n\t\tmax-width: none;\n\t}\n\n\t.splitpanes__pane {\n\t\tbackground-color: transparent;\n\t\ttransition: none;\n\n\t\t&-list {\n\t\t\tmin-width: 200px;\n\t\t\tposition: sticky;\n\t\t\ttop: var(--header-height);\n\n\t\t\t@media only screen and (max-width: $breakpoint-mobile) {\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t}\n\n\t\t&-details {\n\t\t\toverflow-y: scroll;\n\n\t\t\t@media only screen and (max-width: $breakpoint-mobile) {\n\t\t\t\tmin-width: 100%;\n\t\t\t}\n\t\t}\n\t}\n\n\t.splitpanes__splitter {\n\t\twidth: 9px;\n\t\tmargin-left: -5px;\n\t\tbackground-color: transparent;\n\t\tborder-left: none;\n\n\t\t&:before,\n\t\t&:after {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},4707:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-24f4ece3]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-details-toggle[data-v-24f4ece3]{position:fixed;width:44px;height:44px;padding:14px;cursor:pointer;opacity:.6;transform:rotate(180deg);background-color:var(--color-main-background);z-index:2000}.app-details-toggle[data-v-24f4ece3]:active,.app-details-toggle[data-v-24f4ece3]:hover,.app-details-toggle[data-v-24f4ece3]:focus{opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppContent/AppDetailsToggle.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCyDxB,qCACC,cAAe,CACf,UC1CoB,CD2CpB,WC3CoB,CD4CpB,YCpC+C,CDqC/C,cAAe,CACf,UAAW,CACX,wBAAyB,CACzB,6CAA8C,CAC9C,YAAa,CATd,kIAcE,SAAU",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-details-toggle {\n\tposition: fixed;\n\twidth: $clickable-area;\n\theight: $clickable-area;\n\tpadding: $icon-margin;\n\tcursor: pointer;\n\topacity: .6;\n\ttransform: rotate(180deg);\n\tbackground-color: var(--color-main-background);\n\tz-index: 2000;\n\n\t&:active,\n\t&:hover,\n\t&:focus {\n\t\topacity: 1;\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},2400:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-146e0c06]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation[data-v-146e0c06]{will-change:transform;transition:transform var(--animation-quick),margin var(--animation-quick);width:300px;position:sticky;position:-webkit-sticky;top:50px;left:0;z-index:1800;height:calc(100vh - 50px);box-sizing:border-box;background-color:var(--color-main-background);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border-right:1px solid var(--color-border);display:flex;flex-direction:column;flex-grow:0;flex-shrink:0}.app-navigation--close[data-v-146e0c06]{margin-left:-300px;transform:translateX(-100%)}.app-navigation ul[data-v-146e0c06],.app-navigation__list[data-v-146e0c06]{position:relative;height:100%;width:100%;overflow-x:hidden;overflow-y:auto;box-sizing:border-box;display:flex;flex-direction:column}@media only screen and (max-width: 1024px){.app-navigation[data-v-146e0c06]:not(.app-navigation--close){margin-left:-300px}}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigation/AppNavigation.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCoIxB,iCACC,qBAAsB,CACtB,yEAA2E,CAC3E,WC1FuB,CD2FvB,eAAgB,CAChB,uBAAwB,CACxB,QC9FmB,CD+FnB,MAAO,CAEP,YAAa,CACb,yBAAuC,CACvC,qBAAsB,CACtB,6CAA8C,CAC9C,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CACjB,0CAA2C,CAC3C,YAAa,CACb,qBAAsB,CACtB,WAAY,CACZ,aAAc,CAEd,wCACC,kBC/GsB,CDgHtB,2BAA4B,CAzB9B,2EA+BE,iBAAkB,CAClB,WAAY,CACZ,UAAW,CACX,iBAAkB,CAClB,eAAgB,CAChB,qBAAsB,CACtB,YAAa,CACb,qBAAsB,CACtB,2CAKD,6DACC,kBCpIsB,CDqItB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation {\n\twill-change: transform;\n\ttransition: transform var(--animation-quick), margin var(--animation-quick);\n\twidth: $navigation-width;\n\tposition: sticky;\n\tposition: -webkit-sticky;\n\ttop: $header-height;\n\tleft: 0;\n\t// Above appcontent\n\tz-index: 1800;\n\theight: calc(100vh - #{$header-height});\n\tbox-sizing: border-box;\n\tbackground-color: var(--color-main-background);\n\t-webkit-user-select: none;\n\t-moz-user-select: none;\n\t-ms-user-select: none;\n\tuser-select: none;\n\tborder-right: 1px solid var(--color-border);\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\n\t&--close {\n\t\tmargin-left: - $navigation-width;\n\t\ttransform: translateX(-100%);\n\t}\n\n\t//list of navigation items\n\tul,\n\t&__list {\n\t\tposition: relative;\n\t\theight: 100%;\n\t\twidth: 100%;\n\t\toverflow-x: hidden;\n\t\toverflow-y: auto;\n\t\tbox-sizing: border-box;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t}\n}\n\n// When on mobile, we make the navigation slide over the appcontent\n@media only screen and (max-width: $breakpoint-mobile) {\n\t.app-navigation:not(.app-navigation--close) {\n\t\tmargin-left: - $navigation-width;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},4609:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-45d39094]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-caption[data-v-45d39094]{display:flex;justify-content:space-between;padding:0 8px 0 22px}.app-navigation-caption__title[data-v-45d39094]{font-weight:bold;color:var(--color-primary-element);line-height:44px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;opacity:.7;box-shadow:none !important;flex-shrink:0}.app-navigation-caption__actions[data-v-45d39094]{flex:0 0 44px}.app-navigation-caption[data-v-45d39094]:not(:first-child){margin-top:22px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationCaption/AppNavigationCaption.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCiDxB,yCACC,YAAa,CACb,6BAA8B,CAC9B,oBAAoC,CAEpC,gDACC,gBAAiB,CACjB,kCAAmC,CACnC,gBCxCmB,CDyCnB,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB,CACvB,UC1BiB,CD2BjB,0BAA2B,CAC3B,aAAc,CACd,kDAGA,aClDmB,CDmDnB,2DAKD,eAA+B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-caption {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tpadding: 0 8px 0 $clickable-area / 2;\n\n\t&__title {\n\t\tfont-weight: bold;\n\t\tcolor: var(--color-primary-element);\n\t\tline-height: $clickable-area;\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t\topacity: $opacity_normal;\n\t\tbox-shadow: none !important;\n\t\tflex-shrink: 0;\n\t}\n\n\t&__actions {\n\t\tflex: 0 0 $clickable-area;\n\t}\n}\n\n// extra top space if it's not the first item on the list\n.app-navigation-caption:not(:first-child) {\n\tmargin-top: $clickable-area / 2;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},9325:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-3e9952b7]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-entry__counter[data-v-3e9952b7]{font-size:calc(var(--default-font-size) * .8);overflow:hidden;width:fit-content;max-width:44px;text-align:center;text-overflow:ellipsis;line-height:1em;padding:4px 8px;border-radius:var(--border-radius-pill);background-color:var(--color-background-darker)}.app-navigation-entry__counter--highlighted[data-v-3e9952b7]{padding:4px 6px;color:var(--color-primary-text);background-color:var(--color-primary)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationCounter/AppNavigationCounter.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC0DxB,gDACC,6CAA8C,CAC9C,eAAgB,CAChB,iBAAkB,CAClB,cC7CoB,CD8CpB,iBAAkB,CAClB,sBAAuB,CACvB,eAAgB,CAChB,eAAgB,CAChB,uCAAwC,CACxC,+CAAgD,CAEhD,6DACC,eAAgB,CAChB,+BAAgC,CAChC,qCAAsC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-entry__counter {\n\tfont-size: calc(var(--default-font-size) * .8);\n\toverflow: hidden;\n\twidth: fit-content;\n\tmax-width: $clickable-area;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\tline-height: 1em;\n\tpadding: 4px 8px;\n\tborder-radius: var(--border-radius-pill);\n\tbackground-color: var(--color-background-darker);\n\n\t&--highlighted {\n\t\tpadding: 4px 6px;\n\t\tcolor: var(--color-primary-text);\n\t\tbackground-color: var(--color-primary);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},533:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-71402848]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-entry__icon-bullet[data-v-71402848]{display:block;padding:15px}.app-navigation-entry__icon-bullet div[data-v-71402848]{width:14px;height:14px;cursor:pointer;transition:background 100ms ease-in-out;border:none;border-radius:50%}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationIconBullet/AppNavigationIconBullet.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+ExB,oDACC,aAAc,CAEd,YAA2B,CAH5B,wDAKE,UAAuB,CACvB,WAAwB,CACxB,cAAe,CACf,uCAAwC,CACxC,WAAY,CACZ,iBAAkB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-entry__icon-bullet {\n\tdisplay: block;\n\t// there is 2 margins\n\tpadding: $icon-margin + 1px;\n\tdiv {\n\t\twidth: $icon-size - 2px;\n\t\theight: $icon-size - 2px;\n\t\tcursor: pointer;\n\t\ttransition: background 100ms ease-in-out;\n\t\tborder: none;\n\t\tborder-radius: 50%;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},6456:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-4b0d387e]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.icon-collapse[data-v-4b0d387e]{position:absolute;z-index:105;width:44px;height:44px;margin:0;padding:0;transition:opacity var(--animation-quick) ease-in-out;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg);color:var(--color-main-text);border:none;border-radius:0;outline:none !important;background-color:transparent;box-shadow:none}.icon-collapse[data-v-4b0d387e]:hover{color:var(--color-primary)}.icon-collapse--rotated[data-v-4b0d387e]{-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg);color:var(--color-main-text)}.icon-collapse--rotated[data-v-4b0d387e]:hover{color:var(--color-primary)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationItem/AppNavigationIconCollapsible.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCmDxB,gCACC,iBAAkB,CAClB,WAAY,CACZ,UAAW,CACX,WAAY,CACZ,QAAS,CACT,SAAU,CACV,qDAAsD,CACtD,gCAAiC,CACjC,4BAA6B,CAC7B,wBAAyB,CACzB,4BAA6B,CAC7B,WAAY,CACZ,eAAgB,CAChB,uBAAwB,CACxB,4BAA6B,CAC7B,eAAgB,CAhBjB,sCAmBE,0BAA2B,CAC3B,yCAEA,8BAA+B,CAC/B,0BAA2B,CAC3B,sBAAuB,CACvB,4BAA6B,CAJ7B,+CAMC,0BAA2B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.icon-collapse {\n\tposition: absolute;\n\tz-index: 105; // above a, under button\n\twidth: 44px;\n\theight: 44px;\n\tmargin: 0;\n\tpadding: 0;\n\ttransition: opacity var(--animation-quick) ease-in-out;\n\t-webkit-transform: rotate(-90deg);\n\t-ms-transform: rotate(-90deg);\n\ttransform: rotate(-90deg);\n\tcolor: var(--color-main-text);\n\tborder: none;\n\tborder-radius: 0;\n\toutline: none !important;\n\tbackground-color: transparent;\n\tbox-shadow: none;\n\n\t&:hover{\n\t\tcolor: var(--color-primary);\n\t}\n\t&--rotated {\n\t\t-webkit-transform: rotate(0deg);\n\t\t-ms-transform: rotate(0deg);\n\t\ttransform: rotate(0deg);\n\t\tcolor: var(--color-main-text);\n\t\t&:hover{\n\t\t\tcolor: var(--color-primary);\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},183:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-entry{position:relative;display:flex;flex-shrink:0;flex-wrap:wrap;box-sizing:border-box;width:100%;min-height:44px;padding-right:8px}.app-navigation-entry.active{background-color:var(--color-primary-light) !important}.app-navigation-entry:focus-within,.app-navigation-entry:hover{background-color:var(--color-background-hover)}.app-navigation-entry.active .app-navigation-entry__children,.app-navigation-entry:focus-within .app-navigation-entry__children,.app-navigation-entry:hover .app-navigation-entry__children{background-color:var(--color-main-background)}.app-navigation-entry.app-navigation-entry--deleted>ul,.app-navigation-entry.app-navigation-entry--collapsible:not(.app-navigation-entry--opened)>ul{display:none}.app-navigation-entry:not(.app-navigation-entry--editing) .app-navigation-entry-link,.app-navigation-entry:not(.app-navigation-entry--editing) .app-navigation-entry-div{padding-right:14px}.app-navigation-entry .app-navigation-entry-link,.app-navigation-entry .app-navigation-entry-div{z-index:100;display:flex;overflow:hidden;flex:1 1 0;box-sizing:border-box;min-height:44px;padding:0;white-space:nowrap;color:var(--color-main-text);background-repeat:no-repeat;background-position:14px center;background-size:16px 16px;line-height:44px}.app-navigation-entry .app-navigation-entry-link .app-navigation-entry-icon,.app-navigation-entry .app-navigation-entry-div .app-navigation-entry-icon{display:flex;align-items:center;flex:0 0 44px;justify-content:center;width:44px;height:44px;background-size:16px 16px}.app-navigation-entry .app-navigation-entry-link .app-navigation-entry__title,.app-navigation-entry .app-navigation-entry-div .app-navigation-entry__title{overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}.app-navigation-entry .app-navigation-entry-link .editingContainer,.app-navigation-entry .app-navigation-entry-div .editingContainer{width:calc(100% - 44px);margin:auto}.app-navigation-entry .app-navigation-entry__children{position:relative;display:flex;flex:0 1 auto;flex-direction:column;width:100%}.app-navigation-entry .app-navigation-entry__children .app-navigation-entry{display:inline-flex;flex-wrap:wrap;padding-left:16px;padding-right:0}.app-navigation-entry__deleted{display:inline-flex;flex:1 1 0;padding-left:30px !important}.app-navigation-entry__deleted .app-navigation-entry__deleted-description{position:relative;overflow:hidden;flex:1 1 0;white-space:nowrap;text-overflow:ellipsis;line-height:44px}.app-navigation-entry--collapsible .icon-collapse{visibility:hidden}.app-navigation-entry--collapsible.app-navigation-entry--no-icon a .app-navigation-entry-icon,.app-navigation-entry--collapsible:hover a .app-navigation-entry-icon,.app-navigation-entry--collapsible:focus a .app-navigation-entry-icon{visibility:hidden}.app-navigation-entry--collapsible.app-navigation-entry--no-icon .icon-collapse,.app-navigation-entry--collapsible:hover .icon-collapse,.app-navigation-entry--collapsible:focus .icon-collapse{visibility:visible}.app-navigation-entry--collapsible.app-navigation-entry--no-icon .app-navigation-entry__children li:not(.app-navigation-entry--collapsible) a :first-child,.app-navigation-entry--collapsible:hover .app-navigation-entry__children li:not(.app-navigation-entry--collapsible) a :first-child,.app-navigation-entry--collapsible:focus .app-navigation-entry__children li:not(.app-navigation-entry--collapsible) a :first-child{visibility:visible}.app-navigation-entry__utils{display:flex;align-items:center;flex:0 1 auto}.app-navigation-entry__counter-wrapper{margin-right:2px;display:flex;align-items:center;flex:0 1 auto}.app-navigation-entry--editing .app-navigation-entry-edit{z-index:250;opacity:1}.app-navigation-entry--deleted .app-navigation-entry-deleted{z-index:250;transform:translateX(0)}.app-navigation-entry--pinned{order:2;margin-top:auto}.app-navigation-entry--pinned ~ .app-navigation-entry--pinned{margin-top:0}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationItem/AppNavigationItem.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCgexB,sBACC,iBAAkB,CAClB,YAAa,CACb,aAAc,CACd,cAAe,CACf,qBAAsB,CACtB,UAAW,CACX,eCtdoB,CDudpB,iBAAkB,CARnB,6BAaE,sDAAuD,CAbzD,+DAiBE,8CAA+C,CAjBjD,4LAuBG,6CAA8C,CAvBjD,qJAgCG,YAAa,CAhChB,yKAsCG,kBC7e6C,CDuchD,iGA4CE,WAAY,CACZ,YAAa,CACb,eAAgB,CAChB,UAAW,CACX,qBAAsB,CACtB,eChgBmB,CDigBnB,SAAU,CACV,kBAAmB,CACnB,4BAA6B,CAC7B,2BAA4B,CAC5B,+BAAwC,CACxC,yBClgBc,CDmgBd,gBCvgBmB,CD+crB,uJA2DG,YAAa,CACb,kBAAmB,CACnB,aC5gBkB,CD6gBlB,sBAAuB,CACvB,UC9gBkB,CD+gBlB,WC/gBkB,CDghBlB,yBC5gBa,CD2chB,2JAqEG,eAAgB,CAChB,cAAe,CACf,kBAAmB,CACnB,sBAAuB,CAxE1B,qIA4EG,uBAAsC,CACtC,WAAY,CA7Ef,sDAmFE,iBAAkB,CAClB,YAAa,CACb,aAAc,CACd,qBAAsB,CACtB,UAAW,CAvFb,4EA0FG,mBAAoB,CACpB,cAAe,CACf,iBCviBa,CDwiBb,eAAgB,CAChB,+BAMF,mBAAoB,CACpB,UAAW,CACX,4BAAuD,CAHxD,0EAKE,iBAAkB,CAClB,eAAgB,CAChB,UAAW,CACX,kBAAmB,CACnB,sBAAuB,CACvB,gBC5jBmB,CD6jBnB,kDAQA,iBAAkB,CAHpB,0OASG,iBAAkB,CATrB,gMAaG,kBAAmB,CAbtB,iaAkBG,kBAAmB,CACnB,6BAMF,YAAa,CACb,kBAAmB,CACnB,aAAc,CACd,uCAKA,gBAAiB,CACjB,YAAa,CACb,kBAAmB,CACnB,aAAc,CACd,0DAMC,WAAY,CACZ,SAAU,CACV,6DAMA,WAAY,CACZ,uBAAwB,CACxB,8BAKD,OAAQ,CACR,eAAgB,CAFjB,8DAKE,YAAa",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-entry {\n\tposition: relative;\n\tdisplay: flex;\n\tflex-shrink: 0;\n\tflex-wrap: wrap;\n\tbox-sizing: border-box;\n\twidth: 100%;\n\tmin-height: $clickable-area;\n\tpadding-right: 8px;\n\n\t// When .active class is applied, change color background of link and utils. The\n\t// !important prevents the focus state to override the active state.\n\t&.active {\n\t\tbackground-color: var(--color-primary-light) !important;\n\t}\n\t&:focus-within,\n\t&:hover {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\t&.active,\n\t&:focus-within,\n\t&:hover {\n\t\t.app-navigation-entry__children {\n\t\t\tbackground-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t/* hide deletion/collapse of subitems */\n\t&.app-navigation-entry--deleted,\n\t&.app-navigation-entry--collapsible:not(.app-navigation-entry--opened) {\n\t\t> ul {\n\t\t\t// NO ANIMATE because if not really hidden, we can still tab through it\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t&:not(.app-navigation-entry--editing) {\n\t\t.app-navigation-entry-link, .app-navigation-entry-div {\n\t\t\tpadding-right: $icon-margin;\n\t\t}\n\t}\n\n\t// Main entry link\n\t.app-navigation-entry-link, .app-navigation-entry-div {\n\t\tz-index: 100; /* above the bullet to allow click*/\n\t\tdisplay: flex;\n\t\toverflow: hidden;\n\t\tflex: 1 1 0;\n\t\tbox-sizing: border-box;\n\t\tmin-height: $clickable-area;\n\t\tpadding: 0;\n\t\twhite-space: nowrap;\n\t\tcolor: var(--color-main-text);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: $icon-margin center;\n\t\tbackground-size: $icon-size $icon-size;\n\t\tline-height: $clickable-area;\n\n\t\t.app-navigation-entry-icon {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tflex: 0 0 $clickable-area;\n\t\t\tjustify-content: center;\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\tbackground-size: $icon-size $icon-size;\n\t\t}\n\n\t\t.app-navigation-entry__title {\n\t\t\toverflow: hidden;\n\t\t\tmax-width: 100%;\n\t\t\twhite-space: nowrap;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t.editingContainer {\n\t\t\twidth: calc(100% - #{$clickable-area});\n\t\t\tmargin: auto;\n\t\t}\n\t}\n\n\t/* Second level nesting for lists */\n\t.app-navigation-entry__children {\n\t\tposition: relative;\n\t\tdisplay: flex;\n\t\tflex: 0 1 auto;\n\t\tflex-direction: column;\n\t\twidth: 100%;\n\n\t\t.app-navigation-entry {\n\t\t\tdisplay: inline-flex;\n\t\t\tflex-wrap: wrap;\n\t\t\tpadding-left: $icon-size;\n\t\t\tpadding-right: 0;\n\t\t}\n\t}\n}\n\n/* Deleted entries */\n.app-navigation-entry__deleted {\n\tdisplay: inline-flex;\n\tflex: 1 1 0;\n\tpadding-left: $clickable-area - $icon-margin !important;\n\t.app-navigation-entry__deleted-description {\n\t\tposition: relative;\n\t\toverflow: hidden;\n\t\tflex: 1 1 0;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tline-height: $clickable-area;\n\t}\n}\n\n/* Makes the icon of the collapsible element disappear\n* When hovering on the root element */\n.app-navigation-entry--collapsible {\n\t//shows the triangle button\n\t.icon-collapse {\n\t\tvisibility: hidden;\n\t}\n\t&.app-navigation-entry--no-icon,\n\t&:hover, &:focus {\n\t\ta .app-navigation-entry-icon {\n\t\t\t// hides the icon\n\t\t\tvisibility: hidden;\n\t\t}\n\t\t.icon-collapse {\n\t\t\t//shows the triangle button\n\t\t\tvisibility: visible;\n\t\t}\n\t\t// prevent the icon of children elements from being hidden\n\t\t// by the previous rule\n\t\t.app-navigation-entry__children li:not(.app-navigation-entry--collapsible) a :first-child {\n\t\t\tvisibility: visible;\n\t\t}\n\t}\n}\n\n/* counter and actions */\n.app-navigation-entry__utils {\n\tdisplay: flex;\n\talign-items: center;\n\tflex: 0 1 auto;\n}\n\n/* counter */\n.app-navigation-entry__counter-wrapper {\n\t// Add slightly more space to the right of the counter\n\tmargin-right: 2px;\n\tdisplay: flex;\n\talign-items: center;\n\tflex: 0 1 auto;\n}\n\n// STATES\n/* editing state */\n.app-navigation-entry--editing {\n\t.app-navigation-entry-edit {\n\t\tz-index: 250;\n\t\topacity: 1;\n\t}\n}\n\n/* deleted state */\n.app-navigation-entry--deleted {\n\t.app-navigation-entry-deleted {\n\t\tz-index: 250;\n\t\ttransform: translateX(0);\n\t}\n}\n\n/* pinned state */\n.app-navigation-entry--pinned {\n\torder: 2;\n\tmargin-top: auto;\n\t// only put a marginTop auto to the first one!\n\t~ .app-navigation-entry--pinned {\n\t\tmargin-top: 0;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},484:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-input-confirm{flex:1 0 100%;width:100%}.app-navigation-input-confirm form{display:flex}.app-navigation-input-confirm__input{height:34px;flex:1 1 100%;font-size:14px;margin:3px;margin-left:0;padding:7px}.app-navigation-input-confirm__input:active,.app-navigation-input-confirm__input:focus,.app-navigation-input-confirm__input:hover{outline:none;background-color:var(--color-main-background);color:var(--color-text-light);border-color:var(--color-primary-element)}.app-navigation-input-confirm__input:active+.app-navigation-input-confirm__confirm,.app-navigation-input-confirm__input:focus+.app-navigation-input-confirm__confirm,.app-navigation-input-confirm__input:hover+.app-navigation-input-confirm__confirm{border-color:var(--color-primary-element);border-left-color:transparent !important;border-radius:0 var(--border-radius) var(--border-radius) 0 !important}.app-navigation-input-confirm button{display:flex;align-items:center;justify-content:center;width:44px !important;color:var(--color-main-text);border-radius:0}.app-navigation-input-confirm button span{opacity:.7}.app-navigation-input-confirm button:hover span,.app-navigation-input-confirm button:focus span{opacity:1}.app-navigation-input-confirm__confirm{margin-left:-8px;border-left-color:transparent !important;border-radius:0 var(--border-radius) var(--border-radius) 0 !important;background-clip:padding-box;background-color:var(--color-main-background);opacity:1;height:34px;width:34px;padding:7px;cursor:pointer;margin-right:0}.app-navigation-input-confirm__confirm:focus,.app-navigation-input-confirm__confirm:hover{border-radius:var(--border-radius) !important;border-color:var(--color-primary-element) !important}.app-navigation-input-confirm__close{margin:0;border:none;background-color:transparent}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationItem/InputConfirmCancel.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC6GxB,8BACC,aAAc,CACd,UAAW,CAFZ,mCAKE,YAAa,CACb,qCAGA,WAbiB,CAcjB,aAAc,CACd,cAAe,CACf,UAdgB,CAehB,aAAc,CACd,WAjBiB,CAWjB,kIAWC,YAAa,CACb,6CAA8C,CAC9C,6BAA8B,CAC9B,yCAA0C,CAd3C,uPAiBE,yCAA0C,CAC1C,wCAAyC,CACzC,sEAAuE,CA3B3E,qCAkCE,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,qBAAiC,CACjC,4BAA6B,CAC7B,eAAgB,CAvClB,0CA2CG,UCrHgB,CD0EnB,gGAgDI,SCzHY,CD0HZ,uCAKF,gBAAiB,CACjB,wCAAyC,CACzC,sEAAuE,CACvE,2BAA4B,CAC5B,6CAA8C,CAC9C,SAAU,CACV,WAhEiB,CAiEjB,UAjEiB,CAkEjB,WAjEiB,CAkEjB,cAAe,CACf,cAAe,CAXf,0FAeC,6CAA8C,CAC9C,oDAAqD,CACrD,qCAID,QAAS,CACT,WAAY,CACZ,4BAA6B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$input-height: 34px;\n$input-padding: 7px;\n$input-margin: 3px;\n\n.app-navigation-input-confirm {\n\tflex: 1 0 100%;\n\twidth: 100%;\n\n\tform {\n\t\tdisplay: flex;\n\t}\n\n\t&__input {\n\t\theight: $input-height;\n\t\tflex: 1 1 100%;\n\t\tfont-size: 14px;\n\t\tmargin: $input-margin;\n\t\tmargin-left: 0;\n\t\tpadding: $input-padding;\n\n\t\t&:active,\n\t\t&:focus,\n\t\t&:hover {\n\t\t\toutline: none;\n\t\t\tbackground-color: var(--color-main-background);\n\t\t\tcolor: var(--color-text-light);\n\t\t\tborder-color: var(--color-primary-element);\n\n\t\t\t+ .app-navigation-input-confirm__confirm {\n\t\t\t\tborder-color: var(--color-primary-element);\n\t\t\t\tborder-left-color: transparent !important;\n\t\t\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0 !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t// submit and cancel buttons\n\tbutton {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: $clickable-area !important;\n\t\tcolor: var(--color-main-text);\n\t\tborder-radius: 0;\n\n\t\t// icon hover/focus feedback\n\t\tspan {\n\t\t\topacity: $opacity_normal;\n\t\t}\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tspan {\n\t\t\t\topacity: $opacity_full;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__confirm {\n\t\tmargin-left: -8px;\n\t\tborder-left-color: transparent !important;\n\t\tborder-radius: 0 var(--border-radius) var(--border-radius) 0 !important;\n\t\tbackground-clip: padding-box;\n\t\tbackground-color: var(--color-main-background);\n\t\topacity: 1;\n\t\theight: $input-height;\n\t\twidth: $input-height;\n\t\tpadding: $input-padding;\n\t\tcursor: pointer;\n\t\tmargin-right: 0;\n\n\t\t&:focus,\n\t\t&:hover {\n\t\t\tborder-radius: var(--border-radius) !important;\n\t\t\tborder-color: var(--color-primary-element) !important;\n\t\t}\n\t}\n\n\t&__close {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tbackground-color: transparent;\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},7004:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-7286e935]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-new[data-v-7286e935]{display:block;padding:10px}.app-navigation-new button[data-v-7286e935]{display:inline-block;width:100%;padding:10px;padding-left:34px;background-position:10px center;text-align:left;margin:0}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationNew/AppNavigationNew.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCuDxB,qCACC,aAAc,CACd,YAAa,CAFd,4CAIE,oBAAqB,CACrB,UAAW,CACX,YAAa,CACb,iBAAkB,CAClB,+BAAgC,CAChC,eAAgB,CAChB,QAAS",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/* 'New' button */\n.app-navigation-new {\n\tdisplay: block;\n\tpadding: 10px;\n\tbutton {\n\t\tdisplay: inline-block;\n\t\twidth: 100%;\n\t\tpadding: 10px;\n\t\tpadding-left: 34px;\n\t\tbackground-position: 10px center;\n\t\ttext-align: left;\n\t\tmargin: 0;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},8704:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-navigation-new-item__title{overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis;padding-left:7px;font-size:14px}.newItemContainer{width:calc(100% - 44px);margin:auto}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationNewItem/AppNavigationNewItem.vue"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+IxB,gCACC,eAAgB,CAChB,cAAe,CACf,kBAAmB,CACnB,sBAAuB,CACvB,gBAAiB,CACjB,cAAe,CACf,kBAGA,uBAAsC,CACtC,WAAY",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-navigation-new-item__title {\n\toverflow: hidden;\n\tmax-width: 100%;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\tpadding-left: 7px;\n\tfont-size: 14px;\n}\n\n.newItemContainer {\n\twidth: calc(100% - #{$clickable-area});\n\tmargin: auto;\n}\n"],sourceRoot:""}]),t.Z=o},8323:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-20bf47dc]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}#app-settings[data-v-20bf47dc]{margin-top:auto}#app-settings__header[data-v-20bf47dc]{box-sizing:border-box;background-color:var(--color-main-background)}#app-settings__header .settings-button[data-v-20bf47dc]{display:flex;flex:1 1 0;height:44px;width:100%;padding:0;margin:0;background-color:var(--color-main-background);box-shadow:none;border:0;border-radius:0;text-align:left;font-weight:normal;font-size:100%;color:var(--color-main-text);padding-right:14px;line-height:44px}#app-settings__header .settings-button[data-v-20bf47dc]:hover,#app-settings__header .settings-button[data-v-20bf47dc]:focus{background-color:var(--color-background-hover)}#app-settings__header .settings-button__icon[data-v-20bf47dc]{width:44px;height:44px;min-width:44px}#app-settings__header .settings-button__label[data-v-20bf47dc]{overflow:hidden;max-width:100%;white-space:nowrap;text-overflow:ellipsis}#app-settings__content[data-v-20bf47dc]{display:block;padding:10px;background-color:var(--color-main-background);max-height:300px;overflow-y:auto;box-sizing:border-box}.slide-up-leave-active[data-v-20bf47dc],.slide-up-enter-active[data-v-20bf47dc]{transition-duration:var(--animation-slow);transition-property:max-height, padding;overflow-y:hidden !important}.slide-up-enter[data-v-20bf47dc],.slide-up-leave-to[data-v-20bf47dc]{max-height:0 !important;padding:0 10px !important}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationSettings/AppNavigationSettings.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+ExB,+BACC,eAAgB,CAEhB,uCACC,qBAAsB,CACtB,6CAA8C,CAF9C,wDAKC,YAAa,CACb,UAAW,CACX,WCxEkB,CDyElB,UAAW,CACX,SAAU,CACV,QAAS,CACT,6CAA8C,CAC9C,eAAgB,CAChB,QAAS,CACT,eAAgB,CAChB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,4BAA6B,CAC7B,kBAAmB,CACnB,gBCrFkB,CDiEnB,4HAwBE,8CAA+C,CAxBjD,8DA4BE,UC7FiB,CD8FjB,WC9FiB,CD+FjB,cC/FiB,CDiEnB,+DAiCE,eAAgB,CAChB,cAAe,CACf,kBAAmB,CACnB,sBAAuB,CACvB,wCAKF,aAAc,CACd,YAAa,CACb,6CAA8C,CAE9C,gBAAiB,CACjB,eAAgB,CAChB,qBAAsB,CACtB,gFAKD,yCAA0C,CAC1C,uCAAwC,CACxC,4BAA6B,CAC7B,qEAIA,uBAAwB,CACxB,yBAA0B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#app-settings {\n\tmargin-top: auto;\n\n\t&__header {\n\t\tbox-sizing: border-box;\n\t\tbackground-color: var(--color-main-background);\n\n\t\t.settings-button {\n\t\t\tdisplay: flex;\n\t\t\tflex: 1 1 0;\n\t\t\theight: $clickable-area;\n\t\t\twidth: 100%;\n\t\t\tpadding: 0;\n\t\t\tmargin: 0;\n\t\t\tbackground-color: var(--color-main-background);\n\t\t\tbox-shadow: none;\n\t\t\tborder: 0;\n\t\t\tborder-radius: 0;\n\t\t\ttext-align: left;\n\t\t\tfont-weight: normal;\n\t\t\tfont-size: 100%;\n\t\t\tcolor: var(--color-main-text);\n\t\t\tpadding-right: 14px;\n\t\t\tline-height: $clickable-area;\n\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\tbackground-color: var(--color-background-hover);\n\t\t\t}\n\n\t\t\t&__icon {\n\t\t\t\twidth: $clickable-area;\n\t\t\t\theight: $clickable-area;\n\t\t\t\tmin-width: $clickable-area;\n\t\t\t}\n\t\t\t&__label {\n\t\t\t\toverflow: hidden;\n\t\t\t\tmax-width: 100%;\n\t\t\t\twhite-space: nowrap;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__content {\n\t\tdisplay: block;\n\t\tpadding: 10px;\n\t\tbackground-color: var(--color-main-background);\n\t\t/* restrict height of settings and make scrollable */\n\t\tmax-height: 300px;\n\t\toverflow-y: auto;\n\t\tbox-sizing: border-box;\n\t}\n}\n\n.slide-up-leave-active,\n.slide-up-enter-active {\n\ttransition-duration: var(--animation-slow);\n\ttransition-property: max-height, padding;\n\toverflow-y: hidden !important;\n}\n\n.slide-up-enter,\n.slide-up-leave-to {\n\tmax-height: 0 !important;\n\tpadding: 0 10px !important;\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},805:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-31c70ec3]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}button.app-navigation-toggle[data-v-31c70ec3]{position:absolute;top:0;right:0;margin-right:-44px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppNavigationToggle/AppNavigationToggle.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCqExB,8CACC,iBAAkB,CAClB,KAAM,CACN,OAAQ,CACR,kBCxDoB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nbutton.app-navigation-toggle {\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tmargin-right: - $clickable-area;\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},6527:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-268855c9]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}[data-v-268855c9] .modal-wrapper .modal-container{display:flex}.app-settings[data-v-268855c9]{display:flex;width:100%}.app-settings__navigation[data-v-268855c9]{min-width:200px;margin-right:20px}.app-settings__content[data-v-268855c9]{max-width:100vw;overflow-y:auto;overflow-x:hidden;padding:24px;width:100%}.navigation-list[data-v-268855c9]{height:100%;box-sizing:border-box;overflow-y:auto;padding:12px}.navigation-list__link[data-v-268855c9]{display:block;font-size:16px;height:44px;margin:4px 0;line-height:44px;border-radius:var(--border-radius-pill);font-weight:bold;padding:0 20px;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;background-color:transparent;border:none}.navigation-list__link[data-v-268855c9]:hover,.navigation-list__link[data-v-268855c9]:focus{background-color:var(--color-background-hover)}.navigation-list__link--active[data-v-268855c9]{background-color:var(--color-primary-light) !important}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSettingsDialog/AppSettingsDialog.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC2RxB,kDACC,YAAa,CACb,+BAGA,YAAa,CACb,UAAW,CACX,2CACC,eAAgB,CAChB,iBAAkB,CAClB,wCAEA,eAAgB,CAChB,eAAgB,CAChB,iBAAkB,CAClB,YAAa,CACb,UAAW,CACX,kCAID,WAAY,CACZ,qBAAsB,CACtB,eAAgB,CAChB,YAAa,CACb,wCACC,aAAc,CACd,cAAe,CACf,WCtSmB,CDuSnB,YAAa,CACb,gBCxSmB,CDySnB,uCAAwC,CACxC,gBAAiB,CACjB,cAAe,CACf,cAAe,CACf,kBAAmB,CACnB,sBAAuB,CACvB,eAAgB,CAChB,4BAA6B,CAC7B,WAAY,CAdZ,4FAiBC,8CAA+C,CAC/C,gDAEA,sDAAuD",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n::v-deep .modal-wrapper .modal-container {\n\tdisplay: flex;\n}\n\n.app-settings {\n\tdisplay: flex;\n\twidth: 100%;\n\t&__navigation {\n\t\tmin-width: 200px;\n\t\tmargin-right: 20px;\n\t}\n\t&__content {\n\t\tmax-width: 100vw;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tpadding: 24px;\n\t\twidth: 100%;\n\t}\n}\n\n.navigation-list {\n\theight: 100%;\n\tbox-sizing: border-box;\n\toverflow-y: auto;\n\tpadding: 12px;\n\t&__link {\n\t\tdisplay: block;\n\t\tfont-size: 16px;\n\t\theight: $clickable-area;\n\t\tmargin: 4px 0;\n\t\tline-height: $clickable-area;\n\t\tborder-radius: var(--border-radius-pill);\n\t\tfont-weight: bold;\n\t\tpadding: 0 20px;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\toverflow: hidden;\n\t\tbackground-color: transparent;\n\t\tborder: none;\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t\t&--active {\n\t\t\tbackground-color: var(--color-primary-light) !important;\n\t\t}\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},8736:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-0e33da14]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-settings-section[data-v-0e33da14]{margin-bottom:80px}.app-settings-section__title[data-v-0e33da14]{font-size:20px;font-weight:bold;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSettingsSection/AppSettingsSection.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC8CxB,uCACC,kBAAmB,CACnB,8CACC,cAAe,CACf,gBAAiB,CACjB,eAAgB,CAChB,kBAAmB,CACnB,sBAAuB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-settings-section {\n\tmargin-bottom: 80px;\n\t&__title {\n\t\tfont-size: 20px;\n\t\tfont-weight: bold;\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},8711:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-68d5c99c]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-sidebar[data-v-68d5c99c]{position:-webkit-sticky;position:sticky;z-index:1500;top:var(--header-height);right:0;display:flex;overflow-x:hidden;overflow-y:auto;flex-direction:column;flex-shrink:0;width:27vw;min-width:300px;max-width:500px;height:calc(100vh - var(--header-height));border-left:1px solid var(--color-border);background:var(--color-main-background)}.app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-68d5c99c]{position:absolute;z-index:100;top:6px;right:6px;width:44px;height:44px;opacity:.7;border-radius:22px}.app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-68d5c99c]:hover,.app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-68d5c99c]:active,.app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-68d5c99c]:focus{opacity:1;background-color:rgba(127,127,127,0.25)}.app-sidebar .app-sidebar-header>.app-sidebar__close .app-sidebar__close-icon[data-v-68d5c99c]{width:44px;height:44px}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info[data-v-68d5c99c]{flex-direction:row}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info .app-sidebar-header__figure[data-v-68d5c99c]{z-index:2;width:70px;height:70px;margin:9px;border-radius:3px;flex:0 0 auto}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info .app-sidebar-header__desc[data-v-68d5c99c]{padding-left:0;flex:1 1 auto;min-width:0;padding-right:94px}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info .app-sidebar-header__desc.app-sidebar-header__desc--without-actions[data-v-68d5c99c]{padding-right:50px}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info .app-sidebar-header__desc .app-sidebar-header__tertiary-actions[data-v-68d5c99c]{z-index:3;position:absolute;top:9px;left:-44px}.app-sidebar .app-sidebar-header--compact.app-sidebar-header--with-figure .app-sidebar-header__info .app-sidebar-header__desc .app-sidebar-header__menu[data-v-68d5c99c]{top:6px;right:50px;background-color:transparent;position:absolute}.app-sidebar .app-sidebar-header:not(.app-sidebar-header--with-figure) .app-sidebar-header__menu[data-v-68d5c99c]{position:absolute;top:6px;right:50px}.app-sidebar .app-sidebar-header:not(.app-sidebar-header--with-figure) .app-sidebar-header__desc[data-v-68d5c99c]{padding-right:94px}.app-sidebar .app-sidebar-header:not(.app-sidebar-header--with-figure) .app-sidebar-header__desc.app-sidebar-header__desc--without-actions[data-v-68d5c99c]{padding-right:50px}.app-sidebar .app-sidebar-header .app-sidebar-header__info[data-v-68d5c99c]{display:flex;flex-direction:column}.app-sidebar .app-sidebar-header__figure[data-v-68d5c99c]{width:100%;height:250px;max-height:250px;background-repeat:no-repeat;background-position:center;background-size:contain}.app-sidebar .app-sidebar-header__figure--with-action[data-v-68d5c99c]{cursor:pointer}.app-sidebar .app-sidebar-header__desc[data-v-68d5c99c]{position:relative;display:flex;flex-direction:row;justify-content:center;padding:18px 6px 18px 9px}.app-sidebar .app-sidebar-header__desc--with-tertiary-action[data-v-68d5c99c]{padding-left:0}.app-sidebar .app-sidebar-header__desc--editable .app-sidebar-header__maintitle-form[data-v-68d5c99c],.app-sidebar .app-sidebar-header__desc--with-subtitle--editable .app-sidebar-header__maintitle-form[data-v-68d5c99c]{margin-top:-2px;margin-bottom:-2px}.app-sidebar .app-sidebar-header__desc--with-subtitle--editable .app-sidebar-header__subtitle[data-v-68d5c99c]{margin-top:-2px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__tertiary-actions[data-v-68d5c99c]{display:flex;height:44px;width:44px;justify-content:center;flex:0 0 auto}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container[data-v-68d5c99c]{flex:1 1 auto;display:flex;flex-direction:column;justify-content:center;min-width:0}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container[data-v-68d5c99c]{display:flex;align-items:center}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__maintitle[data-v-68d5c99c]{padding:0;min-height:30px;font-size:20px;line-height:30px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__maintitle[data-v-68d5c99c] .linkified{cursor:pointer;text-decoration:underline;margin:0}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__maintitle-form[data-v-68d5c99c]{display:flex;flex:1 1 auto}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__maintitle-form .icon-confirm[data-v-68d5c99c]{margin:0}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__maintitle-form input.app-sidebar-header__maintitle-input[data-v-68d5c99c]{flex:1 1 auto;margin:0;padding:7px;font-size:20px;font-weight:bold}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle-container .app-sidebar-header__menu[data-v-68d5c99c]{height:44px;width:44px;border-radius:22px;background-color:rgba(127,127,127,0.25);margin-left:5px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__maintitle[data-v-68d5c99c],.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__subtitle[data-v-68d5c99c]{overflow:hidden;width:100%;margin:0;white-space:nowrap;text-overflow:ellipsis}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__title-container .app-sidebar-header__subtitle[data-v-68d5c99c]{padding:0;opacity:.7;font-size:var(--default-font-size)}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star[data-v-68d5c99c]{display:block;width:44px;height:44px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .icon-loading-small[data-v-68d5c99c]{display:block;width:44px;height:44px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .star[data-v-68d5c99c]{width:44px;height:44px}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .star--star[data-v-68d5c99c]{color:#000;opacity:.5}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .star--star[data-v-68d5c99c]:hover{color:#FC0}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .star--starred[data-v-68d5c99c]{color:#FC0}.app-sidebar .app-sidebar-header__desc .app-sidebar-header__star .star--starred[data-v-68d5c99c]:hover{color:#000;opacity:.5}.app-sidebar .app-sidebar-header__description[data-v-68d5c99c]{display:flex;align-items:center;margin:0 10px}.slide-right-leave-active[data-v-68d5c99c],.slide-right-enter-active[data-v-68d5c99c]{transition-duration:var(--animation-quick);transition-property:max-width, min-width}.slide-right-enter-to[data-v-68d5c99c],.slide-right-leave[data-v-68d5c99c]{min-width:300px;max-width:500px}.slide-right-enter[data-v-68d5c99c],.slide-right-leave-to[data-v-68d5c99c]{min-width:0 !important;max-width:0 !important}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSidebar/AppSidebar.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCokBxB,8BACC,uBAAwB,CACxB,eAAgB,CAChB,YAAa,CACb,wBAAyB,CACzB,OAAQ,CACR,YAAa,CACb,iBAAkB,CAClB,eAAgB,CAChB,qBAAsB,CACtB,aAAc,CACd,UAAW,CACX,eA7BwB,CA8BxB,eA7BwB,CA8BxB,yCAA0C,CAC1C,yCAA0C,CAC1C,uCAAwC,CAhBzC,sEAmBG,iBAAkB,CAClB,WAAY,CACZ,OA3BsB,CA4BtB,SA5BsB,CA6BtB,UC1kBkB,CD2kBlB,WC3kBkB,CD4kBlB,UC1jBgB,CD2jBhB,kBAAkC,CA1BrC,qOA8BI,SC9jBY,CD+jBZ,uCC3jB8C,CD4hBlD,+FAmCI,UCtlBiB,CDulBjB,WCvlBiB,CDmjBrB,qHA2CI,kBAAmB,CA3CvB,iJA8CK,SAAU,CACV,UAA4C,CAC5C,WAA6C,CAC7C,UAAkC,CAClC,iBAAkB,CAClB,aAAc,CAnDnB,+IAsDK,cAAe,CACf,aAAc,CACd,WAAY,CACZ,kBAAyD,CAzD9D,yLA4DM,kBAAe,CA5DrB,qLAgEM,SAAU,CACV,iBAAkB,CAClB,OAA+B,CAC/B,UAA0B,CAnEhC,yKAsEM,OA5EmB,CA6EnB,UAA6C,CAC7C,4BAA6B,CAC7B,iBAAkB,CAzExB,kHAmFI,iBAAkB,CAClB,OA1FqB,CA2FrB,UAA6C,CArFjD,kHAyFI,kBAAe,CAzFnB,4JA4FK,kBAAe,CA5FpB,4EAmGG,YAAa,CACb,qBAAsB,CApGzB,0DAyGG,UAAW,CACX,YAAa,CACb,gBAAiB,CACjB,2BAA4B,CAC5B,0BAA2B,CAC3B,uBAAwB,CA9G3B,uEAgHI,cAAe,CAhHnB,wDAsHG,iBAAkB,CAClB,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,yBAAkH,CA1HrH,8EA8HI,cAAe,CA9HnB,2NAmII,eAAgB,CAChB,kBAAmB,CApIvB,+GAwII,eAAgB,CAxIpB,8FA4II,YAAa,CACb,WChsBiB,CDisBjB,UCjsBiB,CDksBjB,sBAAuB,CACvB,aAAc,CAhJlB,6FAqJI,aAAc,CACd,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,WAAY,CAzJhB,sIA4JK,YAAa,CACb,kBAAmB,CA7JxB,qKAiKM,SAAU,CACV,eAAgB,CAChB,cAAe,CACf,gBA9KkB,CAUxB,gLAwKO,cAAe,CACf,yBAA0B,CAC1B,QAAS,CA1KhB,0KA+KM,YAAa,CACb,aAAc,CAhLpB,wLAmLO,QAAS,CAnLhB,oNAuLO,aAAc,CACd,QAAS,CACT,WAtMiB,CAuMjB,cAAe,CACf,gBAAiB,CA3LxB,gKAiMM,WCpvBe,CDqvBf,UCrvBe,CDsvBf,kBAAkC,CAClC,uCChuB4C,CDiuB5C,eAAgB,CArMtB,uPA4MK,eAAgB,CAChB,UAAW,CACX,QAAS,CACT,kBAAmB,CACnB,sBAAuB,CAhN5B,2HAqNK,SAAU,CACV,UCvvBc,CDwvBd,kCAAmC,CAvNxC,kFA6NI,aAAc,CACd,UCjxBiB,CDkxBjB,WClxBiB,CDmjBrB,sGAkOK,aAAc,CACd,UCtxBgB,CDuxBhB,WCvxBgB,CDmjBrB,wFAwOK,UC3xBgB,CD4xBhB,WC5xBgB,CDmjBrB,8FA2OM,UAAW,CACX,UAAW,CA5OjB,oGA8OO,UAAW,CA9OlB,iGAkPM,UAAW,CAlPjB,uGAoPO,UAAW,CACX,UAAW,CArPlB,+DA8PG,YAAa,CACb,kBAAmB,CACnB,aAAc,CACd,sFAMF,0CAA2C,CAC3C,wCAAyC,CACzC,2EAIA,eA9RwB,CA+RxB,eA9RwB,CA+RxB,2EAIA,sBAAuB,CACvB,sBAAuB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$sidebar-min-width: 300px;\n$sidebar-max-width: 500px;\n\n$desc-vertical-padding: 18px;\n$desc-input-padding: 7px;\n\n// title and subtitle\n$desc-title-height: 30px;\n$desc-subtitle-height: 22px;\n$desc-height: $desc-title-height + $desc-subtitle-height;\n\n$top-buttons-spacing: 6px;\n\n/*\n\tSidebar: to be used within #content\n\tapp-content will be shrinked properly\n*/\n.app-sidebar {\n\tposition: -webkit-sticky; // Safari support\n\tposition: sticky;\n\tz-index: 1500;\n\ttop: var(--header-height);\n\tright: 0;\n\tdisplay: flex;\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\tflex-direction: column;\n\tflex-shrink: 0;\n\twidth: 27vw;\n\tmin-width: $sidebar-min-width;\n\tmax-width: $sidebar-max-width;\n\theight: calc(100vh - var(--header-height));\n\tborder-left: 1px solid var(--color-border);\n\tbackground: var(--color-main-background);\n\t.app-sidebar-header {\n\t\t> .app-sidebar__close {\n\t\t\tposition: absolute;\n\t\t\tz-index: 100;\n\t\t\ttop: $top-buttons-spacing;\n\t\t\tright: $top-buttons-spacing;\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\topacity: $opacity_normal;\n\t\t\tborder-radius: $clickable-area / 2;\n\t\t\t&:hover,\n\t\t\t&:active,\n\t\t\t&:focus {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\tbackground-color: $action-background-hover;\n\t\t\t}\n\n\t\t\t.app-sidebar__close-icon {\n\t\t\t\twidth: $clickable-area;\n\t\t\t\theight: $clickable-area;\n\t\t\t}\n\t\t}\n\n\t\t// Compact mode only affects a sidebar with a figure\n\t\t&--compact.app-sidebar-header--with-figure {\n\t\t\t.app-sidebar-header__info {\n\t\t\t\tflex-direction: row;\n\n\t\t\t\t.app-sidebar-header__figure {\n\t\t\t\t\tz-index: 2;\n\t\t\t\t\twidth: $desc-height + $desc-vertical-padding;\n\t\t\t\t\theight: $desc-height + $desc-vertical-padding;\n\t\t\t\t\tmargin: $desc-vertical-padding / 2;\n\t\t\t\t\tborder-radius: 3px;\n\t\t\t\t\tflex: 0 0 auto;\n\t\t\t\t}\n\t\t\t\t.app-sidebar-header__desc {\n\t\t\t\t\tpadding-left: 0;\n\t\t\t\t\tflex: 1 1 auto;\n\t\t\t\t\tmin-width: 0;\n\t\t\t\t\tpadding-right: 2 * $clickable-area + $top-buttons-spacing;\n\n\t\t\t\t\t&.app-sidebar-header__desc--without-actions {\n\t\t\t\t\t\tpadding-right: #{$clickable-area + $top-buttons-spacing};\n\t\t\t\t\t}\n\n\t\t\t\t\t.app-sidebar-header__tertiary-actions {\n\t\t\t\t\t\tz-index: 3; // above star\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t\ttop: $desc-vertical-padding / 2;\n\t\t\t\t\t\tleft: -1 * $clickable-area;\n\t\t\t\t\t}\n\t\t\t\t\t.app-sidebar-header__menu {\n\t\t\t\t\t\ttop: $top-buttons-spacing;\n\t\t\t\t\t\tright: $clickable-area + $top-buttons-spacing; // left of the close button\n\t\t\t\t\t\tbackground-color: transparent;\n\t\t\t\t\t\tposition: absolute;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sidebar without figure\n\t\t&:not(.app-sidebar-header--with-figure) {\n\t\t\t// align the menu with the close button\n\t\t\t.app-sidebar-header__menu {\n\t\t\t\tposition: absolute;\n\t\t\t\ttop: $top-buttons-spacing;\n\t\t\t\tright: $top-buttons-spacing + $clickable-area;\n\t\t\t}\n\t\t\t// increase the padding to not overlap the menu\n\t\t\t.app-sidebar-header__desc {\n\t\t\t\tpadding-right: #{$clickable-area * 2 + $top-buttons-spacing};\n\n\t\t\t\t&.app-sidebar-header__desc--without-actions {\n\t\t\t\t\tpadding-right: #{$clickable-area + $top-buttons-spacing};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// the container with the figure and the description\n\t\t.app-sidebar-header__info {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t}\n\n\t\t// header background\n\t\t&__figure {\n\t\t\twidth: 100%;\n\t\t\theight: 250px;\n\t\t\tmax-height: 250px;\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: contain;\n\t\t\t&--with-action {\n\t\t\t\tcursor: pointer;\n\t\t\t}\n\t\t}\n\n\t\t// description\n\t\t&__desc {\n\t\t\tposition: relative;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: row;\n\t\t\tjustify-content: center;\n\t\t\tpadding: #{$desc-vertical-padding} #{$top-buttons-spacing} #{$desc-vertical-padding} #{$desc-vertical-padding / 2};\n\n\t\t\t// custom overrides\n\t\t\t&--with-tertiary-action {\n\t\t\t\tpadding-left: 0;\n\t\t\t}\n\n\t\t\t&--editable .app-sidebar-header__maintitle-form,\n\t\t\t&--with-subtitle--editable .app-sidebar-header__maintitle-form {\n\t\t\t\tmargin-top: -2px;\n\t\t\t\tmargin-bottom: -2px;\n\t\t\t}\n\n\t\t\t&--with-subtitle--editable .app-sidebar-header__subtitle {\n\t\t\t\tmargin-top: -2px;\n\t\t\t}\n\n\t\t\t.app-sidebar-header__tertiary-actions {\n\t\t\t\tdisplay: flex;\n\t\t\t\theight: $clickable-area;\n\t\t\t\twidth: $clickable-area;\n\t\t\t\tjustify-content: center;\n\t\t\t\tflex: 0 0 auto;\n\t\t\t}\n\n\t\t\t// titles\n\t\t\t.app-sidebar-header__title-container {\n\t\t\t\tflex: 1 1 auto;\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tjustify-content: center;\n\t\t\t\tmin-width: 0;\n\n\t\t\t\t.app-sidebar-header__maintitle-container {\n\t\t\t\t\tdisplay: flex;\n\t\t\t\t\talign-items: center;\n\n\t\t\t\t\t// main title\n\t\t\t\t\t.app-sidebar-header__maintitle {\n\t\t\t\t\t\tpadding: 0;\n\t\t\t\t\t\tmin-height: 30px;\n\t\t\t\t\t\tfont-size: 20px;\n\t\t\t\t\t\tline-height: $desc-title-height;\n\n\t\t\t\t\t\t// Needs 'deep' as the link is generated by the linkify directive\n\t\t\t\t\t\t&::v-deep .linkified {\n\t\t\t\t\t\t\tcursor: pointer;\n\t\t\t\t\t\t\ttext-decoration: underline;\n\t\t\t\t\t\t\tmargin: 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t.app-sidebar-header__maintitle-form {\n\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\tflex: 1 1 auto;\n\n\t\t\t\t\t\t& .icon-confirm {\n\t\t\t\t\t\t\tmargin: 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tinput.app-sidebar-header__maintitle-input {\n\t\t\t\t\t\t\tflex: 1 1 auto;\n\t\t\t\t\t\t\tmargin: 0;\n\t\t\t\t\t\t\tpadding: $desc-input-padding;\n\t\t\t\t\t\t\tfont-size: 20px;\n\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// main menu\n\t\t\t\t\t.app-sidebar-header__menu {\n\t\t\t\t\t\theight: $clickable-area;\n\t\t\t\t\t\twidth: $clickable-area;\n\t\t\t\t\t\tborder-radius: $clickable-area / 2;\n\t\t\t\t\t\tbackground-color: $action-background-hover;\n\t\t\t\t\t\tmargin-left: 5px;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// shared between main and subtitle\n\t\t\t\t.app-sidebar-header__maintitle,\n\t\t\t\t.app-sidebar-header__subtitle {\n\t\t\t\t\toverflow: hidden;\n\t\t\t\t\twidth: 100%;\n\t\t\t\t\tmargin: 0;\n\t\t\t\t\twhite-space: nowrap;\n\t\t\t\t\ttext-overflow: ellipsis;\n\t\t\t\t}\n\n\t\t\t\t// subtitle\n\t\t\t\t.app-sidebar-header__subtitle {\n\t\t\t\t\tpadding: 0;\n\t\t\t\t\topacity: $opacity_normal;\n\t\t\t\t\tfont-size: var(--default-font-size);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// favourite\n\t\t\t.app-sidebar-header__star {\n\t\t\t\tdisplay: block;\n\t\t\t\twidth: $clickable-area;\n\t\t\t\theight: $clickable-area;\n\n\t\t\t\t.icon-loading-small {\n\t\t\t\t\tdisplay: block;\n\t\t\t\t\twidth: $clickable-area;\n\t\t\t\t\theight: $clickable-area;\n\t\t\t\t}\n\n\t\t\t\t.star {\n\t\t\t\t\twidth: $clickable-area;\n\t\t\t\t\theight: $clickable-area;\n\t\t\t\t\t&--star {\n\t\t\t\t\t\tcolor: #000;\n\t\t\t\t\t\topacity: .5;\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\tcolor: #FC0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t&--starred {\n\t\t\t\t\t\tcolor: #FC0;\n\t\t\t\t\t\t&:hover {\n\t\t\t\t\t\t\tcolor: #000;\n\t\t\t\t\t\t\topacity: .5;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// sidebar description slot\n\t\t&__description {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tmargin: 0 10px;\n\t\t}\n\t}\n}\n\n.slide-right-leave-active,\n.slide-right-enter-active {\n\ttransition-duration: var(--animation-quick);\n\ttransition-property: max-width, min-width;\n}\n\n.slide-right-enter-to,\n.slide-right-leave {\n\tmin-width: $sidebar-min-width;\n\tmax-width: $sidebar-max-width;\n}\n\n.slide-right-enter,\n.slide-right-leave-to {\n\tmin-width: 0 !important;\n\tmax-width: 0 !important;\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},7464:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-sidebar-header__description button,.app-sidebar-header__description .button,.app-sidebar-header__description input[type='button'],.app-sidebar-header__description input[type='submit'],.app-sidebar-header__description input[type='reset']{padding:6px 22px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSidebar/AppSidebar.vue"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+1BxB,kPAKE,gBAAiB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// ! slots specific designs, cannot be scoped\n// if any button inside the description slot, increase visual padding\n.app-sidebar-header__description {\n\tbutton, .button,\n\tinput[type='button'],\n\tinput[type='submit'],\n\tinput[type='reset'] {\n\t\tpadding: 6px 22px;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},1128:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-15932673]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-sidebar-tabs[data-v-15932673]{display:flex;flex-direction:column;min-height:0;flex:1 1 100%}.app-sidebar-tabs__nav[data-v-15932673]{margin-top:10px}.app-sidebar-tabs__nav ul[data-v-15932673]{display:flex;justify-content:stretch}.app-sidebar-tabs__tab[data-v-15932673]{display:block;flex:1 1;min-width:0;text-align:center}.app-sidebar-tabs__tab a[data-v-15932673]{position:relative;display:block;overflow:hidden;padding:25px 5px 5px 5px;transition:color var(--animation-quick),opacity var(--animation-quick),border-color var(--animation-quick);text-align:center;white-space:nowrap;text-overflow:ellipsis;opacity:.7;color:var(--color-main-text);border-bottom:1px solid var(--color-border)}.app-sidebar-tabs__tab a[data-v-15932673]:hover,.app-sidebar-tabs__tab a[data-v-15932673]:focus,.app-sidebar-tabs__tab a[data-v-15932673]:active,.app-sidebar-tabs__tab a.active[data-v-15932673]{opacity:1}.app-sidebar-tabs__tab a:hover .app-sidebar-tabs__tab-icon[data-v-15932673],.app-sidebar-tabs__tab a:focus .app-sidebar-tabs__tab-icon[data-v-15932673],.app-sidebar-tabs__tab a:active .app-sidebar-tabs__tab-icon[data-v-15932673],.app-sidebar-tabs__tab a.active .app-sidebar-tabs__tab-icon[data-v-15932673]{opacity:1}.app-sidebar-tabs__tab a[data-v-15932673]:not(.active):hover,.app-sidebar-tabs__tab a[data-v-15932673]:not(.active):focus{border-bottom-color:var(--color-background-darker);box-shadow:inset 0 -1px 0 var(--color-background-darker)}.app-sidebar-tabs__tab a.active[data-v-15932673]{color:var(--color-text-light);border-bottom-color:var(--color-text-light);box-shadow:inset 0 -1px 0 var(--color-text-light);font-weight:bold}.app-sidebar-tabs__tab a[data-v-15932673]:focus{border-bottom-color:var(--color-primary-element);box-shadow:inset 0 -1px 0 var(--color-primary-element)}.app-sidebar-tabs__tab-icon[data-v-15932673]{position:absolute;top:0;left:0;width:100%;height:25px;transition:opacity var(--animation-quick);opacity:.7}.app-sidebar-tabs__tab-icon>span[data-v-15932673]{display:flex;align-items:center;justify-content:center;background-size:16px}.app-sidebar-tabs__content[data-v-15932673]{position:relative;min-height:0;height:100%}.app-sidebar-tabs__content--multiple[data-v-15932673]>:not(section){display:none}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSidebar/AppSidebarTabs.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+QxB,mCACC,YAAa,CACb,qBAAsB,CACtB,YAAa,CACb,aAAc,CAEd,wCACC,eAAgB,CADhB,2CAGC,YAAa,CACb,uBAAwB,CACxB,wCAGD,aAAc,CACd,QAAS,CACT,WAAY,CACZ,iBAAkB,CAJlB,0CAMC,iBAAkB,CAClB,aAAc,CACd,eAAgB,CAChB,wBAAyB,CACzB,0GAA6G,CAC7G,iBAAkB,CAClB,kBAAmB,CACnB,sBAAuB,CACvB,UCvQgB,CDwQhB,4BAA6B,CAC7B,2CAA4C,CAhB7C,kMAsBE,SC9QY,CDwPd,kTAwBG,SChRW,CDwPd,0HA6BE,kDAAmD,CACnD,wDAAyD,CA9B3D,iDAiCE,6BAA8B,CAC9B,2CAA4C,CAC5C,iDAAkD,CAClD,gBAAiB,CApCnB,gDA0CE,gDAAiD,CACjD,sDAAuD,CACvD,6CAKF,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CACZ,yCAA0C,CAC1C,UChTiB,CDySjB,kDAUC,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,oBAAqB,CACrB,4CAID,iBAAkB,CAElB,YAAa,CACb,WAAY,CAGZ,oEACC,YAAa",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-sidebar-tabs {\n\tdisplay: flex;\n\tflex-direction: column;\n\tmin-height: 0;\n\tflex: 1 1 100%;\n\n\t&__nav {\n\t\tmargin-top: 10px;\n\t\tul {\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: stretch;\n\t\t}\n\t}\n\t&__tab {\n\t\tdisplay: block;\n\t\tflex: 1 1;\n\t\tmin-width: 0;\n\t\ttext-align: center;\n\t\ta {\n\t\t\tposition: relative;\n\t\t\tdisplay: block;\n\t\t\toverflow: hidden;\n\t\t\tpadding: 25px 5px 5px 5px;\n\t\t\ttransition: color var(--animation-quick), opacity var(--animation-quick), border-color var(--animation-quick);\n\t\t\ttext-align: center;\n\t\t\twhite-space: nowrap;\n\t\t\ttext-overflow: ellipsis;\n\t\t\topacity: $opacity_normal;\n\t\t\tcolor: var(--color-main-text);\n\t\t\tborder-bottom: 1px solid var(--color-border);\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active,\n\t\t\t&.active {\n\t\t\t\topacity: $opacity_full;\n\t\t\t\t.app-sidebar-tabs__tab-icon {\n\t\t\t\t\topacity: $opacity_full;\n\t\t\t\t}\n\t\t\t}\n\t\t\t&:not(.active):hover,\n\t\t\t&:not(.active):focus {\n\t\t\t\tborder-bottom-color: var(--color-background-darker);\n\t\t\t\tbox-shadow: inset 0 -1px 0 var(--color-background-darker);\n\t\t\t}\n\t\t\t&.active {\n\t\t\t\tcolor: var(--color-text-light);\n\t\t\t\tborder-bottom-color: var(--color-text-light);\n\t\t\t\tbox-shadow: inset 0 -1px 0 var(--color-text-light);\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t\t// differentiate the two for accessibility purpose\n\t\t\t// make sure the user knows she's focusing the navigation\n\t\t\t// and can use arrows/home/pageup...\n\t\t\t&:focus {\n\t\t\t\tborder-bottom-color: var(--color-primary-element);\n\t\t\t\tbox-shadow: inset 0 -1px 0 var(--color-primary-element);\n\t\t\t}\n\t\t}\n\t}\n\n\t&__tab-icon {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\twidth: 100%;\n\t\theight: 25px;\n\t\ttransition: opacity var(--animation-quick);\n\t\topacity: $opacity_normal;\n\n\t\t& > span {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tbackground-size: 16px;\n\t\t}\n\t}\n\n\t&__content {\n\t\tposition: relative;\n\t\t// take full available height\n\t\tmin-height: 0;\n\t\theight: 100%;\n\t\t// force the use of the tab component if more than one tab\n\t\t// you can just put raw content if you don't use tabs\n\t\t&--multiple > :not(section) {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},3126:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-28609fd2]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.app-sidebar__tab[data-v-28609fd2]{display:none;padding:10px;min-height:100%;max-height:100%;height:100%;overflow:auto}.app-sidebar__tab[data-v-28609fd2]:focus{border-color:var(--color-primary);box-shadow:0 0 0.2em var(--color-primary);outline:0}.app-sidebar__tab--active[data-v-28609fd2]{display:block}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/AppSidebarTab/AppSidebarTab.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+ExB,mCACC,YAAa,CACb,YAAa,CACb,eAAgB,CAChB,eAAgB,CAChB,WAAY,CACZ,aAAc,CANf,yCASE,iCAAkC,CAClC,yCAA0C,CAC1C,SAAU,CACV,2CAGA,aAAc",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.app-sidebar__tab {\n\tdisplay: none;\n\tpadding: 10px;\n\tmin-height: 100%; // fill available height\n\tmax-height: 100%; // scroll inside\n\theight: 100%;\n\toverflow: auto;\n\n\t&:focus {\n\t\tborder-color: var(--color-primary);\n\t\tbox-shadow: 0 0 0.2em var(--color-primary);\n\t\toutline: 0;\n\t}\n\n\t&--active {\n\t\tdisplay: block;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},6016:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r),s=e(1667),l=e.n(s),c=e(8887),d=e(4831),A=e(2842),u=o()(a()),p=l()(c.Z),m=l()(d.Z),T=l()(A.Z);u.push([n.id,".material-design-icon[data-v-41fc3610]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.avatardiv[data-v-41fc3610]{position:relative;display:inline-block;width:var(--size);height:var(--size)}.avatardiv--unknown[data-v-41fc3610]{position:relative;background-color:var(--color-text-maxcontrast)}.avatardiv[data-v-41fc3610]:not(.avatardiv--unknown){background-color:#fff !important;box-shadow:0 0 5px rgba(0,0,0,0.05) inset}body.theme--dark .avatardiv[data-v-41fc3610]:not(.avatardiv--unknown){background-color:#000 !important}.avatardiv--with-menu[data-v-41fc3610]{cursor:pointer}.avatardiv--with-menu[data-v-41fc3610] .trigger{position:absolute;top:0;left:0}.avatardiv--with-menu .icon-more[data-v-41fc3610],.avatardiv--with-menu .icon-loading[data-v-41fc3610]{display:flex;align-items:center;justify-content:center;width:var(--size);height:var(--size);cursor:pointer;background:none}.avatardiv--with-menu .icon-more[data-v-41fc3610]{opacity:0}.avatardiv--with-menu:focus .icon-more[data-v-41fc3610],.avatardiv--with-menu:hover .icon-more[data-v-41fc3610]{opacity:1}.avatardiv--with-menu:focus img[data-v-41fc3610],.avatardiv--with-menu:hover img[data-v-41fc3610]{opacity:0.3}.avatardiv--with-menu .icon-more[data-v-41fc3610],.avatardiv--with-menu img[data-v-41fc3610]{transition:opacity var(--animation-quick)}.avatardiv>.unknown[data-v-41fc3610]{position:absolute;top:0;left:0;display:block;width:100%;text-align:center;font-weight:normal;color:var(--color-main-background)}.avatardiv img[data-v-41fc3610]{width:100%;height:100%;object-fit:cover}.avatardiv .avatardiv__user-status[data-v-41fc3610]{position:absolute;right:-4px;bottom:-4px;max-height:18px;max-width:18px;height:40%;width:40%;line-height:15px;font-size:var(--default-font-size);border:2px solid var(--color-main-background);background-color:var(--color-main-background);background-repeat:no-repeat;background-size:16px;background-position:center;border-radius:50%}.acli:hover .avatardiv .avatardiv__user-status[data-v-41fc3610]{border-color:var(--color-background-hover);background-color:var(--color-background-hover)}.acli.active .avatardiv .avatardiv__user-status[data-v-41fc3610]{border-color:var(--color-primary-light);background-color:var(--color-primary-light)}.avatardiv .avatardiv__user-status--online[data-v-41fc3610]{background-image:url("+p+")}.avatardiv .avatardiv__user-status--dnd[data-v-41fc3610]{background-image:url("+m+");background-color:#ffffff}.avatardiv .avatardiv__user-status--away[data-v-41fc3610]{background-image:url("+T+")}.avatardiv .avatardiv__user-status--icon[data-v-41fc3610]{border:none;background-color:transparent}.avatardiv .popovermenu-wrapper[data-v-41fc3610]{position:relative;display:inline-block}.avatar-class-icon[data-v-41fc3610]{border-radius:50%;background-color:var(--color-background-darker);height:100%}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Avatar/Avatar.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCylBxB,4BACC,iBAAkB,CAClB,oBAAqB,CACrB,iBAAkB,CAClB,kBAAmB,CAEnB,qCACC,iBAAkB,CAClB,8CAA+C,CARjD,qDAaE,gCAAiC,CAKjC,yCAA6C,CAJ7C,sEAEC,gCAAiC,CACjC,uCAKD,cAAe,CADf,iDAGC,iBAAkB,CAClB,KAAM,CACN,MAAO,CALR,uGAQC,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,iBAAkB,CAClB,kBAAmB,CACnB,cAAe,CACf,eAAgB,CAdjB,kDAiBC,SAAU,CAjBX,gHAsBE,SAAU,CAtBZ,kGAyBE,WAAY,CAzBd,6FA8BC,yCAA0C,CAnD7C,qCAwDE,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,aAAc,CACd,UAAW,CACX,iBAAkB,CAClB,kBAAmB,CACnB,kCAAmC,CA/DrC,gCAoEE,UAAW,CACX,WAAY,CAEZ,gBAAiB,CAvEnB,oDA2EE,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,eAAgB,CAChB,cAAe,CACf,UAAW,CACX,SAAU,CACV,gBAAiB,CACjB,kCAAmC,CACnC,6CAA8C,CAC9C,6CAA8C,CAC9C,2BAA4B,CAC5B,oBAAqB,CACrB,0BAA2B,CAC3B,iBAAkB,CAElB,gEACC,0CAA2C,CAC3C,8CAA+C,CAC/C,iEAEA,uCAAwC,CACxC,2CAA4C,CAjG/C,4DAqGG,wDAAyE,CArG5E,yDAwGG,wDAAsE,CACtE,wBAAyB,CAzG5B,0DA4GG,wDAAuE,CA5G1E,0DA+GG,WAAY,CACZ,4BAA6B,CAhHhC,iDAqHE,iBAAkB,CAClB,oBAAqB,CACrB,oCAID,iBAAkB,CAClB,+CAAgD,CAChD,WAAY",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.avatardiv {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: var(--size);\n\theight: var(--size);\n\n\t&--unknown {\n\t\tposition: relative;\n\t\tbackground-color: var(--color-text-maxcontrast);\n\t}\n\n\t&:not(&--unknown) {\n\t\t// White background for avatars with transparency\n\t\tbackground-color: #fff !important;\n\t\tbody.theme--dark & {\n\t\t\t// And black background in dark mode, as it shines through on hover of the menu\n\t\t\tbackground-color: #000 !important;\n\t\t}\n\t\tbox-shadow: 0 0 5px rgba(0, 0, 0, 0.05) inset;\n\t}\n\n\t&--with-menu {\n\t\tcursor: pointer;\n\t\t::v-deep .trigger {\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t}\n\t\t.icon-more, .icon-loading {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: var(--size);\n\t\t\theight: var(--size);\n\t\t\tcursor: pointer;\n\t\t\tbackground: none;\n\t\t}\n\t\t.icon-more {\n\t\t\topacity: 0;\n\t\t}\n\t\t&:focus,\n\t\t&:hover {\n\t\t\t.icon-more {\n\t\t\t\topacity: 1;\n\t\t\t}\n\t\t\timg {\n\t\t\t\topacity: 0.3;\n\t\t\t}\n\t\t}\n\t\t.icon-more,\n\t\timg {\n\t\t\ttransition: opacity var(--animation-quick);\n\t\t}\n\t}\n\n\t> .unknown {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tfont-weight: normal;\n\t\tcolor: var(--color-main-background);\n\t}\n\n\timg {\n\t\t// Cover entire area\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\t// Keep ratio\n\t\tobject-fit: cover;\n\t}\n\n\t.avatardiv__user-status {\n\t\tposition: absolute;\n\t\tright: -4px;\n\t\tbottom: -4px;\n\t\tmax-height: 18px;\n\t\tmax-width: 18px;\n\t\theight: 40%;\n\t\twidth: 40%;\n\t\tline-height: 15px;\n\t\tfont-size: var(--default-font-size);\n\t\tborder: 2px solid var(--color-main-background);\n\t\tbackground-color: var(--color-main-background);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: 16px;\n\t\tbackground-position: center;\n\t\tborder-radius: 50%;\n\n\t\t.acli:hover & {\n\t\t\tborder-color: var(--color-background-hover);\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t\t.acli.active & {\n\t\t\tborder-color: var(--color-primary-light);\n\t\t\tbackground-color: var(--color-primary-light);\n\t\t}\n\n\t\t&--online{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-online.svg');\n\t\t}\n\t\t&--dnd{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-dnd.svg');\n\t\t\tbackground-color: #ffffff;\n\t\t}\n\t\t&--away{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-away.svg');\n\t\t}\n\t\t&--icon {\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t}\n\t}\n\n\t.popovermenu-wrapper {\n\t\tposition: relative;\n\t\tdisplay: inline-block;\n\t}\n}\n\n.avatar-class-icon {\n\tborder-radius: 50%;\n\tbackground-color: var(--color-background-darker);\n\theight: 100%;\n}\n\n"],sourceRoot:""}]),t.Z=u},430:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-771b8b5f]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.vue-crumb[data-v-771b8b5f]{background-image:none;display:inline-flex;height:44px;padding:0}.vue-crumb[data-v-771b8b5f]:last-child{max-width:210px;font-weight:bold}.vue-crumb:last-child>a[data-v-771b8b5f],.vue-crumb:last-child>a[data-v-771b8b5f] *{cursor:default}.vue-crumb:last-child .vue-crumb__separator[data-v-771b8b5f]{display:none}.vue-crumb:not(:last-child)>a[data-v-771b8b5f]:hover,.vue-crumb:not(:last-child)>a[data-v-771b8b5f]:focus{background-color:var(--color-background-dark);color:var(--color-main-text)}.vue-crumb--hidden[data-v-771b8b5f]{display:none}.vue-crumb.vue-crumb--hovered>a[data-v-771b8b5f]{background-color:var(--color-background-dark);color:var(--color-main-text)}.vue-crumb__separator[data-v-771b8b5f]{padding:0;color:var(--color-text-maxcontrast)}.vue-crumb>a[data-v-771b8b5f]{overflow:hidden;color:var(--color-text-maxcontrast);padding:12px;max-width:100%;border-radius:var(--border-radius-pill);align-items:center;display:inline-flex}.vue-crumb>a>span[data-v-771b8b5f]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vue-crumb[data-v-771b8b5f] .action-item{max-width:100%}.vue-crumb[data-v-771b8b5f] .action-item .trigger{max-width:100%}.vue-crumb[data-v-771b8b5f] .action-item__menutoggle--with-title,.vue-crumb[data-v-771b8b5f] .action-item--single--with-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;display:inline-block;background-color:unset;border:none;padding-right:44px;padding-left:14px}.vue-crumb[data-v-771b8b5f] .action-item__menutoggle--with-title:hover,.vue-crumb[data-v-771b8b5f] .action-item__menutoggle--with-title:focus,.vue-crumb[data-v-771b8b5f] .action-item__menutoggle--with-title:active,.vue-crumb[data-v-771b8b5f] .action-item--single--with-title:hover,.vue-crumb[data-v-771b8b5f] .action-item--single--with-title:focus,.vue-crumb[data-v-771b8b5f] .action-item--single--with-title:active{background-color:var(--color-background-dark) !important;color:var(--color-main-text)}.vue-crumb[data-v-771b8b5f] .action-item__menutoggle--with-title>span.material-design-icon,.vue-crumb[data-v-771b8b5f] .action-item--single--with-title>span.material-design-icon{right:0;left:unset}.vue-crumb[data-v-771b8b5f] .action-item.action-item--open .action-item__menutoggle--with-title{background-color:var(--color-background-dark);color:var(--color-main-text)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Breadcrumb/Breadcrumb.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCsOxB,4BACC,qBAAsB,CACtB,mBAAoB,CACpB,WCxNoB,CDyNpB,SAAU,CAJX,uCAOE,eAAgB,CAChB,gBAAiB,CARnB,oFAYG,cAAe,CAZlB,6DAiBG,YAAa,CAjBhB,0GAyBG,6CAA8C,CAC9C,4BAA6B,CAC7B,oCAID,YAAa,CA/Bf,iDAmCE,6CAA8C,CAC9C,4BAA6B,CAC7B,uCAGA,SAAU,CACV,mCAAoC,CAzCtC,8BA6CE,eAAgB,CAChB,mCAAoC,CACpC,YAAa,CACb,cAAe,CACf,uCAAwC,CACxC,kBAAmB,CACnB,mBAAoB,CAnDtB,mCAsDG,eAAgB,CAChB,sBAAuB,CACvB,kBAAmB,CAxDtB,yCAgEE,cAAe,CAhEjB,kDAkEG,cAAe,CAlElB,8HAwEG,cAAe,CACf,eAAgB,CAChB,sBAAuB,CACvB,kBAAmB,CACnB,UAAW,CACX,oBAAqB,CAErB,sBAAuB,CACvB,WAAY,CAUZ,kBAAmB,CACnB,iBAAkB,CA3FrB,gaAqFI,wDAAyD,CACzD,4BAA6B,CAtFjC,kLA6FI,OAAQ,CACR,UAAW,CA9Ff,gGAmGG,6CAA8C,CAC9C,4BAA6B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.vue-crumb {\n\tbackground-image: none;\n\tdisplay: inline-flex;\n\theight: $clickable-area;\n\tpadding: 0;\n\n\t&:last-child {\n\t\tmax-width: 210px;\n\t\tfont-weight: bold;\n\n\t\t> a,\n\t\t> a::v-deep * {\n\t\t\tcursor: default;\n\t\t}\n\n\t\t// Don't show breadcrumb separator for last crumb\n\t\t.vue-crumb__separator {\n\t\t\tdisplay: none;\n\t\t}\n\t}\n\n\t// Hover and focus effect for crumbs, but not the last one\n\t&:not(:last-child) > a {\n\t\t&:hover,\n\t\t&:focus {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t\tcolor: var(--color-main-text);\n\t\t}\n\t}\n\n\t&--hidden {\n\t\tdisplay: none;\n\t}\n\n\t&#{&}--hovered > a {\n\t\tbackground-color: var(--color-background-dark);\n\t\tcolor: var(--color-main-text);\n\t}\n\n\t&__separator {\n\t\tpadding: 0;\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t> a {\n\t\toverflow: hidden;\n\t\tcolor: var(--color-text-maxcontrast);\n\t\tpadding: 12px;\n\t\tmax-width: 100%;\n\t\tborder-radius: var(--border-radius-pill);\n\t\talign-items: center;\n\t\tdisplay: inline-flex;\n\n\t\t> span {\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t}\n\t}\n\n\t// Adjust action item appearance for crumbs with actions\n\t// to match other crumbs\n\t&::v-deep .action-item {\n\t\t// Adjustments necessary to correctly shrink on small screens\n\t\tmax-width: 100%;\n\t\t.trigger {\n\t\t\tmax-width: 100%;\n\t\t}\n\n\t\t&__menutoggle--with-title,\n\t\t&--single--with-title {\n\t\t\t// Adjustments necessary to correctly shrink on small screens\n\t\t\tmax-width: 100%;\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t\twhite-space: nowrap;\n\t\t\twidth: 100%;\n\t\t\tdisplay: inline-block;\n\n\t\t\tbackground-color: unset;\n\t\t\tborder: none;\n\n\t\t\t&:hover,\n\t\t\t&:focus,\n\t\t\t&:active {\n\t\t\t\tbackground-color: var(--color-background-dark) !important;\n\t\t\t\tcolor: var(--color-main-text);\n\t\t\t}\n\n\t\t\t// Show the icon on the right\n\t\t\tpadding-right: 44px;\n\t\t\tpadding-left: 14px;\n\t\t\t& > span.material-design-icon {\n\t\t\t\tright: 0;\n\t\t\t\tleft: unset;\n\t\t\t}\n\t\t}\n\t\t// Adjust the background of the last crumb when the action is open\n\t\t&.action-item--open .action-item__menutoggle--with-title {\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t\tcolor: var(--color-main-text);\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},9474:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-2d7b61fe]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.breadcrumb[data-v-2d7b61fe]{width:100%;flex-grow:1;display:inline-flex}.breadcrumb--collapsed .vue-crumb[data-v-2d7b61fe]:last-child{min-width:100px;flex-shrink:1}.breadcrumb .breadcrumb__crumbs[data-v-2d7b61fe]{flex-shrink:1;max-width:100%;min-width:228px}.breadcrumb .breadcrumb__crumbs[data-v-2d7b61fe],.breadcrumb .breadcrumb__actions[data-v-2d7b61fe]{display:inline-flex}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Breadcrumbs/Breadcrumbs.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC+jBxB,6BACC,UAAW,CACX,WAAY,CACZ,mBAAoB,CAEpB,8DACC,eAAgB,CAChB,aAAc,CAPhB,iDAWE,aAAc,CACd,cAAe,CAKf,eAAgB,CAjBlB,mGAsBE,mBAAoB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.breadcrumb {\n\twidth: 100%;\n\tflex-grow: 1;\n\tdisplay: inline-flex;\n\n\t&--collapsed .vue-crumb:last-child {\n\t\tmin-width: 100px;\n\t\tflex-shrink: 1;\n\t}\n\n\t& #{&}__crumbs {\n\t\tflex-shrink: 1;\n\t\tmax-width: 100%;\n\t\t/**\n\t\t * This value is given by the min-width of the last crumb (100px) plus\n\t\t * two times the width of a crumb with an icon (first crumb and hidden crumbs actions).\n\t\t */\n\t\tmin-width: 228px;\n\t}\n\n\t& #{&}__crumbs,\n\t& #{&}__actions {\n\t\tdisplay: inline-flex;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},3352:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-27e36536]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.button-vue[data-v-27e36536]{position:relative;width:fit-content;overflow:hidden;border:0;padding:0;font-size:var(--default-font-size);font-weight:bold;min-height:44px;min-width:44px;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:22px;transition:background-color 0.1s linear !important;transition:border 0.1s linear;background-color:var(--color-primary-element-lighter);color:var(--color-primary-light-text)}.button-vue *[data-v-27e36536]{cursor:pointer}.button-vue[data-v-27e36536]:focus{outline:none}.button-vue[data-v-27e36536]:disabled{cursor:default;opacity:.5;filter:saturate(.7)}.button-vue:disabled *[data-v-27e36536]{cursor:default}.button-vue[data-v-27e36536]:hover:not(:disabled){background-color:var(--color-primary-light-hover)}.button-vue[data-v-27e36536]:active{background-color:var(--color-primary-element-lighter)}.button-vue__wrapper[data-v-27e36536]{display:inline-flex;align-items:center;justify-content:space-around}.button-vue__icon[data-v-27e36536]{height:44px;width:44px;min-height:44px;min-width:44px;display:flex;justify-content:center;align-items:center}.button-vue__text[data-v-27e36536]{font-weight:bold;margin-bottom:1px;padding:2px 0}.button-vue--icon-only[data-v-27e36536]{width:44px !important}.button-vue--text-only[data-v-27e36536]{padding:0 12px}.button-vue--text-only .button-vue__text[data-v-27e36536]{margin-left:4px;margin-right:4px}.button-vue--icon-and-text[data-v-27e36536]{padding:0 16px 0 4px}.button-vue--wide[data-v-27e36536]{width:100%}.button-vue--tabbed[data-v-27e36536],.button-vue[data-v-27e36536]:focus-visible{box-shadow:0 0 0 2px var(--color-main-text);background-color:var(--color-primary-light-hover)}.button-vue--tabbed.button-vue--vue-primary[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-primary[data-v-27e36536]{background-color:var(--color-primary-hover)}.button-vue--tabbed.button-vue--vue-secondary[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-secondary[data-v-27e36536]{box-shadow:0 0 0 2px var(--color-main-text)}.button-vue--tabbed.button-vue--vue-tertiary-no-background[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-tertiary-no-background[data-v-27e36536]{opacity:1}.button-vue--tabbed.button-vue--vue-success[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-success[data-v-27e36536]{background-color:var(--color-success-hover)}.button-vue--tabbed.button-vue--vue-warning[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-warning[data-v-27e36536]{background-color:var(--color-warning-hover)}.button-vue--tabbed.button-vue--vue-error[data-v-27e36536],.button-vue:focus-visible.button-vue--vue-error[data-v-27e36536]{background-color:var(--color-error-hover)}.button-vue--vue-primary[data-v-27e36536]{background-color:var(--color-primary-element);color:var(--color-primary-text)}.button-vue--vue-primary[data-v-27e36536]:hover:not(:disabled){background-color:var(--color-primary-element-hover)}.button-vue--vue-primary[data-v-27e36536]:active{background-color:var(--color-primary-element)}.button-vue--vue-secondary[data-v-27e36536]{color:var(--color-main-text);background-color:var(--color-background-dark);box-shadow:0 0 0 2px var(--color-border-dark)}.button-vue--vue-secondary[data-v-27e36536]:hover:not(:disabled){color:var(--color-main-text);background-color:var(--color-background-dark);box-shadow:0 0 0 2px var(--color-primary-element)}.button-vue--vue-tertiary[data-v-27e36536]{color:var(--color-main-text);background-color:transparent}.button-vue--vue-tertiary[data-v-27e36536]:hover:not(:disabled){background-color:var(--color);background-color:var(--color-background-hover)}.button-vue--vue-tertiary-no-background[data-v-27e36536]{color:var(--color-main-text);background-color:transparent;opacity:.7}.button-vue--vue-tertiary-no-background[data-v-27e36536]:hover:not(:disabled){background-color:transparent;opacity:1}.button-vue--vue-success[data-v-27e36536]{background-color:var(--color-success);color:white}.button-vue--vue-success[data-v-27e36536]:hover:not(:disabled){background-color:var(--color-success-hover)}.button-vue--vue-success[data-v-27e36536]:active{background-color:var(--color-success)}.button-vue--vue-warning[data-v-27e36536]{background-color:var(--color-warning);color:white}.button-vue--vue-warning[data-v-27e36536]:hover:not(:disabled){background-color:var(--color-warning-hover)}.button-vue--vue-warning[data-v-27e36536]:active{background-color:var(--color-warning)}.button-vue--vue-error[data-v-27e36536]{background-color:var(--color-error);color:white}.button-vue--vue-error[data-v-27e36536]:hover:not(:disabled){background-color:var(--color-error-hover)}.button-vue--vue-error[data-v-27e36536]:active{background-color:var(--color-error)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Button/Button.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC0YxB,6BACC,iBAAkB,CAClB,iBAAkB,CAClB,eAAgB,CAChB,QAAS,CACT,SAAU,CACV,kCAAmC,CACnC,gBAAiB,CACjB,eCjYoB,CDkYpB,cClYoB,CDmYpB,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CAGvB,cAAe,CAIf,kBAAkC,CAClC,kDAAmD,CACnD,6BAA8B,CAkB9B,qDAAsD,CACtD,qCAAsC,CAxCvC,+BAiBE,cAAe,CAjBjB,mCAyBE,YAAa,CAzBf,sCA6BE,cAAe,CAIf,UCzYmB,CD2YnB,mBAAiC,CAnCnC,wCA+BG,cAAe,CA/BlB,kDA0CE,iDAAkD,CA1CpD,oCAgDE,qDAAsD,CACtD,sCAGA,mBAAoB,CACpB,kBAAmB,CACnB,4BAA6B,CAC7B,mCAGA,WCnbmB,CDobnB,UCpbmB,CDqbnB,eCrbmB,CDsbnB,cCtbmB,CDubnB,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,mCAGA,gBAAiB,CACjB,iBAAkB,CAClB,aAAc,CACd,wCAIA,qBAAiC,CACjC,wCAIA,cAAe,CADf,0DAGC,eAAgB,CAChB,gBAAiB,CACjB,4CAKD,oBAAqB,CACrB,mCAIA,UAAW,CACX,gFAMA,2CAA4C,CAC5C,iDAAkD,CAFlD,gIAIC,2CAA4C,CAJ7C,oIAOC,2CAA4C,CAP7C,8JAUC,SAAU,CAVX,gIAaC,2CAA4C,CAb7C,gIAgBC,2CAA4C,CAhB7C,4HAmBC,yCAA0C,CAC1C,0CAOD,6CAA8C,CAC9C,+BAAgC,CAFhC,+DAIC,mDAAoD,CAJrD,iDASC,6CAA8C,CAC9C,4CAKD,4BAA6B,CAC7B,6CAA8C,CAC9C,6CAA8C,CAH9C,iEAKC,4BAA6B,CAC7B,6CAA8C,CAC9C,iDAAkD,CAClD,2CAKD,4BAA6B,CAC7B,4BAA6B,CAF7B,gEAIC,6BAA8B,CAC9B,8CAA+C,CAC/C,yDAKD,4BAA6B,CAC7B,4BAA6B,CAC7B,UAAW,CAHX,8EAKC,4BAA6B,CAC7B,SAAU,CACV,0CAKD,qCAAsC,CACtC,WAAY,CAFZ,+DAIC,2CAA4C,CAJ7C,iDASC,qCAAsC,CACtC,0CAKD,qCAAsC,CACtC,WAAY,CAFZ,+DAIC,2CAA4C,CAJ7C,iDASC,qCAAsC,CACtC,wCAKD,mCAAoC,CACpC,WAAY,CAFZ,6DAIC,yCAA0C,CAJ3C,+CASC,mCAAoC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.button-vue {\n\tposition: relative;\n\twidth: fit-content;\n\toverflow: hidden;\n\tborder: 0;\n\tpadding: 0;\n\tfont-size: var(--default-font-size);\n\tfont-weight: bold;\n\tmin-height: $clickable-area;\n\tmin-width: $clickable-area;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\n\t// Cursor pointer on element and all children\n\tcursor: pointer;\n\t& * {\n\t\tcursor: pointer;\n\t}\n\tborder-radius: $clickable-area / 2;\n\ttransition: background-color 0.1s linear !important;\n\ttransition: border 0.1s linear;\n\n\t// No outline feedback for focus. Handled with a toggled class in js (see data)\n\t&:focus {\n\t\toutline: none;\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t\t& * {\n\t\t\tcursor: default;\n\t\t}\n\t\topacity: $opacity_disabled;\n\t\t// Gives a wash out effect\n\t\tfilter: saturate($opacity_normal);\n\t}\n\n\t// Default button type\n\tbackground-color: var(--color-primary-element-lighter);\n\tcolor: var(--color-primary-light-text);\n\t&:hover:not(:disabled) {\n\t\tbackground-color: var(--color-primary-light-hover);\n\t}\n\n\t// Back to the default color for this button when active\n\t// TODO: add ripple effect\n\t&:active {\n\t\tbackground-color: var(--color-primary-element-lighter);\n\t}\n\n\t&__wrapper {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: space-around;\n\t}\n\n\t&__icon {\n\t\theight: $clickable-area;\n\t\twidth: $clickable-area;\n\t\tmin-height: $clickable-area;\n\t\tmin-width: $clickable-area;\n\t\tdisplay: flex;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t}\n\n\t&__text {\n\t\tfont-weight: bold;\n\t\tmargin-bottom: 1px;\n\t\tpadding: 2px 0;\n\t}\n\n\t// Icon-only button\n\t&--icon-only {\n\t\twidth: $clickable-area !important;\n\t}\n\n\t// Text-only button\n\t&--text-only {\n\t\tpadding: 0 12px;\n\t\t& .button-vue__text {\n\t\t\tmargin-left: 4px;\n\t\t\tmargin-right: 4px;\n\t\t}\n\t}\n\n\t// Icon and text button\n\t&--icon-and-text {\n\t\tpadding: 0 16px 0 4px;\n\t}\n\n\t// Wide button spans the whole width of the container\n\t&--wide {\n\t\twidth: 100%;\n\t}\n\n\t// We use box-shadow around our buttons instead of an outline, so that the added \"border\"\n\t// coincides with the border of the element. It's not possible to add a border-radius to\n\t// the outline\n\t&--tabbed, &:focus-visible {\n\t\tbox-shadow: 0 0 0 2px var(--color-main-text);\n\t\tbackground-color: var(--color-primary-light-hover);\n\t\t&.button-vue--vue-primary {\n\t\t\tbackground-color: var(--color-primary-hover);\n\t\t}\n\t\t&.button-vue--vue-secondary {\n\t\t\tbox-shadow: 0 0 0 2px var(--color-main-text);\n\t\t}\n\t\t&.button-vue--vue-tertiary-no-background {\n\t\t\topacity: 1;\n\t\t}\n\t\t&.button-vue--vue-success {\n\t\t\tbackground-color: var(--color-success-hover);\n\t\t}\n\t\t&.button-vue--vue-warning {\n\t\t\tbackground-color: var(--color-warning-hover);\n\t\t}\n\t\t&.button-vue--vue-error {\n\t\t\tbackground-color: var(--color-error-hover);\n\t\t}\n\t}\n\n\t// Button types\n\n\t// Primary\n\t&--vue-primary {\n\t\tbackground-color: var(--color-primary-element);\n\t\tcolor: var(--color-primary-text);\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-primary-element-hover);\n\t\t}\n\t\t// Back to the default color for this button when active\n\t\t// TODO: add ripple effect\n\t\t&:active {\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t}\n\t}\n\n\t// Secondary\n\t&--vue-secondary {\n\t\tcolor: var(--color-main-text);\n\t\tbackground-color: var(--color-background-dark);\n\t\tbox-shadow: 0 0 0 2px var(--color-border-dark);\n\t\t&:hover:not(:disabled) {\n\t\t\tcolor: var(--color-main-text);\n\t\t\tbackground-color: var(--color-background-dark);\n\t\t\tbox-shadow: 0 0 0 2px var(--color-primary-element);\n\t\t}\n\t}\n\n\t// Tertiary\n\t&--vue-tertiary {\n\t\tcolor: var(--color-main-text);\n\t\tbackground-color: transparent;\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color);\n\t\t\tbackground-color: var(--color-background-hover);\n\t\t}\n\t}\n\n\t// Tertiary, no background\n\t&--vue-tertiary-no-background {\n\t\tcolor: var(--color-main-text);\n\t\tbackground-color: transparent;\n\t\topacity: .7;\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: transparent;\n\t\t\topacity: 1;\n\t\t}\n\t}\n\n\t// Success\n\t&--vue-success {\n\t\tbackground-color: var(--color-success);\n\t\tcolor: white;\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-success-hover);\n\t\t}\n\t\t// Back to the default color for this button when active\n\t\t// : add ripple effect\n\t\t&:active {\n\t\t\tbackground-color: var(--color-success);\n\t\t}\n\t}\n\n\t// Warning\n\t&--vue-warning {\n\t\tbackground-color: var(--color-warning);\n\t\tcolor: white;\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-warning-hover);\n\t\t}\n\t\t// Back to the default color for this button when active\n\t\t// TODO: add ripple effect\n\t\t&:active {\n\t\t\tbackground-color: var(--color-warning);\n\t\t}\n\t}\n\n\t// Error\n\t&--vue-error {\n\t\tbackground-color: var(--color-error);\n\t\tcolor: white;\n\t\t&:hover:not(:disabled) {\n\t\t\tbackground-color: var(--color-error-hover);\n\t\t}\n\t\t// Back to the default color for this button when active\n\t\t// TODO: add ripple effect\n\t\t&:active {\n\t\t\tbackground-color: var(--color-error);\n\t\t}\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},2778:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-036397c2]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.checkbox-radio-switch[data-v-036397c2]{display:flex}.checkbox-radio-switch__input[data-v-036397c2]{position:fixed;z-index:-1;top:-5000px;left:-5000px;opacity:0}.checkbox-radio-switch__label[data-v-036397c2]{display:flex;align-items:center;user-select:none;height:44px;border-radius:44px;padding:0 14px;margin:0 -14px}.checkbox-radio-switch__label[data-v-036397c2],.checkbox-radio-switch__label *[data-v-036397c2]{cursor:pointer}.checkbox-radio-switch__icon[data-v-036397c2]{margin-right:4px;margin-left:-2px;color:var(--color-primary-element);width:var(--icon-size);height:var(--icon-size)}.checkbox-radio-switch--disabled .checkbox-radio-switch__label[data-v-036397c2]{opacity:.5}.checkbox-radio-switch--disabled .checkbox-radio-switch__label .checkbox-radio-switch__icon[data-v-036397c2]{color:var(--color-text-light)}.checkbox-radio-switch:not(.checkbox-radio-switch--disabled) .checkbox-radio-switch__input:hover+.checkbox-radio-switch__label[data-v-036397c2],.checkbox-radio-switch:not(.checkbox-radio-switch--disabled) .checkbox-radio-switch__input:focus+.checkbox-radio-switch__label[data-v-036397c2]{background-color:var(--color-primary-light)}.checkbox-radio-switch-switch:not(.checkbox-radio-switch--checked) .checkbox-radio-switch__icon[data-v-036397c2]{color:var(--color-text-lighter)}.checkbox-radio-switch-switch.checkbox-radio-switch--disabled.checkbox-radio-switch--checked .checkbox-radio-switch__icon[data-v-036397c2]{color:var(--color-primary-element-light)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/CheckboxRadioSwitch/CheckboxRadioSwitch.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCmZxB,wCACC,YAAa,CAEb,+CACC,cAAe,CACf,UAAW,CACX,WAAY,CACZ,YAAa,CACb,SAAU,CACV,+CAGA,YAAa,CACb,kBAAmB,CACnB,gBAAiB,CACjB,WCjZmB,CDkZnB,kBClZmB,CDmZnB,cC3Y8C,CD4Y9C,cAA0B,CAP1B,gGAUC,cAAe,CACf,8CAID,gBA5BW,CA8BX,gBAAiB,CACjB,kCAAmC,CACnC,sBAAuB,CACvB,uBAAwB,CACxB,gFAGA,UCpZmB,CDmZnB,6GAGC,6BAA8B,CArCjC,gSA2CE,2CAA4C,CAC5C,iHAIA,+BAAgC,CAChC,2IAIA,wCAAyC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$spacing: 4px;\n\n.checkbox-radio-switch {\n\tdisplay: flex;\n\n\t&__input {\n\t\tposition: fixed;\n\t\tz-index: -1;\n\t\ttop: -5000px;\n\t\tleft: -5000px;\n\t\topacity: 0;\n\t}\n\n\t&__label {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tuser-select: none;\n\t\theight: $clickable-area;\n\t\tborder-radius: $clickable-area;\n\t\tpadding: 0 $icon-margin;\n\t\tmargin: 0 #{-$icon-margin};\n\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t&__icon {\n\t\tmargin-right: $spacing;\n\t\t// Remove the left margin of material design icons to align text\n\t\tmargin-left: -2px;\n\t\tcolor: var(--color-primary-element);\n\t\twidth: var(--icon-size);\n\t\theight: var(--icon-size);\n\t}\n\n\t&--disabled &__label {\n\t\topacity: $opacity_disabled;\n\t\t.checkbox-radio-switch__icon {\n\t\t\tcolor: var(--color-text-light)\n\t\t}\n\t}\n\n\t&:not(&--disabled) &__input:hover + &__label,\n\t&:not(&--disabled) &__input:focus + &__label {\n\t\tbackground-color: var(--color-primary-light);\n\t}\n\n\t// Switch specific rules\n\t&-switch:not(&--checked) &__icon {\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t// If switch is checked AND disabled, use the fade primary colour\n\t&-switch.checkbox-radio-switch--disabled.checkbox-radio-switch--checked &__icon {\n\t\tcolor: var(--color-primary-element-light);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},5682:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-146dc9d9]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.color-picker[data-v-146dc9d9]{display:flex;overflow:hidden;align-content:flex-end;flex-direction:column;justify-content:space-between;box-sizing:content-box !important;width:176px;padding:4px;border-radius:3px;height:196px}.color-picker__simple[data-v-146dc9d9]{display:grid;grid-template-columns:repeat(4, 44px);grid-auto-rows:44px}.color-picker__simple-color-circle[data-v-146dc9d9]{display:flex;align-items:center;justify-content:center;width:34px;height:34px;min-height:34px;margin:auto;padding:0;color:white;border:none;border-radius:17px;font-size:16px}.color-picker__simple-color-circle[data-v-146dc9d9]:hover{opacity:.6}.color-picker__simple-color-circle--active[data-v-146dc9d9]{opacity:1 !important}.color-picker__advanced[data-v-146dc9d9]{box-shadow:none !important}.color-picker__navigation[data-v-146dc9d9]{display:flex;flex-direction:row;justify-content:space-between;margin-top:10px}.color-picker__navigation-button[data-v-146dc9d9]{display:flex;align-content:center;justify-content:center;min-width:44px;height:44px;padding:0;margin:0;border:none;border-radius:22px;background:none;justify-self:flex-end;opacity:.7}.color-picker__navigation-button[data-v-146dc9d9]:focus,.color-picker__navigation-button[data-v-146dc9d9]:hover{background-color:rgba(127,127,127,0.25);opacity:1}.color-picker__navigation-button.confirm[data-v-146dc9d9]{display:flex;align-items:center;justify-content:center;padding:4px 8px;color:white !important;background-color:var(--color-primary)}.color-picker__navigation-button.confirm[data-v-146dc9d9]:hover{background-color:var(--color-primary-element-light)}.color-picker__navigation-button.more-settings[data-v-146dc9d9]{margin-left:auto}[data-v-146dc9d9] .vc-chrome{width:176px;height:13}[data-v-146dc9d9] .vc-chrome-color-wrap{width:30px;height:30px}[data-v-146dc9d9] .vc-chrome-active-color{width:34px;height:34px;border-radius:17px}[data-v-146dc9d9] .vc-chrome-body{padding:14px 0 0 0}[data-v-146dc9d9] .vc-chrome-saturation-wrap{border-radius:3px}[data-v-146dc9d9] .vc-chrome-saturation-circle{width:20px;height:20px}.slide-enter[data-v-146dc9d9]{transform:translateX(-50%);opacity:0}.slide-enter-to[data-v-146dc9d9]{transform:translateX(0);opacity:1}.slide-leave[data-v-146dc9d9]{transform:translateX(0);opacity:1}.slide-leave-to[data-v-146dc9d9]{transform:translateX(-50%);opacity:0}.slide-enter-active[data-v-146dc9d9],.slide-leave-active[data-v-146dc9d9]{transition:all 50ms ease-in-out}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/ColorPicker/ColorPicker.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC4QxB,+BACC,YAAa,CACb,eAAgB,CAChB,sBAAuB,CACvB,qBAAsB,CACtB,6BAA8B,CAC9B,iCAAkC,CAClC,WAAY,CACZ,WAAY,CACZ,iBAAkB,CAClB,YAAa,CAEb,uCACC,YAAa,CACb,qCAAiD,CACjD,mBC1QmB,CD4QnB,oDACC,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,UAAW,CACX,WAAY,CACZ,eAAgB,CAChB,WAAY,CACZ,SAAU,CACV,WAAY,CACZ,WAAY,CACZ,kBAAmB,CACnB,cAAe,CAZf,0DAcC,UAAW,CACX,4DAEA,oBAAqB,CACrB,yCAKF,0BAA2B,CAC3B,2CAGA,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,eAAgB,CAChB,kDACC,YAAa,CACb,oBAAqB,CACrB,sBAAuB,CACvB,cC/SkB,CDgTlB,WChTkB,CDiTlB,SAAU,CACV,QAAS,CACT,WAAY,CACZ,kBAAkC,CAClC,eAAgB,CAChB,qBAAsB,CACtB,UCrSgB,CDyRhB,gHAgBC,uCChToC,CDiTpC,SCzSY,CDwRb,0DAqBC,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,eAAgB,CAChB,sBAAuB,CACvB,qCAAsC,CA1BvC,gEA4BE,mDAAoD,CA5BtD,gEAgCC,gBAAiB,CACjB,6BAOF,WAAY,CACZ,SAAU,CAHZ,wCAKG,UAAW,CACX,WAAY,CANf,0CAUG,UAAW,CACX,WAAY,CACZ,kBAAmB,CAZtB,kCAgBG,kBAAmB,CAhBtB,6CAqBI,iBAAkB,CArBtB,+CAyBI,UAAW,CACX,WAAY,CACZ,8BAOF,0BAA2B,CAC3B,SAAU,CACV,iCAEA,uBAAwB,CACxB,SAAU,CACV,8BAEA,uBAAwB,CACxB,SAAU,CACV,iCAEA,0BAA2B,CAC3B,SAAU,CACV,0EAGA,+BAAgC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.color-picker {\n\tdisplay: flex;\n\toverflow: hidden;\n\talign-content: flex-end;\n\tflex-direction: column;\n\tjustify-content: space-between;\n\tbox-sizing: content-box !important;\n\twidth: 176px;\n\tpadding: 4px;\n\tborder-radius: 3px;\n\theight: 196px;\n\n\t&__simple {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: repeat(4, $clickable-area);\n\t\tgrid-auto-rows: $clickable-area;\n\n\t\t&-color-circle {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\twidth: 34px;\n\t\t\theight: 34px;\n\t\t\tmin-height: 34px;\n\t\t\tmargin: auto;\n\t\t\tpadding: 0;\n\t\t\tcolor: white;\n\t\t\tborder: none;\n\t\t\tborder-radius: 17px;\n\t\t\tfont-size: 16px;\n\t\t\t&:hover {\n\t\t\t\topacity: .6;\n\t\t\t}\n\t\t\t&--active {\n\t\t\t\topacity: 1 !important;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__advanced {\n\t\tbox-shadow: none !important;\n\t}\n\n\t&__navigation {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tjustify-content: space-between;\n\t\tmargin-top: 10px;\n\t\t&-button {\n\t\t\tdisplay: flex;\n\t\t\talign-content: center;\n\t\t\tjustify-content: center;\n\t\t\tmin-width: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\tpadding: 0;\n\t\t\tmargin: 0;\n\t\t\tborder: none;\n\t\t\tborder-radius: $clickable-area / 2;\n\t\t\tbackground: none;\n\t\t\tjustify-self: flex-end;\n\t\t\topacity: $opacity_normal;\n\n\t\t\t&:focus,\n\t\t\t&:hover {\n\t\t\t\tbackground-color: $icon-focus-bg;\n\t\t\t\topacity: $opacity_full;\n\t\t\t}\n\n\t\t\t&.confirm {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\tpadding: 4px 8px;\n\t\t\t\tcolor: white !important;\n\t\t\t\tbackground-color: var(--color-primary);\n\t\t\t\t&:hover {\n\t\t\t\t\tbackground-color: var(--color-primary-element-light);\n\t\t\t\t}\n\t\t\t}\n\t\t\t&.more-settings {\n\t\t\t\tmargin-left: auto;\n\t\t\t}\n\t\t}\n\t}\n}\n\n::v-deep .vc {\n\t&-chrome {\n\t\twidth: 176px;\n\t\theight: 13;\n\t\t&-color-wrap {\n\t\t\twidth: 30px;\n\t\t\theight: 30px;\n\t\t}\n\n\t\t&-active-color {\n\t\t\twidth: 34px;\n\t\t\theight: 34px;\n\t\t\tborder-radius: 17px;\n\t\t}\n\n\t\t&-body {\n\t\t\tpadding: 14px 0 0 0;\n\t\t}\n\n\t\t&-saturation {\n\t\t\t&-wrap {\n\t\t\t\tborder-radius: 3px;\n\t\t\t}\n\n\t\t\t&-circle {\n\t\t\t\twidth: 20px;\n\t\t\t\theight: 20px;\n\t\t\t}\n\t\t}\n\t}\n}\n\n.slide {\n\t&-enter {\n\t\ttransform: translateX(-50%);\n\t\topacity: 0;\n\t}\n\t&-enter-to {\n\t\ttransform: translateX(0);\n\t\topacity: 1;\n\t}\n\t&-leave {\n\t\ttransform: translateX(0);\n\t\topacity: 1;\n\t}\n\t&-leave-to {\n\t\ttransform: translateX(-50%);\n\t\topacity: 0;\n\t}\n\t&-enter-active,\n\t&-leave-active {\n\t\ttransition: all 50ms ease-in-out;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},6919:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-4d37098a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.content[data-v-4d37098a]{box-sizing:border-box;position:relative;display:flex;padding-top:50px;min-height:100%}.content[data-v-4d37098a] *{box-sizing:border-box}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Content/Content.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC0ExB,0BACC,qBAAsB,CACtB,iBAAkB,CAClB,YAAa,CACb,gBAAiB,CACjB,eAAgB,CALjB,6BAOE,qBAAsB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.content {\n\tbox-sizing: border-box;\n\tposition: relative;\n\tdisplay: flex;\n\tpadding-top: 50px;\n\tmin-height: 100%;\n\t::v-deep * {\n\t\tbox-sizing: border-box;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},8560:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-0f57a605]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.counter-bubble__counter[data-v-0f57a605]{font-size:calc(var(--default-font-size) * .8);overflow:hidden;width:fit-content;max-width:44px;text-align:center;text-overflow:ellipsis;line-height:1em;padding:4px 6px;border-radius:var(--border-radius-pill);background-color:var(--color-background-darker);font-weight:bold}.counter-bubble__counter--highlighted[data-v-0f57a605]{color:var(--color-primary-text);background-color:var(--color-primary)}.counter-bubble__counter--outlined[data-v-0f57a605]{color:var(--color-primary);background:transparent;box-shadow:inset 0 0 0 2px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/CounterBubble/CounterBubble.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCwExB,0CACC,6CAA8C,CAC9C,eAAgB,CAChB,iBAAkB,CAClB,cC3DoB,CD4DpB,iBAAkB,CAClB,sBAAuB,CACvB,eAAgB,CAChB,eAAgB,CAChB,uCAAwC,CACxC,+CAAgD,CAChD,gBAAiB,CAEjB,uDACC,+BAAgC,CAChC,qCAAsC,CACtC,oDAGA,0BAA2B,CAC3B,sBAAuB,CACvB,0BAA2B",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.counter-bubble__counter {\n\tfont-size: calc(var(--default-font-size) * .8);\n\toverflow: hidden;\n\twidth: fit-content;\n\tmax-width: $clickable-area;\n\ttext-align: center;\n\ttext-overflow: ellipsis;\n\tline-height: 1em;\n\tpadding: 4px 6px;\n\tborder-radius: var(--border-radius-pill);\n\tbackground-color: var(--color-background-darker);\n\tfont-weight: bold;\n\n\t&--highlighted {\n\t\tcolor: var(--color-primary-text);\n\t\tbackground-color: var(--color-primary);\n\t}\n\n\t&--outlined {\n\t\tcolor: var(--color-primary);\n\t\tbackground: transparent;\n\t\tbox-shadow: inset 0 0 0 2px;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},8004:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-6e184da2]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.datetime-picker-inline-icon[data-v-6e184da2]{opacity:.3;border:none;background-color:transparent;border-radius:0;padding:6px !important}.datetime-picker-inline-icon--highlighted[data-v-6e184da2]{opacity:.7}.datetime-picker-inline-icon[data-v-6e184da2]:focus,.datetime-picker-inline-icon[data-v-6e184da2]:hover{opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/DatetimePicker/DatetimePicker.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC0VxB,8CACC,UAAW,CACX,WAAY,CACZ,4BAA6B,CAC7B,eAAgB,CAChB,sBAAuB,CAEvB,2DACC,UAAW,CARb,wGAaE,SAAU",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.datetime-picker-inline-icon {\n\topacity: .3;\n\tborder: none;\n\tbackground-color: transparent;\n\tborder-radius: 0;\n\tpadding: 6px !important;\n\n\t&--highlighted {\n\t\topacity: .7;\n\t}\n\n\t&:focus,\n\t&:hover {\n\t\topacity: 1;\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},1271:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-c0b73214]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.empty-content[data-v-c0b73214]{display:flex;align-items:center;flex-direction:column;margin-top:20vh}.empty-content__icon[data-v-c0b73214]{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 15px;opacity:.4;background-repeat:no-repeat;background-position:center;background-size:64px}.empty-content__icon[data-v-c0b73214] svg{width:64px;height:64px}.empty-content__title[data-v-c0b73214]{margin-bottom:10px;text-align:center}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/EmptyContent/EmptyContent.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCmFxB,gCACC,YAAa,CACb,kBAAmB,CACnB,qBAAsB,CACtB,eAAgB,CAEhB,sCACC,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,UAAW,CACX,WAAY,CACZ,kBAAmB,CACnB,UAAW,CACX,2BAA4B,CAC5B,0BAA2B,CAC3B,oBAAqB,CAVrB,2CAaC,UAAW,CACX,WAAY,CACZ,uCAID,kBAAmB,CACnB,iBAAkB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.empty-content {\n\tdisplay: flex;\n\talign-items: center;\n\tflex-direction: column;\n\tmargin-top: 20vh;\n\n\t&__icon {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 64px;\n\t\theight: 64px;\n\t\tmargin: 0 auto 15px;\n\t\topacity: .4;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: 64px;\n\n\t\t::v-deep svg {\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t}\n\t}\n\n\t&__title {\n\t\tmargin-bottom: 10px;\n\t\ttext-align: center;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},1087:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-609d49c7]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.list-item__wrapper[data-v-609d49c7]{position:relative;width:100%}.list-item[data-v-609d49c7]{display:block;position:relative;flex:0 0 auto;justify-content:flex-start;padding:8px;border-radius:16px;margin:2px 0;width:100%;cursor:pointer;transition:background-color 200ms ease-in-out;list-style:none}.list-item[data-v-609d49c7]:hover,.list-item[data-v-609d49c7]:focus{background-color:var(--color-background-hover)}.list-item--active[data-v-609d49c7],.list-item[data-v-609d49c7]:active,.list-item:active ~ .app-navigation-entry__utils[data-v-609d49c7]{background-color:var(--color-primary-light)}.list-item-content__wrapper[data-v-609d49c7]{display:flex;align-items:center}.list-item-content[data-v-609d49c7]{display:flex;flex:1 1 auto;justify-content:space-between;padding-left:8px}.list-item-content__main[data-v-609d49c7]{flex:1 1 auto;flex-direction:column;width:0;margin:auto 0}.list-item-content__actions[data-v-609d49c7]{flex:0 0 auto;align-self:center;justify-content:center}.list-item__extra[data-v-609d49c7]{margin-top:4px}.line-one[data-v-609d49c7]{display:flex;align-items:center;justify-content:space-between;white-space:nowrap;margin:0 auto}.line-one--bold[data-v-609d49c7]{font-weight:bold}.line-one__title[data-v-609d49c7]{overflow:hidden;flex-grow:1;cursor:pointer;text-overflow:ellipsis;color:var(--color-main-text)}.line-one__details[data-v-609d49c7]{color:var(--color-text-lighter);margin:0 8px;font-weight:normal}.line-two[data-v-609d49c7]{display:flex;align-items:flex-start;justify-content:space-between;white-space:nowrap}.line-two--bold[data-v-609d49c7]{font-weight:bold}.line-two__subtitle[data-v-609d49c7]{overflow:hidden;flex-grow:1;padding-right:4px;cursor:pointer;white-space:nowrap;text-overflow:ellipsis;color:var(--color-text-lighter)}.line-two__counter[data-v-609d49c7]{margin:2px 4px 0 0}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/ListItem/ListItem.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCgdxB,qCACC,iBAAkB,CAClB,UAAW,CACX,4BAIA,aAAc,CACd,iBAAkB,CAClB,aAAc,CACd,0BAA2B,CAC3B,WAAY,CACZ,kBAAmB,CACnB,YAAa,CACb,UAAW,CACX,cAAe,CACf,6CAA8C,CAC9C,eAAgB,CAXjB,oEAcE,8CAA+C,CAC/C,yIAIA,2CAA4C,CAC5C,6CAGA,YAAa,CACb,kBAAmB,CACnB,oCAGA,YAAa,CACb,aAAc,CACd,6BAA8B,CAC9B,gBAAiB,CAEjB,0CACC,aAAc,CACd,qBAAsB,CACtB,OAAQ,CACR,aAAc,CACd,6CAGA,aAAc,CACd,iBAAkB,CAClB,sBAAuB,CAEvB,mCAID,cAAe,CACf,2BAID,YAAa,CACb,kBAAmB,CACnB,6BAA8B,CAC9B,kBAAmB,CACnB,aAAc,CACd,iCACC,gBAAiB,CACjB,kCAGA,eAAgB,CAChB,WAAY,CACZ,cAAe,CACf,sBAAuB,CACvB,4BAA6B,CAC7B,oCAGA,+BAAgC,CAChC,YAAa,CACb,kBAAmB,CACnB,2BAID,YAAa,CACb,sBAAuB,CACvB,6BAA8B,CAC9B,kBAAmB,CACnB,iCACC,gBAAiB,CACjB,qCAGA,eAAgB,CAChB,WAAY,CACZ,iBAAkB,CAClB,cAAe,CACf,kBAAmB,CACnB,sBAAuB,CACvB,+BAAgC,CAChC,oCAGA,kBAAmB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.list-item__wrapper{\n\tposition: relative;\n\twidth: 100%;\n}\n\n// listItem\n.list-item {\n\tdisplay: block;\n\tposition: relative;\n\tflex: 0 0 auto;\n\tjustify-content: flex-start;\n\tpadding: 8px;\n\tborder-radius: 16px;\n\tmargin: 2px 0;\n\twidth: 100%;\n\tcursor: pointer;\n\ttransition: background-color 200ms ease-in-out;\n\tlist-style: none;\n\t&:hover,\n\t&:focus {\n\t\tbackground-color: var(--color-background-hover);\n\t}\n\t&--active,\n\t&:active,\n\t&:active ~ .app-navigation-entry__utils {\n\t\tbackground-color: var(--color-primary-light);\n\t}\n\n\t&-content__wrapper {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t}\n\n\t&-content {\n\t\tdisplay: flex;\n\t\tflex: 1 1 auto;\n\t\tjustify-content: space-between;\n\t\tpadding-left: 8px;\n\n\t\t&__main {\n\t\t\tflex: 1 1 auto;\n\t\t\tflex-direction: column;\n\t\t\twidth: 0;\n\t\t\tmargin: auto 0;\n\t\t}\n\n\t\t&__actions {\n\t\t\tflex: 0 0 auto;\n\t\t\talign-self: center;\n\t\t\tjustify-content: center;\n\n\t\t}\n\t}\n\n\t&__extra {\n\t\tmargin-top: 4px;\n\t}\n}\n\n.line-one {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\twhite-space: nowrap;\n\tmargin: 0 auto;\n\t&--bold {\n\t\tfont-weight: bold;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tflex-grow: 1;\n\t\tcursor: pointer;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-main-text);\n\t}\n\n\t&__details {\n\t\tcolor: var(--color-text-lighter);\n\t\tmargin: 0 8px;\n\t\tfont-weight: normal;\n\t}\n}\n\n.line-two {\n\tdisplay: flex;\n\talign-items: flex-start;\n\tjustify-content: space-between;\n\twhite-space: nowrap;\n\t&--bold {\n\t\tfont-weight: bold;\n\t}\n\n\t&__subtitle {\n\t\toverflow: hidden;\n\t\tflex-grow: 1;\n\t\tpadding-right: 4px;\n\t\tcursor: pointer;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: var(--color-text-lighter);\n\t}\n\n\t&__counter {\n\t\tmargin: 2px 4px 0 0;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},9863:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-1e7d5981]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.option[data-v-1e7d5981]{display:flex;align-items:center;width:100%;height:var(--height)}.option__avatar[data-v-1e7d5981]{margin-right:var(--margin)}.option__details[data-v-1e7d5981]{display:flex;flex:1 1;flex-direction:column;justify-content:center;min-width:0}.option__lineone[data-v-1e7d5981]{color:var(--color-text-light)}.option__linetwo[data-v-1e7d5981]{opacity:.7}.option__lineone[data-v-1e7d5981],.option__linetwo[data-v-1e7d5981]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;line-height:1.1em}.option__lineone strong[data-v-1e7d5981],.option__linetwo strong[data-v-1e7d5981]{font-weight:bold}.option__icon[data-v-1e7d5981]{flex:0 0 44px;width:44px;height:44px;opacity:.5;background-position:center;background-size:16px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/ListItemIcon/ListItemIcon.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC6NxB,yBACC,YAAa,CACb,kBAAmB,CACnB,UAAW,CACX,oBAAqB,CAErB,iCACC,0BAA2B,CAC3B,kCAGA,YAAa,CACb,QAAS,CACT,qBAAsB,CACtB,sBAAuB,CACvB,WAAY,CACZ,kCAGA,6BAA8B,CAC9B,kCAEA,UChNiB,CDiNjB,oEAGA,eAAgB,CAChB,kBAAmB,CACnB,sBAAuB,CACvB,iBAAkB,CALlB,kFAOC,gBAAiB,CACjB,+BAID,aChPmB,CDiPnB,UCjPmB,CDkPnB,WClPmB,CDmPnB,UClOmB,CDmOnB,0BAA2B,CAC3B,oBAAqB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.option {\n\tdisplay: flex;\n\talign-items: center;\n\twidth: 100%;\n\theight: var(--height);\n\n\t&__avatar {\n\t\tmargin-right: var(--margin);\n\t}\n\n\t&__details {\n\t\tdisplay: flex;\n\t\tflex: 1 1;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\tmin-width: 0;\n\t}\n\n\t&__lineone {\n\t\tcolor: var(--color-text-light);\n\t}\n\t&__linetwo {\n\t\topacity: $opacity_normal;\n\t}\n\t&__lineone,\n\t&__linetwo {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tline-height: 1.1em;\n\t\tstrong {\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n\n\t&__icon {\n\t\tflex: 0 0 $clickable-area;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\topacity: $opacity_disabled;\n\t\tbackground-position: center;\n\t\tbackground-size: 16px;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},1309:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-2da14a6a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.modal-mask[data-v-2da14a6a]{position:fixed;z-index:9998;top:0;left:0;display:block;width:100%;height:100%;background-color:rgba(0,0,0,0.5)}.modal-mask--dark[data-v-2da14a6a]{background-color:rgba(0,0,0,0.92)}.modal-header[data-v-2da14a6a]{position:absolute;z-index:10001;top:0;right:0;left:0;display:flex !important;align-items:center;justify-content:center;width:100%;height:50px;transition:opacity 250ms, visibility 250ms}.modal-header.invisible[style*='display:none'][data-v-2da14a6a],.modal-header.invisible[style*='display: none'][data-v-2da14a6a]{visibility:hidden}.modal-header .modal-title[data-v-2da14a6a]{overflow-x:hidden;box-sizing:border-box;width:100%;padding:0 132px 0 12px;transition:padding ease 100ms;white-space:nowrap;text-overflow:ellipsis;color:#fff;font-size:14px}@media only screen and (min-width: 512px){.modal-header .modal-title[data-v-2da14a6a]{padding-left:132px;text-align:center}}.modal-header .icons-menu[data-v-2da14a6a]{position:absolute;right:0;display:flex;align-items:center;justify-content:flex-end}.modal-header .icons-menu .header-close[data-v-2da14a6a]{display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin:3px;padding:0}.modal-header .icons-menu .play-pause-icons[data-v-2da14a6a]{position:relative;width:50px;height:50px;margin:0;padding:0;cursor:pointer;border:none;background-color:transparent}.modal-header .icons-menu .play-pause-icons:hover .play-pause-icons__play[data-v-2da14a6a],.modal-header .icons-menu .play-pause-icons:hover .play-pause-icons__pause[data-v-2da14a6a],.modal-header .icons-menu .play-pause-icons:focus .play-pause-icons__play[data-v-2da14a6a],.modal-header .icons-menu .play-pause-icons:focus .play-pause-icons__pause[data-v-2da14a6a]{opacity:1;border-radius:22px;background-color:rgba(127,127,127,0.25)}.modal-header .icons-menu .play-pause-icons__play[data-v-2da14a6a],.modal-header .icons-menu .play-pause-icons__pause[data-v-2da14a6a]{box-sizing:border-box;width:44px;height:44px;margin:3px;cursor:pointer;opacity:.7}.modal-header .icons-menu .header-actions[data-v-2da14a6a]{margin:3px;color:white}.modal-header .icons-menu .action-item--single[data-v-2da14a6a]{box-sizing:border-box;width:44px;height:44px;cursor:pointer;background-position:center;background-size:22px}.modal-header .icons-menu[data-v-2da14a6a] button{color:#fff}.modal-header .icons-menu[data-v-2da14a6a] .action-item__menutoggle{padding:0}.modal-header .icons-menu[data-v-2da14a6a] .action-item__menutoggle span,.modal-header .icons-menu[data-v-2da14a6a] .action-item__menutoggle svg{width:var(--icon-size);height:var(--icon-size)}.modal-wrapper[data-v-2da14a6a]{display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:100%;height:100%}.modal-wrapper .prev[data-v-2da14a6a],.modal-wrapper .next[data-v-2da14a6a]{z-index:10000;display:flex !important;align-items:center;justify-content:center;width:8%;min-width:44px;height:35vw;position:absolute;transition:opacity 250ms, visibility 250ms}.modal-wrapper .prev.invisible[style*='display:none'][data-v-2da14a6a],.modal-wrapper .prev.invisible[style*='display: none'][data-v-2da14a6a],.modal-wrapper .next.invisible[style*='display:none'][data-v-2da14a6a],.modal-wrapper .next.invisible[style*='display: none'][data-v-2da14a6a]{visibility:hidden}.modal-wrapper .prev[data-v-2da14a6a]{left:0}.modal-wrapper .next[data-v-2da14a6a]{right:0}.modal-wrapper .icon-next[data-v-2da14a6a],.modal-wrapper .icon-previous[data-v-2da14a6a]{box-sizing:border-box;width:44px;height:44px;color:white;background-image:none;display:flex}.modal-wrapper .modal-container[data-v-2da14a6a]{display:block;overflow:auto;padding:0;transition:transform 300ms ease;border-radius:var(--border-radius-large);background-color:var(--color-main-background);box-shadow:0 0 40px rgba(0,0,0,0.2)}.modal-wrapper--small .modal-container[data-v-2da14a6a]{width:390px;max-width:95%;max-height:90%}.modal-wrapper--normal .modal-container[data-v-2da14a6a]{max-width:90%;width:600px;max-height:90%}.modal-wrapper--large .modal-container[data-v-2da14a6a]{max-width:90%;width:900px;max-height:90%}.modal-wrapper--full .modal-container[data-v-2da14a6a]{width:100%;height:calc(100% - var(--header-height));position:absolute;top:50px;border-radius:0}@media only screen and (max-width: 512px){.modal-wrapper:not(.modal-wrapper--small) .modal-container[data-v-2da14a6a]{max-width:initial;width:100%;max-height:initial;height:calc(100% - var(--header-height));position:absolute;top:50px;border-radius:0}}.fade-enter-active[data-v-2da14a6a],.fade-leave-active[data-v-2da14a6a]{transition:opacity 250ms}.fade-enter[data-v-2da14a6a],.fade-leave-to[data-v-2da14a6a]{opacity:0}.fade-visibility-enter[data-v-2da14a6a],.fade-visibility-leave-to[data-v-2da14a6a]{visibility:hidden;opacity:0}.modal-in-enter-active[data-v-2da14a6a],.modal-in-leave-active[data-v-2da14a6a],.modal-out-enter-active[data-v-2da14a6a],.modal-out-leave-active[data-v-2da14a6a]{transition:opacity 250ms}.modal-in-enter[data-v-2da14a6a],.modal-in-leave-to[data-v-2da14a6a],.modal-out-enter[data-v-2da14a6a],.modal-out-leave-to[data-v-2da14a6a]{opacity:0}.modal-in-enter .modal-container[data-v-2da14a6a],.modal-in-leave-to .modal-container[data-v-2da14a6a]{transform:scale(0.9)}.modal-out-enter .modal-container[data-v-2da14a6a],.modal-out-leave-to .modal-container[data-v-2da14a6a]{transform:scale(1.1)}.modal-mask .play-pause-icons .progress-ring[data-v-2da14a6a]{position:absolute;top:0;left:0;transform:rotate(-90deg)}.modal-mask .play-pause-icons .progress-ring .progress-ring__circle[data-v-2da14a6a]{transition:100ms stroke-dashoffset;transform-origin:50% 50%;animation:progressring-data-v-2da14a6a linear var(--slideshow-duration) infinite;stroke-linecap:round;stroke-dashoffset:94.24778;stroke-dasharray:94.24778}.modal-mask .play-pause-icons--paused .icon-pause[data-v-2da14a6a]{animation:breath-data-v-2da14a6a 2s cubic-bezier(0.4, 0, 0.2, 1) infinite}.modal-mask .play-pause-icons--paused .progress-ring__circle[data-v-2da14a6a]{animation-play-state:paused !important}@keyframes progressring-data-v-2da14a6a{from{stroke-dashoffset:94.24778}to{stroke-dashoffset:0}}@keyframes breath-data-v-2da14a6a{0%{opacity:1}50%{opacity:0}100%{opacity:1}}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Modal/Modal.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC6gBxB,6BACC,cAAe,CACf,YAAa,CACb,KAAM,CACN,MAAO,CACP,aAAc,CACd,UAAW,CACX,WAAY,CACZ,gCAAmC,CACnC,mCACC,iCAAoC,CACpC,+BAID,iBAAkB,CAClB,aAAc,CACd,KAAM,CACN,OAAQ,CACR,MAAO,CAGP,uBAAwB,CACxB,kBAAmB,CACnB,sBAAuB,CACvB,UAAW,CACX,WC3fmB,CD4fnB,0CACiB,CAdlB,iIAmBE,iBAAkB,CAnBpB,4CAuBE,iBAAkB,CAClB,qBAAsB,CACtB,UAAW,CACX,sBAAwC,CACxC,6BAA8B,CAC9B,kBAAmB,CACnB,sBAAuB,CACvB,UAAW,CACX,cCjiB8C,CDkiB9C,0CAhCF,4CAqCG,kBAAc,CACd,iBAAkB,CAClB,CAvCH,2CA2CE,iBAAkB,CAClB,OAAQ,CACR,YAAa,CACb,kBAAmB,CACnB,wBAAyB,CA/C3B,yDAkDG,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,qBAAsB,CACtB,UAA8C,CAC9C,SAAU,CAvDb,6DA2DG,iBAAkB,CAClB,UC3iBiB,CD4iBjB,WC5iBiB,CD6iBjB,QAAS,CACT,SAAU,CACV,cAAe,CACf,WAAY,CACZ,4BAA6B,CAlEhC,8WAuEK,SC9jBW,CD+jBX,kBAAkC,CAClC,uCCxkBmC,CD+fxC,uIA8EI,qBAAsB,CACtB,UCzlBiB,CD0lBjB,WC1lBiB,CD2lBjB,UAA8C,CAC9C,cAAe,CACf,UC3kBe,CDwfnB,2DAwFG,UAA8C,CAC9C,WAAY,CAzFf,gEA6FG,qBAAsB,CACtB,UCxmBkB,CDymBlB,WCzmBkB,CD0mBlB,cAAe,CACf,0BAA2B,CAC3B,oBAAqB,CAlGxB,mDAuGG,UAAW,CAvGd,oEA4GG,SAAU,CA5Gb,iJA8GI,sBAAuB,CACvB,uBAAwB,CACxB,gCAMH,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,qBAAsB,CACtB,UAAW,CACX,WAAY,CANb,4EAWE,aAAc,CAEd,uBAAwB,CACxB,kBAAmB,CACnB,sBAAuB,CACvB,QAAS,CACT,cChpBmB,CDipBnB,WAAY,CACZ,iBAAkB,CAClB,0CACiB,CArBnB,8RA6BG,iBAAkB,CA7BrB,sCAiCE,MAAO,CAjCT,sCAoCE,OAAQ,CApCV,0FA0CE,qBAAsB,CACtB,UC1qBmB,CD2qBnB,WC3qBmB,CD4qBnB,WAAY,CACZ,qBAAsB,CACtB,YAAa,CA/Cf,iDAoDE,aAAc,CACd,aAAc,CACd,SAAU,CACV,+BAAgC,CAChC,wCAAyC,CACzC,6CAA8C,CAC9C,mCAAsC,CACtC,wDAKC,WAAY,CACZ,aAAc,CACd,cAAe,CACf,yDAIA,aAAc,CACd,WAAY,CACZ,cAAe,CACf,wDAIA,aAAc,CACd,WAAY,CACZ,cAAe,CACf,uDAIA,UAAW,CACX,wCAAyC,CACzC,iBAAkB,CAClB,QC5rBiB,CD6rBjB,eAAgB,CAChB,0CA1FH,4EAgGG,iBAAkB,CAClB,UAAW,CACX,kBAAmB,CACnB,wCAAyC,CACzC,iBAAkB,CAClB,QCzsBiB,CD0sBjB,eAAgB,CAChB,CAKH,wEAEC,wBAAyB,CACzB,6DAIA,SAAU,CACV,mFAIA,iBAAkB,CAClB,SAAU,CACV,kKAMA,wBAAyB,CACzB,4IAMA,SAAU,CACV,uGAIA,oBAAoB,CACpB,yGAIA,oBAAqB,CACrB,8DAQC,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,wBAAyB,CAL3B,qFAOG,kCAAmC,CACnC,wBAAyB,CACzB,gFAAiE,CAEjE,oBAAqB,CACrB,0BAfQ,CAgBR,yBAhBQ,CAGX,mEAkBG,yEAAwD,CAlB3D,8EAqBG,sCAAuC,CACvC,wCAMF,KACC,0BAhCS,CAkCV,GACC,mBAAoB,CAAA,CAItB,kCACC,GACC,SAAU,CAEX,IACC,SAAU,CAEX,KACC,SAAU,CAAA",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.modal-mask {\n\tposition: fixed;\n\tz-index: 9998;\n\ttop: 0;\n\tleft: 0;\n\tdisplay: block;\n\twidth: 100%;\n\theight: 100%;\n\tbackground-color: rgba(0, 0, 0, .5);\n\t&--dark {\n\t\tbackground-color: rgba(0, 0, 0, .92);\n\t}\n}\n\n.modal-header {\n\tposition: absolute;\n\tz-index: 10001;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n\t// prevent vue show to use display:none and reseting\n\t// the circle animation loop\n\tdisplay: flex !important;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: 100%;\n\theight: $header-height;\n\ttransition: opacity 250ms,\n\t\tvisibility 250ms;\n\n\t// replace display by visibility\n\t&.invisible[style*='display:none'],\n\t&.invisible[style*='display: none'] {\n\t\tvisibility: hidden;\n\t}\n\n\t.modal-title {\n\t\toverflow-x: hidden;\n\t\tbox-sizing: border-box;\n\t\twidth: 100%;\n\t\tpadding: 0 #{$clickable-area * 3} 0 12px; // maximum actions is 3\n\t\ttransition: padding ease 100ms;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\tcolor: #fff;\n\t\tfont-size: $icon-margin;\n\t}\n\n\t// On wider screens the title can be centered\n\t@media only screen and (min-width: $breakpoint-mobile / 2) {\n\t\t.modal-title {\n\t\t\tpadding-left: #{$clickable-area * 3}; // maximum actions is 3\n\t\t\ttext-align: center;\n\t\t}\n\t}\n\n\t.icons-menu {\n\t\tposition: absolute;\n\t\tright: 0;\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: flex-end;\n\n\t\t.header-close {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tbox-sizing: border-box;\n\t\t\tmargin: ($header-height - $clickable-area) / 2;\n\t\t\tpadding: 0;\n\t\t}\n\n\t\t.play-pause-icons {\n\t\t\tposition: relative;\n\t\t\twidth: $header-height;\n\t\t\theight: $header-height;\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tcursor: pointer;\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t\t&:hover,\n\t\t\t&:focus {\n\t\t\t\t.play-pause-icons__play,\n\t\t\t\t.play-pause-icons__pause {\n\t\t\t\t\topacity: $opacity_full;\n\t\t\t\t\tborder-radius: $clickable-area / 2;\n\t\t\t\t\tbackground-color: $icon-focus-bg;\n\t\t\t\t}\n\t\t\t}\n\t\t\t&__play,\n\t\t\t&__pause {\n\t\t\t\tbox-sizing: border-box;\n\t\t\t\twidth: $clickable-area;\n\t\t\t\theight: $clickable-area;\n\t\t\t\tmargin: ($header-height - $clickable-area) / 2;\n\t\t\t\tcursor: pointer;\n\t\t\t\topacity: $opacity_normal;\n\t\t\t}\n\t\t}\n\n\t\t.header-actions {\n\t\t\tmargin: ($header-height - $clickable-area) / 2;\n\t\t\tcolor: white;\n\t\t}\n\n\t\t.action-item--single {\n\t\t\tbox-sizing: border-box;\n\t\t\twidth: $clickable-area;\n\t\t\theight: $clickable-area;\n\t\t\tcursor: pointer;\n\t\t\tbackground-position: center;\n\t\t\tbackground-size: 22px;\n\t\t}\n\n\t\t::v-deep button {\n\t\t\t// force white instead of default main text\n\t\t\tcolor: #fff;\n\t\t}\n\n\t\t// Force the Actions menu icon to be the same size as other icons\n\t\t&::v-deep .action-item__menutoggle {\n\t\t\tpadding: 0;\n\t\t\tspan, svg {\n\t\t\t\twidth: var(--icon-size);\n\t\t\t\theight: var(--icon-size);\n\t\t\t}\n\t\t}\n\t}\n}\n\n.modal-wrapper {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tbox-sizing: border-box;\n\twidth: 100%;\n\theight: 100%;\n\n\t/* Navigation buttons */\n\t.prev,\n\t.next {\n\t\tz-index: 10000;\n\t\t// ignore display: none\n\t\tdisplay: flex !important;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: 8%;\n\t\tmin-width: $clickable-area;\n\t\theight: 35vw;\n\t\tposition: absolute;\n\t\ttransition: opacity 250ms,\n\t\t\tvisibility 250ms;\n\n\t\t// we want to keep the elements on page\n\t\t// even if hidden to avoid having a unbalanced\n\t\t// centered content\n\t\t// replace display by visibility\n\t\t&.invisible[style*='display:none'],\n\t\t&.invisible[style*='display: none'] {\n\t\t\tvisibility: hidden;\n\t\t}\n\t}\n\t.prev {\n\t\tleft: 0;\n\t}\n\t.next {\n\t\tright: 0;\n\t}\n\n\t// buttons/icons\n\t.icon-next,\n\t.icon-previous {\n\t\tbox-sizing: border-box;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\tcolor: white;\n\t\tbackground-image: none;\n\t\tdisplay: flex;\n\t}\n\n\t/* Content */\n\t.modal-container {\n\t\tdisplay: block;\n\t\toverflow: auto; // avoids unecessary hacks if the content should be bigger than the modal\n\t\tpadding: 0;\n\t\ttransition: transform 300ms ease;\n\t\tborder-radius: var(--border-radius-large);\n\t\tbackground-color: var(--color-main-background);\n\t\tbox-shadow: 0 0 40px rgba(0, 0, 0, .2);\n\t}\n\n\t// Sizing\n\t&--small {\n\t\t.modal-container {\n\t\t\twidth: 390px;\n\t\t\tmax-width: 95%;\n\t\t\tmax-height: 90%;\n\t\t}\n\t}\n\t&--normal {\n\t\t.modal-container {\n\t\t\tmax-width: 90%;\n\t\t\twidth: 600px;\n\t\t\tmax-height: 90%;\n\t\t}\n\t}\n\t&--large {\n\t\t.modal-container {\n\t\t\tmax-width: 90%;\n\t\t\twidth: 900px;\n\t\t\tmax-height: 90%;\n\t\t}\n\t}\n\t&--full {\n\t\t.modal-container {\n\t\t\twidth: 100%;\n\t\t\theight: calc(100% - var(--header-height));\n\t\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n\n\t// Make modal full screen on mobile\n\t@media only screen and (max-width: $breakpoint-mobile / 2) {\n\t\t&:not(&--small) .modal-container {\n\t\t\tmax-width: initial;\n\t\t\twidth: 100%;\n\t\t\tmax-height: initial;\n\t\t\theight: calc(100% - var(--header-height));\n\t\t\tposition: absolute;\n\t\t\ttop: $header-height;\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n}\n\n/* TRANSITIONS */\n.fade-enter-active,\n.fade-leave-active {\n\ttransition: opacity 250ms;\n}\n\n.fade-enter,\n.fade-leave-to {\n\topacity: 0;\n}\n\n.fade-visibility-enter,\n.fade-visibility-leave-to {\n\tvisibility: hidden;\n\topacity: 0;\n}\n\n.modal-in-enter-active,\n.modal-in-leave-active,\n.modal-out-enter-active,\n.modal-out-leave-active {\n\ttransition: opacity 250ms;\n}\n\n.modal-in-enter,\n.modal-in-leave-to,\n.modal-out-enter,\n.modal-out-leave-to {\n\topacity: 0;\n}\n\n.modal-in-enter .modal-container,\n.modal-in-leave-to .modal-container {\n\ttransform: scale(.9);\n}\n\n.modal-out-enter .modal-container,\n.modal-out-leave-to .modal-container {\n\ttransform: scale(1.1);\n}\n\n// animated circle\n$radius: 15;\n$pi: 3.14159265358979;\n\n.modal-mask .play-pause-icons {\n\t.progress-ring {\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\ttransform: rotate(-90deg);\n\t\t.progress-ring__circle {\n\t\t\ttransition: 100ms stroke-dashoffset;\n\t\t\ttransform-origin: 50% 50%; // axis compensation\n\t\t\tanimation: progressring linear var(--slideshow-duration) infinite;\n\n\t\t\tstroke-linecap: round;\n\t\t\tstroke-dashoffset: $radius * 2 * $pi; // radius * 2 * PI\n\t\t\tstroke-dasharray: $radius * 2 * $pi; // radius * 2 * PI\n\t\t}\n\t}\n\t&--paused {\n\t\t.icon-pause {\n\t\t\tanimation: breath 2s cubic-bezier(.4, 0, .2, 1) infinite;\n\t\t}\n\t\t.progress-ring__circle {\n\t\t\tanimation-play-state: paused !important;\n\t\t}\n\t}\n}\n\n// keyframes get scoped too and break the animation name, we need them unscoped\n@keyframes progressring {\n\tfrom {\n\t\tstroke-dashoffset: $radius * 2 * $pi; // radius * 2 * PI\n\t}\n\tto {\n\t\tstroke-dashoffset: 0;\n\t}\n}\n\n@keyframes breath {\n\t0% {\n\t\topacity: 1;\n\t}\n\t50% {\n\t\topacity: 0;\n\t}\n\t100% {\n\t\topacity: 1;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},9814:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-0f132242]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.name-parts[data-v-0f132242]{display:flex;max-width:100%}.name-parts__first[data-v-0f132242]{overflow:hidden;text-overflow:ellipsis}.name-parts__first[data-v-0f132242],.name-parts__last[data-v-0f132242]{white-space:pre}.name-parts__first strong[data-v-0f132242],.name-parts__last strong[data-v-0f132242]{font-weight:bold}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Multiselect/EllipsisedOption.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCmHxB,6BACC,YAAa,CACb,cAAe,CACf,oCACC,eAAgB,CAChB,sBAAuB,CACvB,uEAIA,eAAgB,CAHhB,qFAKC,gBAAiB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.name-parts {\n\tdisplay: flex;\n\tmax-width: 100%;\n\t&__first {\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\t&__first,\n\t&__last {\n\t\t// prevent whitespace from being trimmed\n\t\twhite-space: pre;\n\t\tstrong {\n\t\t\tfont-weight: bold;\n\t\t}\n\t}\n}\n"],sourceRoot:""}]),t.Z=o},5878:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.popover{z-index:100000;display:block !important;filter:drop-shadow(0 1px 10px var(--color-box-shadow))}.popover__inner{padding:0;color:var(--color-main-text);border-radius:var(--border-radius);background:var(--color-main-background)}.popover__arrow{position:absolute;z-index:1;width:0;height:0;margin:10px;border-style:solid;border-color:transparent;border-width:10px}.popover[x-placement^='top']{margin-bottom:10px}.popover[x-placement^='top'] .popover__arrow{bottom:-10px;left:calc(50% - $arrow-width);margin-top:0;margin-bottom:0;border-bottom-width:0;border-top-color:var(--color-main-background)}.popover[x-placement^='bottom']{margin-top:10px}.popover[x-placement^='bottom'] .popover__arrow{top:-10px;left:calc(50% - $arrow-width);margin-top:0;margin-bottom:0;border-top-width:0;border-bottom-color:var(--color-main-background)}.popover[x-placement^='right']{margin-left:10px}.popover[x-placement^='right'] .popover__arrow{top:calc(50% - $arrow-width);left:-10px;margin-right:0;margin-left:0;border-left-width:0;border-right-color:var(--color-main-background)}.popover[x-placement^='left']{margin-right:10px}.popover[x-placement^='left'] .popover__arrow{top:calc(50% - $arrow-width);right:-10px;margin-right:0;margin-left:0;border-right-width:0;border-left-color:var(--color-main-background)}.popover[aria-hidden='true']{visibility:hidden;transition:opacity var(--animation-quick),visibility var(--animation-quick);opacity:0}.popover[aria-hidden='false']{visibility:visible;transition:opacity var(--animation-quick);opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/Popover/Popover.vue"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCyGxB,SACC,cAAe,CACf,wBAAyB,CAEzB,sDAAuD,CAEvD,gBACC,SAAU,CACV,4BAA6B,CAC7B,kCAAmC,CACnC,uCAAwC,CACxC,gBAGA,iBAAkB,CAClB,SAAU,CACV,OAAQ,CACR,QAAS,CACT,WApBgB,CAqBhB,kBAAmB,CACnB,wBAAyB,CACzB,iBAvBgB,CAElB,6BAyBE,kBA3BgB,CAElB,6CA4BG,YA9Be,CA+Bf,6BAA8B,CAC9B,YAAa,CACb,eAAgB,CAChB,qBAAsB,CACtB,6CAA8C,CAjCjD,gCAsCE,eAxCgB,CAElB,gDAyCG,SA3Ce,CA4Cf,6BAA8B,CAC9B,YAAa,CACb,eAAgB,CAChB,kBAAmB,CACnB,gDAAiD,CA9CpD,+BAmDE,gBArDgB,CAElB,+CAsDG,4BAA6B,CAC7B,UAzDe,CA0Df,cAAe,CACf,aAAc,CACd,mBAAoB,CACpB,+CAAgD,CA3DnD,8BAgEE,iBAlEgB,CAElB,8CAmEG,4BAA6B,CAC7B,WAtEe,CAuEf,cAAe,CACf,aAAc,CACd,oBAAqB,CACrB,8CAA+C,CAxElD,6BA6EE,iBAAkB,CAClB,2EAA6E,CAC7E,SAAU,CA/EZ,8BAmFE,kBAAmB,CACnB,yCAA0C,CAC1C,SAAU",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$arrow-width: 10px;\n\n.popover {\n\tz-index: 100000;\n\tdisplay: block !important;\n\n\tfilter: drop-shadow(0 1px 10px var(--color-box-shadow));\n\n\t&__inner {\n\t\tpadding: 0;\n\t\tcolor: var(--color-main-text);\n\t\tborder-radius: var(--border-radius);\n\t\tbackground: var(--color-main-background);\n\t}\n\n\t&__arrow {\n\t\tposition: absolute;\n\t\tz-index: 1;\n\t\twidth: 0;\n\t\theight: 0;\n\t\tmargin: $arrow-width;\n\t\tborder-style: solid;\n\t\tborder-color: transparent;\n\t\tborder-width: $arrow-width;\n\t}\n\n\t&[x-placement^='top'] {\n\t\tmargin-bottom: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\tbottom: -$arrow-width;\n\t\t\tleft: calc(50% - $arrow-width);\n\t\t\tmargin-top: 0;\n\t\t\tmargin-bottom: 0;\n\t\t\tborder-bottom-width: 0;\n\t\t\tborder-top-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='bottom'] {\n\t\tmargin-top: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: -$arrow-width;\n\t\t\tleft: calc(50% - $arrow-width);\n\t\t\tmargin-top: 0;\n\t\t\tmargin-bottom: 0;\n\t\t\tborder-top-width: 0;\n\t\t\tborder-bottom-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='right'] {\n\t\tmargin-left: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: calc(50% - $arrow-width);\n\t\t\tleft: -$arrow-width;\n\t\t\tmargin-right: 0;\n\t\t\tmargin-left: 0;\n\t\t\tborder-left-width: 0;\n\t\t\tborder-right-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[x-placement^='left'] {\n\t\tmargin-right: $arrow-width;\n\n\t\t.popover__arrow {\n\t\t\ttop: calc(50% - $arrow-width);\n\t\t\tright: -$arrow-width;\n\t\t\tmargin-right: 0;\n\t\t\tmargin-left: 0;\n\t\t\tborder-right-width: 0;\n\t\t\tborder-left-color: var(--color-main-background);\n\t\t}\n\t}\n\n\t&[aria-hidden='true'] {\n\t\tvisibility: hidden;\n\t\ttransition: opacity var(--animation-quick), visibility var(--animation-quick);\n\t\topacity: 0;\n\t}\n\n\t&[aria-hidden='false'] {\n\t\tvisibility: visible;\n\t\ttransition: opacity var(--animation-quick);\n\t\topacity: 1;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},7816:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-4dae360a]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}ul[data-v-4dae360a]{display:flex;flex-direction:column}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/PopoverMenu/PopoverMenu.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCkDxB,oBACC,YAAa,CACb,qBAAsB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nul {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n"],sourceRoot:""}]),t.Z=o},3530:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-79bc7480]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}li[data-v-79bc7480]{display:flex;flex:0 0 auto}li.hidden[data-v-79bc7480]{display:none}li>button[data-v-79bc7480],li>a[data-v-79bc7480],li>.menuitem[data-v-79bc7480]{cursor:pointer;line-height:44px;border:0;border-radius:0;background-color:transparent;display:flex;align-items:flex-start;height:auto;margin:0;padding:0;font-weight:normal;box-shadow:none;width:100%;color:var(--color-main-text);white-space:nowrap;opacity:.7}li>button span[class^='icon-'][data-v-79bc7480],li>button span[class*=' icon-'][data-v-79bc7480],li>button[class^='icon-'][data-v-79bc7480],li>button[class*=' icon-'][data-v-79bc7480],li>a span[class^='icon-'][data-v-79bc7480],li>a span[class*=' icon-'][data-v-79bc7480],li>a[class^='icon-'][data-v-79bc7480],li>a[class*=' icon-'][data-v-79bc7480],li>.menuitem span[class^='icon-'][data-v-79bc7480],li>.menuitem span[class*=' icon-'][data-v-79bc7480],li>.menuitem[class^='icon-'][data-v-79bc7480],li>.menuitem[class*=' icon-'][data-v-79bc7480]{min-width:0;min-height:0;background-position:14px center;background-size:16px}li>button span[class^='icon-'][data-v-79bc7480],li>button span[class*=' icon-'][data-v-79bc7480],li>a span[class^='icon-'][data-v-79bc7480],li>a span[class*=' icon-'][data-v-79bc7480],li>.menuitem span[class^='icon-'][data-v-79bc7480],li>.menuitem span[class*=' icon-'][data-v-79bc7480]{padding:22px 0 22px 44px}li>button:not([class^='icon-']):not([class*='icon-'])>span[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>button:not([class^='icon-']):not([class*='icon-'])>input[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>button:not([class^='icon-']):not([class*='icon-'])>form[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>a:not([class^='icon-']):not([class*='icon-'])>span[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>a:not([class^='icon-']):not([class*='icon-'])>input[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>a:not([class^='icon-']):not([class*='icon-'])>form[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>.menuitem:not([class^='icon-']):not([class*='icon-'])>span[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>.menuitem:not([class^='icon-']):not([class*='icon-'])>input[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child,li>.menuitem:not([class^='icon-']):not([class*='icon-'])>form[data-v-79bc7480]:not([class^='icon-']):not([class*='icon-']):first-child{margin-left:44px}li>button[class^='icon-'][data-v-79bc7480],li>button[class*=' icon-'][data-v-79bc7480],li>a[class^='icon-'][data-v-79bc7480],li>a[class*=' icon-'][data-v-79bc7480],li>.menuitem[class^='icon-'][data-v-79bc7480],li>.menuitem[class*=' icon-'][data-v-79bc7480]{padding:0 14px 0 44px}li>button[data-v-79bc7480]:not(:disabled):hover,li>button[data-v-79bc7480]:not(:disabled):focus,li>button:not(:disabled).active[data-v-79bc7480],li>a[data-v-79bc7480]:not(:disabled):hover,li>a[data-v-79bc7480]:not(:disabled):focus,li>a:not(:disabled).active[data-v-79bc7480],li>.menuitem[data-v-79bc7480]:not(:disabled):hover,li>.menuitem[data-v-79bc7480]:not(:disabled):focus,li>.menuitem:not(:disabled).active[data-v-79bc7480]{opacity:1 !important}li>button.action[data-v-79bc7480],li>a.action[data-v-79bc7480],li>.menuitem.action[data-v-79bc7480]{padding:inherit !important}li>button>span[data-v-79bc7480],li>a>span[data-v-79bc7480],li>.menuitem>span[data-v-79bc7480]{cursor:pointer;white-space:nowrap}li>button>p[data-v-79bc7480],li>a>p[data-v-79bc7480],li>.menuitem>p[data-v-79bc7480]{width:150px;line-height:1.6em;padding:8px 0;white-space:normal;overflow:hidden;text-overflow:ellipsis}li>button>select[data-v-79bc7480],li>a>select[data-v-79bc7480],li>.menuitem>select[data-v-79bc7480]{margin:0;margin-left:6px}li>button[data-v-79bc7480]:not(:empty),li>a[data-v-79bc7480]:not(:empty),li>.menuitem[data-v-79bc7480]:not(:empty){padding-right:14px !important}li>button>img[data-v-79bc7480],li>a>img[data-v-79bc7480],li>.menuitem>img[data-v-79bc7480]{width:16px;height:16px;margin:14px}li>button>input.radio+label[data-v-79bc7480],li>button>input.checkbox+label[data-v-79bc7480],li>a>input.radio+label[data-v-79bc7480],li>a>input.checkbox+label[data-v-79bc7480],li>.menuitem>input.radio+label[data-v-79bc7480],li>.menuitem>input.checkbox+label[data-v-79bc7480]{padding:0 !important;width:100%}li>button>input.checkbox+label[data-v-79bc7480]::before,li>a>input.checkbox+label[data-v-79bc7480]::before,li>.menuitem>input.checkbox+label[data-v-79bc7480]::before{margin:-2px 13px 0}li>button>input.radio+label[data-v-79bc7480]::before,li>a>input.radio+label[data-v-79bc7480]::before,li>.menuitem>input.radio+label[data-v-79bc7480]::before{margin:-2px 12px 0}li>button>input[data-v-79bc7480]:not([type=radio]):not([type=checkbox]):not([type=image]),li>a>input[data-v-79bc7480]:not([type=radio]):not([type=checkbox]):not([type=image]),li>.menuitem>input[data-v-79bc7480]:not([type=radio]):not([type=checkbox]):not([type=image]){width:150px}li>button form[data-v-79bc7480],li>a form[data-v-79bc7480],li>.menuitem form[data-v-79bc7480]{display:flex;flex:1 1 auto}li>button form[data-v-79bc7480]:not(:first-child),li>a form[data-v-79bc7480]:not(:first-child),li>.menuitem form[data-v-79bc7480]:not(:first-child){margin-left:5px}li>button>span.hidden+form[data-v-79bc7480],li>button>span[style*='display:none']+form[data-v-79bc7480],li>a>span.hidden+form[data-v-79bc7480],li>a>span[style*='display:none']+form[data-v-79bc7480],li>.menuitem>span.hidden+form[data-v-79bc7480],li>.menuitem>span[style*='display:none']+form[data-v-79bc7480]{margin-left:0}li>button input[data-v-79bc7480],li>a input[data-v-79bc7480],li>.menuitem input[data-v-79bc7480]{min-width:44px;max-height:40px;margin:2px 0;flex:1 1 auto}li>button input[data-v-79bc7480]:not(:first-child),li>a input[data-v-79bc7480]:not(:first-child),li>.menuitem input[data-v-79bc7480]:not(:first-child){margin-left:5px}li:not(.hidden):not([style*='display:none']):first-of-type>button>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):first-of-type>button>input[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):first-of-type>a>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):first-of-type>a>input[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):first-of-type>.menuitem>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):first-of-type>.menuitem>input[data-v-79bc7480]{margin-top:12px}li:not(.hidden):not([style*='display:none']):last-of-type>button>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):last-of-type>button>input[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):last-of-type>a>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):last-of-type>a>input[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):last-of-type>.menuitem>form[data-v-79bc7480],li:not(.hidden):not([style*='display:none']):last-of-type>.menuitem>input[data-v-79bc7480]{margin-bottom:12px}li>button[data-v-79bc7480]{padding:0}li>button span[data-v-79bc7480]{opacity:1}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/PopoverMenu/PopoverMenuItem.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCqMxB,oBACC,YAAa,CACb,aAAc,CAFf,2BAKE,YAAa,CALf,+EAWE,cAAe,CACf,gBChMmB,CDiMnB,QAAS,CACT,eAAgB,CAChB,4BAA6B,CAC7B,YAAa,CACb,sBAAuB,CACvB,WAAY,CACZ,QAAS,CACT,SAAU,CACV,kBAAmB,CACnB,eAAgB,CAChB,UAAW,CACX,4BAA6B,CAC7B,kBAAmB,CACnB,UC5LiB,CDkKnB,giBAiCG,WAAY,CACZ,YAAa,CACb,+BAA2C,CAC3C,oBCpNa,CDgLhB,+RA2CG,wBC/NkB,CDoLrB,iqCAoDK,gBCxOgB,CDoLrB,iQA2DG,qBC/OkB,CDoLrB,6aAiEG,oBAAiC,CAjEpC,oGAsEG,0BAA2B,CAtE9B,8FA0EG,cAAe,CACf,kBAAmB,CA3EtB,qFAgFG,WAAY,CACZ,iBAAkB,CAClB,aAAc,CACd,kBAAmB,CAGnB,eAAgB,CAChB,sBAAuB,CAvF1B,oGA4FG,QAAS,CACT,eAAgB,CA7FnB,mHAkGG,6BAAsC,CAlGzC,2FAwGG,UCxRa,CDyRb,WCzRa,CD0Rb,WCtR6C,CD4KhD,mRAgHG,oBAAqB,CACrB,UAAW,CAjHd,sKAoHG,kBAAmB,CApHtB,6JAuHG,kBAAmB,CAvHtB,4QA0HG,WAAY,CA1Hf,8FA+HG,YAAa,CACb,aAAc,CAhIjB,oJAoII,eAAgB,CApIpB,oTA0IG,aAAc,CA1IjB,iGA8IG,cClUkB,CDmUlB,eAAY,CACZ,YAAa,CACb,aAAc,CAjJjB,uJAoJI,eAAgB,CApJpB,+gBA+JK,eAA8B,CA/JnC,ygBAsKK,kBAAiC,CAtKtC,2BA4KE,SAAU,CA5KZ,gCA8KG,SC/Ua",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nli {\n\tdisplay: flex;\n\tflex: 0 0 auto;\n\n\t&.hidden {\n\t\tdisplay: none;\n\t}\n\n\t> button,\n\t> a,\n\t> .menuitem {\n\t\tcursor: pointer;\n\t\tline-height: $clickable-area;\n\t\tborder: 0;\n\t\tborder-radius: 0; // otherwise Safari will cut the border-radius area\n\t\tbackground-color: transparent;\n\t\tdisplay: flex;\n\t\talign-items: flex-start;\n\t\theight: auto;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tfont-weight: normal;\n\t\tbox-shadow: none;\n\t\twidth: 100%;\n\t\tcolor: var(--color-main-text);\n\t\twhite-space: nowrap;\n\t\topacity: $opacity_normal;\n\n\t\t// TODO split into individual components for readability\n\t\tspan[class^='icon-'],\n\t\tspan[class*=' icon-'],\n\t\t&[class^='icon-'],\n\t\t&[class*=' icon-'] {\n\t\t\tmin-width: 0; /* Overwrite icons*/\n\t\t\tmin-height: 0;\n\t\t\tbackground-position: #{$icon-margin} center;\n\t\t\tbackground-size: $icon-size;\n\t\t}\n\n\t\tspan[class^='icon-'],\n\t\tspan[class*=' icon-'] {\n\t\t\t/* Keep padding to define the width to\n\t\t\t\tassure correct position of a possible text */\n\t\t\tpadding: #{$clickable-area / 2} 0 #{$clickable-area / 2} $clickable-area;\n\t\t}\n\n\t\t// If no icons set, force left margin to align\n\t\t&:not([class^='icon-']):not([class*='icon-']) {\n\t\t\t> span,\n\t\t\t> input,\n\t\t\t> form {\n\t\t\t\t&:not([class^='icon-']):not([class*='icon-']):first-child {\n\t\t\t\t\tmargin-left: $clickable-area;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t&[class^='icon-'],\n\t\t&[class*=' icon-'] {\n\t\t\tpadding: 0 $icon-margin 0 $clickable-area;\n\t\t}\n\n\t\t&:not(:disabled):hover,\n\t\t&:not(:disabled):focus,\n\t\t&:not(:disabled).active {\n\t\t\topacity: $opacity_full !important;\n\t\t}\n\n\t\t/* prevent .action class to break the design */\n\t\t&.action {\n\t\t\tpadding: inherit !important;\n\t\t}\n\n\t\t> span {\n\t\t\tcursor: pointer;\n\t\t\twhite-space: nowrap;\n\t\t}\n\n\t\t// long text area\n\t\t> p {\n\t\t\twidth: 150px;\n\t\t\tline-height: 1.6em;\n\t\t\tpadding: 8px 0;\n\t\t\twhite-space: normal;\n\n\t\t\t// in case there are no spaces like long email addresses\n\t\t\toverflow: hidden;\n\t\t\ttext-overflow: ellipsis;\n\t\t}\n\n\t\t// TODO: do we really supports it?\n\t\t> select {\n\t\t\tmargin: 0;\n\t\t\tmargin-left: 6px;\n\t\t}\n\n\t\t/* Add padding if contains icon+text */\n\t\t&:not(:empty) {\n\t\t\tpadding-right: $icon-margin !important;\n\t\t}\n\n\t\t/* DEPRECATED! old img in popover fallback\n\t\t\t* TODO: to remove */\n\t\t> img {\n\t\t\twidth: $icon-size;\n\t\t\theight: $icon-size;\n\t\t\tmargin: $icon-margin;\n\t\t}\n\n\t\t/* checkbox/radio fixes */\n\t\t> input.radio + label,\n\t\t> input.checkbox + label {\n\t\t\tpadding: 0 !important;\n\t\t\twidth: 100%;\n\t\t}\n\t\t> input.checkbox + label::before {\n\t\t\tmargin: -2px 13px 0;\n\t\t}\n\t\t> input.radio + label::before {\n\t\t\tmargin: -2px 12px 0;\n\t\t}\n\t\t> input:not([type=radio]):not([type=checkbox]):not([type=image]) {\n\t\t\twidth: 150px;\n\t\t}\n\n\t\t// Forms & text inputs\n\t\tform {\n\t\t\tdisplay: flex;\n\t\t\tflex: 1 1 auto;\n\t\t\t/* put a small space between text and form\n\t\t\t\tif there is an element before */\n\t\t\t&:not(:first-child) {\n\t\t\t\tmargin-left: 5px;\n\t\t\t}\n\t\t}\n\t\t/* no margin if hidden span before */\n\t\t> span.hidden + form,\n\t\t> span[style*='display:none'] + form {\n\t\t\tmargin-left: 0;\n\t\t}\n\t\t/* Inputs inside popover supports text, submit & reset */\n\t\tinput {\n\t\t\tmin-width: $clickable-area;\n\t\t\tmax-height: #{$clickable-area - 4px}; /* twice the element margin-y */\n\t\t\tmargin: 2px 0;\n\t\t\tflex: 1 1 auto;\n\t\t\t// space between inline inputs\n\t\t\t&:not(:first-child) {\n\t\t\t\tmargin-left: 5px;\n\t\t\t}\n\t\t}\n\t}\n\n\t// TODO: do that in js, should be cleaner\n\t/* css hack, only first not hidden */\n\t&:not(.hidden):not([style*='display:none']) {\n\t\t&:first-of-type {\n\t\t\t> button, > a, > .menuitem {\n\t\t\t\t> form, > input {\n\t\t\t\t\tmargin-top: $icon-margin - 2px; // minus the input margin\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t&:last-of-type {\n\t\t\t> button, > a, > .menuitem {\n\t\t\t\t> form, > input {\n\t\t\t\t\tmargin-bottom: $icon-margin - 2px; // minus the input margin\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t> button {\n\t\tpadding: 0;\n\t\tspan {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n}\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},1142:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r),s=e(1667),l=e.n(s),c=e(8887),d=e(4831),A=e(2842),u=o()(a()),p=l()(c.Z),m=l()(d.Z),T=l()(A.Z);u.push([n.id,".material-design-icon[data-v-c5738294]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.autocomplete-result[data-v-c5738294]{display:flex;height:44px;padding:10px}.highlight .autocomplete-result[data-v-c5738294]{color:var(--color-main-text);background:var(--color-primary-light)}.highlight .autocomplete-result[data-v-c5738294],.highlight .autocomplete-result *[data-v-c5738294]{cursor:pointer}.autocomplete-result__icon[data-v-c5738294]{position:relative;flex:0 0 44px;width:44px;min-width:44px;height:44px;border-radius:44px;background-color:var(--color-background-darker);background-repeat:no-repeat;background-position:center;background-size:24px}.autocomplete-result__icon--with-avatar[data-v-c5738294]{color:inherit;background-size:cover}.autocomplete-result__status[data-v-c5738294]{position:absolute;right:-4px;bottom:-4px;box-sizing:border-box;width:18px;height:18px;border:2px solid var(--color-main-background);border-radius:50%;background-color:var(--color-main-background);font-size:var(--default-font-size);line-height:15px;background-repeat:no-repeat;background-size:16px;background-position:center}.autocomplete-result__status--online[data-v-c5738294]{background-image:url("+p+")}.autocomplete-result__status--dnd[data-v-c5738294]{background-image:url("+m+");background-color:#ffffff}.autocomplete-result__status--away[data-v-c5738294]{background-image:url("+T+")}.autocomplete-result__status--icon[data-v-c5738294]{border:none;background-color:transparent}.autocomplete-result__content[data-v-c5738294]{display:flex;flex:1 1 100%;flex-direction:column;justify-content:center;min-width:0;padding-left:10px}.autocomplete-result__title[data-v-c5738294],.autocomplete-result__subline[data-v-c5738294]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.autocomplete-result__subline[data-v-c5738294]{color:var(--color-text-lighter)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/RichContenteditable/AutoCompleteResult.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCgGxB,sCACC,YAAa,CACb,WCjFoB,CDkFpB,YAL0B,CAO1B,iDACC,4BAA6B,CAC7B,qCAAsC,CAFvC,oGAIE,cAAe,CACf,4CAID,iBAAkB,CAClB,aC9FmB,CD+FnB,UC/FmB,CDgGnB,cChGmB,CDiGnB,WCjGmB,CDkGnB,kBClGmB,CDmGnB,+CAAgD,CAChD,2BAA4B,CAC5B,0BAA2B,CAC3B,oBAA4D,CAC5D,yDACC,aAAc,CACd,qBAAsB,CACtB,8CAID,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,qBAAsB,CACtB,UAAW,CACX,WAAY,CACZ,6CAA8C,CAC9C,iBAAkB,CAClB,6CAA8C,CAC9C,kCAAmC,CACnC,gBAAiB,CACjB,2BAA4B,CAC5B,oBAAqB,CACrB,0BAA2B,CAE3B,sDACC,wDAAyE,CACzE,mDAEA,wDAAsE,CACtE,wBAAyB,CACzB,oDAEA,wDAAuE,CACvE,oDAEA,WAAY,CACZ,4BAA6B,CAC7B,+CAID,YAAa,CACb,aAAc,CACd,qBAAsB,CACtB,sBAAuB,CACvB,WAAY,CACZ,iBAtEyB,CAuEzB,4FAIA,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB,CACvB,+CAGA,+BAAgC",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$autocomplete-padding: 10px;\n\n.autocomplete-result {\n\tdisplay: flex;\n\theight: $clickable-area;\n\tpadding: $autocomplete-padding;\n\n\t.highlight & {\n\t\tcolor: var(--color-main-text);\n\t\tbackground: var(--color-primary-light);\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\tflex: 0 0 $clickable-area;\n\t\twidth: $clickable-area;\n\t\tmin-width: $clickable-area;\n\t\theight: $clickable-area;\n\t\tborder-radius: $clickable-area;\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $clickable-area - 2 * $autocomplete-padding;\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__status {\n\t\tposition: absolute;\n\t\tright: -4px;\n\t\tbottom: -4px;\n\t\tbox-sizing: border-box;\n\t\twidth: 18px;\n\t\theight: 18px;\n\t\tborder: 2px solid var(--color-main-background);\n\t\tborder-radius: 50%;\n\t\tbackground-color: var(--color-main-background);\n\t\tfont-size: var(--default-font-size);\n\t\tline-height: 15px;\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-size: 16px;\n\t\tbackground-position: center;\n\n\t\t&--online{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-online.svg');\n\t\t}\n\t\t&--dnd{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-dnd.svg');\n\t\t\tbackground-color: #ffffff;\n\t\t}\n\t\t&--away{\n\t\t\tbackground-image: url('../../assets/status-icons/user-status-away.svg');\n\t\t}\n\t\t&--icon {\n\t\t\tborder: none;\n\t\t\tbackground-color: transparent;\n\t\t}\n\t}\n\n\t&__content {\n\t\tdisplay: flex;\n\t\tflex: 1 1 100%;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\tmin-width: 0;\n\t\tpadding-left: $autocomplete-padding;\n\t}\n\n\t&__title,\n\t&__subline {\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&__subline {\n\t\tcolor: var(--color-text-lighter);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=u},4388:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-724f9d58]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.mention-bubble--primary .mention-bubble__content[data-v-724f9d58]{color:var(--color-primary-text);background-color:var(--color-primary-element)}.mention-bubble__wrapper[data-v-724f9d58]{max-width:150px;height:18px;vertical-align:text-bottom;display:inline-flex;align-items:center}.mention-bubble__content[data-v-724f9d58]{display:inline-flex;overflow:hidden;align-items:center;max-width:100%;height:20px;-webkit-user-select:none;user-select:none;padding-right:6px;padding-left:2px;border-radius:10px;background-color:var(--color-background-dark)}.mention-bubble__icon[data-v-724f9d58]{position:relative;width:16px;height:16px;border-radius:8px;background-color:var(--color-background-darker);background-repeat:no-repeat;background-position:center;background-size:12px}.mention-bubble__icon--with-avatar[data-v-724f9d58]{color:inherit;background-size:cover}.mention-bubble__title[data-v-724f9d58]{overflow:hidden;margin-left:2px;white-space:nowrap;text-overflow:ellipsis}.mention-bubble__title[data-v-724f9d58]::before{content:attr(title)}.mention-bubble__select[data-v-724f9d58]{position:absolute;z-index:-1;left:-1000px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/RichContenteditable/MentionBubble.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC8FvB,mEACC,+BAAgC,CAChC,6CAA8C,CAC9C,0CAGA,eAXsB,CAatB,WAAwC,CACxC,0BAA2B,CAC3B,mBAAoB,CACpB,kBAAmB,CACnB,0CAGA,mBAAoB,CACpB,eAAgB,CAChB,kBAAmB,CACnB,cAAe,CACf,WAzBkB,CA0BlB,wBAAyB,CACzB,gBAAiB,CACjB,iBAAkC,CAClC,gBA3BkB,CA4BlB,kBAAiC,CACjC,6CAA8C,CAC9C,uCAGA,iBAAkB,CAClB,UAjCuD,CAkCvD,WAlCuD,CAmCvD,iBAAsC,CACtC,+CAAgD,CAChD,2BAA4B,CAC5B,0BAA2B,CAC3B,oBAA0D,CAE1D,oDACC,aAAc,CACd,qBAAsB,CACtB,wCAID,eAAgB,CAChB,eAlDkB,CAmDlB,kBAAmB,CACnB,sBAAuB,CAJvB,gDAOC,mBAAoB,CACpB,yCAKD,iBAAkB,CAClB,UAAW,CACX,YAAa",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n$bubble-height: 20px;\n$bubble-max-width: 150px;\n$bubble-padding: 2px;\n$bubble-avatar-size: $bubble-height - 2 * $bubble-padding;\n\n.mention-bubble {\n\t&--primary &__content {\n\t\tcolor: var(--color-primary-text);\n\t\tbackground-color: var(--color-primary-element);\n\t}\n\n\t&__wrapper {\n\t\tmax-width: $bubble-max-width;\n\t\t// Align with text\n\t\theight: $bubble-height - $bubble-padding;\n\t\tvertical-align: text-bottom;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\toverflow: hidden;\n\t\talign-items: center;\n\t\tmax-width: 100%;\n\t\theight: $bubble-height ;\n\t\t-webkit-user-select: none;\n\t\tuser-select: none;\n\t\tpadding-right: $bubble-padding * 3;\n\t\tpadding-left: $bubble-padding;\n\t\tborder-radius: $bubble-height / 2;\n\t\tbackground-color: var(--color-background-dark);\n\t}\n\n\t&__icon {\n\t\tposition: relative;\n\t\twidth: $bubble-avatar-size;\n\t\theight: $bubble-avatar-size;\n\t\tborder-radius: $bubble-avatar-size / 2;\n\t\tbackground-color: var(--color-background-darker);\n\t\tbackground-repeat: no-repeat;\n\t\tbackground-position: center;\n\t\tbackground-size: $bubble-avatar-size - 2 * $bubble-padding;\n\n\t\t&--with-avatar {\n\t\t\tcolor: inherit;\n\t\t\tbackground-size: cover;\n\t\t}\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\tmargin-left: $bubble-padding;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t\t// Put label in ::before so it is not selectable\n\t\t&::before {\n\t\t\tcontent: attr(title);\n\t\t}\n\t}\n\n\t// Hide the mention id so it is selectable\n\t&__select {\n\t\tposition: absolute;\n\t\tz-index: -1;\n\t\tleft: -1000px;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},2305:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-6d5a0150]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.rich-contenteditable__input[data-v-6d5a0150]{overflow-y:auto;width:auto;margin:0;padding:6px;cursor:text;white-space:pre-wrap;word-break:break-word;color:var(--color-main-text);border:1px solid var(--color-border-dark);border-radius:var(--border-radius);outline:none;background-color:var(--color-main-background);font-family:var(--font-face);font-size:inherit;min-height:44px;max-height:242px}.rich-contenteditable__input--empty[data-v-6d5a0150]:before{content:attr(placeholder);color:var(--color-text-maxcontrast)}.rich-contenteditable__input[contenteditable='false'][data-v-6d5a0150]:not(.rich-contenteditable__input--disabled){cursor:default;background-color:transparent;color:var(--color-main-text);border-color:transparent;opacity:1;border-radius:0}.rich-contenteditable__input--multiline[data-v-6d5a0150]{min-height:132px;max-height:none}.rich-contenteditable__input--disabled[data-v-6d5a0150]{opacity:.5;color:var(--color-text-lighter);border:1px solid var(--color-background-darker);border-radius:var(--border-radius);background-color:var(--color-background-dark)}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/RichContenteditable/RichContenteditable.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CC8hBxB,8CACC,eAAgB,CAChB,UAAW,CACX,QAAS,CACT,WAAY,CACZ,WAAY,CACZ,oBAAqB,CACrB,qBAAsB,CACtB,4BAA6B,CAC7B,yCAA0C,CAC1C,kCAAmC,CACnC,YAAa,CACb,6CAA8C,CAC9C,4BAA6B,CAC7B,iBAAkB,CAClB,eC5hBoB,CD6hBpB,gBAAiC,CAGjC,4DACC,yBAA0B,CAC1B,mCAAoC,CArBtC,mHAyBE,cAAe,CACf,4BAA6B,CAC7B,4BAA6B,CAC7B,wBAAyB,CACzB,SAAU,CACV,eAAgB,CAChB,yDAGA,gBAA+B,CAE/B,eAAgB,CAChB,wDAGA,UCpiBmB,CDqiBnB,+BAAgC,CAChC,+CAAgD,CAChD,kCAAmC,CACnC,6CAA8C",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n// Standalone styling, independent from server\n.rich-contenteditable__input {\n\toverflow-y: auto;\n\twidth: auto;\n\tmargin: 0;\n\tpadding: 6px;\n\tcursor: text;\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n\tcolor: var(--color-main-text);\n\tborder: 1px solid var(--color-border-dark);\n\tborder-radius: var(--border-radius);\n\toutline: none;\n\tbackground-color: var(--color-main-background);\n\tfont-family: var(--font-face);\n\tfont-size: inherit;\n\tmin-height: $clickable-area;\n\tmax-height: $clickable-area * 5.5;\n\n\t// Cannot use :empty because of firefox bug https://bugzilla.mozilla.org/show_bug.cgi?id=1513303\n\t&--empty:before {\n\t\tcontent: attr(placeholder);\n\t\tcolor: var(--color-text-maxcontrast);\n\t}\n\n\t&[contenteditable='false']:not(&--disabled) {\n\t\tcursor: default;\n\t\tbackground-color: transparent;\n\t\tcolor: var(--color-main-text);\n\t\tborder-color: transparent;\n\t\topacity: 1;\n\t\tborder-radius: 0;\n\t}\n\n\t&--multiline {\n\t\tmin-height: $clickable-area * 3;\n\t\t// No max for mutiline\n\t\tmax-height: none;\n\t}\n\n\t&--disabled {\n\t\topacity: $opacity_disabled;\n\t\tcolor: var(--color-text-lighter);\n\t\tborder: 1px solid var(--color-background-darker);\n\t\tborder-radius: var(--border-radius);\n\t\tbackground-color: var(--color-background-dark);\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},4398:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.tribute-container,.tribute-container-emoji{z-index:9000;overflow:auto;min-width:250px;max-width:300px;max-height:288px;margin:5px 0;color:var(--color-main-text);border-radius:var(--border-radius);background:var(--color-main-background);box-shadow:0 1px 5px var(--color-box-shadow)}.tribute-container-emoji{min-width:200px;max-width:200px;padding:4px;max-height:187.25px}.tribute-container-emoji__item{border-radius:8px;padding:4px 8px;margin-bottom:4px;opacity:0.8;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tribute-container-emoji__item:last-child{margin-bottom:0}.tribute-container-emoji__item__emoji{padding-right:8px}.tribute-container-emoji .highlight{opacity:1;color:var(--color-main-text);background:var(--color-primary-light)}.tribute-container-emoji .highlight,.tribute-container-emoji .highlight *{cursor:pointer}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/RichContenteditable/RichContenteditable.vue"],names:[],mappings:"AAGA,sBACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCilBxB,4CACC,YAAa,CACb,aAAc,CACd,eAAgB,CAChB,eAAgB,CAGhB,gBAA0C,CAE1C,YAAa,CACb,4BAA6B,CAC7B,kCAAmC,CACnC,uCAAwC,CACxC,4CAA6C,CAC7C,yBAGA,eAAgB,CAChB,eAAgB,CAChB,WAAY,CAEZ,mBAAmC,CAEnC,+BACC,iBAAkB,CAClB,eAAgB,CAChB,iBAAkB,CAClB,WAAY,CACZ,cAAe,CAGf,kBAAmB,CACnB,eAAgB,CAChB,sBAAuB,CAVvB,0CAaC,eAAgB,CAChB,sCAGA,iBAAkB,CAxBrB,oCA6BE,SAAU,CACV,4BAA6B,CAC7B,qCAAsC,CA/BxC,0EAiCG,cAAe",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.tribute-container, .tribute-container-emoji {\n\tz-index: 9000;\n\toverflow: auto;\n\tmin-width: 250px;\n\tmax-width: 300px;\n\t// Show maximum 4 entries and a half to show scroll\n\t// 44px + 10px padding\n\tmax-height: ($clickable-area + 20px) * 4.5;\n\t// Space it out a bit from the text\n\tmargin: 5px 0;\n\tcolor: var(--color-main-text);\n\tborder-radius: var(--border-radius);\n\tbackground: var(--color-main-background);\n\tbox-shadow: 0 1px 5px var(--color-box-shadow);\n}\n\n.tribute-container-emoji {\n\tmin-width: 200px;\n\tmax-width: 200px;\n\tpadding: 4px;\n\t// Show maximum 5 entries and a half to show scroll\n\tmax-height: 34.5px * 5 + 29.5px / 2;\n\n\t&__item {\n\t\tborder-radius: 8px;\n\t\tpadding: 4px 8px;\n\t\tmargin-bottom: 4px;\n\t\topacity: 0.8;\n\t\tcursor: pointer;\n\n\t\t// Take care of long names\n\t\twhite-space: nowrap;\n\t\toverflow: hidden;\n\t\ttext-overflow: ellipsis;\n\n\t\t&:last-child {\n\t\t\tmargin-bottom: 0;\n\t\t}\n\n\t\t&__emoji {\n\t\t\tpadding-right: 8px;\n\t\t}\n\t}\n\n\t.highlight {\n\t\topacity: 1;\n\t\tcolor: var(--color-main-text);\n\t\tbackground: var(--color-primary-light);\n\t\t&, * {\n\t\t\tcursor: pointer;\n\t\t}\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},1305:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-548823d7]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.settings-section[data-v-548823d7]{display:block;margin-bottom:auto;padding:30px}.settings-section[data-v-548823d7]:not(:last-child){border-bottom:1px solid var(--color-border)}.settings-section__title[data-v-548823d7]{display:inline-flex;align-items:center;justify-content:center;font-size:20px;font-weight:bold}.settings-section__info[data-v-548823d7]{display:flex;align-items:center;justify-content:center;width:44px;height:44px;margin:-14px;margin-left:0;opacity:.7}.settings-section__info[data-v-548823d7]:hover,.settings-section__info[data-v-548823d7]:focus,.settings-section__info[data-v-548823d7]:active{opacity:1}.settings-section__desc[data-v-548823d7]{margin-top:-.2em;margin-bottom:1em;opacity:.7}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/SettingsSection/SettingsSection.vue","webpack://./src/assets/variables.scss"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCuGxB,mCACC,aAAc,CACd,kBAAmB,CACnB,YAAa,CAHd,oDAME,2CAA4C,CAC5C,0CAGA,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CACvB,cAAe,CACf,gBAAiB,CACjB,yCAGA,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,UC3GmB,CD4GnB,WC5GmB,CD8GnB,YCtG8C,CDuG9C,aAAc,CACd,UC9FiB,CDqFjB,8IAYC,SChGa,CDiGb,yCAID,gBAAiB,CACjB,iBAAkB,CAClB,UCxGiB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.settings-section {\n\tdisplay: block;\n\tmargin-bottom: auto;\n\tpadding: 30px;\n\n\t&:not(:last-child) {\n\t\tborder-bottom: 1px solid var(--color-border);\n\t}\n\n\t&__title {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 20px;\n\t\tfont-weight: bold;\n\t}\n\n\t&__info {\n\t\tdisplay: flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\twidth: $clickable-area;\n\t\theight: $clickable-area;\n\t\t// make sure to properly align the icon with the text\n\t\tmargin: -$icon-margin;\n\t\tmargin-left: 0;\n\t\topacity: $opacity_normal;\n\n\t\t&:hover, &:focus, &:active {\n\t\t\topacity: $opacity_full;\n\t\t}\n\t}\n\n\t&__desc {\n\t\tmargin-top: -.2em;\n\t\tmargin-bottom: 1em;\n\t\topacity: $opacity_normal;\n\t}\n}\n\n","/**\n * @copyright Copyright (c) 2019 John Molakvoæ \n *\n * @author John Molakvoæ \n *\n * @license GNU AGPL version 3 or any later version\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n */\n\n// https://uxplanet.org/7-rules-for-mobile-ui-button-design-e9cf2ea54556\n// recommended is 48px\n// 44px is what we choose and have very good visual-to-usability ratio\n$clickable-area: 44px;\n\n// background icon size\n// also used for the scss icon font\n$icon-size: 16px;\n\n// icon padding for a $clickable-area width and a $icon-size icon\n// ( 44px - 16px ) / 2\n$icon-margin: ($clickable-area - $icon-size) / 2;\n\n// transparency background for icons\n$icon-focus-bg: rgba(127, 127, 127, .25);\n\n// popovermenu arrow width from the triangle center\n$arrow-width: 9px;\n\n// opacities\n$opacity_disabled: .5;\n$opacity_normal: .7;\n$opacity_full: 1;\n\n// menu round background hover feedback\n// good looking on dark AND white bg\n$action-background-hover: rgba(127, 127, 127, .25);\n\n// various structure data used in the \n// `AppNavigation` component\n$header-height: 50px;\n$navigation-width: 300px;\n\n// mobile breakpoint\n$breakpoint-mobile: 1024px;\n"],sourceRoot:""}]),t.Z=o},3317:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-4c50db00]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}[data-v-4c50db00] .multiselect__tags{border:none !important}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/TimezonePicker/TimezonePicker.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCoHxB,qCACC,sBAAuB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n::v-deep .multiselect__tags {\n\tborder: none !important; // Remove the Multiselect border\n}\n"],sourceRoot:""}]),t.Z=o},4705:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,".material-design-icon[data-v-864988e2]{display:flex;align-self:center;justify-self:center;align-items:center;justify-content:center}.user-bubble__wrapper[data-v-864988e2]{display:inline-block;vertical-align:middle;min-width:0;max-width:100%}.user-bubble__content[data-v-864988e2]{display:inline-flex;max-width:100%;background-color:var(--color-background-dark)}.user-bubble__content--primary[data-v-864988e2]{color:var(--color-primary-text);background-color:var(--color-primary-element)}.user-bubble__content[data-v-864988e2]>:last-child{padding-right:8px}.user-bubble__avatar[data-v-864988e2]{align-self:center}.user-bubble__title[data-v-864988e2]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.user-bubble__title[data-v-864988e2],.user-bubble__secondary[data-v-864988e2]{padding:0;padding-left:4px}\n","",{version:3,sources:["webpack://./src/assets/material-icons.css","webpack://./src/components/UserBubble/UserBubble.vue"],names:[],mappings:"AAGA,uCACC,YAAa,CACb,iBAAkB,CAClB,mBAAoB,CACpB,kBAAmB,CACnB,sBAAuB,CCqRvB,uCAEC,oBAAqB,CACrB,qBAAsB,CAEtB,WAAY,CACZ,cAAe,CACf,uCAGA,mBAAoB,CACpB,cAAe,CACf,6CAA8C,CAE9C,gDACC,+BAAgC,CAChC,6CAA8C,CAP/C,mDAYC,iBAAkB,CAClB,sCAID,iBAAkB,CAClB,qCAGA,eAAgB,CAChB,kBAAmB,CACnB,sBAAuB,CACvB,8EAKA,SAAU,CACV,gBAAiB",sourcesContent:["/*\n* Ensure proper alignment of the vue material icons\n*/\n.material-design-icon {\n\tdisplay: flex;\n\talign-self: center;\n\tjustify-self: center;\n\talign-items: center;\n\tjustify-content: center;\n}\n","$scope_version:\"17fd6e1\"; @import 'variables'; @import 'material-icons';\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.user-bubble {\n\t&__wrapper {\n\t\t// align inline with text\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t\t// shrink and allow grow to fit\n\t\tmin-width: 0;\n\t\tmax-width: 100%;\n\t}\n\n\t&__content {\n\t\tdisplay: inline-flex;\n\t\tmax-width: 100%;\n\t\tbackground-color: var(--color-background-dark);\n\n\t\t&--primary {\n\t\t\tcolor: var(--color-primary-text);\n\t\t\tbackground-color: var(--color-primary-element);\n\t\t}\n\n\t\t> :last-child {\n\t\t\t// border radius left padding\n\t\t\tpadding-right: 8px;\n\t\t}\n\t}\n\n\t&__avatar {\n\t\talign-self: center;\n\t}\n\n\t&__title {\n\t\toverflow: hidden;\n\t\twhite-space: nowrap;\n\t\ttext-overflow: ellipsis;\n\t}\n\n\t&__title,\n\t&__secondary {\n\t\t// proper spacing between avatar, title & slot\n\t\tpadding: 0;\n\t\tpadding-left: 4px;\n\t}\n}\n\n"],sourceRoot:""}]),t.Z=o},6381:function(n,t,e){"use strict";var i=e(4015),a=e.n(i),r=e(3645),o=e.n(r)()(a());o.push([n.id,"\n.app-navigation-spacer[data-v-42195cc8] {\n\tflex-shrink: 0;\n\torder: 1;\n\theight: 22px;\n}\n\n","",{version:3,sources:["webpack://./src/components/AppNavigationSpacer/AppNavigationSpacer.vue"],names:[],mappings:";AAgCA;CACA,cAAA;CACA,QAAA;CACA,YAAA;AACA",sourcesContent:["\x3c!--\n - @copyright Copyright (c) 2019 Christoph Wurst \n -\n - @author Christoph Wurst \n -\n - @license GNU AGPL version 3 or any later version\n -\n - This program is free software: you can redistribute it and/or modify\n - it under the terms of the GNU Affero General Public License as\n - published by the Free Software Foundation, either version 3 of the\n - License, or (at your option) any later version.\n -\n - This program is distributed in the hope that it will be useful,\n - but WITHOUT ANY WARRANTY; without even the implied warranty of\n - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - GNU Affero General Public License for more details.\n -\n - You should have received a copy of the GNU Affero General Public License\n - along with this program. If not, see .\n -\n --\x3e\n\n\n