diff --git a/2/ecolyo.16b441c1d2a28260ae40.js b/2/ecolyo.4fa6b651882eb2869050.js similarity index 98% rename from 2/ecolyo.16b441c1d2a28260ae40.js rename to 2/ecolyo.4fa6b651882eb2869050.js index ae75a43792ab331796bd3edb0cf12e536a6af561..d388af172eade64e94f12d574f85d7fc7c9a4bd5 100644 --- a/2/ecolyo.16b441c1d2a28260ae40.js +++ b/2/ecolyo.4fa6b651882eb2869050.js @@ -2419,18 +2419,18 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _react = _interopRequireDefault(__webpack_require__("q1tI")); +var _Button = _interopRequireDefault(__webpack_require__("FtsS")); + +var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); var _I18n = __webpack_require__("buk/"); -var _reactRouterDom = __webpack_require__("55Ip"); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); -var _Button = _interopRequireDefault(__webpack_require__("FtsS")); +var _reactRouterDom = __webpack_require__("55Ip"); __webpack_require__("7ttY"); -var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); - var AnalysisErrorModal = function AnalysisErrorModal() { var _useI18n = (0, _I18n.useI18n)(), t = _useI18n.t; @@ -2461,15 +2461,15 @@ var AnalysisErrorModal = function AnalysisErrorModal() { }, /*#__PURE__*/_react.default.createElement("div", { id: 'accessibility-title' }, t('analysis_error_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { - className: "em-root analyis-error-container" + className: "em-root analysis-error-container" }, /*#__PURE__*/_react.default.createElement("div", { className: "em-content" }, /*#__PURE__*/_react.default.createElement("div", { - className: "analyis-error-title text-20-bold" + className: "analysis-error-title text-20-bold" }, t('analysis_error_modal.title')), /*#__PURE__*/_react.default.createElement("div", { - className: "analyis-error-message text-16-normal" + className: "analysis-error-message text-16-normal" }, t('analysis_error_modal.message')), /*#__PURE__*/_react.default.createElement("div", { - className: "analyis-error-button" + className: "analysis-error-button" }, /*#__PURE__*/_react.default.createElement(_Button.default, { "aria-label": t('analysis_error_modal.accessibility.button_go_back'), onClick: goBack, @@ -2497,7 +2497,7 @@ exports.default = _default; exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysis-root.black .modal-overlay .modal-close-button {\n display: none;\n}\n\n.analyis-error-container {\n border-radius: 4px;\n margin-bottom: 1rem;\n color: #e0e0e0;\n text-align: center;\n}\n.analyis-error-container .analyis-error-title {\n color: #e3b82a;\n margin-bottom: 2rem;\n}\n.analyis-error-container .analyis-error-button {\n display: flex;\n justify-content: space-between;\n margin-top: 2rem;\n}\n.analyis-error-container .analyis-error-button button.btn-highlight, .analyis-error-container .analyis-error-button button.btn-secondary-positive {\n width: 45%;\n margin-bottom: 0;\n}\n.analyis-error-container .analyis-error-button button.btn-secondary-positive {\n padding: 0.5rem 1rem;\n}\n.analyis-error-container .analyis-error-button button.btn-highlight {\n padding: 0.25rem 0.5rem;\n}\n@media only screen and (max-width : 768px) {\n .analyis-error-container .analyis-error-button {\n flex-direction: column-reverse;\n }\n .analyis-error-container .analyis-error-button button.btn-highlight, .analyis-error-container .analyis-error-button button.btn-secondary-positive {\n margin-bottom: 0;\n width: 100%;\n height: 45px;\n }\n}\n\n#accessibility-title {\n display: none;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.analysis-root.black .modal-overlay .modal-close-button {\n display: none;\n}\n\n.analysis-error-container {\n border-radius: 4px;\n margin-bottom: 1rem;\n color: #e0e0e0;\n text-align: center;\n}\n.analysis-error-container .analysis-error-title {\n color: #e3b82a;\n margin-bottom: 2rem;\n}\n.analysis-error-container .analysis-error-button {\n display: flex;\n justify-content: space-between;\n gap: 1rem;\n margin-top: 2rem;\n}\n.analysis-error-container .analysis-error-button button {\n margin: 0;\n}\n.analysis-error-container .analysis-error-button button.btn-highlight, .analysis-error-container .analysis-error-button button.btn-secondary-positive {\n width: 45%;\n margin-bottom: 0;\n}\n.analysis-error-container .analysis-error-button button.btn-secondary-positive {\n padding: 0.5rem 1rem;\n}\n.analysis-error-container .analysis-error-button button.btn-highlight {\n padding: 0.25rem 0.5rem;\n}\n@media only screen and (max-width : 768px) {\n .analysis-error-container .analysis-error-button {\n flex-direction: column-reverse;\n }\n .analysis-error-container .analysis-error-button button.btn-highlight, .analysis-error-container .analysis-error-button button.btn-secondary-positive {\n margin-bottom: 0;\n width: 100%;\n height: 45px;\n }\n}\n\n#accessibility-title {\n display: none;\n}", ""]); diff --git a/3/ecolyo.bbcc51224dcd46292d2d.js b/3/ecolyo.92f85627b114d8c56c51.js similarity index 96% rename from 3/ecolyo.bbcc51224dcd46292d2d.js rename to 3/ecolyo.92f85627b114d8c56c51.js index 7a5dcd3ee4cc86f17f8f18b53ee4dd34def7960d..39e0d38306aa1dbe1a44b3dacdd4f7c540b3d6a2 100644 --- a/3/ecolyo.bbcc51224dcd46292d2d.js +++ b/3/ecolyo.92f85627b114d8c56c51.js @@ -9,32 +9,6 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE -/***/ }), - -/***/ "/y1n": -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__("t/Vw"); - -if(typeof content === 'string') content = [[module.i, content, '']]; - -var transform; -var insertInto; - - - -var options = {"hmr":true} - -options.transform = transform -options.insertInto = undefined; - -var update = __webpack_require__("aET+")(content, options); - -if(content.locals) module.exports = content.locals; - -if(false) {} - /***/ }), /***/ 0: @@ -589,6 +563,32 @@ exports.default = ConnectionService; /***/ }), +/***/ "49ra": +/***/ (function(module, exports, __webpack_require__) { + + +var content = __webpack_require__("JppB"); + +if(typeof content === 'string') content = [[module.i, content, '']]; + +var transform; +var insertInto; + + + +var options = {"hmr":true} + +options.transform = transform +options.insertInto = undefined; + +var update = __webpack_require__("aET+")(content, options); + +if(content.locals) module.exports = content.locals; + +if(false) {} + +/***/ }), + /***/ "4xwb": /***/ (function(module, exports, __webpack_require__) { @@ -867,94 +867,6 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE -/***/ }), - -/***/ "9J6O": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("TqRt"); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - -var _I18n = __webpack_require__("buk/"); - -var _Button = _interopRequireDefault(__webpack_require__("FtsS")); - -__webpack_require__("/y1n"); - -var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); - -var _reactRedux = __webpack_require__("/MKj"); - -var _decoreText = __webpack_require__("j5h9"); - -var ReleaseNotesModal = function ReleaseNotesModal(_ref) { - var open = _ref.open, - handleCloseClick = _ref.handleCloseClick; - - var _useI18n = (0, _I18n.useI18n)(), - t = _useI18n.t; - - var _useSelector = (0, _reactRedux.useSelector)(function (state) { - return state.ecolyo.global; - }), - releaseNotes = _useSelector.releaseNotes; - - return /*#__PURE__*/_react.default.createElement(_Dialog.default, { - open: open, - disableEscapeKeyDown: true, - onClose: function onClose(event, reason) { - event && reason !== 'backdropClick' && handleCloseClick(); - }, - "aria-labelledby": 'accessibility-title', - classes: { - root: 'modal-root', - paper: 'modal-paper' - } - }, /*#__PURE__*/_react.default.createElement("div", { - id: 'accessibility-title' - }, t('consumption_visualizer.release_notes_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { - className: "em-root release-note-container" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "em-content" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-title text-20-bold" - }, t('consumption_visualizer.release_notes_modal.title')), /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-message text-16-bold" - }, t('consumption_visualizer.release_notes_modal.message')), /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-message text-16-normal" - }, releaseNotes.notes.length > 0 && releaseNotes.notes.map(function (note, index) { - return /*#__PURE__*/_react.default.createElement("div", { - key: index, - className: "release-note-part" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-message text-16-bold" - }, note.title), /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-description text-16-normal" - }, (0, _decoreText.decoreText)(note.description))); - })), /*#__PURE__*/_react.default.createElement("div", { - className: "release-note-button" - }, /*#__PURE__*/_react.default.createElement(_Button.default, { - "aria-label": t('consumption_visualizer.release_notes_modal.accessibility.button_go_back'), - onClick: handleCloseClick, - classes: { - root: 'btn-highlight', - label: 'text-16-bold' - } - }, t('consumption_visualizer.release_notes_modal.go_back')))))); -}; - -var _default = ReleaseNotesModal; -exports.default = _default; - /***/ }), /***/ "A45e": @@ -1403,16 +1315,6 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _fluid = __webpack_require__("5Wkc"); - -var _timeStep = __webpack_require__("cKQ8"); - -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); - -var _reactRedux = __webpack_require__("/MKj"); - -__webpack_require__("xz5R"); - var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); var _ExpiredConsentModal = _interopRequireDefault(__webpack_require__("m9+5")); @@ -1439,10 +1341,20 @@ var _KonnectorViewerList = _interopRequireDefault(__webpack_require__("WoCI")); var _Loader = _interopRequireDefault(__webpack_require__("Ra/y")); -var _PartnersIssueModal = _interopRequireDefault(__webpack_require__("HK68")); +var _PartnerIssueModal = _interopRequireDefault(__webpack_require__("Maki")); var _cozyClient = __webpack_require__("SH7X"); +var _fluid = __webpack_require__("5Wkc"); + +var _timeStep = __webpack_require__("cKQ8"); + +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); + +var _reactRedux = __webpack_require__("/MKj"); + +var _reactRouterDom = __webpack_require__("55Ip"); + var _profile = _interopRequireDefault(__webpack_require__("2l2O")); var _chart = __webpack_require__("U6AS"); @@ -1451,7 +1363,9 @@ var _global = __webpack_require__("c4IZ"); var _utils = __webpack_require__("c+yx"); -var _releaseNotesModal = _interopRequireDefault(__webpack_require__("9J6O")); +__webpack_require__("xz5R"); + +var _ReleaseNotesModal = _interopRequireDefault(__webpack_require__("mh/b")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -1469,6 +1383,7 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va var ConsumptionView = function ConsumptionView(_ref) { var fluidType = _ref.fluidType; + var history = (0, _reactRouterDom.useHistory)(); var client = (0, _cozyClient.useClient)(); var dispatch = (0, _reactRedux.useDispatch)(); var isMulti = fluidType !== _fluid.FluidType.MULTIFLUID; @@ -1510,31 +1425,34 @@ var ConsumptionView = function ConsumptionView(_ref) { var _useState9 = (0, _react.useState)(true), _useState10 = (0, _slicedToArray2.default)(_useState9, 2), openExpiredConsentModal = _useState10[0], - setopenExpiredConsentModal = _useState10[1]; + setOpenExpiredConsentModal = _useState10[1]; var _useState11 = (0, _react.useState)([]), _useState12 = (0, _slicedToArray2.default)(_useState11, 2), consentExpiredFluids = _useState12[0], - setconsentExpiredFluids = _useState12[1]; + setConsentExpiredFluids = _useState12[1]; - var updatekey = fluidType !== _fluid.FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? "".concat(fluidStatus[fluidType].lastDataDate.toLocaleString(), " + ").concat(fluidStatus[fluidType].status + fluidType) : ''; + var updateKey = fluidType !== _fluid.FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? "".concat(fluidStatus[fluidType].lastDataDate.toLocaleString(), " + ").concat(fluidStatus[fluidType].status + fluidType) : ''; var lastDataDateKey = fluidType !== _fluid.FluidType.MULTIFLUID && fluidStatus[fluidType].lastDataDate ? "".concat(fluidStatus[fluidType].lastDataDate.toLocaleString() + fluidType) : ''; var defineHeaderHeight = (0, _react.useCallback)(function (height) { setHeaderHeight(height); }, []); - var toggleReleaseNoteModal = (0, _react.useCallback)(function () { - setOpenReleaseNoteModal(function (prev) { - return !prev; - }); - dispatch((0, _global.showReleaseNotes)(false, releaseNotes.notes)); - }, [dispatch, releaseNotes.notes]); + var handleCloseReleaseNoteModal = (0, _react.useCallback)(function () { + setOpenReleaseNoteModal(false); + dispatch((0, _global.showReleaseNotes)(false, releaseNotes.notes, releaseNotes.redirectLink)); + + if (releaseNotes.redirectLink) { + history.push(releaseNotes.redirectLink); + } + }, [dispatch, history, releaseNotes.notes, releaseNotes.redirectLink]); var handleCloseModal = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { var profileService, updatedProfile; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - profileService = new _profile.default(client); + profileService = new _profile.default(client); // TODO change for each fluid ? + _context.next = 3; return profileService.updateProfile({ partnersIssueDate: (0, _utils.getTodayDate)() @@ -1624,7 +1542,7 @@ var ConsumptionView = function ConsumptionView(_ref) { _iterator.f(); } - if (subscribed) setconsentExpiredFluids(expiredConsents); + if (subscribed) setConsentExpiredFluids(expiredConsents); return function () { subscribed = false; }; @@ -1637,10 +1555,10 @@ var ConsumptionView = function ConsumptionView(_ref) { height: headerHeight }, /*#__PURE__*/_react.default.createElement(_FluidButtons.default, { activeFluid: fluidType, - key: updatekey - }), openReleaseNoteModal && /*#__PURE__*/_react.default.createElement(_releaseNotesModal.default, { + key: updateKey + }), openReleaseNoteModal && /*#__PURE__*/_react.default.createElement(_ReleaseNotesModal.default, { open: openReleaseNoteModal, - handleCloseClick: toggleReleaseNoteModal + handleCloseClick: handleCloseReleaseNoteModal }), isFluidKonnected ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, loading && /*#__PURE__*/_react.default.createElement("div", { className: 'consumptionview-loading', "aria-busy": "true" @@ -1673,10 +1591,13 @@ var ConsumptionView = function ConsumptionView(_ref) { isDisconnected: true, setActive: setActive, active: active - }) : /*#__PURE__*/_react.default.createElement(_KonnectorViewerList.default, null))), /*#__PURE__*/_react.default.createElement(_PartnersIssueModal.default, { - open: openPartnersIssueModal, - fluidStatus: fluidStatus, - handleCloseClick: handleCloseModal + }) : /*#__PURE__*/_react.default.createElement(_KonnectorViewerList.default, null))), fluidStatus.map(function (fluid) { + return fluid.maintenance && fluid.fluidType === fluidType && /*#__PURE__*/_react.default.createElement(_PartnerIssueModal.default, { + key: fluid.fluidType, + issuedFluid: fluid, + open: openPartnersIssueModal, + handleCloseClick: handleCloseModal + }); }), /*#__PURE__*/_react.default.createElement(_CustomPopupModal.default, { customPopup: customPopupModal, handleCloseClick: handleCloseCustomPopupModal @@ -1685,11 +1606,11 @@ var ConsumptionView = function ConsumptionView(_ref) { key: fluid, open: openExpiredConsentModal, handleCloseClick: function handleCloseClick() { - return setopenExpiredConsentModal(false); + return setOpenExpiredConsentModal(false); }, fluidType: fluid, toggleModal: function toggleModal() { - return setopenExpiredConsentModal(function (prev) { + return setOpenExpiredConsentModal(function (prev) { return !prev; }); } @@ -2111,16 +2032,16 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); + +var _cozyClient = __webpack_require__("SH7X"); var _I18n = __webpack_require__("buk/"); -var _cozyClient = __webpack_require__("SH7X"); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); var _reactRedux = __webpack_require__("/MKj"); -var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); - __webpack_require__("981c"); var _fluid = __webpack_require__("5Wkc"); @@ -2129,59 +2050,59 @@ var _userChallenge = __webpack_require__("dQx6"); var _userDuel = __webpack_require__("MBn6"); -var _picto = __webpack_require__("6DBe"); - -var _challenge = __webpack_require__("ojwR"); +var _account = _interopRequireDefault(__webpack_require__("gucQ")); -var _global = __webpack_require__("c4IZ"); +var _challenge = _interopRequireDefault(__webpack_require__("kdea")); var _fluid2 = _interopRequireDefault(__webpack_require__("z34f")); -var _challenge2 = _interopRequireDefault(__webpack_require__("kdea")); +var _challenge2 = __webpack_require__("ojwR"); -var _account = _interopRequireDefault(__webpack_require__("gucQ")); - -var _chevronDown = _interopRequireDefault(__webpack_require__("CYAo")); +var _global = __webpack_require__("c4IZ"); -var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); +var _picto = __webpack_require__("6DBe"); var _core = __webpack_require__("TTf+"); +var _chevronDown = _interopRequireDefault(__webpack_require__("CYAo")); + var _notif_error = _interopRequireDefault(__webpack_require__("pSnQ")); var _notif_maintenance = _interopRequireDefault(__webpack_require__("goTn")); -var _ConnectionNotFound = _interopRequireDefault(__webpack_require__("7qdp")); - var _Connection = _interopRequireDefault(__webpack_require__("G9aQ")); +var _ConnectionNotFound = _interopRequireDefault(__webpack_require__("7qdp")); + var _ConnectionResult = _interopRequireDefault(__webpack_require__("sWHR")); var _KonnectorModal = _interopRequireDefault(__webpack_require__("jer4")); +var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); + +var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); + var _triggers = __webpack_require__("Ih3Q"); var _ConnectionFlow = _interopRequireDefault(__webpack_require__("/HH+")); var _flowEvents = __webpack_require__("Pdj9"); -var _luxon = __webpack_require__("ExVU"); - -var _chart = __webpack_require__("U6AS"); +var _fluidSlug = __webpack_require__("jFN3"); -var _dateChart = _interopRequireDefault(__webpack_require__("Ty7+")); +var _konnectorError = __webpack_require__("fdru"); -var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); +var _usageEvent = __webpack_require__("/fHX"); -var _usageEvent = _interopRequireDefault(__webpack_require__("dECN")); +var _luxon = __webpack_require__("ExVU"); -var _usageEvent2 = __webpack_require__("/fHX"); +var _dateChart = _interopRequireDefault(__webpack_require__("Ty7+")); var _partnersInfo = _interopRequireDefault(__webpack_require__("4zrG")); -var _fluidSlug = __webpack_require__("jFN3"); +var _usageEvent2 = _interopRequireDefault(__webpack_require__("dECN")); -var _konnectorError = __webpack_require__("fdru"); +var _chart = __webpack_require__("U6AS"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -2334,7 +2255,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { break; } - challengeService = new _challenge2.default(client); + challengeService = new _challenge.default(client); _context2.next = 4; return challengeService.initChallengeDuelProgress(currentChallenge); @@ -2342,7 +2263,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { _yield$challengeServi = _context2.sent; updatedUserChallenge = _yield$challengeServi.updatedUserChallenge; dataloads = _yield$challengeServi.dataloads; - dispatch((0, _challenge.setChallengeConsumption)(updatedUserChallenge, dataloads)); // Check is duel is done and display notification + dispatch((0, _challenge2.setChallengeConsumption)(updatedUserChallenge, dataloads)); // Check is duel is done and display notification _context2.next = 10; return challengeService.isChallengeDone(updatedUserChallenge, dataloads); @@ -2444,7 +2365,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { } _context4.next = 12; - return _usageEvent.default.udpateConnectionAttemptEvent(client, fluidSlug); + return _usageEvent2.default.udpateConnectionAttemptEvent(client, fluidSlug); case 12: if (!(updatedFluidStatus.length > 0)) { @@ -2489,8 +2410,8 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { while (1) { switch (_context5.prev = _context5.next) { case 0: - return _context5.abrupt("return", _usageEvent.default.addEvent(client, { - type: isConnexion ? _usageEvent2.UsageEventType.KONNECTOR_CONNECT_EVENT : _usageEvent2.UsageEventType.KONNECTOR_REFRESH_EVENT, + return _context5.abrupt("return", _usageEvent2.default.addEvent(client, { + type: isConnexion ? _usageEvent.UsageEventType.KONNECTOR_CONNECT_EVENT : _usageEvent.UsageEventType.KONNECTOR_REFRESH_EVENT, target: konnectorSlug, result: 'success' })); @@ -2513,8 +2434,8 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { while (1) { switch (_context6.prev = _context6.next) { case 0: - return _context6.abrupt("return", _usageEvent.default.addEvent(client, { - type: isConnexion ? _usageEvent2.UsageEventType.KONNECTOR_CONNECT_EVENT : _usageEvent2.UsageEventType.KONNECTOR_REFRESH_EVENT, + return _context6.abrupt("return", _usageEvent2.default.addEvent(client, { + type: isConnexion ? _usageEvent.UsageEventType.KONNECTOR_CONNECT_EVENT : _usageEvent.UsageEventType.KONNECTOR_REFRESH_EVENT, target: konnectorSlug, result: 'error' })); @@ -2604,7 +2525,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { }) : /*#__PURE__*/_react.default.createElement(_Icon.default, { icon: iconAddType, size: 49 - }), fluidStatus.status === _fluid.FluidState.PARTNER_ISSUE ? /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { + }), fluidStatus.maintenance ? /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _notif_maintenance.default, size: 24, className: "konnector-state-picto" @@ -2613,9 +2534,9 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { size: 24, className: "konnector-state-picto" })); - }, [fluidStatus.connection.account, fluidStatus.status, iconAddType, iconType, isOutdatedData]); + }, [fluidStatus.connection.account, fluidStatus.maintenance, fluidStatus.status, iconAddType, iconType, isOutdatedData]); var displayKonnectorHeader = (0, _react.useCallback)(function () { - if (fluidStatus.status === _fluid.FluidState.PARTNER_ISSUE) { + if (fluidStatus.maintenance) { return /*#__PURE__*/_react.default.createElement("span", { className: "text-16-bold" }, t("konnector_options.partner_issue")); @@ -2734,7 +2655,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { expanded: active, onChange: toggleAccordion, classes: { - root: "expansion-panel-root ".concat(fluidStatus.status !== _fluid.FluidState.PARTNER_ISSUE && (fluidStatus.status === _fluid.FluidState.ERROR || fluidStatus.status === _fluid.FluidState.ERROR_LOGIN_FAILED || isOutdatedData) ? 'red-border' : '') + root: "expansion-panel-root ".concat(!fluidStatus.maintenance && (fluidStatus.status === _fluid.FluidState.ERROR || fluidStatus.status === _fluid.FluidState.ERROR_LOGIN_FAILED || isOutdatedData) ? 'red-border' : '') } }, /*#__PURE__*/_react.default.createElement(_core.AccordionSummary, { "aria-label": t("konnector_options.accessibility.button_toggle_detail_".concat(_fluid.FluidType[fluidStatus.fluidType].toLowerCase())), @@ -2748,7 +2669,7 @@ var KonnectorViewerCard = function KonnectorViewerCard(_ref) { content: 'expansion-panel-content' } }, displayKonnectorIcon(), /*#__PURE__*/_react.default.createElement("div", { - className: (0, _classnames.default)('konnector-title', (0, _defineProperty2.default)({}, "".concat(_fluid.FluidType[fluidStatus.fluidType].toLowerCase(), "-connected text-16-bold"), fluidStatus.status !== _fluid.FluidState.NOT_CONNECTED && fluidStatus.status !== _fluid.FluidState.PARTNER_ISSUE)) + className: (0, _classnames.default)('konnector-title', (0, _defineProperty2.default)({}, "".concat(_fluid.FluidType[fluidStatus.fluidType].toLowerCase(), "-connected text-16-bold"), fluidStatus.status !== _fluid.FluidState.NOT_CONNECTED && !fluidStatus.maintenance)) }, displayKonnectorHeader())), /*#__PURE__*/_react.default.createElement(_core.AccordionDetails, { classes: { root: 'expansion-panel-details' @@ -2771,117 +2692,25 @@ exports.default = _default; /***/ }), -/***/ "HK68": -/***/ (function(module, exports, __webpack_require__) { +/***/ "H9Js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("4BeY"); +/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("IaFt"); +/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__); -var _interopRequireDefault = __webpack_require__("TqRt"); - -Object.defineProperty(exports, "__esModule", { - value: true +var symbol = new _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default.a({ + "id": "questionMark_6265dec65ed91711a1172d9845bec03c", + "use": "questionMark_6265dec65ed91711a1172d9845bec03c-usage", + "viewBox": "0 0 38 38", + "content": "<symbol viewBox=\"0 0 38 38\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" id=\"questionMark_6265dec65ed91711a1172d9845bec03c\">\n<circle cx=\"18.5\" cy=\"18.5\" r=\"18\" stroke=\"white\" />\n<path d=\"M14.4691 13.1925C14.7071 12.9825 14.9661 12.783 15.2461 12.594C15.5331 12.405 15.8411 12.2405 16.1701 12.1005C16.4991 11.9605 16.8561 11.852 17.2411 11.775C17.6261 11.691 18.0426 11.649 18.4906 11.649C19.0996 11.649 19.6526 11.733 20.1496 11.901C20.6536 12.069 21.0841 12.3105 21.4411 12.6255C21.7981 12.9335 22.0746 13.308 22.2706 13.749C22.4666 14.19 22.5646 14.6835 22.5646 15.2295C22.5646 15.7615 22.4876 16.2235 22.3336 16.6155C22.1796 17.0005 21.9836 17.3365 21.7456 17.6235C21.5146 17.9105 21.2626 18.159 20.9896 18.369C20.7166 18.579 20.4576 18.7785 20.2126 18.9675C19.9676 19.1495 19.7541 19.3315 19.5721 19.5135C19.3971 19.6885 19.2921 19.888 19.2571 20.112L19.0156 21.645H17.2411L17.0626 19.9335C17.0556 19.8985 17.0521 19.8705 17.0521 19.8495C17.0521 19.8215 17.0521 19.79 17.0521 19.755C17.0521 19.447 17.1291 19.181 17.2831 18.957C17.4371 18.726 17.6296 18.5125 17.8606 18.3165C18.0916 18.1135 18.3401 17.9175 18.6061 17.7285C18.8721 17.5395 19.1206 17.3365 19.3516 17.1195C19.5826 16.8955 19.7751 16.6435 19.9291 16.3635C20.0831 16.0835 20.1601 15.7545 20.1601 15.3765C20.1601 15.1245 20.1111 14.9005 20.0131 14.7045C19.9221 14.5015 19.7926 14.33 19.6246 14.19C19.4566 14.043 19.2536 13.931 19.0156 13.854C18.7846 13.777 18.5326 13.7385 18.2596 13.7385C17.8606 13.7385 17.5211 13.784 17.2411 13.875C16.9681 13.959 16.7336 14.057 16.5376 14.169C16.3486 14.274 16.1876 14.372 16.0546 14.463C15.9216 14.547 15.8026 14.589 15.6976 14.589C15.4456 14.589 15.2636 14.484 15.1516 14.274L14.4691 13.1925ZM16.4536 25.572C16.4536 25.355 16.4921 25.1485 16.5691 24.9525C16.6531 24.7565 16.7651 24.5885 16.9051 24.4485C17.0521 24.3085 17.2236 24.1965 17.4196 24.1125C17.6156 24.0285 17.8256 23.9865 18.0496 23.9865C18.2666 23.9865 18.4731 24.0285 18.6691 24.1125C18.8651 24.1965 19.0331 24.3085 19.1731 24.4485C19.3131 24.5885 19.4251 24.7565 19.5091 24.9525C19.5931 25.1485 19.6351 25.355 19.6351 25.572C19.6351 25.796 19.5931 26.006 19.5091 26.202C19.4251 26.391 19.3131 26.5555 19.1731 26.6955C19.0331 26.8355 18.8651 26.944 18.6691 27.021C18.4731 27.105 18.2666 27.147 18.0496 27.147C17.8256 27.147 17.6156 27.105 17.4196 27.021C17.2236 26.944 17.0521 26.8355 16.9051 26.6955C16.7651 26.5555 16.6531 26.391 16.5691 26.202C16.4921 26.006 16.4536 25.796 16.4536 25.572Z\" fill=\"white\" />\n</symbol>" }); -exports.default = void 0; - -var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); - -var _Button = _interopRequireDefault(__webpack_require__("FtsS")); - -var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); - -var _IconButton = _interopRequireDefault(__webpack_require__("o6Jd")); - -var _close = _interopRequireDefault(__webpack_require__("aodS")); - -var _warnOrange = _interopRequireDefault(__webpack_require__("t+F9")); - -var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); - -var _I18n = __webpack_require__("buk/"); - -var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); - -var _fluid = __webpack_require__("5Wkc"); - -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); - -__webpack_require__("cVgS"); - -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -var PartnersIssueModal = function PartnersIssueModal(_ref) { - var open = _ref.open, - fluidStatus = _ref.fluidStatus, - handleCloseClick = _ref.handleCloseClick; - - var _useI18n = (0, _I18n.useI18n)(), - t = _useI18n.t; - - var _useState = (0, _react.useState)([]), - _useState2 = (0, _slicedToArray2.default)(_useState, 2), - fluids = _useState2[0], - setFluids = _useState2[1]; - - (0, _react.useEffect)(function () { - var issuedFluids = fluidStatus.filter(function (fluid) { - return fluid.status === _fluid.FluidState.PARTNER_ISSUE; - }); - setFluids(issuedFluids); - }, [fluidStatus]); - return /*#__PURE__*/_react.default.createElement(_Dialog.default, { - open: open, - disableEscapeKeyDown: true, - onClose: function onClose(event, reason) { - event && reason !== 'backdropClick' && handleCloseClick(); - }, - "aria-labelledby": 'accessibility-title', - classes: { - root: 'modal-root', - paper: 'modal-paper' - }, - style: { - zIndex: 1500 - } - }, /*#__PURE__*/_react.default.createElement("div", { - id: 'accessibility-title' - }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_IconButton.default, { - "aria-label": t('feedback.accessibility.button_close'), - className: "modal-paper-close-button", - onClick: handleCloseClick - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - icon: _close.default, - size: 16 - })), /*#__PURE__*/_react.default.createElement("div", { - className: "partnersIssueModal" - }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { - icon: _warnOrange.default, - size: 40, - className: 'warn-icon' - }), /*#__PURE__*/_react.default.createElement("div", { - className: "partners-issue-title text-20-bold" - }, t('consumption.partners_issue_modal.title')), /*#__PURE__*/_react.default.createElement("div", { - className: "partners-issue-content text-16-normal" - }, t('consumption.partners_issue_modal.text_1')), /*#__PURE__*/_react.default.createElement("ul", null, fluids.map(function (fluid, key) { - return /*#__PURE__*/_react.default.createElement("li", { - key: key, - className: "text-16-bold" - }, fluid.connection.konnectorConfig.name); - })), /*#__PURE__*/_react.default.createElement("div", { - className: "partners-issue-content text-16-normal" - }, t('consumption.partners_issue_modal.text_2')), /*#__PURE__*/_react.default.createElement(_Button.default, { - onClick: handleCloseClick, - classes: { - root: 'btn-highlight partnermodalclose', - label: 'text-16-bold' - } - }, t('consumption.partners_issue_modal.button_validate')))); -}; - -var _default = PartnersIssueModal; -exports.default = _default; +var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default.a.add(symbol); +/* harmony default export */ __webpack_exports__["default"] = (symbol); /***/ }), @@ -3180,6 +3009,17 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE +/***/ }), + +/***/ "JppB": +/***/ (function(module, exports, __webpack_require__) { + +exports = module.exports = __webpack_require__("JPst")(false); +// Module +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.release-root.black .modal-overlay .modal-close-button {\n display: none;\n}\n\n.release-note-container {\n border-radius: 4px;\n margin-bottom: 1rem;\n color: #e0e0e0;\n}\n.release-note-container .em-content {\n padding: 1rem;\n}\n.release-note-container .release-note-title {\n color: #e3b82a;\n margin-bottom: 2rem;\n}\n.release-note-container .release-note-button {\n display: flex;\n justify-content: center;\n margin-top: 2rem;\n}\n.release-note-container .release-note-button button.btn-highlight, .release-note-container .release-note-button button.btn-secondary-positive {\n width: 45%;\n margin-bottom: 0;\n}\n.release-note-container .release-note-button button.btn-secondary-positive {\n padding: 0.5rem 1rem;\n}\n.release-note-container .release-note-button button.btn-highlight {\n padding: 0.25rem 0.5rem;\n}\n@media only screen and (max-width : 768px) {\n .release-note-container .release-note-button {\n flex-direction: column-reverse;\n }\n .release-note-container .release-note-button button.btn-highlight, .release-note-container .release-note-button button.btn-secondary-positive {\n margin-bottom: 0;\n width: 100%;\n height: 45px;\n }\n}\n.release-note-container .release-note-part {\n margin-top: 0.5rem;\n}\n.release-note-container .release-note-description {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n#accessibility-title {\n display: none;\n}", ""]); + + + /***/ }), /***/ "KA1Q": @@ -3530,6 +3370,119 @@ exports.default = _default; /***/ }), +/***/ "Maki": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Button = _interopRequireDefault(__webpack_require__("FtsS")); + +var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); + +var _IconButton = _interopRequireDefault(__webpack_require__("o6Jd")); + +var _close = _interopRequireDefault(__webpack_require__("aodS")); + +var _warnOrange = _interopRequireDefault(__webpack_require__("t+F9")); + +var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); + +var _I18n = __webpack_require__("buk/"); + +var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); + +var _fluid = __webpack_require__("5Wkc"); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +__webpack_require__("TA95"); + +var PartnerIssueModal = function PartnerIssueModal(_ref) { + var open = _ref.open, + issuedFluid = _ref.issuedFluid, + handleCloseClick = _ref.handleCloseClick; + + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; + + var getFluidTypeLabel = function getFluidTypeLabel() { + switch (issuedFluid.fluidType) { + case _fluid.FluidType.ELECTRICITY: + return 'elec'; + + case _fluid.FluidType.WATER: + return 'water'; + + case _fluid.FluidType.GAS: + return 'gaz'; + + default: + return; + } + }; + + return /*#__PURE__*/_react.default.createElement(_Dialog.default, { + open: open, + disableEscapeKeyDown: true, + onClose: function onClose(event, reason) { + event && reason !== 'backdropClick' && handleCloseClick(); + }, + "aria-labelledby": 'accessibility-title', + classes: { + root: 'modal-root', + paper: 'modal-paper' + }, + style: { + zIndex: 1500 + } + }, /*#__PURE__*/_react.default.createElement("div", { + id: 'accessibility-title' + }, t('feedback.accessibility.window_title')), /*#__PURE__*/_react.default.createElement(_IconButton.default, { + "aria-label": t('feedback.accessibility.button_close'), + className: "modal-paper-close-button", + onClick: handleCloseClick + }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + icon: _close.default, + size: 16 + })), /*#__PURE__*/_react.default.createElement("div", { + className: "partnerIssueModal" + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { + icon: _warnOrange.default, + size: 40, + className: 'warn-icon' + }), /*#__PURE__*/_react.default.createElement("div", { + className: "partner-issue-title text-20-bold" + }, t('consumption.partner_issue_modal.title')), /*#__PURE__*/_react.default.createElement("div", { + className: "partner-issue-content text-16-normal", + dangerouslySetInnerHTML: { + __html: t("consumption.partner_issue_modal.error_connect_".concat(getFluidTypeLabel())) + } + }), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("div", { + dangerouslySetInnerHTML: { + __html: t("consumption.partner_issue_modal.additional_text") + } + }), /*#__PURE__*/_react.default.createElement(_Button.default, { + onClick: handleCloseClick, + classes: { + root: 'btn-highlight', + label: 'text-16-bold' + } + }, t('consumption.partner_issue_modal.ok')))); +}; + +var _default = PartnerIssueModal; +exports.default = _default; + +/***/ }), + /***/ "N1/j": /***/ (function(module, exports, __webpack_require__) { @@ -4152,6 +4105,32 @@ exports.default = _default; /***/ }), +/***/ "TA95": +/***/ (function(module, exports, __webpack_require__) { + + +var content = __webpack_require__("tVBh"); + +if(typeof content === 'string') content = [[module.i, content, '']]; + +var transform; +var insertInto; + + + +var options = {"hmr":true} + +options.transform = transform +options.insertInto = undefined; + +var update = __webpack_require__("aET+")(content, options); + +if(content.locals) module.exports = content.locals; + +if(false) {} + +/***/ }), + /***/ "TAXC": /***/ (function(module, exports, __webpack_require__) { @@ -4588,34 +4567,147 @@ __webpack_require__("2Z76"); var _decoreText = __webpack_require__("j5h9"); -var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); +var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); + +var _I18n = __webpack_require__("buk/"); + +var StepDetail = function StepDetail(_ref) { + var step = _ref.step; + + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; + + var info1 = t(step.info1); + var info2 = t(step.info2); + return /*#__PURE__*/_react.default.createElement("div", { + className: "step-detail-info" + }, /*#__PURE__*/_react.default.createElement(_Icon.default, { + className: "info-icon", + icon: step.icon, + size: 222 + }), /*#__PURE__*/_react.default.createElement("div", { + className: "info-content text-18-normal" + }, /*#__PURE__*/_react.default.createElement("div", { + className: "info-content-text" + }, (0, _decoreText.decoreText)(info1)), info2.length > 0 && /*#__PURE__*/_react.default.createElement("div", { + className: "info-content-text" + }, (0, _decoreText.decoreText)(info2)))); +}; + +var _default = StepDetail; +exports.default = _default; + +/***/ }), + +/***/ "Y5EC": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +var _fluid = __webpack_require__("5Wkc"); + +var _Switch = _interopRequireDefault(__webpack_require__("DJX/")); + +var _styles = __webpack_require__("DfQ9"); + +var _excluded = ["fluidType"]; +var SwitchBase = (0, _styles.withStyles)({ + root: { + paddingLeft: 0, + width: 52, + overflow: 'initial' + }, + switchBase: { + color: 'var(--greyBright)', + width: 'auto', + left: -8, + '&$checked': { + color: 'var(--greyBright)', + '& + $track': { + opacity: 1, + backgroundColor: 'var(--multiColor)' + } + } + }, + checked: {}, + track: { + opacity: 1, + backgroundColor: 'var(--greyDark)', + marginTop: 'initial', + marginLeft: 'initial', + left: 0 + } +})(_Switch.default); +var SwitchElec = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--elecColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); +var SwitchWater = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--waterColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); +var SwitchGas = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--gasColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); + +var StyledSwitch = function StyledSwitch(_ref) { + var fluidType = _ref.fluidType, + props = (0, _objectWithoutProperties2.default)(_ref, _excluded); -var _I18n = __webpack_require__("buk/"); + if (fluidType !== undefined) { + switch (fluidType) { + case _fluid.FluidType.ELECTRICITY: + return /*#__PURE__*/_react.default.createElement(SwitchElec, props); -var StepDetail = function StepDetail(_ref) { - var step = _ref.step; + case _fluid.FluidType.WATER: + return /*#__PURE__*/_react.default.createElement(SwitchWater, props); - var _useI18n = (0, _I18n.useI18n)(), - t = _useI18n.t; + case _fluid.FluidType.GAS: + return /*#__PURE__*/_react.default.createElement(SwitchGas, props); - var info1 = t(step.info1); - var info2 = t(step.info2); - return /*#__PURE__*/_react.default.createElement("div", { - className: "step-detail-info" - }, /*#__PURE__*/_react.default.createElement(_Icon.default, { - className: "info-icon", - icon: step.icon, - size: 222 - }), /*#__PURE__*/_react.default.createElement("div", { - className: "info-content text-18-normal" - }, /*#__PURE__*/_react.default.createElement("div", { - className: "info-content-text" - }, (0, _decoreText.decoreText)(info1)), info2.length > 0 && /*#__PURE__*/_react.default.createElement("div", { - className: "info-content-text" - }, (0, _decoreText.decoreText)(info2)))); + default: + return /*#__PURE__*/_react.default.createElement(SwitchBase, props); + } + } else { + return /*#__PURE__*/_react.default.createElement(SwitchBase, props); + } }; -var _default = StepDetail; +var _default = StyledSwitch; exports.default = _default; /***/ }), @@ -4715,7 +4807,7 @@ var CustomPopupModal = function CustomPopupModal(_ref) { root: 'btn-highlight ', label: 'text-16-bold' } - }, t('consumption.partners_issue_modal.ok')))); + }, t('consumption.partner_issue_modal.ok')))); }; var _default = CustomPopupModal; @@ -4894,32 +4986,6 @@ var insertInto; -var options = {"hmr":true} - -options.transform = transform -options.insertInto = undefined; - -var update = __webpack_require__("aET+")(content, options); - -if(content.locals) module.exports = content.locals; - -if(false) {} - -/***/ }), - -/***/ "cVgS": -/***/ (function(module, exports, __webpack_require__) { - - -var content = __webpack_require__("ksc/"); - -if(typeof content === 'string') content = [[module.i, content, '']]; - -var transform; -var insertInto; - - - var options = {"hmr":true} options.transform = transform @@ -5808,33 +5874,33 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var _notif_error = _interopRequireDefault(__webpack_require__("pSnQ")); -var _I18n = __webpack_require__("buk/"); +var _notif_maintenance = _interopRequireDefault(__webpack_require__("goTn")); -var _fluid = __webpack_require__("5Wkc"); +var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); -var _picto = __webpack_require__("6DBe"); +var _cozyClient = __webpack_require__("SH7X"); -var _reactRouter = __webpack_require__("Ty5D"); +var _I18n = __webpack_require__("buk/"); -var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); +var _fluid = __webpack_require__("5Wkc"); var _usageEvent = __webpack_require__("/fHX"); -var _usageEvent2 = _interopRequireDefault(__webpack_require__("dECN")); - -var _cozyClient = __webpack_require__("SH7X"); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); var _reactRedux = __webpack_require__("/MKj"); -var _utils = __webpack_require__("c+yx"); +var _reactRouter = __webpack_require__("Ty5D"); -var _notif_error = _interopRequireDefault(__webpack_require__("pSnQ")); +var _dateChart = _interopRequireDefault(__webpack_require__("Ty7+")); -var _notif_maintenance = _interopRequireDefault(__webpack_require__("goTn")); +var _usageEvent2 = _interopRequireDefault(__webpack_require__("dECN")); -var _dateChart = _interopRequireDefault(__webpack_require__("Ty7+")); +var _picto = __webpack_require__("6DBe"); + +var _utils = __webpack_require__("c+yx"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -5900,10 +5966,10 @@ var FluidButton = function FluidButton(_ref) { }, _callee); })), [history, fluidType, client]); - var serviceIsDown = function serviceIsDown() { + var isFluidMaintenance = function isFluidMaintenance() { var _fluidStatus$fluidTyp; - return fluidType !== _fluid.FluidType.MULTIFLUID && ((_fluidStatus$fluidTyp = fluidStatus[fluidType]) === null || _fluidStatus$fluidTyp === void 0 ? void 0 : _fluidStatus$fluidTyp.status) === _fluid.FluidState.PARTNER_ISSUE; + return (_fluidStatus$fluidTyp = fluidStatus[fluidType]) === null || _fluidStatus$fluidTyp === void 0 ? void 0 : _fluidStatus$fluidTyp.maintenance; }; (0, _react.useEffect)(function () { @@ -5919,7 +5985,7 @@ var FluidButton = function FluidButton(_ref) { className: "fluid-icon", icon: iconType, size: fluidType === _fluid.FluidType.MULTIFLUID ? 36 : 32 - }), serviceIsDown() ? /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { + }), isFluidMaintenance() ? /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { icon: _notif_maintenance.default, size: 22, className: "notif-error" @@ -6101,39 +6167,37 @@ var _toConsumableArray2 = _interopRequireDefault(__webpack_require__("RIqP")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); -__webpack_require__("c+fo"); +var _consentOutdatedEnedis = _interopRequireDefault(__webpack_require__("h3na")); + +var _dataNok = _interopRequireDefault(__webpack_require__("DCDI")); + +var _dataOk = _interopRequireDefault(__webpack_require__("PA2O")); var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); -var _I18n = __webpack_require__("buk/"); +var _Loader = _interopRequireDefault(__webpack_require__("Ra/y")); -var _reactLottie = _interopRequireDefault(__webpack_require__("hxQi")); +var _connectionWaitingText = _interopRequireDefault(__webpack_require__("PhcN")); -var loadingData = _interopRequireWildcard(__webpack_require__("9tz8")); +var _firstConnectionWaitingText = _interopRequireDefault(__webpack_require__("YqUa")); var _flowEvents = __webpack_require__("Pdj9"); -var _fluid = __webpack_require__("5Wkc"); +var _I18n = __webpack_require__("buk/"); var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); -var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); - -var _dataNok = _interopRequireDefault(__webpack_require__("DCDI")); - -var _consentOutdatedEnedis = _interopRequireDefault(__webpack_require__("h3na")); - -var _dataOk = _interopRequireDefault(__webpack_require__("PA2O")); - -var _connectionWaitingText = _interopRequireDefault(__webpack_require__("PhcN")); +var _fluid = __webpack_require__("5Wkc"); -var _firstConnectionWaitingText = _interopRequireDefault(__webpack_require__("YqUa")); +var _konnectorError = __webpack_require__("fdru"); var _lodash = __webpack_require__("LvDl"); -var _konnectorError = __webpack_require__("fdru"); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); + +__webpack_require__("c+fo"); var _KonnectorModalFooter = _interopRequireDefault(__webpack_require__("TAXC")); @@ -6141,15 +6205,6 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -var loadingOptions = { - loop: true, - autoplay: true, - animationData: loadingData, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice' - } -}; - var KonnectorModal = function KonnectorModal(_ref) { var open = _ref.open, isUpdating = _ref.isUpdating, @@ -6235,11 +6290,8 @@ var KonnectorModal = function KonnectorModal(_ref) { id: 'accessibility-title' }, t('konnector_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { className: "kmodal-content" - }, open && !state ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactLottie.default, { - options: loadingOptions, - height: 50, - width: 50, - speed: 2 + }, open && !state ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Loader.default, { + fluidType: fluidType }), !isLogging && /*#__PURE__*/_react.default.createElement("div", { className: "kmodal-content-text kmodal-content-text-center text-16-normal" }, /*#__PURE__*/_react.default.createElement("div", { @@ -6513,17 +6565,6 @@ if(content.locals) module.exports = content.locals; if(false) {} -/***/ }), - -/***/ "ksc/": -/***/ (function(module, exports, __webpack_require__) { - -exports = module.exports = __webpack_require__("JPst")(false); -// Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.partnersIssueModal {\n padding: 1rem;\n max-width: 20rem;\n}\n.partnersIssueModal .warn-icon {\n margin: 1rem auto;\n display: block;\n}\n.partnersIssueModal .partners-issue-title {\n color: #ec9d41;\n margin: 1rem auto;\n text-align: center;\n}\n.partnersIssueModal .partners-issue-content {\n color: #e0e0e0;\n}\n.partnersIssueModal button.btn-highlight {\n padding: 0.65rem;\n}\n\n.partners-issue-portal .modal-overlay .modal-box {\n max-width: 21rem;\n}\n\n#accessibility-title {\n display: none;\n}", ""]); - - - /***/ }), /***/ "lWzs": @@ -6690,6 +6731,94 @@ exports.default = _default; /***/ }), +/***/ "mh/b": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _Button = _interopRequireDefault(__webpack_require__("FtsS")); + +var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); + +var _I18n = __webpack_require__("buk/"); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +var _reactRedux = __webpack_require__("/MKj"); + +var _decoreText = __webpack_require__("j5h9"); + +__webpack_require__("49ra"); + +var ReleaseNotesModal = function ReleaseNotesModal(_ref) { + var open = _ref.open, + handleCloseClick = _ref.handleCloseClick; + + var _useI18n = (0, _I18n.useI18n)(), + t = _useI18n.t; + + var _useSelector = (0, _reactRedux.useSelector)(function (state) { + return state.ecolyo.global; + }), + releaseNotes = _useSelector.releaseNotes; + + return /*#__PURE__*/_react.default.createElement(_Dialog.default, { + open: open, + disableEscapeKeyDown: true, + onClose: function onClose(event, reason) { + event && reason !== 'backdropClick' && handleCloseClick(); + }, + "aria-labelledby": 'accessibility-title', + classes: { + root: 'modal-root', + paper: 'modal-paper' + } + }, /*#__PURE__*/_react.default.createElement("div", { + id: 'accessibility-title' + }, t('consumption_visualizer.release_notes_modal.accessibility.window_title')), /*#__PURE__*/_react.default.createElement("div", { + className: "em-root release-note-container" + }, /*#__PURE__*/_react.default.createElement("div", { + className: "em-content" + }, /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-title text-20-bold" + }, t('consumption_visualizer.release_notes_modal.title')), /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-message text-16-bold" + }, t('consumption_visualizer.release_notes_modal.message')), /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-message text-16-normal" + }, releaseNotes.notes.length > 0 && releaseNotes.notes.map(function (note, index) { + return /*#__PURE__*/_react.default.createElement("div", { + key: index, + className: "release-note-part" + }, /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-message text-16-bold" + }, note.title), /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-description text-16-normal" + }, (0, _decoreText.decoreText)(note.description))); + })), /*#__PURE__*/_react.default.createElement("div", { + className: "release-note-button" + }, /*#__PURE__*/_react.default.createElement(_Button.default, { + "aria-label": t('consumption_visualizer.release_notes_modal.accessibility.button_go_back'), + onClick: handleCloseClick, + classes: { + root: 'btn-highlight', + label: 'text-16-bold' + } + }, t('consumption_visualizer.release_notes_modal.go_back')))))); +}; + +var _default = ReleaseNotesModal; +exports.default = _default; + +/***/ }), + /***/ "mpFa": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -6712,6 +6841,98 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), +/***/ "mvdD": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +var _CardActionArea = _interopRequireDefault(__webpack_require__("9pVe")); + +var _CardContent = _interopRequireDefault(__webpack_require__("7/eH")); + +var _styles = __webpack_require__("DfQ9"); + +var _fluid = __webpack_require__("5Wkc"); + +var _excluded = ["fluidType"]; +var CardBase = (0, _styles.withStyles)({ + root: { + background: 'var(--greyLinearGradientBackground)', + boxSizing: 'border-box', + boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)', + borderRadius: '4px', + margin: '10px 0px 20px 0px' + } +})(_CardActionArea.default); +var CardElec = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--elecColor40)' + } +})(CardBase); +var CardWater = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--waterColor40)' + } +})(CardBase); +var CardGas = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--gasColor40)' + } +})(CardBase); +var CardMulti = (0, _styles.withStyles)({ + root: { + border: '1px solid var( --greyDark)' + } +})(CardBase); +var CardContentBase = (0, _styles.withStyles)({ + root: { + color: 'white' + } +})(_CardContent.default); + +var GenerateContentCard = function GenerateContentCard(fluidType, children) { + return /*#__PURE__*/_react.default.createElement(CardContentBase, null, children); +}; + +var StyledCard = function StyledCard(_ref) { + var fluidType = _ref.fluidType, + props = (0, _objectWithoutProperties2.default)(_ref, _excluded); + + switch (fluidType) { + case _fluid.FluidType.ELECTRICITY: + return /*#__PURE__*/_react.default.createElement(CardElec, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.WATER: + return /*#__PURE__*/_react.default.createElement(CardWater, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.GAS: + return /*#__PURE__*/_react.default.createElement(CardGas, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.MULTIFLUID: + return /*#__PURE__*/_react.default.createElement(CardMulti, props, GenerateContentCard(fluidType, props.children)); + + default: + return /*#__PURE__*/_react.default.createElement(CardBase, props, /*#__PURE__*/_react.default.createElement(CardContentBase, null, props.children)); + } +}; + +var _default = StyledCard; +exports.default = _default; + +/***/ }), + /***/ "n6jp": /***/ (function(module, exports, __webpack_require__) { @@ -7256,8 +7477,8 @@ var ConnectionResult = function ConnectionResult(_ref) { return /*#__PURE__*/_react.default.createElement("div", { className: "connection-update-result" }, /*#__PURE__*/_react.default.createElement("div", { - className: status === 'errored' && !hasUpdatedToday() && fluidStatus.status !== _fluid.FluidState.PARTNER_ISSUE ? 'connection-update-errored' : '' - }, fluidStatus.status === _fluid.FluidState.PARTNER_ISSUE ? + className: status === 'errored' && !hasUpdatedToday() && !fluidStatus.maintenance ? 'connection-update-errored' : '' + }, fluidStatus.maintenance ? /*#__PURE__*/ // First check if there is partner error from backoffice _react.default.createElement("div", { @@ -7381,12 +7602,12 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), -/***/ "t/Vw": +/***/ "tVBh": /***/ (function(module, exports, __webpack_require__) { exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.release-root.black .modal-overlay .modal-close-button {\n display: none;\n}\n\n.release-note-container {\n border-radius: 4px;\n margin-bottom: 1rem;\n color: #e0e0e0;\n}\n.release-note-container .em-content {\n padding: 1rem;\n}\n.release-note-container .release-note-title {\n color: #e3b82a;\n margin-bottom: 2rem;\n}\n.release-note-container .release-note-button {\n display: flex;\n justify-content: center;\n margin-top: 2rem;\n}\n.release-note-container .release-note-button button.btn-highlight, .release-note-container .release-note-button button.btn-secondary-positive {\n width: 45%;\n margin-bottom: 0;\n}\n.release-note-container .release-note-button button.btn-secondary-positive {\n padding: 0.5rem 1rem;\n}\n.release-note-container .release-note-button button.btn-highlight {\n padding: 0.25rem 0.5rem;\n}\n@media only screen and (max-width : 768px) {\n .release-note-container .release-note-button {\n flex-direction: column-reverse;\n }\n .release-note-container .release-note-button button.btn-highlight, .release-note-container .release-note-button button.btn-secondary-positive {\n margin-bottom: 0;\n width: 100%;\n height: 45px;\n }\n}\n.release-note-container .release-note-part {\n margin-top: 0.5rem;\n}\n.release-note-container .release-note-description {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n}\n\n#accessibility-title {\n display: none;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.partnerIssueModal {\n padding: 1rem;\n max-width: 20rem;\n text-align: center;\n}\n.partnerIssueModal .warn-icon {\n margin: 1rem auto;\n display: block;\n}\n.partnerIssueModal .partner-issue-title {\n color: #ec9d41;\n margin: 1rem auto;\n text-align: center;\n}\n.partnerIssueModal .partner-issue-content {\n color: #e0e0e0;\n font-weight: bold;\n}\n.partnerIssueModal .partner-issue-content span.gaz {\n color: #45d1b8;\n}\n.partnerIssueModal .partner-issue-content span.elec {\n color: #d87b39;\n}\n.partnerIssueModal .partner-issue-content span.water {\n color: #3a98ec;\n}\n.partnerIssueModal button.btn-highlight {\n padding: 0.65rem;\n}\n\n.partner-issue-portal .modal-overlay .modal-box {\n max-width: 21rem;\n}\n\n#accessibility-title {\n display: none;\n}", ""]); diff --git a/5/ecolyo.43cb1dd3cc08d92da963.js b/5/ecolyo.3a48b3c8783b8b429d7f.js similarity index 97% rename from 5/ecolyo.43cb1dd3cc08d92da963.js rename to 5/ecolyo.3a48b3c8783b8b429d7f.js index 69c006a6aad9e4edc4fd132bef128904e781eaac..07330c5fd39d5a069e94ebd45deb78d361d55e23 100644 --- a/5/ecolyo.43cb1dd3cc08d92da963.js +++ b/5/ecolyo.3a48b3c8783b8b429d7f.js @@ -5,7 +5,7 @@ exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.date-navigator-format {\n display: flex;\n flex-direction: column;\n min-width: 7.81rem;\n text-align: center;\n align-items: center;\n align-self: center;\n}\n@media all and (max-width: 320px) {\n .date-navigator-format {\n min-width: 10.32rem;\n }\n}\n.date-navigator-format .date-navigator-format-date {\n color: #e0e0e0;\n}\n.date-navigator-format .date-navigator-format-date::first-letter {\n text-transform: uppercase;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.date-navigator-format {\n display: flex;\n flex-direction: column;\n min-width: 7.81rem;\n text-align: center;\n align-items: center;\n align-self: center;\n}\n@media all and (max-width: 320px) {\n .date-navigator-format {\n min-width: 10.32rem;\n }\n}\n.date-navigator-format .date-navigator-format-date {\n color: #e0e0e0;\n}\n.date-navigator-format .date-navigator-format-date::first-letter {\n text-transform: uppercase;\n}\n.date-navigator-format .date-navigator-format-date.timeRange {\n white-space: normal;\n}", ""]); @@ -266,11 +266,11 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _react = _interopRequireDefault(__webpack_require__("q1tI")); +var _timeStep2 = __webpack_require__("cKQ8"); var _luxon = __webpack_require__("ExVU"); -var _timeStep2 = __webpack_require__("cKQ8"); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); __webpack_require__("NEj4"); @@ -303,10 +303,20 @@ var DateNavigatorFormat = function DateNavigatorFormat(_ref) { })]; case _timeStep2.TimeStep.HALF_AN_HOUR: - return [date.toLocaleString({ + /** + * Format date to range: + * 9:00 - 9:30 + * Day 0X Month + */ + return ["".concat(date.toLocaleString({ hour: 'numeric', minute: 'numeric' - }), date.toLocaleString({ + }), " -\n ").concat(date.plus({ + minutes: 30 + }).toLocaleString({ + hour: 'numeric', + minute: 'numeric' + })), date.toLocaleString({ weekday: 'long', day: '2-digit', month: 'long' @@ -323,7 +333,7 @@ var DateNavigatorFormat = function DateNavigatorFormat(_ref) { }, inline ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formatedDate[0] && formatedDate[1] && /*#__PURE__*/_react.default.createElement("div", { className: "date-navigator-format-date text-16-bold" }, formatedDate[0], " ", formatedDate[1])) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, formatedDate[0] && /*#__PURE__*/_react.default.createElement("div", { - className: "date-navigator-format-date text-16-bold" + className: "date-navigator-format-date text-16-bold timeRange" }, formatedDate[0]), formatedDate[1] && /*#__PURE__*/_react.default.createElement("div", { className: "date-navigator-format-date text-15-normal" }, formatedDate[1]))); diff --git a/6/ecolyo.6cfb73bb1a865d05ec39.js b/6/ecolyo.a113251de3c27963062b.js similarity index 90% rename from 6/ecolyo.6cfb73bb1a865d05ec39.js rename to 6/ecolyo.a113251de3c27963062b.js index d72d97df764ee02b20a8ee443a5f226c74ce31fc..64a15d7a8d75e3b0002c8de7d33f51bbf18f296f 100644 --- a/6/ecolyo.6cfb73bb1a865d05ec39.js +++ b/6/ecolyo.a113251de3c27963062b.js @@ -658,6 +658,28 @@ if(false) {} /***/ }), +/***/ "H9Js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("4BeY"); +/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("IaFt"); +/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__); + + +var symbol = new _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default.a({ + "id": "questionMark_6265dec65ed91711a1172d9845bec03c", + "use": "questionMark_6265dec65ed91711a1172d9845bec03c-usage", + "viewBox": "0 0 38 38", + "content": "<symbol viewBox=\"0 0 38 38\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" id=\"questionMark_6265dec65ed91711a1172d9845bec03c\">\n<circle cx=\"18.5\" cy=\"18.5\" r=\"18\" stroke=\"white\" />\n<path d=\"M14.4691 13.1925C14.7071 12.9825 14.9661 12.783 15.2461 12.594C15.5331 12.405 15.8411 12.2405 16.1701 12.1005C16.4991 11.9605 16.8561 11.852 17.2411 11.775C17.6261 11.691 18.0426 11.649 18.4906 11.649C19.0996 11.649 19.6526 11.733 20.1496 11.901C20.6536 12.069 21.0841 12.3105 21.4411 12.6255C21.7981 12.9335 22.0746 13.308 22.2706 13.749C22.4666 14.19 22.5646 14.6835 22.5646 15.2295C22.5646 15.7615 22.4876 16.2235 22.3336 16.6155C22.1796 17.0005 21.9836 17.3365 21.7456 17.6235C21.5146 17.9105 21.2626 18.159 20.9896 18.369C20.7166 18.579 20.4576 18.7785 20.2126 18.9675C19.9676 19.1495 19.7541 19.3315 19.5721 19.5135C19.3971 19.6885 19.2921 19.888 19.2571 20.112L19.0156 21.645H17.2411L17.0626 19.9335C17.0556 19.8985 17.0521 19.8705 17.0521 19.8495C17.0521 19.8215 17.0521 19.79 17.0521 19.755C17.0521 19.447 17.1291 19.181 17.2831 18.957C17.4371 18.726 17.6296 18.5125 17.8606 18.3165C18.0916 18.1135 18.3401 17.9175 18.6061 17.7285C18.8721 17.5395 19.1206 17.3365 19.3516 17.1195C19.5826 16.8955 19.7751 16.6435 19.9291 16.3635C20.0831 16.0835 20.1601 15.7545 20.1601 15.3765C20.1601 15.1245 20.1111 14.9005 20.0131 14.7045C19.9221 14.5015 19.7926 14.33 19.6246 14.19C19.4566 14.043 19.2536 13.931 19.0156 13.854C18.7846 13.777 18.5326 13.7385 18.2596 13.7385C17.8606 13.7385 17.5211 13.784 17.2411 13.875C16.9681 13.959 16.7336 14.057 16.5376 14.169C16.3486 14.274 16.1876 14.372 16.0546 14.463C15.9216 14.547 15.8026 14.589 15.6976 14.589C15.4456 14.589 15.2636 14.484 15.1516 14.274L14.4691 13.1925ZM16.4536 25.572C16.4536 25.355 16.4921 25.1485 16.5691 24.9525C16.6531 24.7565 16.7651 24.5885 16.9051 24.4485C17.0521 24.3085 17.2236 24.1965 17.4196 24.1125C17.6156 24.0285 17.8256 23.9865 18.0496 23.9865C18.2666 23.9865 18.4731 24.0285 18.6691 24.1125C18.8651 24.1965 19.0331 24.3085 19.1731 24.4485C19.3131 24.5885 19.4251 24.7565 19.5091 24.9525C19.5931 25.1485 19.6351 25.355 19.6351 25.572C19.6351 25.796 19.5931 26.006 19.5091 26.202C19.4251 26.391 19.3131 26.5555 19.1731 26.6955C19.0331 26.8355 18.8651 26.944 18.6691 27.021C18.4731 27.105 18.2666 27.147 18.0496 27.147C17.8256 27.147 17.6156 27.105 17.4196 27.021C17.2236 26.944 17.0521 26.8355 16.9051 26.6955C16.7651 26.5555 16.6531 26.391 16.5691 26.202C16.4921 26.006 16.4536 25.796 16.4536 25.572Z\" fill=\"white\" />\n</symbol>" +}); +var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default.a.add(symbol); +/* harmony default export */ __webpack_exports__["default"] = (symbol); + +/***/ }), + /***/ "K75s": /***/ (function(module, exports, __webpack_require__) { @@ -772,6 +794,8 @@ var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); var _fluid = __webpack_require__("5Wkc"); +var _timeStep = __webpack_require__("cKQ8"); + var _lodash = __webpack_require__("LvDl"); var _react = _interopRequireWildcard(__webpack_require__("q1tI")); @@ -815,8 +839,8 @@ var ExportOptions = function ExportOptions() { var _useState9 = (0, _react.useState)([]), _useState10 = (0, _slicedToArray2.default)(_useState9, 2), - enabledFluids = _useState10[0], - setEnabledFluids = _useState10[1]; + exportableFluids = _useState10[0], + setExportableFluids = _useState10[1]; var _useState11 = (0, _react.useState)([]), _useState12 = (0, _slicedToArray2.default)(_useState11, 2), @@ -838,8 +862,8 @@ var ExportOptions = function ExportOptions() { var tempAnswer = (0, _toConsumableArray2.default)(answer); if (tempAnswer.includes(value)) { - (0, _lodash.remove)(tempAnswer, function (n) { - return n === value; + (0, _lodash.remove)(tempAnswer, function (answer) { + return answer === value; }); } else { tempAnswer.push(value); @@ -851,29 +875,23 @@ var ExportOptions = function ExportOptions() { (0, _react.useEffect)(function () { var subscribed = true; - var getEnabledFluids = /*#__PURE__*/function () { + var getExportableFluids = /*#__PURE__*/function () { var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() { - var firstDateDatas, enabledFluidsData; + var exportableFluidsData; return _regenerator.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; - return consumptionService.fetchAllFirstDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); + return consumptionService.getExportableFluids([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS], _timeStep.TimeStep.MONTH); case 2: - firstDateDatas = _context.sent; - enabledFluidsData = []; - firstDateDatas.forEach(function (date, index) { - if (date) { - enabledFluidsData.push(index); - } - }); - setEnabledFluids(enabledFluidsData); - setAnswer(enabledFluidsData); + exportableFluidsData = _context.sent; + setExportableFluids(exportableFluidsData); + setAnswer(exportableFluidsData); subscribed = false; - case 8: + case 6: case "end": return _context.stop(); } @@ -881,13 +899,13 @@ var ExportOptions = function ExportOptions() { }, _callee); })); - return function getEnabledFluids() { + return function getExportableFluids() { return _ref.apply(this, arguments); }; }(); if (subscribed) { - getEnabledFluids(); + getExportableFluids(); } return function () { @@ -896,10 +914,10 @@ var ExportOptions = function ExportOptions() { }, [consumptionService]); var fluidCheckbox = function fluidCheckbox() { - return enabledFluids.map(function (fluidType, key) { + return exportableFluids.map(function (fluidType, key) { return /*#__PURE__*/_react.default.createElement("label", { key: key, - className: (0, _classnames.default)('checkbox', (0, _defineProperty2.default)({}, 'answer-checked', answer.includes(fluidType) && enabledFluids[key] != null)) + className: (0, _classnames.default)('checkbox', (0, _defineProperty2.default)({}, 'answer-checked', answer.includes(fluidType))) }, /*#__PURE__*/_react.default.createElement("input", { type: 'checkbox', value: fluidType, @@ -907,8 +925,7 @@ var ExportOptions = function ExportOptions() { onChange: function onChange() { return handleChange(fluidType); }, - checked: answer.includes(fluidType), - disabled: enabledFluids[key] === null + checked: answer.includes(fluidType) }), t('FLUID.' + _fluid.FluidType[fluidType] + '.LABEL')); }); }; @@ -957,7 +974,7 @@ var ExportOptions = function ExportOptions() { className: "text-15-normal content intro" }, t('export.text1')), /*#__PURE__*/_react.default.createElement("div", { className: "text-16-bold content" - }, t('export.fluid_select')), enabledFluids.length === 0 ? /*#__PURE__*/_react.default.createElement("div", { + }, t('export.fluid_select')), exportableFluids.length === 0 ? /*#__PURE__*/_react.default.createElement("div", { className: "text-15-normal content intro" }, t('export.no_data')) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, fluidCheckbox(), /*#__PURE__*/_react.default.createElement(_core.Button, { "aria-label": t('unsubscribe.button_accessibility'), @@ -1045,35 +1062,33 @@ var _regenerator = _interopRequireDefault(__webpack_require__("o0o1")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); - -__webpack_require__("YEWe"); - -var _I18n = __webpack_require__("buk/"); - -var _reactLottie = _interopRequireDefault(__webpack_require__("hxQi")); +var _core = __webpack_require__("TTf+"); var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); var _close = _interopRequireDefault(__webpack_require__("aodS")); -var FileSaver = _interopRequireWildcard(__webpack_require__("Iab2")); +var _Loader = _interopRequireDefault(__webpack_require__("Ra/y")); -var XLSX = _interopRequireWildcard(__webpack_require__("JcrP")); +var _cozyClient = __webpack_require__("SH7X"); -var _consumption = _interopRequireDefault(__webpack_require__("AVq/")); +var _I18n = __webpack_require__("buk/"); -var _cozyClient = __webpack_require__("SH7X"); +var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); + +var _fluid = __webpack_require__("5Wkc"); var _timeStep = __webpack_require__("cKQ8"); -var _fluid = __webpack_require__("5Wkc"); +var FileSaver = _interopRequireWildcard(__webpack_require__("Iab2")); -var _core = __webpack_require__("TTf+"); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); -var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); +var _consumption = _interopRequireDefault(__webpack_require__("AVq/")); + +var XLSX = _interopRequireWildcard(__webpack_require__("JcrP")); -var bounceLoading = _interopRequireWildcard(__webpack_require__("9tz8")); +__webpack_require__("YEWe"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -1085,15 +1100,6 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o = function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var loadingOptions = { - loop: true, - autoplay: true, - animationData: bounceLoading, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice' - } -}; - var ExportLoadingModal = function ExportLoadingModal(_ref) { var open = _ref.open, handleCloseClick = _ref.handleCloseClick, @@ -1173,7 +1179,7 @@ var ExportLoadingModal = function ExportLoadingModal(_ref) { case 12: dataLoad = _context.sent; - if (!(dataLoad && dataLoad.actualData)) { + if (!(dataLoad !== null && dataLoad !== void 0 && dataLoad.actualData)) { _context.next = 20; break; } @@ -1343,10 +1349,8 @@ var ExportLoadingModal = function ExportLoadingModal(_ref) { className: "content" }, /*#__PURE__*/_react.default.createElement("div", { className: "icon-main" - }, /*#__PURE__*/_react.default.createElement(_reactLottie.default, { - options: loadingOptions, - height: 38, - width: 38 + }, /*#__PURE__*/_react.default.createElement(_Loader.default, { + color: "gold" })), /*#__PURE__*/_react.default.createElement("div", { className: "text-16-bold text text1" }, t('export.modal_loading.text1')), /*#__PURE__*/_react.default.createElement("div", { @@ -1659,6 +1663,119 @@ if(false) {} /***/ }), +/***/ "Y5EC": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +var _fluid = __webpack_require__("5Wkc"); + +var _Switch = _interopRequireDefault(__webpack_require__("DJX/")); + +var _styles = __webpack_require__("DfQ9"); + +var _excluded = ["fluidType"]; +var SwitchBase = (0, _styles.withStyles)({ + root: { + paddingLeft: 0, + width: 52, + overflow: 'initial' + }, + switchBase: { + color: 'var(--greyBright)', + width: 'auto', + left: -8, + '&$checked': { + color: 'var(--greyBright)', + '& + $track': { + opacity: 1, + backgroundColor: 'var(--multiColor)' + } + } + }, + checked: {}, + track: { + opacity: 1, + backgroundColor: 'var(--greyDark)', + marginTop: 'initial', + marginLeft: 'initial', + left: 0 + } +})(_Switch.default); +var SwitchElec = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--elecColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); +var SwitchWater = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--waterColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); +var SwitchGas = (0, _styles.withStyles)({ + switchBase: { + '&$checked': { + '& + $track': { + backgroundColor: 'var(--gasColor)' + } + } + }, + checked: {}, + track: {} +})(SwitchBase); + +var StyledSwitch = function StyledSwitch(_ref) { + var fluidType = _ref.fluidType, + props = (0, _objectWithoutProperties2.default)(_ref, _excluded); + + if (fluidType !== undefined) { + switch (fluidType) { + case _fluid.FluidType.ELECTRICITY: + return /*#__PURE__*/_react.default.createElement(SwitchElec, props); + + case _fluid.FluidType.WATER: + return /*#__PURE__*/_react.default.createElement(SwitchWater, props); + + case _fluid.FluidType.GAS: + return /*#__PURE__*/_react.default.createElement(SwitchGas, props); + + default: + return /*#__PURE__*/_react.default.createElement(SwitchBase, props); + } + } else { + return /*#__PURE__*/_react.default.createElement(SwitchBase, props); + } +}; + +var _default = StyledSwitch; +exports.default = _default; + +/***/ }), + /***/ "YEWe": /***/ (function(module, exports, __webpack_require__) { @@ -1863,6 +1980,98 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), +/***/ "mvdD": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__("TqRt"); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); + +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +var _CardActionArea = _interopRequireDefault(__webpack_require__("9pVe")); + +var _CardContent = _interopRequireDefault(__webpack_require__("7/eH")); + +var _styles = __webpack_require__("DfQ9"); + +var _fluid = __webpack_require__("5Wkc"); + +var _excluded = ["fluidType"]; +var CardBase = (0, _styles.withStyles)({ + root: { + background: 'var(--greyLinearGradientBackground)', + boxSizing: 'border-box', + boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)', + borderRadius: '4px', + margin: '10px 0px 20px 0px' + } +})(_CardActionArea.default); +var CardElec = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--elecColor40)' + } +})(CardBase); +var CardWater = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--waterColor40)' + } +})(CardBase); +var CardGas = (0, _styles.withStyles)({ + root: { + border: '1px solid var(--gasColor40)' + } +})(CardBase); +var CardMulti = (0, _styles.withStyles)({ + root: { + border: '1px solid var( --greyDark)' + } +})(CardBase); +var CardContentBase = (0, _styles.withStyles)({ + root: { + color: 'white' + } +})(_CardContent.default); + +var GenerateContentCard = function GenerateContentCard(fluidType, children) { + return /*#__PURE__*/_react.default.createElement(CardContentBase, null, children); +}; + +var StyledCard = function StyledCard(_ref) { + var fluidType = _ref.fluidType, + props = (0, _objectWithoutProperties2.default)(_ref, _excluded); + + switch (fluidType) { + case _fluid.FluidType.ELECTRICITY: + return /*#__PURE__*/_react.default.createElement(CardElec, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.WATER: + return /*#__PURE__*/_react.default.createElement(CardWater, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.GAS: + return /*#__PURE__*/_react.default.createElement(CardGas, props, GenerateContentCard(fluidType, props.children)); + + case _fluid.FluidType.MULTIFLUID: + return /*#__PURE__*/_react.default.createElement(CardMulti, props, GenerateContentCard(fluidType, props.children)); + + default: + return /*#__PURE__*/_react.default.createElement(CardBase, props, /*#__PURE__*/_react.default.createElement(CardContentBase, null, props.children)); + } +}; + +var _default = StyledCard; +exports.default = _default; + +/***/ }), + /***/ "nXo9": /***/ (function(module, exports, __webpack_require__) { diff --git a/9/ecolyo.5abe5f137bb2c2949192.js b/8/ecolyo.260ed9b202a1b7c1d846.js similarity index 99% rename from 9/ecolyo.5abe5f137bb2c2949192.js rename to 8/ecolyo.260ed9b202a1b7c1d846.js index d17eb16b173c62c32c33b46f8488914d52409042..81c1798c1274ac1db859b2f13d303e4b2534c293 100644 --- a/9/ecolyo.5abe5f137bb2c2949192.js +++ b/8/ecolyo.260ed9b202a1b7c1d846.js @@ -1,4 +1,4 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{ /***/ "GwQd": /***/ (function(module, exports, __webpack_require__) { diff --git a/8/ecolyo.f2b0273a73d7cafbc0a4.js b/8/ecolyo.f2b0273a73d7cafbc0a4.js deleted file mode 100644 index 8ac848508171f3b6214aa24fdd53f9db4f18a603..0000000000000000000000000000000000000000 --- a/8/ecolyo.f2b0273a73d7cafbc0a4.js +++ /dev/null @@ -1,237 +0,0 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{ - -/***/ "9tz8": -/***/ (function(module) { - -module.exports = JSON.parse("{\"v\":\"5.5.8\",\"fr\":30,\"ip\":0,\"op\":60,\"w\":128,\"h\":128,\"nm\":\"Comp 1\",\"ddd\":0,\"assets\":[],\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":4,\"nm\":\"Shape Layer 2\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[102.5,114,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,50,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.665,\"y\":1},\"o\":{\"x\":0.088,\"y\":0},\"t\":0,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],\"c\":true}]},{\"i\":{\"x\":0.888,\"y\":0.992},\"o\":{\"x\":0.315,\"y\":0},\"t\":15,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-29.5],[10,45],[5,50],[-5,50],[-10,45],[-10,-29.5],[-5,-34.5],[5,-34.5]],\"c\":true}]},{\"i\":{\"x\":0.777,\"y\":1},\"o\":{\"x\":0.117,\"y\":0.013},\"t\":30,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],\"c\":true}]},{\"i\":{\"x\":0.853,\"y\":1},\"o\":{\"x\":0.098,\"y\":0},\"t\":46,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,18.75],[10,45],[5,50],[-5,50],[-10,45],[-10,18.75],[-5,13.75],[5,13.75]],\"c\":true}]},{\"t\":60,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-8.75],[10,45],[5,50],[-5,50],[-10,45],[-10,-8.75],[-5,-13.75],[5,-13.75]],\"c\":true}]}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false}],\"ip\":0,\"op\":61,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":4,\"nm\":\"Shape Layer 3\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[62.5,114,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,50,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.631,\"y\":1},\"o\":{\"x\":0.167,\"y\":0},\"t\":0,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],\"c\":true}]},{\"i\":{\"x\":0.667,\"y\":1},\"o\":{\"x\":0.391,\"y\":0},\"t\":13.846,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,4],[10,45],[5,50],[-5,50],[-10,45],[-10,4],[-5,-1],[5,-1]],\"c\":true}]},{\"i\":{\"x\":0.88,\"y\":1},\"o\":{\"x\":0.093,\"y\":0},\"t\":27,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],\"c\":true}]},{\"i\":{\"x\":0.873,\"y\":1},\"o\":{\"x\":0.165,\"y\":0},\"t\":45,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,11.875],[10,45],[5,50],[-5,50],[-10,45],[-10,11.875],[-5,6.875],[5,6.875]],\"c\":true}]},{\"t\":60,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,-33],[10,45],[5,50],[-5,50],[-10,45],[-10,-33],[-5,-38],[5,-38]],\"c\":true}]}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false}],\"ip\":0,\"op\":61,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":4,\"nm\":\"Shape Layer 4\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[22.5,114,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,50,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"shapes\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.562,\"y\":1},\"o\":{\"x\":0.46,\"y\":0},\"t\":0,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],\"c\":true}]},{\"i\":{\"x\":0.505,\"y\":1},\"o\":{\"x\":0.402,\"y\":0},\"t\":15,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,13],[10,45],[5,50],[-5,50],[-10,45],[-10,13],[-5,8],[5,8]],\"c\":true}]},{\"i\":{\"x\":0.407,\"y\":1},\"o\":{\"x\":0.167,\"y\":0},\"t\":32,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],\"c\":true}]},{\"i\":{\"x\":0.599,\"y\":1},\"o\":{\"x\":0.526,\"y\":0},\"t\":47,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,3],[10,45],[5,50],[-5,50],[-10,45],[-10,3],[-5,-2],[5,-2]],\"c\":true}]},{\"t\":60,\"s\":[{\"i\":[[0,-2.761],[0,0],[2.761,0],[0,0],[0,2.761],[0,0],[-2.761,0],[0,0]],\"o\":[[0,0],[0,2.761],[0,0],[-2.761,0],[0,0],[0,-2.761],[0,0],[2.761,0]],\"v\":[[10,29.25],[10,45],[5,50],[-5,50],[-10,45],[-10,29.25],[-5,24.25],[5,24.25]],\"c\":true}]}],\"ix\":2},\"nm\":\"Path 1\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ty\":\"fl\",\"c\":{\"a\":0,\"k\":[0.8901960784313725,0.7215686274509804,0.16470588235294117,1],\"ix\":4},\"o\":{\"a\":0,\"k\":100,\"ix\":5},\"r\":1,\"bm\":0,\"nm\":\"Fill 1\",\"mn\":\"ADBE Vector Graphic - Fill\",\"hd\":false}],\"ip\":0,\"op\":61,\"st\":0,\"bm\":0}],\"markers\":[]}"); - -/***/ }), - -/***/ "H9Js": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("4BeY"); -/* harmony import */ var _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("IaFt"); -/* harmony import */ var _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1__); - - -var symbol = new _node_modules_svg_baker_runtime_browser_symbol_js__WEBPACK_IMPORTED_MODULE_0___default.a({ - "id": "questionMark_6265dec65ed91711a1172d9845bec03c", - "use": "questionMark_6265dec65ed91711a1172d9845bec03c-usage", - "viewBox": "0 0 38 38", - "content": "<symbol viewBox=\"0 0 38 38\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" id=\"questionMark_6265dec65ed91711a1172d9845bec03c\">\n<circle cx=\"18.5\" cy=\"18.5\" r=\"18\" stroke=\"white\" />\n<path d=\"M14.4691 13.1925C14.7071 12.9825 14.9661 12.783 15.2461 12.594C15.5331 12.405 15.8411 12.2405 16.1701 12.1005C16.4991 11.9605 16.8561 11.852 17.2411 11.775C17.6261 11.691 18.0426 11.649 18.4906 11.649C19.0996 11.649 19.6526 11.733 20.1496 11.901C20.6536 12.069 21.0841 12.3105 21.4411 12.6255C21.7981 12.9335 22.0746 13.308 22.2706 13.749C22.4666 14.19 22.5646 14.6835 22.5646 15.2295C22.5646 15.7615 22.4876 16.2235 22.3336 16.6155C22.1796 17.0005 21.9836 17.3365 21.7456 17.6235C21.5146 17.9105 21.2626 18.159 20.9896 18.369C20.7166 18.579 20.4576 18.7785 20.2126 18.9675C19.9676 19.1495 19.7541 19.3315 19.5721 19.5135C19.3971 19.6885 19.2921 19.888 19.2571 20.112L19.0156 21.645H17.2411L17.0626 19.9335C17.0556 19.8985 17.0521 19.8705 17.0521 19.8495C17.0521 19.8215 17.0521 19.79 17.0521 19.755C17.0521 19.447 17.1291 19.181 17.2831 18.957C17.4371 18.726 17.6296 18.5125 17.8606 18.3165C18.0916 18.1135 18.3401 17.9175 18.6061 17.7285C18.8721 17.5395 19.1206 17.3365 19.3516 17.1195C19.5826 16.8955 19.7751 16.6435 19.9291 16.3635C20.0831 16.0835 20.1601 15.7545 20.1601 15.3765C20.1601 15.1245 20.1111 14.9005 20.0131 14.7045C19.9221 14.5015 19.7926 14.33 19.6246 14.19C19.4566 14.043 19.2536 13.931 19.0156 13.854C18.7846 13.777 18.5326 13.7385 18.2596 13.7385C17.8606 13.7385 17.5211 13.784 17.2411 13.875C16.9681 13.959 16.7336 14.057 16.5376 14.169C16.3486 14.274 16.1876 14.372 16.0546 14.463C15.9216 14.547 15.8026 14.589 15.6976 14.589C15.4456 14.589 15.2636 14.484 15.1516 14.274L14.4691 13.1925ZM16.4536 25.572C16.4536 25.355 16.4921 25.1485 16.5691 24.9525C16.6531 24.7565 16.7651 24.5885 16.9051 24.4485C17.0521 24.3085 17.2236 24.1965 17.4196 24.1125C17.6156 24.0285 17.8256 23.9865 18.0496 23.9865C18.2666 23.9865 18.4731 24.0285 18.6691 24.1125C18.8651 24.1965 19.0331 24.3085 19.1731 24.4485C19.3131 24.5885 19.4251 24.7565 19.5091 24.9525C19.5931 25.1485 19.6351 25.355 19.6351 25.572C19.6351 25.796 19.5931 26.006 19.5091 26.202C19.4251 26.391 19.3131 26.5555 19.1731 26.6955C19.0331 26.8355 18.8651 26.944 18.6691 27.021C18.4731 27.105 18.2666 27.147 18.0496 27.147C17.8256 27.147 17.6156 27.105 17.4196 27.021C17.2236 26.944 17.0521 26.8355 16.9051 26.6955C16.7651 26.5555 16.6531 26.391 16.5691 26.202C16.4921 26.006 16.4536 25.796 16.4536 25.572Z\" fill=\"white\" />\n</symbol>" -}); -var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WEBPACK_IMPORTED_MODULE_1___default.a.add(symbol); -/* harmony default export */ __webpack_exports__["default"] = (symbol); - -/***/ }), - -/***/ "Y5EC": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("TqRt"); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); - -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - -var _fluid = __webpack_require__("5Wkc"); - -var _Switch = _interopRequireDefault(__webpack_require__("DJX/")); - -var _styles = __webpack_require__("DfQ9"); - -var _excluded = ["fluidType"]; -var SwitchBase = (0, _styles.withStyles)({ - root: { - paddingLeft: 0, - width: 52, - overflow: 'initial' - }, - switchBase: { - color: 'var(--greyBright)', - width: 'auto', - left: -8, - '&$checked': { - color: 'var(--greyBright)', - '& + $track': { - opacity: 1, - backgroundColor: 'var(--multiColor)' - } - } - }, - checked: {}, - track: { - opacity: 1, - backgroundColor: 'var(--greyDark)', - marginTop: 'initial', - marginLeft: 'initial', - left: 0 - } -})(_Switch.default); -var SwitchElec = (0, _styles.withStyles)({ - switchBase: { - '&$checked': { - '& + $track': { - backgroundColor: 'var(--elecColor)' - } - } - }, - checked: {}, - track: {} -})(SwitchBase); -var SwitchWater = (0, _styles.withStyles)({ - switchBase: { - '&$checked': { - '& + $track': { - backgroundColor: 'var(--waterColor)' - } - } - }, - checked: {}, - track: {} -})(SwitchBase); -var SwitchGas = (0, _styles.withStyles)({ - switchBase: { - '&$checked': { - '& + $track': { - backgroundColor: 'var(--gasColor)' - } - } - }, - checked: {}, - track: {} -})(SwitchBase); - -var StyledSwitch = function StyledSwitch(_ref) { - var fluidType = _ref.fluidType, - props = (0, _objectWithoutProperties2.default)(_ref, _excluded); - - if (fluidType !== undefined) { - switch (fluidType) { - case _fluid.FluidType.ELECTRICITY: - return /*#__PURE__*/_react.default.createElement(SwitchElec, props); - - case _fluid.FluidType.WATER: - return /*#__PURE__*/_react.default.createElement(SwitchWater, props); - - case _fluid.FluidType.GAS: - return /*#__PURE__*/_react.default.createElement(SwitchGas, props); - - default: - return /*#__PURE__*/_react.default.createElement(SwitchBase, props); - } - } else { - return /*#__PURE__*/_react.default.createElement(SwitchBase, props); - } -}; - -var _default = StyledSwitch; -exports.default = _default; - -/***/ }), - -/***/ "mvdD": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var _interopRequireDefault = __webpack_require__("TqRt"); - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; - -var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); - -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - -var _CardActionArea = _interopRequireDefault(__webpack_require__("9pVe")); - -var _CardContent = _interopRequireDefault(__webpack_require__("7/eH")); - -var _styles = __webpack_require__("DfQ9"); - -var _fluid = __webpack_require__("5Wkc"); - -var _excluded = ["fluidType"]; -var CardBase = (0, _styles.withStyles)({ - root: { - background: 'var(--greyLinearGradientBackground)', - boxSizing: 'border-box', - boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)', - borderRadius: '4px', - margin: '10px 0px 20px 0px' - } -})(_CardActionArea.default); -var CardElec = (0, _styles.withStyles)({ - root: { - border: '1px solid var(--elecColor40)' - } -})(CardBase); -var CardWater = (0, _styles.withStyles)({ - root: { - border: '1px solid var(--waterColor40)' - } -})(CardBase); -var CardGas = (0, _styles.withStyles)({ - root: { - border: '1px solid var(--gasColor40)' - } -})(CardBase); -var CardMulti = (0, _styles.withStyles)({ - root: { - border: '1px solid var( --greyDark)' - } -})(CardBase); -var CardContentBase = (0, _styles.withStyles)({ - root: { - color: 'white' - } -})(_CardContent.default); - -var GenerateContentCard = function GenerateContentCard(fluidType, children) { - return /*#__PURE__*/_react.default.createElement(CardContentBase, null, children); -}; - -var StyledCard = function StyledCard(_ref) { - var fluidType = _ref.fluidType, - props = (0, _objectWithoutProperties2.default)(_ref, _excluded); - - switch (fluidType) { - case _fluid.FluidType.ELECTRICITY: - return /*#__PURE__*/_react.default.createElement(CardElec, props, GenerateContentCard(fluidType, props.children)); - - case _fluid.FluidType.WATER: - return /*#__PURE__*/_react.default.createElement(CardWater, props, GenerateContentCard(fluidType, props.children)); - - case _fluid.FluidType.GAS: - return /*#__PURE__*/_react.default.createElement(CardGas, props, GenerateContentCard(fluidType, props.children)); - - case _fluid.FluidType.MULTIFLUID: - return /*#__PURE__*/_react.default.createElement(CardMulti, props, GenerateContentCard(fluidType, props.children)); - - default: - return /*#__PURE__*/_react.default.createElement(CardBase, props, /*#__PURE__*/_react.default.createElement(CardContentBase, null, props.children)); - } -}; - -var _default = StyledCard; -exports.default = _default; - -/***/ }) - -}]); \ No newline at end of file diff --git a/10/ecolyo.1823bf23fa5cf052fd8e.js b/9/ecolyo.c032f05af862fb957661.js similarity index 97% rename from 10/ecolyo.1823bf23fa5cf052fd8e.js rename to 9/ecolyo.c032f05af862fb957661.js index ea44a190a7a0c8f443b1038529c659c2ee45f028..be0401d502d1ac81521b54b35daaf50c366f66b6 100644 --- a/10/ecolyo.1823bf23fa5cf052fd8e.js +++ b/9/ecolyo.c032f05af862fb957661.js @@ -1,4 +1,4 @@ -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[10],{ +(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{ /***/ "LUT6": /***/ (function(module, exports, __webpack_require__) { diff --git a/app/ecolyo.17095a8e1054979f03da.js b/app/ecolyo.91537fe32e1b24dcf7fb.js similarity index 97% rename from app/ecolyo.17095a8e1054979f03da.js rename to app/ecolyo.91537fe32e1b24dcf7fb.js index 3c53ca3d8070a1ce02bb2454fb76a8e1cbe917dc..5c87da028df4cd7ab562965e7ad943f0300b1154 100644 --- a/app/ecolyo.17095a8e1054979f03da.js +++ b/app/ecolyo.91537fe32e1b24dcf7fb.js @@ -64,7 +64,7 @@ /******/ /******/ // script path function /******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"16b441c1d2a28260ae40","3":"bbcc51224dcd46292d2d","4":"3dce9fe3dee4e77244fa","5":"43cb1dd3cc08d92da963","6":"6cfb73bb1a865d05ec39","7":"8e0088481e1baf094fa4","8":"f2b0273a73d7cafbc0a4","9":"5abe5f137bb2c2949192","10":"1823bf23fa5cf052fd8e"}[chunkId] + ".js" +/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"4fa6b651882eb2869050","3":"92f85627b114d8c56c51","4":"3dce9fe3dee4e77244fa","5":"3a48b3c8783b8b429d7f","6":"a113251de3c27963062b","7":"8e0088481e1baf094fa4","8":"260ed9b202a1b7c1d846","9":"c032f05af862fb957661"}[chunkId] + ".js" /******/ } /******/ /******/ // The require function @@ -1569,17 +1569,13 @@ var _defineProperty2 = _interopRequireDefault(__webpack_require__("lSNA")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); - -var _cozyClient = __webpack_require__("SH7X"); - -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var Sentry = _interopRequireWildcard(__webpack_require__("agHs")); -var _reactRedux = __webpack_require__("/MKj"); +var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); var _useExploration3 = _interopRequireDefault(__webpack_require__("sU2c")); -var _fluid2 = __webpack_require__("5Wkc"); +var _cozyClient = __webpack_require__("SH7X"); var _usageEvent = __webpack_require__("/fHX"); @@ -1599,13 +1595,17 @@ var _migration2 = __webpack_require__("vBvZ"); var _initialisationSteps = __webpack_require__("3HG6"); +var _react2 = _interopRequireWildcard(__webpack_require__("q1tI")); + +var _reactRedux = __webpack_require__("/MKj"); + var _action = _interopRequireDefault(__webpack_require__("5e6O")); var _challenge = _interopRequireDefault(__webpack_require__("kdea")); var _customPopup = _interopRequireDefault(__webpack_require__("WUPU")); -var _fluid3 = _interopRequireDefault(__webpack_require__("z34f")); +var _fluid2 = _interopRequireDefault(__webpack_require__("z34f")); var _initialization = _interopRequireDefault(__webpack_require__("zIFU")); @@ -1635,8 +1635,6 @@ var _SplashScreen = _interopRequireDefault(__webpack_require__("Eg5n")); var _SplashScreenError = _interopRequireDefault(__webpack_require__("7RpM")); -var Sentry = _interopRequireWildcard(__webpack_require__("agHs")); - function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } @@ -1661,7 +1659,7 @@ var SplashRoot = function SplashRoot(_ref) { children = _ref.children; var client = (0, _cozyClient.useClient)(); - var _useState = (0, _react.useState)({ + var _useState = (0, _react2.useState)({ splashEnd: false, splashStart: false }), @@ -1671,18 +1669,18 @@ var SplashRoot = function SplashRoot(_ref) { splashStart = _useState2$.splashStart, setState = _useState2[1]; - var _useState3 = (0, _react.useState)(_initialisationSteps.InitSteps.MIGRATION), + var _useState3 = (0, _react2.useState)(_initialisationSteps.InitSteps.MIGRATION), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), initStep = _useState4[0], - setinitStep = _useState4[1]; + setInitStep = _useState4[1]; - var _useState5 = (0, _react.useState)(null), + var _useState5 = (0, _react2.useState)(null), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), initStepErrors = _useState6[0], - setinitStepErrors = _useState6[1]; + setInitStepErrors = _useState6[1]; var dispatch = (0, _reactRedux.useDispatch)(); - (0, _react.useEffect)(function () { + (0, _react2.useEffect)(function () { var timeoutSplash; if (splashStart) { @@ -1704,7 +1702,7 @@ var SplashRoot = function SplashRoot(_ref) { _useExploration2 = (0, _slicedToArray2.default)(_useExploration, 2), setValidExploration = _useExploration2[1]; - (0, _react.useEffect)(function () { + (0, _react2.useEffect)(function () { var subscribed = true; function loadData() { @@ -1719,10 +1717,10 @@ var SplashRoot = function SplashRoot(_ref) { while (1) { switch (_context.prev = _context.next) { case 0: - initializationService = new _initialization.default(client, setinitStep, setinitStepErrors); + initializationService = new _initialization.default(client, setInitStep, setInitStepErrors); partnersInfoService = new _partnersInfo.default(client); customPopupService = new _customPopup.default(client); - ms = new _migration2.MigrationService(client, setinitStepErrors); + ms = new _migration2.MigrationService(client, setInitStepErrors); _context.prev = 4; _context.next = 7; return ms.runMigrations(_migration.migrations); @@ -1730,7 +1728,7 @@ var SplashRoot = function SplashRoot(_ref) { case 7: migrationsResult = _context.sent; // Init last release notes when they exist - dispatch((0, _global.showReleaseNotes)(migrationsResult.show, migrationsResult.notes)); //init Terms + dispatch((0, _global.showReleaseNotes)(migrationsResult.show, migrationsResult.notes, migrationsResult.redirectLink)); //init Terms _context.next = 11; return initializationService.initConsent(); @@ -1947,12 +1945,12 @@ var SplashRoot = function SplashRoot(_ref) { case 97: partnersInfo = _context.sent; - if (!(partnersInfo && partnersInfo.notification_activated && !(profile !== null && profile !== void 0 && profile.isFirstConnection))) { + if (!(partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && !(profile !== null && profile !== void 0 && profile.isFirstConnection))) { _context.next = 108; break; } - fluidService = new _fluid3.default(client); + fluidService = new _fluid2.default(client); _context.next = 102; return fluidService.getFluidStatus(partnersInfo); @@ -1964,7 +1962,7 @@ var SplashRoot = function SplashRoot(_ref) { try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { _fluid = _step2.value; - if (_fluid.status === _fluid2.FluidState.PARTNER_ISSUE) isConcernedByPartnerIssue = true; + if (_fluid.maintenance) isConcernedByPartnerIssue = true; } } catch (err) { _iterator2.e(err); @@ -1980,6 +1978,7 @@ var SplashRoot = function SplashRoot(_ref) { */ if (today !== (profile === null || profile === void 0 ? void 0 : profile.partnersIssueDate.toISO()) && isConcernedByPartnerIssue) { + // TODO to transform for each fluid ? dispatch((0, _global.setPartnersIssue)(true)); } @@ -2011,7 +2010,7 @@ var SplashRoot = function SplashRoot(_ref) { _context.t2 = _context["catch"](4); if (_context.t2.message === 'Failed to fetch' && !initStepErrors) { - setinitStepErrors(_initialisationSteps.InitStepsErrors.UNKNOWN_ERROR); + setInitStepErrors(_initialisationSteps.InitStepsErrors.UNKNOWN_ERROR); } _logger.default.error("[Initialization] Error : ".concat(_context.t2)); @@ -2035,14 +2034,14 @@ var SplashRoot = function SplashRoot(_ref) { subscribed = false; }; }, [client, dispatch, initStepErrors, setValidExploration]); - return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, !splashEnd && /*#__PURE__*/_react.default.createElement("div", { + return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, !splashEnd && /*#__PURE__*/_react2.default.createElement("div", { style: { transitionDuration: "".concat(fadeTimer / 1000, "s") }, className: (0, _classnames.default)('splash-root', (0, _defineProperty2.default)({}, 'splash-fade', splashStart)) - }, !initStepErrors ? /*#__PURE__*/_react.default.createElement(_SplashScreen.default, { + }, !initStepErrors ? /*#__PURE__*/_react2.default.createElement(_SplashScreen.default, { initStep: initStep - }) : /*#__PURE__*/_react.default.createElement(_SplashScreenError.default, { + }) : /*#__PURE__*/_react2.default.createElement(_SplashScreenError.default, { error: initStepErrors })), splashStart && children); }; @@ -3105,7 +3104,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.slide {\n margin: 1rem 1rem 1rem 0;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n transition: all 300ms ease;\n color: white;\n display: flex;\n flex-direction: column;\n}\n.slide.active {\n transform: scale(1);\n}\n.slide.inactive {\n transform: scale(0.9);\n}\n.slide .cardContent {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n height: inherit;\n box-sizing: border-box;\n padding: 5% 10%;\n transition: all 300ms ease;\n border-radius: 4px;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.slide {\n margin: 0 1rem 0 0;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n transition: all 300ms ease;\n color: white;\n display: flex;\n flex-direction: column;\n}\n.slide.active {\n transform: scale(1);\n}\n.slide.inactive {\n transform: scale(0.9);\n}\n.slide .cardContent {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n height: inherit;\n box-sizing: border-box;\n padding: 1rem;\n transition: all 300ms ease;\n border-radius: 4px;\n}", ""]); @@ -3157,10 +3156,10 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - var _I18n = __webpack_require__("buk/"); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + var StepAddress = function StepAddress(_ref) { var sgeState = _ref.sgeState, _onChange = _ref.onChange; @@ -3181,7 +3180,7 @@ var StepAddress = function StepAddress(_ref) { name: "address", value: sgeState.address, onChange: function onChange(e) { - return _onChange('address', e.target.value); + return _onChange('address', e.target.value.trim()); } }), /*#__PURE__*/_react.default.createElement("label", { htmlFor: "zipCode", @@ -4075,31 +4074,31 @@ var _defineProperty2 = _interopRequireDefault(__webpack_require__("lSNA")); var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var _Content = _interopRequireDefault(__webpack_require__("VOVi")); -var _reactRedux = __webpack_require__("/MKj"); +var _FormNavigation = _interopRequireDefault(__webpack_require__("Pnfk")); -var _CozyBar = _interopRequireDefault(__webpack_require__("CJMG")); +var _FormProgress = _interopRequireDefault(__webpack_require__("Q/++")); -var _Content = _interopRequireDefault(__webpack_require__("VOVi")); +var _CozyBar = _interopRequireDefault(__webpack_require__("CJMG")); var _Header = _interopRequireDefault(__webpack_require__("frrP")); var _sgeStep = __webpack_require__("q1H9"); -var _StepIdentityAndPdl = _interopRequireDefault(__webpack_require__("9mY8")); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); -var _StepAddress = _interopRequireDefault(__webpack_require__("3dsA")); +var _reactRedux = __webpack_require__("/MKj"); -var _StepConsent = _interopRequireDefault(__webpack_require__("jJse")); +var _global = __webpack_require__("c4IZ"); __webpack_require__("8ECJ"); -var _FormNavigation = _interopRequireDefault(__webpack_require__("Pnfk")); +var _StepAddress = _interopRequireDefault(__webpack_require__("3dsA")); -var _global = __webpack_require__("c4IZ"); +var _StepConsent = _interopRequireDefault(__webpack_require__("jJse")); -var _FormProgress = _interopRequireDefault(__webpack_require__("Q/++")); +var _StepIdentityAndPdl = _interopRequireDefault(__webpack_require__("9mY8")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -4125,12 +4124,12 @@ var SgeConnectView = function SgeConnectView() { var _useState3 = (0, _react.useState)(sgeConnect.currentStep), _useState4 = (0, _slicedToArray2.default)(_useState3, 2), currentStep = _useState4[0], - setcurrentStep = _useState4[1]; + setCurrentStep = _useState4[1]; var _useState5 = (0, _react.useState)(sgeConnect), _useState6 = (0, _slicedToArray2.default)(_useState5, 2), currentSgeState = _useState6[0], - setcurrentSgeState = _useState6[1]; + setCurrentSgeState = _useState6[1]; var defineHeaderHeight = (0, _react.useCallback)(function (height) { setHeaderHeight(height); @@ -4152,7 +4151,7 @@ var SgeConnectView = function SgeConnectView() { }, [currentSgeState.address, currentSgeState.city, currentSgeState.dataConsent, currentSgeState.firstName, currentSgeState.lastName, currentSgeState.pdl, currentSgeState.pdlConfirm, currentSgeState.zipCode, currentStep]); var handleNext = (0, _react.useCallback)(function () { if (currentStep < _sgeStep.SgeStep.Consent && isNextValid()) { - setcurrentStep(function (prev) { + setCurrentStep(function (prev) { return prev + 1; }); dispatch((0, _global.updateSgeStore)(currentSgeState)); @@ -4160,31 +4159,31 @@ var SgeConnectView = function SgeConnectView() { if (currentStep === _sgeStep.SgeStep.Consent && isNextValid()) { var updatedState = _objectSpread(_objectSpread({}, currentSgeState), {}, { + city: currentSgeState.city.trim(), shouldLaunchAccount: true, // switch to false in case the form fails and the user have to give its consent again dataConsent: false, pdlConfirm: false }); - setcurrentSgeState(updatedState); + setCurrentSgeState(updatedState); dispatch((0, _global.updateSgeStore)(updatedState)); } }, [currentSgeState, currentStep, dispatch, isNextValid]); var handlePrev = (0, _react.useCallback)(function () { if (currentStep !== _sgeStep.SgeStep.IdentityAndPDL) { - setcurrentStep(function (prev) { + setCurrentStep(function (prev) { return prev - 1; }); } dispatch((0, _global.updateSgeStore)(currentSgeState)); }, [currentSgeState, currentStep, dispatch]); - var onChange = (0, _react.useCallback)(function (objkey, value, maxLength) { - if (!maxLength || // optionnal ? - value === '' || /[0-9]/.test(value.toString()) && value.toString().length <= maxLength) { - var updatedState = _objectSpread(_objectSpread({}, currentSgeState), {}, (0, _defineProperty2.default)({}, objkey, value)); + var onChange = (0, _react.useCallback)(function (key, value, maxLength) { + if (!maxLength || value === '' || /[0-9]/.test(value.toString()) && value.toString().length <= maxLength) { + var updatedState = _objectSpread(_objectSpread({}, currentSgeState), {}, (0, _defineProperty2.default)({}, key, value)); - setcurrentSgeState(updatedState); + setCurrentSgeState(updatedState); } }, [currentSgeState]); @@ -4327,7 +4326,7 @@ var PartnersInfoService = /*#__PURE__*/function () { switch (_context.prev = _context.next) { case 0: env = new _environment.default(); - remoteUrl = env.isProduction() ? _orgEcolyoAgentPartners.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO : _orgEcolyoAgentPartners.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC; + remoteUrl = env.isProduction() ? _orgEcolyoAgentPartners.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO : _orgEcolyoAgentPartners.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC; _context.prev = 2; _logger.default.info('[Initialization] Getting PartnersInfo'); @@ -4387,7 +4386,7 @@ exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.loader {\n height: 50px;\n margin: auto;\n display: flex;\n align-items: flex-end;\n gap: 8px;\n}\n.loader.gold {\n color: #b2901b;\n}\n.loader.gaz {\n color: #45d1b8;\n}\n.loader.elec {\n color: #d87b39;\n}\n.loader.water {\n color: #3a98ec;\n}\n.loader.black {\n color: #242633;\n}\n.loader .bar {\n width: 10px;\n border-radius: 5px;\n background: currentColor;\n animation: load 0.4s -0.4s linear infinite alternate;\n}\n.loader .bar:nth-child(1) {\n animation-delay: -0.1s;\n}\n.loader .bar:nth-child(3) {\n animation-delay: -0.55s;\n}\n@keyframes load {\n 0% {\n height: 20%;\n }\n 100% {\n height: 100%;\n }\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.loader {\n height: 50px;\n margin: auto;\n display: flex;\n align-items: flex-end;\n justify-content: center;\n gap: 8px;\n}\n.loader.gold {\n color: #b2901b;\n}\n.loader.gaz {\n color: #45d1b8;\n}\n.loader.elec {\n color: #d87b39;\n}\n.loader.water {\n color: #3a98ec;\n}\n.loader.black {\n color: #242633;\n}\n.loader .bar {\n width: 10px;\n border-radius: 5px;\n background: currentColor;\n animation: load 0.4s -0.4s linear infinite alternate;\n}\n.loader .bar:nth-child(1) {\n animation-delay: -0.1s;\n}\n.loader .bar:nth-child(3) {\n animation-delay: -0.55s;\n}\n@keyframes load {\n 0% {\n height: 20%;\n }\n 100% {\n height: 100%;\n }\n}", ""]); @@ -4691,7 +4690,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -6590,6 +6588,7 @@ var migrations = [{ title: "Le parcours d'acc\xE8s aux donn\xE9es de consommation \xE9lectrique \xE9volue\xA0!", description: "Pour continuer à accéder à vos données d'électricité, merci de vous reconnecter via ce nouveau parcours. Aucune donnée ne sera perdue, et vos données seront à nouveau mises à jour quotidiennement. <p>Pourquoi ce changement ?</p> Pour faciliter l'accès aux données de consommation au plus grand nombre. Plus besoin de se créer un compte Enedis, l'accès aux données en est facilité. N'hésitez pas à en parler autour de vous ! :)" }, + redirectLink: '/consumption/electricity', docTypes: '', run: function () { var _run21 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee21() { @@ -6643,7 +6642,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.sge-view {\n box-sizing: border-box;\n min-height: inherit;\n width: inherit;\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: space-between;\n}\n.sge-view .sge-container {\n padding: 1rem;\n}\n.sge-view .sge-container .sge-step-container {\n color: #e0e0e0;\n /* Chrome, Safari, Edge, Opera */\n /* Firefox */\n}\n.sge-view .sge-container .sge-step-container .title,\n.sge-view .sge-container .sge-step-container .head {\n margin-top: 1rem;\n}\n.sge-view .sge-container .sge-step-container label {\n display: block;\n margin-top: 1rem;\n margin-bottom: 0.625rem;\n cursor: pointer;\n}\n.sge-view .sge-container .sge-step-container label span span {\n color: #e3b82a;\n}\n.sge-view .sge-container .sge-step-container #zipCode {\n max-width: 115px;\n}\n.sge-view .sge-container .sge-step-container .checkbox {\n margin: 0.5rem 0;\n display: flex;\n align-items: center;\n}\n.sge-view .sge-container .sge-step-container .checkbox:first-of-type {\n margin-top: 1.5rem;\n}\n.sge-view .sge-container .sge-step-container .checkbox input {\n margin: 0.5rem 1rem 0.5rem 0.5rem;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n width: 1.45rem;\n height: 1.45rem;\n min-width: 1.45rem;\n min-height: 1.45rem;\n background: radial-gradient(60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100%);\n position: relative;\n border: solid 2px #e3b82a;\n cursor: pointer;\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:before, .sge-view .sge-container .sge-step-container .answer-checked input:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #e3b82a;\n border-radius: 0.5rem;\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n.sge-view .sge-container .sge-step-container input:not([type=checkbox]) {\n appearance: none;\n max-width: 280px;\n width: 100%;\n height: 45px;\n border-radius: 4px;\n border: 1px solid #7b7b7b;\n background: rgba(0, 0, 0, 0.3);\n transition: all 300ms ease;\n color: #e0e0e0;\n padding: 0 0.5rem;\n}\n.sge-view .sge-container .sge-step-container input:not([type=checkbox]):focus, .sge-view .sge-container .sge-step-container input:not([type=checkbox]):focus-visible {\n outline: 1px solid #e3b82a;\n}\n.sge-view .sge-container .sge-step-container input::-webkit-outer-spin-button,\n.sge-view .sge-container .sge-step-container input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.sge-view .sge-container .sge-step-container input[type=number] {\n -moz-appearance: textfield;\n}\n.sge-view .sge-container .sge-step-container .pdl-hint {\n cursor: pointer;\n border-bottom: solid 1px #e0e0e0;\n text-align: center;\n margin: 1rem auto auto;\n padding: 0.2rem;\n width: 175px;\n}\n@media (min-width: 1023px) {\n .sge-view .sge-container .sge-step-container .pdl-hint {\n margin-left: 0;\n }\n}\n.sge-view .sge-container .sge-step-container ul {\n padding: 0 1rem 1rem;\n line-height: 130%;\n border-bottom: 1px solid #7b7b7b;\n}\n.sge-view .sge-container .sge-step-container ul li {\n margin: 0.5rem 0;\n}\n\n.sgeHintModal {\n text-align: center;\n}\n.sgeHintModal .title {\n color: #e3b82a;\n margin: 1rem 0;\n}\n.sgeHintModal .pdl {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n background: #eff2f4;\n text-align: left;\n}\n.sgeHintModal .pdl p {\n color: #526576;\n margin: 0;\n}\n.sgeHintModal .pdl .bill {\n display: flex;\n gap: 0.5rem;\n}\n.sgeHintModal .pdl svg.prm {\n width: 100%;\n height: 180px;\n}\n.sgeHintModal .pdl svg.bill {\n width: 150px;\n height: 80px;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.sge-view {\n box-sizing: border-box;\n min-height: inherit;\n width: inherit;\n display: flex;\n flex: 1;\n flex-direction: column;\n justify-content: space-between;\n}\n.sge-view .sge-container {\n padding: 1rem;\n}\n.sge-view .sge-container .sge-step-container {\n color: #e0e0e0;\n /* Chrome, Safari, Edge, Opera */\n /* Firefox */\n}\n.sge-view .sge-container .sge-step-container .title,\n.sge-view .sge-container .sge-step-container .head {\n margin-top: 1rem;\n}\n.sge-view .sge-container .sge-step-container label {\n display: block;\n margin-top: 1rem;\n margin-bottom: 0.625rem;\n cursor: pointer;\n}\n.sge-view .sge-container .sge-step-container label span span {\n color: #e3b82a;\n}\n.sge-view .sge-container .sge-step-container #zipCode {\n max-width: 115px;\n}\n.sge-view .sge-container .sge-step-container .checkbox {\n margin: 0.5rem 0;\n display: flex;\n align-items: center;\n}\n.sge-view .sge-container .sge-step-container .checkbox:first-of-type {\n margin-top: 1.5rem;\n}\n.sge-view .sge-container .sge-step-container .checkbox input {\n margin: 0.5rem 1rem 0.5rem 0.5rem;\n appearance: none;\n -moz-appearance: none;\n -webkit-appearance: none;\n width: 1.45rem;\n height: 1.45rem;\n min-width: 1.45rem;\n min-height: 1.45rem;\n background: radial-gradient(60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100%);\n position: relative;\n border: solid 2px #e3b82a;\n cursor: pointer;\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:before, .sge-view .sge-container .sge-step-container .answer-checked input:after {\n content: \"\";\n position: absolute;\n display: inline-block;\n background: #e3b82a;\n border-radius: 0.5rem;\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:before {\n width: 3px;\n height: 12px;\n left: 10px;\n top: 4px;\n transform: rotate(41deg);\n}\n.sge-view .sge-container .sge-step-container .answer-checked input:after {\n width: 3px;\n height: 6px;\n left: 5px;\n top: 8px;\n transform: rotate(133deg);\n}\n.sge-view .sge-container .sge-step-container input:not([type=checkbox]) {\n appearance: none;\n max-width: 280px;\n width: 100%;\n height: 45px;\n border-radius: 4px;\n border: 1px solid #7b7b7b;\n background: rgba(0, 0, 0, 0.3);\n transition: all 300ms ease;\n color: #e0e0e0;\n padding: 0 0.5rem;\n}\n.sge-view .sge-container .sge-step-container input:not([type=checkbox]):focus, .sge-view .sge-container .sge-step-container input:not([type=checkbox]):focus-visible {\n border: 1px solid #e3b82a;\n outline: none;\n}\n.sge-view .sge-container .sge-step-container input::-webkit-outer-spin-button,\n.sge-view .sge-container .sge-step-container input::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n.sge-view .sge-container .sge-step-container input[type=number] {\n -moz-appearance: textfield;\n}\n.sge-view .sge-container .sge-step-container .pdl-hint {\n cursor: pointer;\n border-bottom: solid 1px #e0e0e0;\n text-align: center;\n margin: 1rem auto auto;\n padding: 0.2rem;\n width: 175px;\n}\n@media (min-width: 1023px) {\n .sge-view .sge-container .sge-step-container .pdl-hint {\n margin-left: 0;\n }\n}\n.sge-view .sge-container .sge-step-container ul {\n padding: 0 1rem 1rem;\n line-height: 130%;\n border-bottom: 1px solid #7b7b7b;\n}\n.sge-view .sge-container .sge-step-container ul li {\n margin: 0.5rem 0;\n}\n\n.sgeHintModal {\n text-align: center;\n}\n.sgeHintModal .title {\n color: #e3b82a;\n margin: 1rem 0;\n}\n.sgeHintModal .pdl {\n padding: 1rem;\n display: flex;\n flex-direction: column;\n gap: 1rem;\n background: #eff2f4;\n text-align: left;\n}\n.sgeHintModal .pdl p {\n color: #526576;\n margin: 0;\n}\n.sgeHintModal .pdl .bill {\n display: flex;\n gap: 0.5rem;\n}\n.sgeHintModal .pdl svg.prm {\n width: 100%;\n height: 180px;\n}\n.sgeHintModal .pdl svg.bill {\n width: 150px;\n height: 80px;\n}", ""]); @@ -6772,30 +6771,17 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = void 0; -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - -var _I18n = __webpack_require__("buk/"); - -var _reactLottie = _interopRequireDefault(__webpack_require__("hxQi")); - var _Button = _interopRequireDefault(__webpack_require__("FtsS")); -var loadingData = _interopRequireWildcard(__webpack_require__("noA/")); +var _ecolyo = _interopRequireDefault(__webpack_require__("nyyM")); -__webpack_require__("a3QZ"); +var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } +var _I18n = __webpack_require__("buk/"); -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } +var _react = _interopRequireDefault(__webpack_require__("q1tI")); -var loadingOptions = { - loop: false, - autoplay: false, - animationData: loadingData, - rendererSettings: { - preserveAspectRatio: 'xMidYMid slice' - } -}; +__webpack_require__("a3QZ"); var SplashScreenError = function SplashScreenError(_ref) { var error = _ref.error; @@ -6807,11 +6793,11 @@ var SplashScreenError = function SplashScreenError(_ref) { className: "splash-content" }, /*#__PURE__*/_react.default.createElement("div", { className: "splash-loader" - }, /*#__PURE__*/_react.default.createElement(_reactLottie.default, { - options: loadingOptions, - height: 200, - width: 200 - }), /*#__PURE__*/_react.default.createElement("div", { + }, /*#__PURE__*/_react.default.createElement(_StyledIcon.default, { + icon: _ecolyo.default, + size: 130, + className: "error" + }), /*#__PURE__*/_react.default.createElement("span", null, "Ecolyo"), /*#__PURE__*/_react.default.createElement("div", { className: "splash-error-text text-20-bold" }, t('splashscreen.error_loading')), /*#__PURE__*/_react.default.createElement("div", { className: "splash-error-text text-18-normal" @@ -8309,11 +8295,11 @@ exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireWildcard(__webpack_require__("q1tI")); +var _SgeModalHint = _interopRequireDefault(__webpack_require__("Bpne")); var _I18n = __webpack_require__("buk/"); -var _SgeModalHint = _interopRequireDefault(__webpack_require__("Bpne")); +var _react = _interopRequireWildcard(__webpack_require__("q1tI")); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -8329,10 +8315,10 @@ var StepIdentityAndPdl = function StepIdentityAndPdl(_ref) { var _useState = (0, _react.useState)(false), _useState2 = (0, _slicedToArray2.default)(_useState, 2), openHintModal = _useState2[0], - setopenHintModal = _useState2[1]; + setOpenHintModal = _useState2[1]; var toggleModal = (0, _react.useCallback)(function () { - setopenHintModal(function (prev) { + setOpenHintModal(function (prev) { return !prev; }); }, []); @@ -8397,7 +8383,7 @@ exports.default = _default; /***/ "9pOX": /***/ (function(module) { -module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"CGU\",\"title_sge_connect\":\"Connexion à l'électricité\",\"accessibility\":{\"loading\":\"Chargement\"}},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smart_count} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"not_connected\":\"Non connecté\",\"no_data_2\":\"Données non disponibles\",\"accessibility\":{\"button_go_to_profil\":\"Aller à la page de profil\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\"},\"no_data\":\"Pas de données\"},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_options\":\"Je connecte mes compteurs\",\"go_back\":\"Retour\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_go_back\":\"Retour\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"month\":\"Au mois de \",\"estimation\":\"Comment sont estimés\",\"estimation2\":\"les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"electricity-info-modal\",\"button_close\":\"close-modal\"},\"title1\":\"Qu’est-ce que la consommation minimum ?\",\"title2\":\"Qu’est-ce que la puissance maximum ?\",\"text1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"text2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\",\"text3\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"text4\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"text5\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlHint\":\"Où trouver le n° de PDL ?\",\"pdlModal\":{\"txt1\":\"Où trouver le n° de PDL ou PRM ?\",\"txt2\":\"Le numéro de PDL ou PRM se compose de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\",\"modalHint\":{\"accessibility\":\"Titre de la modale\",\"title\":\"Où trouver le n° de PDL ?\",\"button\":\"J'ai compris\",\"button-accessibility\":\"Bouton valider\"}},\"grdfgrandlyon\":{\"connect\":{\"label1\":\"Je me connecte à mon\",\"label2\":\"compte GRDF\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à votre compte GRDF\",\"subtitle1\":\"Si vous n’avez pas de compte GRDF\",\"button_create_account\":\"Je crée mon compte GRDF\",\"subtitle2\":\"Si vous avez déjà un compte GRDF,\",\"subtitle2_info\":\"votre accord est nécessaire pour connecter GRDF et Ecolyo\",\"info\":\"GRDF est responsable de votre compteur Gazpar et en charge de relever vos consommations.\"},\"with_account\":{\"title\":\"Votre compte GRDF a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter GRDF et Ecolyo !\",\"subtitle1_info\":\"Une période de consentement minimale d'un an est recommandée\",\"subtitle2\":\"Si vous n’avez pas de compte GRDF\",\"button_create_account\":\"Je crée mon compte\",\"subtitle2_info\":\"En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à-pas est disponible pour vous y aider.\",\"button_goto_guide\":\"Voir le guide\"}},\"eglgrandlyon\":{\"connect\":{\"login\":\"Identifiant Eau du Grand Lyon (7 chiffres)\",\"password\":\"Mot de passe\",\"label1\":\"Je me connecte à mon\",\"label2\":\"compte Eau du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à votre compte Eau du Grand Lyon\",\"subtitle1\":\"Si vous n’avez pas de compte EGL\",\"button_create_account\":\"Je crée mon compte EGL\",\"subtitle2\":\"Si vous avez déjà un compte EGL,\",\"subtitle2_info\":\"renseignez votre identifiant Eau Du Grand Lyon.\"},\"with_account\":{\"title\":\"Votre compte Eau du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter EGL et Ecolyo !\",\"subtitle2\":\"Si vous n’avez pas de compte EGL\",\"button_create_account\":\"Je crée mon compte\",\"subtitle2_info\":\"En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à-pas est disponible pour vous y aider.\",\"button_goto_guide\":\"Voir le guide\"}},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_goto_guide\":\"Voir le guide\"}},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\"},\"partners_issue_modal\":{\"title\":\"Un problème dans la récupération de vos données\",\"text_1\":\"Ces partenaires nous indiquent qu’ils subissent en ce moment un soucis technique :\",\"text_2\":\"La visualisation de vos consommations peut s’en trouver affectée.\",\"button_validate\":\"J'ai compris\",\"ok\":\"Ok\"}},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_data\":\"Dernières données\",\"last_valid_data\":\"Dernières données disponibles\",\"last_valid_data_multi\":\"Dernières données complètes\",\"data_to_come\":\"à venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (tarif réglementé de vente au %{gasPriceStartDate} pour un consommateur soutirant moins de 6 MWh par an)\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte dans Ecolyo.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"sucess\":{\"title\":\"Félicitations !\",\"message1\":\"Vous avez économisé \",\"message2\":\"et gagné le badge \",\"button_validate\":\"Youpi !\"},\"lost\":{\"title\":\"Presque !\",\"message1\":\"Vous avez dépassé de \",\"message2\":\"et manqué le badge \",\"button_validate\":\"Zut alors !\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune.\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Tous\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_go_to_profil\":\"Aller à la page de profil\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes \",\"text2\":\"Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà.\",\"text3\":\"Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reinit\":\"Réinitialiser ma sélection\",\"reinitModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins d’infos\",\"show_more\":\"Voir plus d’infos\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd'hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour votre chauffage ?\"},\"hot_water_type\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"garden\":\"Jardin\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smart_count} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"Besoin d'aide ?\",\"read_help\":\"Accéder au Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"subtitle\":\"Pas de panique, c'est bien l'équipe Ecolyo qui traitera votre demande !\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Pour le bon fonctionnement du service, nous avons besoin de l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elle conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les <span class=\\\"action\\\">Conditions Générales d’Utilisation</span> \",\"validLegal\":\" du service et ai pris connaissance des <span class=\\\"action\\\"> Mentions Légales </span> de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"subtitle\":\"Envie de prendre le temps de relire ces CGU ces Conditions Générales d’Utilisation plus tard ? Vous pourrez les retrouver dans la page Options du service.\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cloud Personnel Grand Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maitrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Grand Lyon.\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Grand Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"gcu_option\":{\"title\":\"Conditions générales d’utilisation\",\"read_gcu\":\"Lire les CGU\"},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_delete\":\"Supprimer\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_delete\":\"Supprimer votre connexion\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_update_electricity\":\"Vos données de consommation d'électricité sont maintenant à jour dans Ecolyo.\",\"success_data_update_water\":\"Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.\",\"success_data_update_gas\":\"Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_data_gas\":\"Un problème est survenu. Vos données de consommation de gaz ne seront pas chargées.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_come_back_later\":\"Revenir plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span style=\\\"text-align:left; font-weight:700;\\\">Le problème peut provenir des cas suivants :</span> <ul style=\\\"text-align:left;\\\"><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span style=\\\"color:#E3B82A; font-weight:700;\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li> Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li> Avez-vous bien entré le <span style=\\\"color:#E3B82A; font-weight:700;\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p style=\\\"text-align:center; font-style: italic; font-weight:400; font-size: 0.9rem;\\\">Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div style=\\\"text-align:center; font-weight:700;\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Votre autorisation pour afficher vos données de gaz a expiré\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"Veuillez re-donner votre accord pour que GRDF nous transmette vos données de consommation.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Voulez-vous donner votre accord sur votre compte GRDF maintenant ?\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\"},\"delete_grdf_modal\":{\"text1\":\"La suppression de la connexion avec GRDF s’accompagne de la suppression de votre consentement à partager vos données gaz avec Ecolyo.\",\"text2\":\"Si vous souhaitez vous reconnecter, il vous faudra re-donner votre accord pour que GRDF nous transmette vos données de consommation.\",\"text3\":\"Voulez-vous supprimer votre connexion et votre consentement à GRDF ?\",\"cancel\":\"Plus tard\",\"go\":\"Oui\"},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Energie Climat\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-lottie, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les biliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, Sonarqube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"old_fluid_data_modal\":{\"errorTxt\":\"Aïe !\",\"oldData\":\"Vos données semblent anciennes\",\"verify\":\"Veuillez vérifier l’état de vos connecteurs : \",\"problem\":\"Vos connecteurs semblent bien connectés, il se peut qu’il y ait un problème au niveau du ou des fournisseurs de données :\",\"problem_electricity\":\"pour l'électricité.\",\"problem_water\":\"pour l'eau.\",\"problem_gas\":\"pour le gaz.\",\"contact\":\"Veuillez prendre contact directement avec eux.\",\"accessButton\":\"Accéder aux connecteurs\",\"later\":\"Plus tard\",\"ok\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_ok\":\"Fermer la fenêtre\",\"button_later\":\"Fermer la fenêtre\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"partner_connection_steps\":{\"water\":{\"step1\":{\"info1\":\"Munissez-vous d’une <span>facture d'eau</span> et d’un zeste de patience.\",\"info2\":\"\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.\",\"info2\":\"\"},\"button_validate\":\"Aller sur EGL\"},\"gas\":{\"step1\":{\"info1\":\"Munissez-vous d’une <span>facture de gaz</span> et d’un zeste de patience.\",\"info2\":\"\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.\",\"info2\":\"\"},\"button_validate\":\"Aller sur GRDF\"},\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"accessibility\":{\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_validate\":\"Aller sur le site du partenaire.\",\"button_close\":\"Fermer la fenêtre.\",\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\"}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_alert\":\"Alerte fuite d'eau\",\"title_bilan\":\"Notification par mail\",\"switch_label_bilan\":\"Je reçois la lettre mensuelle contenant un bilan et des conseils sur ma consommation.\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \",\"activate\":\"Activer\",\"deactivate\":\"Désactiver\"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"appartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"ecogesture_error\":\"Chargement des astuces de consommation\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Chargement des astuces de consommations\",\"4\":\"Actualisation de votre progression dans les défis\",\"5\":\"Mise à jour des prix\",\"6\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"title\":\"Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel ?\",\"content\":\"Dans ce cas, vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_text\":\"Oui, je me désabonne\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); +module.exports = JSON.parse("{\"common\":{\"title_app\":\"Ecolyo\",\"title_challenge\":\"Défis\",\"title_quiz\":\"Quiz\",\"title_exploration\":\"Exploration\",\"title_action\":\"Action\",\"title_duel\":\"Duel final\",\"title_ecogesture\":\"Astuce\",\"title_ecogestures\":\"Astuces\",\"title_ecogestures_choice\":\"Sélection des astuces\",\"title_options\":\"Options\",\"title_analysis\":\"Analyse\",\"title_profiletype\":\"Ajuster mon profil\",\"title_legal_notice\":\"Mentions légales\",\"title_gcu\":\"CGU\",\"title_sge_connect\":\"Connexion à l'électricité\",\"accessibility\":{\"loading\":\"Chargement\"}},\"FLUID\":{\"ELECTRICITY\":{\"NAME\":\"Électricité\",\"LABEL\":\"Électricité\",\"UNIT\":\"kWh\",\"ADD\":\"Ajouter l'électricité\",\"MEGAUNIT\":\"MWh\",\"provider\":\"Enedis\"},\"WATER\":{\"NAME\":\"Eau\",\"LABEL\":\"Eau\",\"ADD\":\"Ajouter l'eau\",\"UNIT\":\"L\",\"MEGAUNIT\":\"m³\",\"provider\":\"Eau du Grand Lyon\"},\"GAS\":{\"NAME\":\"Gaz\",\"LABEL\":\"Gaz\",\"ADD\":\"Ajouter le gaz\",\"UNIT\":\"kWh\",\"MEGAUNIT\":\"MWh\",\"provider\":\"GRDF\"},\"MULTIFLUID\":{\"NAME\":\"Multi fluide\",\"LABEL\":\"Multi\",\"UNIT\":\"€\"}},\"action\":{\"duration\":\"Durée : %{smart_count} jours\",\"result\":\"Résultat\",\"finished\":\"Défi terminé !\",\"details\":\"Détail de l'astuce\",\"apply\":\"J'applique cette action\",\"other\":\"Je choisis une autre action\",\"resultText1\":\"Cela n'a pas été trop difficile ?\",\"resultText2\":\"Jetez un coup d'œil dans la page conso dans 1 à 3 jours, le temps que vos données arrivent, pour voir l'impact de votre action.\",\"resultText3\":\"Pas de baisse de significative ? Pas de panique, en maintenant cette pratique dans le temps, les économies d'énergies et d'eau seront davantage visibles.\",\"resultText4\":\"Dans tous les cas, bravo, vous remportez...\",\"ok\":\"Ok\"},\"action_modal\":{\"accept\":\"Je relève le défi\",\"refuse\":\"Je me défile\",\"accessibility\":{\"window_title\":\"Fenêtre de confirmation\",\"button_accept\":\"Accepter\",\"button_refuse\":\"Refuser\"}},\"analysis\":{\"viewTitle\":\"Analyse\",\"comparison\":\"Comparatif\",\"analysis_date\":\"Conso totale\",\"challenge\":\"Défis terminés en\",\"user_consumption\":\"Votre conso\",\"average_home\":\"Conso moyenne d'un profil similaire\",\"average_home_description\":\"Le comparatif ici présenté est calculé sur la base d'un profil similaire au vôtre. Il s'agit d'un calcul et non d'une comparaison avec les autres utilisateurs de l'application. Sont pris en compte l'ensemble des informations entrées dans votre profil : mode de chauffage, âge du logement et éventuels travaux de rénovation, etc. Ce modèle a été créé avec l'Agence Locale de l'Energie sur la base de chiffres issues du Schéma Directeur des Energies de la Métropole de Lyon et de Chiffres-clé publiés par l'ADEME (l'Agence de l'Environnement et de la Maîtrise de l'Energie).\",\"approximative_description\":\"Pour comparer votre consommation avec un foyer similaire ou avec une conso idéale, veuillez détailler votre profil\",\"not_connected\":\"Non connecté\",\"no_data_2\":\"Données non disponibles\",\"accessibility\":{\"button_go_to_profil\":\"Aller à la page de profil\"},\"max_day\":\"Jour où vous avez le plus consommé\",\"compare\":{\"title\":\"Comparateur\"},\"no_data\":\"Pas de données\"},\"analysis_error_modal\":{\"title\":\"Aucune analyse\",\"message\":\"Pour profiter d’une analyse de vos consommations, connectez au moins un de vos compteurs.\",\"go_to_options\":\"Je connecte mes compteurs\",\"go_back\":\"Retour\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_go_back\":\"Retour\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"analysis_pie\":{\"total\":\"Conso totale\",\"month\":\"Au mois de \",\"estimation\":\"Comment sont estimés\",\"estimation2\":\"les prix ?\"},\"special_elec\":{\"title\":\"Spécial Électricité\",\"average\":\"Conso moyenne\",\"weektype\":\"un jour de \",\"week\":\"semaine\",\"weekend\":\"week-end\",\"min\":\"Conso minimum\",\"percentage\":\"Part dans la facture\",\"price\":\"Soit\",\"maxPower\":\"Puissance maximum atteinte\",\"showModal\":\"Plus d'infos\"},\"elec_info_modal\":{\"accessibility\":{\"window_title\":\"electricity-info-modal\",\"button_close\":\"close-modal\"},\"title1\":\"Qu’est-ce que la consommation minimum ?\",\"title2\":\"Qu’est-ce que la puissance maximum ?\",\"text1\":\"Elle correspond à votre plus petite consommation du mois sur un créneau d'une demi-heure.\",\"text2\":\"Nous extrapolons cette consommation sur 1 mois afin vous donner un aperçu de la consommation de vos consommations électriques en veille (box, télé, chargeurs, ...) ou encore de celle, incompressible, de vos appareils de froid (frigo, congélateur).\",\"text3\":\"C’est la puissance maximum délivrée par tous les appareils fonctionnant au même moment dans votre logement.\",\"text4\":\"Vous avez choisi une puissance maximum dans votre offre d’électricité (3, 6 ou 9 kVA...) que vous ne devez pas dépasser pour ne pas faire sauter votre compteur. \",\"text5\":\"Cette puissance varie d'un mois à l'autre, regardez cette valeur sur l'ensemble de l'année pour vérifier si votre puissance souscrite correspond bien à votre usage.\"},\"auth\":{\"enedissgegrandlyon\":{\"title\":\"Ecolyo doit se connecter à l’électricité\",\"bill\":\"Munissez-vous d’une <span>facture d’électricité</span> pour valider la connexion\",\"connect\":\"Je me connecte à l'électricité\",\"accessibility\":{\"connect\":\"Se connecter\"},\"identityTitle\":\"Nom inscrit sur la facture\",\"firstName\":\"Prénom\",\"lastName\":\"Nom\",\"pdlTitle\":\"Numéro de votre compteur électrique (PDL)\",\"pdlLabel\":\"N° (14 chiffres)\",\"pdlHint\":\"Où trouver le n° de PDL ?\",\"pdlModal\":{\"txt1\":\"Où trouver le n° de PDL ou PRM ?\",\"txt2\":\"Le numéro de PDL ou PRM se compose de 14 chiffres.\",\"txt3\":\"Votre numéro de PDL ou PRM se trouve sur votre facture d’électricité.\",\"txt4\":\"Si vous avez un compteur Linky, appuyez sur le bouton “+” et faites défiler l’affichage jusqu’à obtenir l’affichage suivant :\"},\"addressTitle\":\"Adresse du titulaire\",\"address\":\"Numéro et voie\",\"zipCode\":\"Code postal\",\"city\":\"Ville\",\"headConsent\":\"Vous allez partager vos données à la Métropole de Lyon. Elles seront directement transférées à Ecolyo à l'intérieur de votre cloud personnel, sans que la Métropole n'y accède ni ne les visualise.\",\"textConsent\":\"Afin de vous offrir des fonctionnalités de visualisation et d'analyse, Ecolyo a besoin des données suivantes : \",\"consentLi1\":\"L'historique et le relevé de vos consommations quotidiennes en kWh\",\"consentLi2\":\"L'historique et le relevé de vos consommations au pas de temps 30 minutes\",\"consentLi3\":\"Les puissances maximales atteintes quotidiennement\",\"consentLi4\":\"Les données contractuelles (début de contrat et puissance souscrite)\",\"consentCheck1\":\"Je consens à partager les données personnelles ci-dessus pour une durée d'<span>un an</span>\",\"consentCheck2\":\"J’atteste être le titulaire du point de livraison (PDL) renseigné à l’étape précédente\",\"modalHint\":{\"accessibility\":\"Titre de la modale\",\"title\":\"Où trouver le n° de PDL ?\",\"button\":\"J'ai compris\",\"button-accessibility\":\"Bouton valider\"}},\"grdfgrandlyon\":{\"connect\":{\"label1\":\"Je me connecte à mon\",\"label2\":\"compte GRDF\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à votre compte GRDF\",\"subtitle1\":\"Si vous n’avez pas de compte GRDF\",\"button_create_account\":\"Je crée mon compte GRDF\",\"subtitle2\":\"Si vous avez déjà un compte GRDF,\",\"subtitle2_info\":\"votre accord est nécessaire pour connecter GRDF et Ecolyo\",\"info\":\"GRDF est responsable de votre compteur Gazpar et en charge de relever vos consommations.\"},\"with_account\":{\"title\":\"Votre compte GRDF a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter GRDF et Ecolyo !\",\"subtitle1_info\":\"Une période de consentement minimale d'un an est recommandée\",\"subtitle2\":\"Si vous n’avez pas de compte GRDF\",\"button_create_account\":\"Je crée mon compte\",\"subtitle2_info\":\"En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à-pas est disponible pour vous y aider.\",\"button_goto_guide\":\"Voir le guide\"}},\"eglgrandlyon\":{\"connect\":{\"login\":\"Identifiant Eau du Grand Lyon (7 chiffres)\",\"password\":\"Mot de passe\",\"label1\":\"Je me connecte à mon\",\"label2\":\"compte Eau du Grand Lyon\"},\"no_account\":{\"title\":\"Ecolyo doit se connecter à votre compte Eau du Grand Lyon\",\"subtitle1\":\"Si vous n’avez pas de compte EGL\",\"button_create_account\":\"Je crée mon compte EGL\",\"subtitle2\":\"Si vous avez déjà un compte EGL,\",\"subtitle2_info\":\"renseignez votre identifiant Eau Du Grand Lyon.\"},\"with_account\":{\"title\":\"Votre compte Eau du Grand Lyon a bien été créé ?\",\"subtitle1\":\"Plus qu’à donner votre accord pour connecter EGL et Ecolyo !\",\"subtitle2\":\"Si vous n’avez pas de compte EGL\",\"button_create_account\":\"Je crée mon compte\",\"subtitle2_info\":\"En cas de soucis pour créer votre compte ou pour vous y connecter, un guide en pas-à-pas est disponible pour vous y aider.\",\"button_goto_guide\":\"Voir le guide\"}},\"accessibility\":{\"button_reveal_password\":\"Afficher le mot de passe\",\"button_connect\":\"Se connecter\",\"button_create_account\":\"Se créer un compte\",\"button_goto_guide\":\"Voir le guide\"}},\"challenge\":{\"card\":{\"ongoing\":{\"quiz\":\"Quiz\",\"exploration\":\"Explorations\",\"action\":\"Actions\",\"duel\":\"Duel Final\",\"result\":\"Résultat\",\"duelDone\":\"du duel final\"},\"locked\":{\"desc\":\"À débloquer en terminant le défi précédent\"}},\"card_done\":{\"saving\":\"Économie de\",\"depense\":\"Dépense de\",\"win\":\"Gagné\",\"lost\":\"Perdu\",\"final_defi\":\"sur le duel final\",\"final_defi_view\":\"Revoir le duel final\"},\"card_last\":{\"title\":\"Tous les défis sont terminés\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"button\":\"Suggérer une idée de défi\"},\"card_unlocked\":{\"button_launch\":\"Lancer le défi\"},\"accessibility\":{\"button_launch\":\"Lancer le défi\",\"button_goto_konnector\":\"Aller aux connecteurs\",\"button_slider_previous\":\"Précédent\",\"button_slider_next\":\"Suivant\"}},\"challenge_no_fluid_modal\":{\"title\":\"Oups !\",\"content\":\"Connectez au moins 1 fluide pour pouvoir jouer\",\"button_validate\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Valider\"}},\"consumption\":{\"display_last_data\":\"Voir mes dernières consos\",\"accessibility\":{\"button_previous_period\":\"Afficher la période précédente\",\"button_next_period\":\"Afficher la période suivante\",\"button_previous_value\":\"Sélectionner la valeur précédente\",\"button_next_value\":\"Sélectionner la valeur suivante\",\"checkbox_compare\":\"Afficher ou cacher la comparaison\"},\"partner_issue_modal\":{\"title\":\"Attention !\",\"error_connect_gaz\":\"La connexion à vos données de <span class='gaz'>gaz</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='gaz'>GRDF</span> ou dans notre service)\",\"error_connect_elec\":\"La connexion à vos données d'<span class='elec'>électricité</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='elec'>Enedis</span> ou dans notre service)\",\"error_connect_water\":\"La connexion à vos données d'<span class='water'>eau</span> est actuellement dysfonctionnelle (Maintenance chez notre partenaire <span class='water'>Eau Publique du Grand Lyon</span> ou dans notre service)\",\"additional_text\":\"La visualisation et/ou la connexion à vos données de consommation peut s'en trouver affectée.<br /><br /><i>Merci pour votre patience en attendant un retour à la normale :)</i>\",\"ok\":\"Ok\"}},\"consumption_details\":{\"detail\":\"Détail par fluide\",\"connect\":\"Connecter d'autres fluides\",\"mini_cards_label\":\"AUTRES ENERGIES\"},\"consumption_visualizer\":{\"missing_data\":\"Données manquantes\",\"no_data\":\"Pas de données\",\"why_no_data\":\"Pourquoi n'ai-je pas de données ?\",\"last_data\":\"Dernières données\",\"last_valid_data\":\"Dernières données disponibles\",\"last_valid_data_multi\":\"Dernières données complètes\",\"data_to_come\":\"à venir\",\"aie\":\"Aïe !\",\"data_empty\":\"Vide\",\"estimated\":\"estimés\",\"dataModal\":{\"list_title\":\"3 raisons possibles :\",\"item1\":\"le lien entre Ecolyo et le fournisseur de données est rompu : une mise à jour de ce lien (en bas de la page) peut résoudre ce problème.\",\"item2\":\"un problème technique chez votre gestionnaire : se connecter directement chez ce gestionnaire pour vérifier que cette donnée apparaît.\",\"item3\":\"vous n'aviez tout simplement pas de compteur communicant à l'époque !\"},\"modal\":{\"window_title\":\"info estimation des prix\",\"title\":\"Comment sont estimés les prix ?\",\"close\":\"Fermer la fenêtre\",\"part1\":\"Le prix de votre électricité ou de votre gaz dépend de l'offre choisie auprès de votre fournisseur. N’ayant pas accès à cette information, Ecolyo affiche un prix moyen par fluide. \",\"part2\":\"Tarifs moyens retenus :\",\"list1\":\" : 1 kWh = %{elecPrice} €TTC (il correspond au tarif réglementé d’EDF au %{elecPriceStartDate} pour une puissance souscrite de 3 ou 6 kVA et hors offre heure pleine/heure creuse)\",\"list2\":\" : 1 kWh = %{gasPrice} €TTC (tarif réglementé de vente au %{gasPriceStartDate} pour un consommateur soutirant moins de 6 MWh par an)\",\"list3\":\" : 1 litre d’eau = %{waterPrice} € TTC (prix constaté au %{waterPriceStartDate} pour un abonnement et une consommation de 120 m3/an sur la Métropole de Lyon)\",\"part3\":\"Le coût de votre abonnement n'est pas pris en compte dans Ecolyo.\"},\"release_notes_modal\":{\"title\":\"Du nouveau sur Ecolyo !\",\"message\":\"Les mises à jour suivantes ont été effectuées sur votre application :\",\"go_back\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre de notifications\",\"button_go_back\":\"J'ai compris\"}}},\"duel\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"average_info\":\"%{average} euros étant votre moyenne actuelle, relevez-vous le défi ?\",\"button_start\":\"Allons-y !\",\"goal1\":\"Faites moins que votre moyenne actuelle sur %{durationInDays} jours\",\"goal2\":\"pour gagner le badge %{title}\",\"goal_done\":\"Duel remporté\",\"goal_failed\":\"Duel perdu\",\"caption_average\":\"Votre moyenne à titre indicatif\",\"caption_consumption\":\"Votre consommation\",\"caption_incoming\":\"Données à venir\",\"accessibility\":{\"button_go_back\":\"Retour\",\"button_start_duel\":\"Lancer le duel\",\"button_start_quiz\":\"Lancer le quiz\"}},\"duel_result_modal\":{\"sucess\":{\"title\":\"Félicitations !\",\"message1\":\"Vous avez économisé \",\"message2\":\"et gagné le badge \",\"button_validate\":\"Youpi !\"},\"lost\":{\"title\":\"Presque !\",\"message1\":\"Vous avez dépassé de \",\"message2\":\"et manqué le badge \",\"button_validate\":\"Zut alors !\"},\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_validate\":\"Valider\"}},\"last_duel_modal\":{\"title\":\"Félicitations !\",\"subtitle\":\"Vous avez terminé tous les défis !\",\"message1\":\"Nous travaillons actuellement à vous proposer de nouveaux défis.\",\"message2\":\"Vous pouvez donner votre avis sur ce que vous aimeriez en cliquant sur la bulle jaune.\"},\"duel_empty_value_modal\":{\"title\":\"Oups !\",\"message\":\"Impossible de lancer le duel. Il nous manque en effet certaines de vos données de consommation pour vous proposer un duel à votre hauteur.\",\"button\":\"Je retourne au menu des défis\",\"accessibility\":{\"window_title\":\"Fenêtre d'erreur\",\"button_validate\":\"Retourner au menu des défis\"}},\"ecogesture\":{\"title_tab_0\":\"Objectifs\",\"title_tab_1\":\"Je fais déjà\",\"title_tab_2\":\"Toutes\",\"MENU_TITLE\":\"Filtrer\",\"ALL\":\"Tous les usages\",\"HEATING\":\"Chauffage\",\"AIR_CONDITIONING\":\"Climatisation\",\"ECS\":\"Eau chaude\",\"COLD_WATER\":\"Eau froide\",\"ELECTRICITY_SPECIFIC\":\"Électricité courante\",\"COOKING\":\"Cuisson\",\"selection\":\"Sélectionner les astuces les plus adaptées à votre consommation\",\"selection_2\":\"vues sur\",\"button_selection\":\"Continuer ma sélection\",\"no_ecogesture\":\"Aucune astuce ne correspond à votre filtrage\",\"no_ecogesture_filter\":{\"text1\":\"Nous n'avons pas trouvé d'astuces adaptées à votre profil dans cette catégorie.\",\"text2\":\"En effet, de par votre profil et vos modes de chauffage, d'eau ou d'eau chaude sanitaire, nous n'avons pas identifié d’astuces vous permettant de diminuer vos factures à titre individuel. Toutefois, vous pouvez toujours agir pour préserver les ressources en appliquant et diffusant autour de vous les autres bonnes pratiques présentées dans la partie \\\"Toutes les astuces\\\".\"},\"adjust_profil\":{\"description\":\"Pour une sélection d’astuces adaptée à votre consommation, vous pouvez ajuster votre profil.\",\"button_go_to_profil\":\"Ajuster mon profil\"},\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_go_to_profil\":\"Aller à la page de profil\",\"button_close\":\"Fermer la fenêtre\",\"button_selection\":\"Aller à la page de sélection\"},\"doing\":\"Je fais déjà\",\"objective\":\"Objectif\",\"emptyList\":{\"obj1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes.\",\"obj1_done\":\"Aucune astuce n’a été sélectionnée comme objectif actuellement.\",\"obj2\":\"Vous pouvez sélectionner ceux à mettre en objectifs et ceux que vous appliquez déjà.\",\"obj2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous souhaitez garder en objectif dans cette section.\",\"doing1\":\"Aucune astuce n’a été sélectionnée dans la catégorie appliquée actuellement.\",\"doing1_done\":\"Aucune astuce n’est indiquée comme déjà appliquée actuellement.\",\"doing2\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"doing2_done\":\"Vous pouvez consulter toutes les astuces et ajouter celles que vous mettez déjà en pratique dans cette section.\",\"btn1\":\"Voir toutes les astuces\",\"btn2\":\"Sélectionner\"},\"initModal\":{\"title\":\"Sélectionner mes astuces\",\"text1\":\"Les astuces présentées sont des actions qui vous permettent de réduire vos consommations et donc vos factures. On parle parfois d’écogestes \",\"text2\":\"Vous pouvez sélectionner celles à mettre en objectifs et celles que vous appliquez déjà.\",\"text3\":\"Afin de pré-sélectionner les astuces correspondant à votre consommation, merci de répondre à quelques rapides questions.\",\"btn1\":\"Plus tard\",\"btn2\":\"C'est parti !\"},\"reinit\":\"Réinitialiser ma sélection\",\"reinitModal\":{\"title_part1\":\"Cette action\",\"title_part2\":\"supprimera votre liste d’astuces\",\"title_part3\":\"sélectionnées dans\",\"title_part4\":\"“Objectifs”\",\"title_part5\":\"et\",\"title_part6\":\"“Je fais déjà”\",\"text1\":\"Vous pourrez ensuite faire une nouvelle sélection adaptée à votre consommation.\",\"text2\":\"Souhaitez-vous réinitialiser votre sélection d’astuces ?\",\"btn1\":\"Non\",\"btn2\":\"Réinitialiser\"}},\"ecogesture_modal\":{\"title_ecogesture\":\"Astuce\",\"title_action\":\"Action\",\"efficiency\":\"Efficacité\",\"show_less\":\"Voir moins d’infos\",\"show_more\":\"Voir plus d’infos\",\"select_action\":\"Je choisis cette action\",\"accessibility\":{\"window_title_ecogesture\":\"Fenêtre astuce\",\"window_title_action\":\"Fenêtre action\",\"button_close\":\"Fermer la fenêtre\",\"button_select_action\":\"Sélectionner cette action\",\"button_see_more_detail\":\"Afficher plus de détails\"}},\"ecogesture_info_modal\":{\"header\":\"Comment sont choisis les astuces adaptées à mon profil ?\",\"text\":\"Les astuces adaptés à votre profil sont aujourd'hui choisies en fonction des compteurs individuels que vous possédez (communicants ou non). Ceux présentés ici vous permettent d'agir sur vos consommations individuelles. Des modes de tri plus personnalisables seront proposés à l'avenir.\",\"button_close\":\"J'ai compris\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_close\":\"Fermer la fenêtre\"}},\"ecogesture_form\":{\"heating_type\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour votre chauffage ?\"},\"hot_water_type\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"}},\"ecogesture_profile\":{\"equipments\":{\"question\":\"Quels équipements possédez-vous ?\",\"hint\":\"Plusieurs réponses possibles\",\"air_conditioning\":\"Climatisation\",\"computer\":\"Ordinateur\",\"microwave\":\"Micro-ondes\",\"oven\":\"Four\",\"washing_machine\":\"Lave-linge\",\"dishwasher\":\"Lave-vaisselle\",\"cooking_plates\":\"Plaques électriques\",\"garden\":\"Jardin\",\"dryer\":\"Sèche-linge\",\"refregirator\":\"Réfrigérateur\",\"fan\":\"Ventilateur\",\"water_heater\":\"Chauffe-eau\",\"curtain\":\"Rideaux\",\"internet_box\":\"Box internet\",\"ventilation\":\"VMC\",\"freezer\":\"Congélateur\",\"boiler\":\"Chaudière\",\"hydraulic_heating\":\"Chauffage hydraulique\"}},\"ecogesture_selection\":{\"header\":\"Sélection des astuces\",\"title\":\"Vous avez parcouru un groupe de %{smart_count} astuces\",\"text\":\"Voulez-vous continuer sur votre lancée ou remettre cette sélection à plus tard ?\",\"title_final\":\"Félicitations !\",\"text_final_1\":\"Vous avez terminé la sélection des astuces adaptées à votre consommation.\",\"text_final_2\":\"Vous pouvez les retrouver dans les sections “Objectifs” et “Je fais déjà” selon que vous les pratiquiez déjà ou non.\",\"button_go_to_ecogesture\":\"Plus tard\",\"button_ok\":\"J'ai compris\",\"button_continue\":\"Poursuivre\",\"button_objective\":\"Objectif\",\"button_doing\":\"Je fais déjà\",\"button_skip\":\"Pas intéressé\",\"accessibility\":{\"window_title\":\"Fenêtre d'information'\",\"button_close\":\"Fermer la fenêtre\",\"button_go_to_ecogesture\":\"Retourner aux astuces\",\"button_continue\":\"Poursuivre\",\"button_ok\":\"Fermer la sélection\"},\"selectionModal\":{\"title\":\"Des astuces correspondant à votre profil ont été trouvées !\",\"text\":\"À vous de choisir celles que vous souhaitez mettre en objectif et celles que vous faites déjà.\",\"button_close\":\"C'est parti !\"}},\"exploration\":{\"global_error\":\"Oups. Une erreur est survenue. Veuillez retourner à l'écran d’accueil des défis\",\"button_go_back\":\"Retour\",\"button_already_done\":\"C’est déjà fait !\",\"button_come_back\":\"Je reviens quand cela sera fait\",\"button_start\":\"C'est parti !\",\"watch_consumption\":\"Je fonce\",\"congratulation\":\"Bravo !\",\"earn\":\"Vous remportez\",\"button_confirm\":\"Ok\",\"interval\":{\"explanation\":\"Vous pouvez vérifier cette informations sur l'écran Conso.\"},\"accessibility\":{\"button_already_done\":\"Marquer l'exploration comme déjà réalisée\",\"button_confirm\":\"Valider\",\"button_come_back\":\"Fermer l'exploration\",\"button_go_back\":\"Retour\",\"button_start\":\"Lancer l'exploration\"}},\"error_page\":{\"main\":\"Erreur\",\"back\":\"Retour\",\"no_ecogesture\":\"Oups ! Nous n'avons pas trouvé l'astuce demandée.\"},\"help\":{\"title_help\":\"Besoin d'aide ?\",\"read_help\":\"Accéder au Service d'Assistance Utilisateur\"},\"feedback\":{\"title\":\"Vous allez contacter le Service Assistance Utilisateur du Grand Lyon.\",\"subtitle\":\"Pas de panique, c'est bien l'équipe Ecolyo qui traitera votre demande !\",\"later\":\"Plus tard\",\"lets_go\":\"J'y vais\",\"accessibility\":{\"window_title\":\"Fenêtre de partage de retours\",\"button_close\":\"Fermer la fenêtre de partage de retours\"}},\"dataShare\":{\"title1\":\"Bienvenue !\",\"title1Update\":\"Ecolyo évolue !\",\"title2Update\":\"Pour continuer à utiliser Ecolyo, merci d’accepter les modalités de traitement des données ci-dessous.\",\"part1\":\"Pour le bon fonctionnement du service, nous avons besoin de l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon.\",\"part2\":\"Cette donnée de compte est conservée dans Ecolyo le temps de l’utilisation de ce service.\",\"part3\":\"La Métropole de Lyon utilisera cet email afin de vous tenir informé·e :\",\"item1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter.\",\"item2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"item3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part4\":\"Vos données privées de consommation d’énergie et d’eau sont récupérées, sauvegardées et stockées dans votre cloud personnel à votre initiative sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part5\":\"Il en est de même pour les données privées de composition du logement et du foyer, fournies par vos soins. Elles restent également sans visibilité de la Métropole de Lyon sur leur contenu.\\nLes données d’identification entrées lors de la connexion aux données de consommations d’électricité sont quant à elle conservées dans un espace sécurisé de la Métropole de Lyon et sont utilisées uniquement à des fins de contrôle du consentement par des organismes extérieurs.\",\"part6\":\"Dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées et pseudonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation, d’évaluer globalement l’usage de l’application via des mesures d’audience ainsi que d’évaluer à terme l’impact global en termes de baisse des consommations énergétiques de notre service.\",\"part7\":\"Au sein de votre cloud personnel, vous pouvez à tout moment exercer vos droits d’accès, de rectification, de portabilité, de limitation et d’opposition en consultant notamment la page Options.\",\"part8\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part9\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 \",\"part10\":\"ou en ligne, au moyen du formulaire disponible à l'adresse suivante : \",\"link1\":\"<a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/</a>\",\"validDataConsent\":\"Je consens au traitement de mes données tel que décrit ci-dessus.\",\"validCGU\":\"Je valide les <span class=\\\"action\\\">Conditions Générales d’Utilisation</span> \",\"validLegal\":\" du service et ai pris connaissance des <span class=\\\"action\\\"> Mentions Légales </span> de celui-ci.\",\"button_accept\":\"C'est parti !\",\"accessibility\":{\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"minorUpdate\":{\"title\":\"Ecolyo évolue !\",\"button\":\"J'ai compris\"},\"gcu\":{\"title\":\"Conditions générales d’utilisation du service\",\"subtitle\":\"Envie de prendre le temps de relire ces CGU ces Conditions Générales d’Utilisation plus tard ? Vous pourrez les retrouver dans la page Options du service.\",\"version\":\"Version du 12.12.2022\",\"content\":{\"title1\":\"Ecolyo, késako ?\",\"part1_1\":\"Ecolyo est un service proposé par la Métropole de Lyon vous permettant de suivre au même endroit vos consommations d’électricité, de gaz et d’eau, en kWh, en litres, en euros et à différentes échelles de temps. Ce service vous permet également de participer à des défis individuels et vous offre une analyse de vos consommations. Des astuces vous sont aussi proposées afin de vous permettre de réduire vos consommations.\",\"part1_2\":\"C’est un service gratuit qui prend la forme d’un site web dit « responsive », c’est-à-dire qu’il peut être consulté sur ordinateur ou sur mobile. Sur mobile, c’est une application que l’on a souhaitée ergonomique, réactive et esthétique pour votre plaisir de navigation et d’utilisation au quotidien.\",\"part1_3\":\"Tous les termes « techniques » sont définis en bas de page.\",\"title2\":\"Quelles fonctionnalités le service propose-t-il ?\",\"part2_1\":\"La fonctionnalité principale d’Ecolyo est la visualisation, au même endroit, de vos consommations d’électricité, de gaz et d’eau et ce, à différents pas de temps (de la demi-heure – uniquement pour l’électricité, à plusieurs années, en passant par les pas de temps journaliers et mensuels). La visualisation des consommations se fait en kWh pour l’énergie et en L pour l’eau ainsi qu’en euros (euros résultant d’un prix moyenné).\",\"part2_2\":\"Au-delà de la visualisation de vos consommations et parce que nous souhaitons vous aider à diminuer ces consommations vous retrouverez plusieurs autres pages : \",\"part2_2_list1\":\"Défis : Des quiz, et actions à mettre en place vous seront proposés pour vous pousser à réduire vos consommations.\",\"part2_2_list2\":\"Astuces : Une liste d’astuces pour maîtriser ses consommations d’énergie et d’eau à trier par usage, et avec une possibilité de les adapter plus précisément à votre profil.\",\"part2_2_list3\":\"Analyse : Une analyse de vos consommations réelles en comparaison à celle d’un foyer étant proche d’une vôtre.\",\"part2_3\":\"Pour la page Analyse ainsi que pour la partie personnalisation des astuces, des éléments supplémentaires sur votre profil vous seront demandés. L’ensemble de ces informations récoltées à l’aide du formulaire peuvent être modifiées par la suite.\",\"part2_4\":\"Dernière page : la page Options dans laquelle vous pourrez vous abonner à un service d’alerte sur vos consommations d’eau, de quoi ajuster votre profil ou encore vous désabonner de la lettre mensuelle.\",\"title3\":\"Comment ai-je accès à mes données d’électricité, de gaz et d’eau ?\",\"part3_1\":\"Pour visualiser vos consommations réelles et profiter pleinement du potentiel de notre service, il vous faut au minimum un des trois compteurs communicants suivants : Linky (pour l’électricité), Gazpar (pour le gaz), Téléo (pour l’eau).\",\"part3_2\":\"Ces compteurs sont opérés par les gestionnaires de réseaux. Pour Linky, c’est Enedis, le gestionnaire de réseau de distribution d’électricité. Pour Gazpar, GRDF est responsable de cette gestion. Et pour Téléo, c’est Eau du Grand Lyon.\",\"part3_3\":\"Ces acteurs sont responsables de la relève de vos données. Ces données servent notamment à votre fournisseur d’électricité, de gaz ou d’eau pour permettre la facturation de vos consommations d’énergie. Des fournisseurs d’électricité ou de gaz il y en a des dizaines. Les gestionnaires de réseaux (… et de votre compteur) ne sont qu’au nombre de trois. Nous avons donc décidé de travailler avec eux, au plus près de la donnée brute issue de vos compteurs.\",\"part3_4\":\"Il vous faudra donc avoir un compte chez GRDF et Eau du Grand Lyon pour accéder à vos données. Si vous n’en avez pas, il suffira de vous en créer un. Ceci ne sera à faire qu’une fois, au début.\",\"title4\":\"Ecolyo se trouve dans un cloud personnel Grand Lyon, qu’est-ce que cela signifie ?\",\"part4_1\":\"Comme vous avez dû le remarquer, lors de votre première connexion à Ecolyo vous avez dû vous créer un compte Cloud Personnel Grand Lyon. Ce cloud personnel est un espace sécurisé porté par l’ambition de vous apporter visibilité, transparence et maitrise sur l’usage de vos données personnelles, et dont les fonctionnalités vous permettant de récupérer, synchroniser, stocker et partager vos données avec les destinataires de votre choix. Le service Ecolyo se déploie à l’intérieur de cet espace protégé. Dans ce cloud personnel, vous pourrez accéder également à d’autres services. Toutes les données traitées par Ecolyo, mais aussi les autres services que vous seriez amenés à utiliser dans ce cloud personnel restent dans ce Cloud Personnel Grand Lyon et n’en sortent pas, sauf si vous décidez vous-même de partager vos données avec des tiers.\",\"part4_2\":\"Pour en savoir plus sur ce cloud et son utilisation, ainsi que la durée de conservation de vos données, vous pouvez lire les conditions générales d’utilisation du service <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">ici</a>.\",\"title5\":\"Et donc concrètement pour Ecolyo, quelles données sont collectées et qui y a accès ?\",\"part5_1\":\"Pour qu’Ecolyo ait accès à vos données de consommations, vous devrez activer vos différents connecteurs. À ce moment-là, pour la connexion aux données de gaz et d’eau à travers un parcours qui vous conduira de manière intuitive sur le site de chacun des gestionnaires de réseaux concerné, vous pourrez donner votre consentement à partager ces données avec le Service Ecolyo, et ce pour une durée limitée dans le temps. Pour l’électricité, le don du consentement et la connexion aux données se fait directement dans notre service. Quid de la durée de ce consentement ? Pour les données électriques, elle est par défaut d'un an. Pour les données gaz, cela sera à vous de la définir (nous vous recommandons 1 an pour une expérience optimale). Les données utilisées pour vérifier la bonne connexion de vos données d’électricité sont stockées du côté de la Métropole de Lyon sur des serveurs sécurisés.\",\"part5_2\":\"Vos connecteurs, une fois configurés, permettent le transfert de vos données de consommations au service Ecolyo. Le transfert de ces données de consommation se fait sans que personne n’accède à leur contenu, pas même la Métropole de Lyon. En effet, ces données sont stockées et traitées directement dans votre cloud personnel qui en assure la protection. Tous les calculs, analyses et traitements sur ces données sont faites DANS votre espace personnel sans visibilité sur le contenu des données par la Métropole de Lyon.\",\"part5_3\":\"Vous pouvez bien sûr mettre fin à la récupération/ au transfert de vos données de consommation sur votre espace cloud personnel à tout moment et à plusieurs niveaux : \",\"part5_3_list1\":\"Vous pouvez supprimer le transfert quotidien de vos données en supprimant tout simplement le connecteur dans la page Consos (en bas).\",\"part5_3_list2\":\"Pour supprimer l’ensemble de vos données ainsi que votre espace personnel Grand Lyon, vous devez demander la suppression de votre cloud. Pour faire cela, rendez-vous dans les paramètres de votre cloud personnel via la barre blanche en haut d’Ecolyo et appuyez sur le bouton « Supprimer mon compte » dans la partie paramètres.\",\"part5_4\":\"Des données sur le profil de votre foyer peuvent être également remplies au sein de l’application. Ces données s’enrichiront au fur et à mesure de votre utilisation du service avec d’autres informations : défis réalisés, étoiles gagnées, etc. L’ensemble de ces données restent à l’intérieur de votre cloud personnel, sans que personne n’y ait accès.\",\"part5_5\":\"Enfin, afin de permettre une mise à jour quotidienne de vos données de consommations, vos identifiants Eau du Grand Lyon, un jeton d’identification GRDF ainsi que vos numéros de compteurs sont stockés.\",\"title6\":\"Personne n’a donc accès à mes données, pas même la Métropole de Lyon, vraiment ?\",\"part6_1\":\"Conformément aux indications du paragraphe précédent, la Métropole de Lyon n’accède ni à vos données de consommations ni aux données utilisées via certaines fonctionnalités du service comme le formulaire (celui-là même qui permet l’analyse de vos consommations personnalisée ainsi qu’une sélection d’éco-gestes personnalisés). Toutes ces informations sont bien gardées au chaud dans votre cloud personnel Grand Lyon.\",\"part6_2\":\"Seul vous pouvez accepter de partager vos données, documents ou fichiers privés avec la Métropole de Lyon, ses partenaires ou d’autres utilisateurs ou acteurs (publics ou privés) après recueil de votre consentement éclairé et par une action expresse de votre part.\",\"part6_3\":\"La Métropole de Lyon n'a cependant accès qu’à l’adresse email utilisée lors la création de votre cloud personnel Grand Lyon. Elle utilise cet email afin de vous tenir informé·e :\",\"part6_3_list1\":\"En réponse à vos demandes, si vous avez pris l’initiative de nous contacter. \",\"part6_3_list2\":\"En cas de problème majeur avec la gestion de votre compte.\",\"part6_3_list3\":\"De l’évolution de vos consommations, des nouveautés et de la qualité du service via une lettre mensuelle. Vous pouvez à tout moment vous désinscrire de cette lettre via la page Options du service.\",\"part6_4\":\"Elle stocke également les informations transmises lors de la connexion à l’électricité (nom, adresse postale). Ces informations doivent être stockées car la Métropole de Lyon est régulièrement contrôlée par Enedis et doit prouver détenir le consentement des personnes pour lesquelles elle va chercher la donnée.\",\"part6_5\":\"Par ailleurs, et dans le cadre de l’évaluation et de l’amélioration du service, des données d’utilisation anonymisées seront remontées à des fins d’exploitation statistiques. La récupération de ces statistiques anonymisées nous permettra de s’assurer du bon fonctionnement technique de la connexion à vos données de consommation ainsi que d’évaluer l’impact global en termes de baisse des consommations énergétiques de notre service. Parmi ces statistiques, des mesures d’audience de la fréquentation des différentes pages du service sont réalisées. Vous pouvez, via la page Options, à tout instant, décider de vous opposer à la récupération de ces données d’utilisation.\",\"title8\":\"Encore des questions ?\",\"part8_1\":\"N’hésitez pas à consulter la FAQ ou à nous contacter via le formulaire de contact présente sur l’ensemble des pages.\",\"part8_2\":\"Dernière option, contactez-nous directement à <a href=\\\"mailto:ecolyo@grandlyon.com\\\">ecolyo(at)grandlyon.com</a>.\",\"title9\":\"LEXIQUE\",\"part9_1_title\":\"Cloud personnel Grand Lyon : \",\"part9_1_content\":\"Cloud personnel : appelé aussi le « domicile numérique », le cloud personnel est souvent réduit à un simple espace de stockage de documents mais il est bien plus que ça. C'est un espace individuel et sécurisé où vous pouvez accéder à des services sans exposer aucune donnée à l’extérieur. Vous seul pouvez y accéder, personne d'autre.\",\"part9_2_title\":\"Connecteur : \",\"part9_2_content\":\"Un connecteur est un service, installé dans votre cloud personnel également, qui a pour but uniquement d’aller récupérer les données auprès de différents partenaires/sources de données. Dans le cadre d’Ecolyo, trois connecteurs sont pré-installés dans votre cloud personnel : celui d’Enedis, celui de GRDF et celui d’Eau du Grand Lyon.\",\"part9_3_title\":\"Compteur communicant : \",\"part9_3_content\":\"Un compteur communicant est un compteur qui mesure de manière précise et détaillée vos consommations et peut transmettre ces données au gestionnaire de réseau via une technologie radio (c'est le cas pour Gazpar et Téléo par exemple) ou via les réseaux électriques (via Courant Porteur en ligne, c'est le cas pour Linky par exemple).\",\"part9_4_title\":\"Fournisseur : \",\"part9_4_content\":\"Votre fournisseur d’électricité, de gaz ou d’eau est l’entreprise qui vous facture votre électricité, gaz ou eau. Côté électricité il en existe <a href=\\\"https://www.enedis.fr/liste-des-fournisseurs-delectricite\\\">aujourd’hui plus de 50</a>, chacun proposant des tarifs différents.\",\"part9_5_title\":\"Gestionnaire de réseau de distribution : \",\"part9_5_content\":\"Appelé aussi parfois distributeur, il est en charge de la livraison de votre électricité, gaz ou eau jusqu’à votre domicile. Il est aussi en charge du compteur qui relève vos consommations. Il transmet vos données de consommations à votre fournisseur afin qu’il effectue la facturation de vos consommations d’énergie. Il peut également les transmettre à tout acteur avec qui vous avez décidé de partager ces données.\"}},\"gcu_modal\":{\"button_accept\":\"J'accepte\",\"accessibility\":{\"window_title\":\"Conditions générales d’utilisation\",\"button_accept\":\"Accepter les conditions générales d'utilisation\"}},\"gcu_option\":{\"title\":\"Conditions générales d’utilisation\",\"read_gcu\":\"Lire les CGU\"},\"matomo\":{\"matomo_title\":\"Suivi statistiques d'usage Matomo\"},\"header\":{\"accessibility\":{\"button_back\":\"Retour à la page précédente\",\"button_open_feedbacks\":\"Ouvrir le partage de retours\"}},\"konnector_form\":{\"label_updated_at\":\"Dernière mise-à-jour le\",\"button_update\":\"Mettre à jour\",\"wait_end_issue\":\"Attendre la fin de la maintenance avant de mettre à jour.\",\"button_delete\":\"Supprimer\",\"issue\":\"Le problème semble venir de \",\"resolve\":\"Une mise à jour peut résoudre ce problème.\",\"login_failed\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"not_installed\":\"Le connecteur n'est pas installé. Veuillez l'installer en cliquant sur le bouton ci-dessous.\",\"button_install\":\"Installer\",\"error_account_creation\":\"Une erreur est survenue, veuillez essayer de nouveau.\",\"error_no_login_password\":\"Identifiant et mot de passe requis\",\"error_login_failed\":\"Identifiants invalides\",\"error_update\":\"Un problème est survenu lors du rapatriement de vos données.\",\"error_update_oauth\":\"Votre autorisation pour afficher vos données %{fluid} a expiré.\",\"button_oauth_reload\":\"Redonner mon consentement\",\"OK\":\"Ok\",\"accessibility\":{\"button_install\":\"Installer le connecteur\",\"button_update\":\"Mettre à jour votre connexion\",\"button_delete\":\"Supprimer votre connexion\"}},\"konnector_options\":{\"label_connect_to_electricity\":\"Se connecter à l'électricité\",\"label_connect_to_water\":\"Se connecter à l'eau\",\"label_connect_to_gas\":\"Se connecter au gaz\",\"partner_issue\":\"En maintenance\",\"outdated\":\"Données manquantes depuis %{isOutdatedData} jours\",\"accessibility\":{\"label_ko_status\":\"Connecteur en erreur\",\"button_toggle_detail_electricity\":\"Afficher ou masquer le détail de la connexion à l'électricité\",\"button_toggle_detail_water\":\"Afficher ou masquer le détail de la connexion à l'eau\",\"button_toggle_detail_gas\":\"Afficher ou masquer le détail de la connexion au gaz\"}},\"konnector_modal\":{\"loading_data\":\"Veuillez patienter, vos données sont en cours de chargement.\",\"loading_data_update\":\"Veuillez patienter, vos données sont en cours de mise à jour.\",\"logging_txt\":\"Nous vérifions vos informations d'identité\",\"success_txt\":\"Félicitations !\",\"success_data_electricity\":\"Vos données de consommation d'électricité sont maintenant connectées à Ecolyo.\",\"success_data_water\":\"Vos données de consommation d'eau sont maintenant connectées à Ecolyo.\",\"success_data_gas\":\"Vos données de consommation de gaz sont maintenant connectées à Ecolyo.\",\"success_data_update_electricity\":\"Vos données de consommation d'électricité sont maintenant à jour dans Ecolyo.\",\"success_data_update_water\":\"Vos données de consommation d'eau sont maintenant à jour dans Ecolyo.\",\"success_data_update_gas\":\"Vos données de consommation de gaz sont maintenant à jour dans Ecolyo.\",\"error_txt\":\"Aïe !\",\"mismatch\":{\"title\":\"Vos données n'ont pas pu être récupérées.\",\"text1\":\"Vos nom et numéro de compteur ne correspondent plus. Merci de reconfigurer votre connecteur.\",\"text2\":\"Reconfigurer mon connecteur ?\",\"text3\":\"La reconfiguration de votre connecteur passe par sa suppression et sa nouvelle installation. Vos données seront conservées.\"},\"error_data_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité ne seront pas chargées.\",\"error_data_water\":\"Un problème est survenu. Vos données de consommation d’eau ne seront pas chargées.\",\"error_credentials_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter. L'identifiant est un numéro à 7 chiffres (différent de votre numéro de contrat).\",\"error_credentials_electricity\":\"Il semblerait que les nom(s) et adresse ne concordent pas avec le numéro de votre compteur.\",\"error_credentials_electricity_2\":\"Nous ne pouvons vous donner accès aux données de consommation.\",\"error_credentials_update_water\":\"Une erreur s'est glissée dans vos identifiants de connexion. Veuillez vérifier ces éléments et tenter de vous reconnecter.\",\"error_credentials_update_electricity\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_credentials_update_gas\":\"Un problème a lieu lors de la récupération de vos données. Merci de supprimer votre connecteur et vous reconnecter.\",\"error_data_gas\":\"Un problème est survenu. Vos données de consommation de gaz ne seront pas chargées.\",\"error_data_update_electricity\":\"Un problème est survenu. Vos données de consommation d’électricité n’ont pas été mises à jour.\",\"error_data_update_water\":\"Un problème est survenu. Vos données de consommation d’eau n’ont pas été mises à jour.\",\"error_data_update_gas\":\"Un problème est survenu. Vos données de consommation de gaz n’ont pas été mises à jour.\",\"error_data_2\":\"Merci de réessayer plus tard.\",\"button_validate\":\"Ok\",\"button_understood\":\"J'ai compris\",\"button_come_back_later\":\"Revenir plus tard\",\"show_common_error\":\"Voir les erreurs récurrentes\",\"show_common_error_list\":\"<span style=\\\"text-align:left; font-weight:700;\\\">Le problème peut provenir des cas suivants :</span> <ul style=\\\"text-align:left;\\\"><li>Vous avez un co-titulaire sur votre contrat. Veillez à bien entrer le nom du <span style=\\\"color:#E3B82A; font-weight:700;\\\">titulaire du contrat</span> et non le co-titulaire.</li><li> Votre nom comporte un tiret ? Tentez sans le tiret.</li><li> Entrez bien le nom de votre commune de résidence en entier (tirets et accents inclus)</li><li> Avez-vous bien entré le <span style=\\\"color:#E3B82A; font-weight:700;\\\">numéro de votre compteur</span> (PDL) ? Tout autre numéro (de contrat, de client) ne fonctionne pas.</li></ul><p style=\\\"text-align:center; font-style: italic; font-weight:400; font-size: 0.9rem;\\\">Si vous rencontrez toujours des difficultés, contactez notre service d'aide </p><div style=\\\"text-align:center; font-weight:700;\\\">Avez-vous pensez à vérifier ces informations ?</div>\",\"accessibility\":{\"window_title\":\"Fenêtre d'attente de connexion\",\"button_close\":\"Fermer la fenêtre\"}},\"consent_outdated\":{\"title\":{\"0\":\"Votre autorisation pour afficher vos données d’électricité a expiré\",\"2\":\"Votre autorisation pour afficher vos données de gaz a expiré\"},\"text1\":{\"0\":\"Veuillez re-donner votre consentement pour la transmission et la reconnexion de vos données ENEDIS à Ecolyo.\",\"2\":\"Veuillez re-donner votre accord pour que GRDF nous transmette vos données de consommation.\"},\"text2\":{\"0\":\"Souhaitez-vous renouveler votre accord dès maintenant pour un an ?\",\"2\":\"Voulez-vous donner votre accord sur votre compte GRDF maintenant ?\"},\"later\":\"Plus tard\",\"go\":\"J'y vais\",\"no\":\"Non\",\"yes\":\"Oui\"},\"delete_grdf_modal\":{\"text1\":\"La suppression de la connexion avec GRDF s’accompagne de la suppression de votre consentement à partager vos données gaz avec Ecolyo.\",\"text2\":\"Si vous souhaitez vous reconnecter, il vous faudra re-donner votre accord pour que GRDF nous transmette vos données de consommation.\",\"text3\":\"Voulez-vous supprimer votre connexion et votre consentement à GRDF ?\",\"cancel\":\"Plus tard\",\"go\":\"Oui\"},\"legal\":{\"read_legal\":\"Lire les mentions légales\",\"title_legal\":\"Mentions légales & CGU\",\"version\":\"Version du 12.12.2022\",\"site\":\"Site du service Ecolyo : <a href=\\\"https://ecolyo.com/\\\"> https://ecolyo.com/</a>\",\"adress\":\"Métropole de Lyon - 20, rue du Lac – CS 33569 - 69505 Lyon cedex 03\",\"phone\":\"Tél : (33) 4 78 63 40 40\",\"mail\":\"<a href=\\\"mailto:ecolyo@grandlyon.com\\\"> ecolyo(at)grandlyon.com</a>\",\"p1b\":\"Directrice de publication : \",\"p1\":\"Blandine MELAY, Responsable du Service Energie Climat\",\"p2b\":\"Animation éditoriale, gestion et mise à jour : \",\"p2\":\"Marion BERTHOLON, Chargée de services numériques pour la transition énergétique\",\"p3b\":\"Photographies : \",\"p3\":\"sauf mention contraire, les photos sont la propriété de la Métropole de Lyon\",\"p4b\":\"Conception et Charte graphique : \",\"p4\":\"Florent Dufier\",\"p5b\":\"Réalisation technique : \",\"p5\":\"Métropole de Lyon, Sopra Steria\",\"p6b\":\"Maintenance technique : \",\"p6\":\"Délégation Développement économique, emploi & savoirs - Innovation numérique & systèmes d’information - Usages et services numériques - Développement des services numériques\",\"title1\":\"Crédits\",\"part1\":\"Ce site est le résultat de développements spécifiques réalisés dans les langages Go, TypeScript, HTML et Sass. Les développements s’appuient sur plusieurs bibliothèques et frameworks libres : axios, cozy-bar, cozy-client, cozy-harvest-lib, cozy-scripts, cozy-ui, d3, detect-browser, eslint-config-cozy-app, global, lodash, luxon, moment, moment-timezone, node-sass, object-hash, react, react-dom, react-redux, react-router-dom, react-swipeable-views, redux-devtools-extension, sass-loader. Les tests de l’application s’appuient sur les bibliothèques et frameworks libres suivants: enzyme, enzyme-adapter-react-16, jest-junit, react-test-renderer, redux-mock-store. La pile technique intègre également les applications Cozy stack, Yarn, Docker, ACH. Les déploiements sont réalisés sur le registre hébergé chez Cozy. L’équipe de réalisation utilise au quotidien les applications GitLab, IceScrum, RocketChat, SonarQube.\",\"title2\":\"Traitement des données personnelles et droit d’accès, de modification et de suppression\",\"part2\":\"Conformément à la réglementation en vigueur en matière de protection des données personnelles, le service Ecolyo a fait l’objet d’une inscription au registre des traitements de la Métropole de Lyon. Ecolyo fait partie de l’écosystème de services orientés « self data » déployés par la Métropole de Lyon avec l’ambition d’offrir aux usagers métropolitains les outils et les services leur permettant d’exercer directement leur droit à la portabilité, dans un cadre apte à garantir aussi bien la transparence et le contrôle sur l’usage de leurs données personnelles que l’exploitation directe du contenu de ces données selon leurs libres choix. Le self data est en effet selon la Fondation Internet Nouvelle Génération (FING) « la production, l’exploitation et le partage de données personnelles par les individus, sous leur contrôle et à leurs propres fins ». Au sein de cet environnement self data, la gestion des données s’appuie sur l’organisation suivante des rôles et responsabilités associées : \",\"part2-1\":\"Les partenaires du service GRDF et Eau du Grand Lyon sont responsables exclusivement des seuls traitements de Données Personnelles relatifs à la collecte des données de consommation de gaz et d’eau de l’utilisateur et à leur transmission sur la plateforme de cloud personnel, après consentement de l’utilisateur.\",\"part2-2\":\"Enedis est responsable de la collecte des données de consommation d’électricité et de leur mise à disposition à la Métropole de Lyon qui, elle en gère la transmission sur la plateforme du cloud personnel de l’utilisateur, après avoir récupéré le consentement de l’utilisateur.\",\"part2-3\":\"La Métropole de Lyon est responsable de traitement sur le périmètre du service Ecolyo qu’elle propose à l’usager, ainsi que des traitements nécessaires à la fourniture de la plateforme de cloud personnel qu’elle met à disposition de l’usager pour accéder au service Ecolyo. En sa qualité de responsable de ces traitements, elle collecte et traite : \",\"part2-3-1\":\"Les données de compte de l’usager renseignées par l’usager au sein de son espace de cloud personnel Grand Lyon à des fins de gestion du compte et de communication avec l’usager ;\",\"part2-3-2\":\"Les données de compte de l’utilisateur lui permettant de connecter ses données d’électricité à Ecolyo ;\",\"part2-3-3\":\"Les données privées de consommation d’énergie et d’eau dont la récupération, la sauvegarde, le stockage, la synchronisation et le partage sur la plateforme de cloud personnel sont initiés par l’usager sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-4\":\"Les données privées sur la composition du logement et du foyer de l’utilisateur, fournies par l’utilisateur lui-même au sein du service, sont traitées par le service sans visibilité de la Métropole de Lyon sur leur contenu.\",\"part2-3-5\":\"Des métriques d’usage du service anonymisées et remontées périodiquement afin d’améliorer la qualité du service et d’évaluer son impact (Plus d’informations sur la manière dont votre anonymat est bien préservé dans ce processus <a href=\\\"https://ecolyo.com/cloud_statistiques.html\\\">ici</a>).\",\"part2-4\":\"La Métropole réalise également des mesures d’audience à l’aide de la solution Matomo. Afin de vous fournir un meilleur service et d’améliorer votre expérience d'utilisateur, nous utilisons des solutions de mesure d’audience qui utilisent la technologie des « cookies », des fichiers texte qui sont enregistrés sur votre ordinateur et qui permettent de générer des informations envoyées aux serveurs de mesure d’audience. Sur ces serveurs, l’adresse IP est anonymisée. Les données recueillies ont uniquement pour finalité de permettre d'analyser la fréquentation de nos pages afin d'en améliorer le contenu. Il s'agit de statistiques agrégées permettant de connaître le nombre de visites et de visiteurs différents, les pages les plus populaires, les chemins préférés, les niveaux d'activité par jour de la semaine et par heure de la journée, les principales erreurs etc. Vous avez cependant le droit de vous opposer à l’utilisation de ces cookies, et donc au traitement de vos données personnelles de navigation, en vous rendant dans la page Options de notre service.\",\"part2-5\":\"L’usager est seul décisionnaire des finalités d’utilisation qu’il souhaite définir pour le traitement de ses données personnelles de consommation, à la suite de leur transmission par les partenaires du service Ecolyo sur son cloud personnel. Ainsi, dans le cadre de l’utilisation d’Ecolyo, l’usager ne recevra les données des partenaires du service : Enedis, GRDF et Eau du Grand Lyon seulement qu’à sa demande expresse après la saisie de ses identifiants.\",\"part2-6\":\"L’utilisateur est donc le seul à accéder :\",\"part2-6-1\":\"À ses données de consommation d’électricité horaires, journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-2\":\"À ses données de consommation de gaz journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-6-3\":\"À ses données de consommation eau journalières, hebdomadaires, mensuelles et annuelles.\",\"part2-7\":\"Les engagements et responsabilités de la Métropole de Lyon concernant la protection des données et la confidentialité des données Ecolyo sont précisés dans les Mentions légales et les conditions d’utilisation du cloud personnel Grand Lyon qui accueille aujourd’hui le service Ecolyo et sans lequel le service ne peut pas fonctionner. Pour plus d’informations sur les engagements et responsabilités de la Métropole de Lyon concernant la protection et la confidentialité dans le cloud personnel, nous vous invitons à vous référer <a href=\\\"https://manager.cozygrandlyon.cloud/tos/266b4226-8417-42fb-b911-41e86dae8581.pdf?locale=fr\\\">aux mentions légales et CGU du cloud personnel métropolitain.</a> \",\"part2-8\":\"Conformément à la loi 78-17 du 6 janvier 1978 modifiée relative à l’information, aux fichiers et aux libertés, vous disposez d’un droit d’accès, de rectification et d’opposition au traitement de vos données à caractère personnel. Votre cloud personnel vous permet d’exercer ces droits directement dans cet espace sur vos données de compte. S’agissant des données de consommations d’électricité et de gaz, l’utilisateur peut supprimer son consentement à partager ses données en supprimant son connecteur dans la page Consos.\",\"part2-9\":\"Vous pouvez également exercer vos droits d’accès, de rectification, de limitation, d’opposition et d’effacement de vos données personnelles en contactant directement le Délégué à la Protection des Données par courrier en écrivant à l’adresse :\",\"part2-10\":\"Métropole de Lyon – Délégué à la Protection des Données - Direction des Assemblées, des Affaires Juridiques et des Assurances - 20, rue du Lac - BP 33569 - 69505 Lyon Cedex 03 ou en ligne, au moyen du formulaire disponible à l'adresse suivante : <a href=\\\"https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/\\\">https://demarches.toodego.com/sve/proteger-mes-donnees-personnelles/.</a>\",\"part2-11\":\"L’exercice de ces droits sur vos données personnelles auprès de la Métropole de Lyon concerne exclusivement les données traitées dans le cadre du service « Ecolyo ».\",\"title3\":\"Dispositions légales\",\"part3-1\":\"Les divers éléments du site web (la forme, la mise en page, le fonds, la structure …) sont protégés par le droit des dessins et modèles, le droit d’auteur, le droit des marques ainsi que le droit à l’image et ils ne peuvent être copiés ou imités en tout ou partie sauf autorisation expresse de la Métropole de Lyon.\",\"part3-2\":\"Toute personne ne respectant pas les dispositions légales applicables se rend coupable du délit de contrefaçon et est passible des sanctions pénales prévues par la loi.\",\"title4\":\"Droits d’auteurs\",\"part4-1\":\"Les photographies, textes, logos, pictogrammes, ainsi que toutes œuvres intégrées dans le site sont la propriété de la \\\"Métropole de Lyon\\\" ou de tiers ayant autorisé la \\\"Métropole de Lyon\\\" à les utiliser.\",\"part4-2\":\"Les reproductions, les transmissions, les modifications, les réutilisations, sur un support papier ou informatique, dudit site et des œuvres qui y sont reproduites ne sont autorisées que pour un usage personnel et privé conforme aux dispositions de l’article L 122-5 du Code de la Propriété Intellectuelle. Ces reproductions devront ainsi notamment indiquer clairement la source et l’auteur du site et/ou de ces œuvres multimédias. En aucun cas ces reproductions ne sauraient porter préjudice aux droits des tiers. Les reproductions, les transmissions, les modifications, les réutilisations à des fins publicitaires, commerciales ou d’information, de tout ou partie du site, sont totalement interdites.\",\"title5\":\"Logo de la Métropole de Lyon et d’Ecolyo\",\"part5\":\"Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent pas être modifiés – proportions, couleurs, éléments, constituants – et ne peuvent pas être sujet à aucune transformation, animation ou tout autre processus. Les logos de la Métropole de Lyon et d’Ecolyo ne peuvent être utilisés et associés qu’aux seules informations vérifiables. Ils ne peuvent être notamment utilisés que pour illustrer des relations avec la Métropole de Lyon ou des actions de sponsorings dûment établies. Quel que soit le cas d’espèce, la Métropole de Lyon se réserve le droit d’approuver ou de désapprouver toute utilisation des logos de la Métropole de Lyon et d’Ecolyo, pour assurer son utilisation correcte, conformément à l’éthique, la morale et aux intérêts de la Métropole de Lyon. Les conditions susmentionnées s’appliquent dans le cadre de pages web, elles ne font pas référence à l’utilisation des logos dans tout autre document. La Métropole de Lyon se réserve le droit de modifier les conditions d’utilisation des logos de la Métropole de Lyon et d’Ecolyo à tout moment et sans préavis.\",\"title6\":\"Droit des bases de données\",\"part6\":\"Les bases de données sont protégées par la loi du 1er juillet 1998 et le régime français du droit d’auteur.\",\"title7\":\"Établissements de liens vers le site Ecolyo\",\"part7-1\":\"La Métropole de Lyon autorise la mise en place d’un lien hypertexte vers son service Ecolyo pour tous les sites internet, à l’exclusion de ceux diffusant des informations à caractère polémique, pornographique, xénophobe ou pouvant, dans une plus large mesure porter atteinte à la sensibilité du plus grand nombre.\",\"part7-2\":\"Le lien doit aboutir à la page d’accueil du service (<a href=\\\"https://ecolyo.com\\\">https://ecolyo.com</a>), cette page devant apparaître dans une nouvelle fenêtre. Les pages du service Ecolyo ne doivent en aucun cas être intégrées à l’intérieur des pages d’un autre site (iframe).\",\"part7-3\":\"Dans tous les cas d’espèce, La Métropole de Lyon se réserve le droit de demander la suppression d’un lien si elle estime que le site cible ne respecte pas les règles ainsi définies.\",\"title8\":\"Liens vers des sites tiers depuis le site Ecolyo\",\"part8\":\"Les liens hypertextes mis en œuvre au sein du site en direction d’autres sites et/ou de pages personnelles et d’une manière générale vers toutes ressources existantes sur internet ne sauraient engager la responsabilité de la Métropole de Lyon quant aux liens qu’ils contiennent ou aux changements ou mises à jour qui leur sont apportés.\",\"title9\":\"Mise en garde générale\",\"part9-1\":\"Nos services mettent tout en œuvre pour offrir aux visiteurs de ce site web des informations fiables et vérifiées. Cependant, malgré tous les soins apportés, le site peut comporter des inexactitudes, des défauts de mise à jour ou des erreurs.\",\"part9-2\":\"Nous remercions les utilisateurs du site de nous faire part d’éventuelles omissions, erreurs ou corrections par mail sur la boite aux lettres du webmestre ou directement via le formulaire proposé dans le service.\",\"accessibility\":{\"button_close\":\"Fermer la fenêtre\"}},\"navigation\":{\"consumption\":\"Conso\",\"challenges\":\"Défis\",\"ecogestures\":\"Astuces\",\"options\":\"Options\",\"analysis\":\"Analyse\"},\"oauth\":{\"window\":{\"title\":\"OAuth\"}},\"onboarding\":{\"welcomeModal\":{\"title\":\"Vous êtes à mi-chemin !\",\"part1\":\"Votre cloud personnel a bien été créé.\",\"part2\":\"Il vous faut maintenant donner votre accord pour connecter vos compteurs au service.\",\"button_valid\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre de bienvenue\",\"button_valid\":\"Valider\"}}},\"old_fluid_data_modal\":{\"errorTxt\":\"Aïe !\",\"oldData\":\"Vos données semblent anciennes\",\"verify\":\"Veuillez vérifier l’état de vos connecteurs : \",\"problem\":\"Vos connecteurs semblent bien connectés, il se peut qu’il y ait un problème au niveau du ou des fournisseurs de données :\",\"problem_electricity\":\"pour l'électricité.\",\"problem_water\":\"pour l'eau.\",\"problem_gas\":\"pour le gaz.\",\"contact\":\"Veuillez prendre contact directement avec eux.\",\"accessButton\":\"Accéder aux connecteurs\",\"later\":\"Plus tard\",\"ok\":\"Ok\",\"accessibility\":{\"window_title\":\"Fenêtre d'information\",\"button_ok\":\"Fermer la fenêtre\",\"button_later\":\"Fermer la fenêtre\",\"button_goto_konnector\":\"Aller aux connecteurs\"}},\"partner_connection_steps\":{\"water\":{\"step1\":{\"info1\":\"Munissez-vous d’une <span>facture d'eau</span> et d’un zeste de patience.\",\"info2\":\"\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.\",\"info2\":\"\"},\"button_validate\":\"Aller sur EGL\"},\"gas\":{\"step1\":{\"info1\":\"Munissez-vous d’une <span>facture de gaz</span> et d’un zeste de patience.\",\"info2\":\"\"},\"step2\":{\"info1\":\"Une fois votre compte créé, <span>revenez sur Ecolyo</span> pour finaliser la connexion.\",\"info2\":\"\"},\"button_validate\":\"Aller sur GRDF\"},\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"accessibility\":{\"window_title\":\"Fenêtre d'information sur la création de compte.\",\"button_validate\":\"Aller sur le site du partenaire.\",\"button_close\":\"Fermer la fenêtre.\",\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\"}},\"performance_indicator\":{\"bilan\":{\"text1\":\"Par rapport à \",\"text2\":\"soit une différence de : \"},\"error_no_compare\":\"comparaison impossible\",\"error_no_compare_reason\":\"(manque de données)\",\"error_no_compare_no_data\":\"Vos consommations pour cette période sont incomplètes à cause d’un problème technique concernant :\",\"fpi\":{\"no_data\":\"Données non disponibles\",\"no_comparison\":\"Pas de comparaison possible\"}},\"profile\":{\"report\":{\"title_alert\":\"Alerte fuite d'eau\",\"title_bilan\":\"Notification par mail\",\"switch_label_bilan\":\"Je reçois la lettre mensuelle contenant un bilan et des conseils sur ma consommation.\",\"switch_label_alert\":\"Être prévenu d’un dépassement anormal de ma consommation d’eau\",\"input_label_alert\":\"Si ma consommation d’eau quotidienne dépasse :\",\"input_label_subtext_alert\":\"Votre consommation quotidienne maximum sur les 6 derniers mois : \",\"activate\":\"Activer\",\"deactivate\":\"Désactiver\"},\"accessibility\":{\"button_toggle_mail_report\":\"Recevoir mon bilan mensuel par mail\",\"button_toggle_consumption_alert\":\"Recevoir des alertes sur mes consommations journalières\",\"input_water_alert_report\":\"Indiquer une limite de consommation d'eau journalière\"}},\"profile_type\":{\"title_profile\":\"Mes données\",\"read_profile\":\"Ajuster mon profil\",\"button_update_profile\":\"J'ajuste mon profil\",\"your_profile\":\"Mon profil\",\"multi_choices\":\"Plusieurs réponses possibles\",\"housing_type\":{\"title\":\"Logement\",\"question\":\"De quel type de logement disposez-vous ?\",\"individual_house\":\"Maison individuelle\",\"appartment\":\"Appartement\"},\"construction_year\":{\"title\":\"Construction\",\"question\":\"Quelle est son année de construction ?\",\"text_before_1948\":\"Construit avant 1948\",\"text_between_1948_and_1974\":\"Construit entre 1948 et 1974\",\"text_between_1975_and_1989\":\"Construit entre 1975 et 1989\",\"text_between_1990_and_1998\":\"Construit entre 1990 et 1998\",\"text_after_1998\":\"Construit après 1998\",\"text_unknown\":\"Construit après 1998\",\"before_1948\":\"Avant 1948\",\"between_1948_and_1974\":\"Entre 1948 et 1974\",\"between_1975_and_1989\":\"Entre 1975 et 1989\",\"between_1990_and_1998\":\"Entre 1990 et 1998\",\"after_1998\":\"Après 1998\",\"unknown\":\"Je ne sais pas\"},\"occupantsNumber\":{\"single\":\" occupant\",\"multi\":\" occupants\"},\"area\":{\"title\":\"Surface\",\"question\":\"Quelle est sa surface en m² ?\",\"name\":\" m²\"},\"occupants_number\":{\"title\":\"Nombre d'occupants\",\"question\":\"Combien il y a-t-il d'occupants ?\"},\"outside_facing_walls\":{\"1\":\"1 façade\",\"2\":\"2 façades\",\"3\":\"3 façades\",\"4\":\"4 façades\",\"title\":\"Murs extérieurs\",\"question\":\"Combien de façades donnent sur l'extérieur ?\",\"text\":{\"single\":\" façade donne sur l'extérieur\",\"multi\":\" façades donnent sur l'extérieur\"}},\"floor\":{\"title\":\"Étage\",\"question\":\"À quel étage est votre appartement ?\",\"ground_floor\":\"Au rez-de-chaussée\",\"intermediate_floor\":\"Étage intermédiaire\",\"last_floor\":\"Dernier étage\",\"not_applicable\":\"Sans objet\"},\"heating\":{\"title\":\"Chauffage\",\"question\":\"Quel est votre type de chauffage ?\",\"individual\":\"Individuel\",\"collective\":\"Collectif\"},\"individual_insulation_work\":{\"title\":\"Travaux de rénovation\",\"question\":\"Quels travaux de rénovation avez-vous réalisés ces 10 dernières années ?\",\"none\":\"Aucun\",\"roof_insulation\":\"Isolation toiture\",\"window_replacement\":\"Remplacement fenêtres\",\"wall_insulation\":\"Isolation des murs\",\"window_replacement_and_wall_insulation\":\"Remplacement fenêtres et isolation des murs\",\"window_replacement_and_roof_insulation\":\"Remplacement fenêtres et isolation toiture\",\"roof_and_wall_insulation\":\"Isolation toiture et murs\",\"window_replacement_and_roof_and_wall_insulation\":\"Remplacement fenêtre et isolation des murs et isolation toiture\",\"built_after_1998\":\"construit après 1998\"},\"facilities_installation\":{\"title\":\"Équipement\"},\"ventilation\":{\"title\":\"Ventilation double flux\",\"question\":\"Êtes-vous équipé d'une ventilation double flux ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une ventilation double flux\"},\"heater_replacement\":{\"title\":\"Pompe à chaleur ou poêle à bois\",\"question\":\"Au cours de ces 10 dernières années, avez-vous remplacé votre chaudière ou vous êtes-vous équipé d'une pompe à chaleur ou d'un poêle à bois ?\",\"yes\":\"Oui\",\"no\":\"Non\",\"unknown\":\"Je ne sais pas\",\"text\":\"Équipé d'une pompe à chaleur ou poêle à bois\"},\"cold_water\":{\"title\":\"Eau\",\"question\":\"Votre eau est-elle comprise dans vos charges collectives ?\",\"individual\":\"Non\",\"collective\":\"Oui\",\"individual_text\":\"Individuelle\",\"collective_text\":\"Collective\"},\"hot_water\":{\"title\":\"Eau chaude\",\"question\":\"Quel est votre type de production d’eau chaude ?\",\"individual\":\"Individuelle\",\"collective\":\"Collective\"},\"hot_water_equipment\":{\"title\":\"Eau chaude\",\"question\":\"Utilisez-vous l’un de ces équipements pour produire votre eau chaude ?\",\"solar\":\"Chauffe-eau solaire\",\"thermodynamic\":\"Chauffe-eau thermodynamique\",\"other\":\"Aucun des deux\"},\"warming_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"3\":\"Bois\",\"4\":\"Fioul\",\"title\":\"Source chauffage\",\"question\":\"Quelle source d’énergie principale utilisez-vous pour vous chauffer ?\",\"no_fluid_text\":\"Produit ni par de l'électricité, ni par du gaz, ni par du bois ou du fuel\",\"0_text\":\"Produit grâce à de l'électricité\",\"2_text\":\"Produit grâce au gaz\",\"3_text\":\"Produit grâce au bois\",\"4_text\":\"Produit grâce au fioul\"},\"hot_water_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source eau chaude\",\"question\":\"Avec quelle source d’énergie votre eau chaude est-elle produite ?\",\"no_fluid_text\":\"Produite ni par de l'électricité, ni par du gaz\",\"0_text\":\"Produite grâce à de l'électricité\",\"2_text\":\"Produite grâce au gaz\"},\"cooking_fluid\":{\"0\":\"Électricité\",\"2\":\"Gaz\",\"title\":\"Source cuisson\",\"question\":\"Quel mode de cuisson principal utilisez-vous ?\"},\"update_date\":{\"title\":\"Date de prise d'effet\",\"question\":\"A partir de quelle date souhaitez-vous que ce nouveau profil soit pris en compte dans l'analyse de vos données ?\"},\"fluidType\":{\"0\":\"Électricité\",\"1\":\"Eau\",\"2\":\"Gaz\"},\"form\":{\"button_previous\":\"Précédent\",\"button_next\":\"Suivant\",\"button_end\":\"Terminer\"},\"finished\":{\"title\":\"Terminé !\",\"label1\":\"Grâce à ces informations, vous pourrez comparer votre consommation avec celle d'un foyer vous ressemblant davantage !\",\"label2\":\"Nous pourrons aussi vous proposer des astuces pour maîtriser vos consommations adaptées à votre profil.\",\"button_validate\":\"OK\"},\"accessibility\":{\"button_end\":\"Terminer la mise à jour du profil\",\"button_next\":\"Aller à la section suivante\",\"button_previous\":\"Retour à la section précédente\",\"button_update_profile\":\"Ouvrir la page de mise à jour du profil\",\"button_toggle_detail_profile\":\"Afficher ou masquer le détail du profil\",\"button_toggle_export\":\"Afficher ou masquer l'export des données'\",\"button_toggle_average_home\":\"Afficher ou masquer les informations sur le comparatif'\",\"button_validate\":\"Valider\"}},\"export\":{\"title_export\":\"Télécharger mes données\",\"text1\":\"Vous allez télécharger l'historique mensuel de vos fluides sélectionnés\",\"fluid_select\":\"Pour quel(s) fluide(s) souhaitez vous exporter vos données ?\",\"no_data\":\"Vous n'avez aucune donnée de fluide...\",\"button_download\":\"Télécharger\",\"month\":\"Mois\",\"year\":\"Année\",\"consumption\":\"Consommation\",\"button_close\":\"Fermer la fenêtre\",\"modal_start\":{\"accessibility_title\":\"Commencer le téléchargement\",\"text1\":\"Vous allez télécharger des données personnelles, Ecolyo n’est plus responsable de celles-ci une fois téléchargées\",\"text2\":\"Les données seront téléchargées sous forme de document excel (.xls)\",\"text3\":\"Lancer le téléchargement ?\",\"button_cancel\":\"Annuler\"},\"modal_loading\":{\"accessibility_title\":\"Téléchargement en cours\",\"text1\":\"Données en cours de téléchargement\",\"text2\":\"Veuillez ne pas quitter l’application pendant la récupération et le téléchargement de vos données\",\"button_cancel\":\"Annuler le téléchargement\"},\"modal_done\":{\"accessibility_title\":\"Téléchargement terminé\",\"text1\":\"Vos données ont bien été téléchargées !\",\"text2\":\"Vous pouvez maintenant retrouver l’historique de vos données sur votre appareil\",\"error1\":\"Aïe !\",\"error2\":\"Il semblerait qu’une erreur se soit produite lors du téléchargement de vos données.\",\"button_close\":\"Fermer\",\"button_close_error\":\"Revenir plus tard\"}},\"quiz\":{\"explanation\":\"Répondez correctement aux 5 questions et remportez 5 des 15 étoiles nécessaires pour débloquer le duel final\",\"score_final\":\"SCORE FINAL\",\"correct\":\"Bravo !\",\"wrong\":\"Raté !\",\"rightAnswer\":\"Bonne réponse :\",\"earn\":\"Vous remportez\",\"button_go_back\":\"Retour\",\"button_end_quiz\":\"Youpi !\",\"button_try_again\":\"Réessayer\",\"button_validate\":\"Valider\",\"next\":\"Suivant\",\"consumption_question\":\"Question sur votre consommation\",\"accessibility\":{\"window_title\":\"Fenêtre de résultat\",\"button_end_quiz\":\"Terminer le quiz\",\"button_go_back\":\"Retour\",\"button_go_next\":\"Suivant\",\"button_try_again\":\"Relancer le quiz\",\"button_validate\":\"Valider\"}},\"splashscreen\":{\"error_loading\":\"Une erreur est survenue\",\"button_reload\":\"Réessayer\",\"accessibility\":{\"button_reload\":\"Recharger la page\"},\"migration_error\":\"Mise à jour de l'application\",\"consent_error\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"profile_error\":\"Chargement de votre profil utilisateur\",\"profileType_error\":\"Chargement de votre profil de consommation.\",\"ecogesture_error\":\"Chargement des astuces de consommation\",\"challenges_error\":\"Actualisation de votre progression dans les défis\",\"analysis_error\":\"Chargement de votre analyse mensuelle\",\"index_error\":\"Chargement des index\",\"prices_error\":\"Mise à jour des prix\",\"consos_error\":\"Connexion à vos données de consommation\",\"partners_error\":\"Récupération de l'état des services partenaires\",\"unknown_error\":\"Veuillez vérifier votre connexion internet\",\"network_error\":\"Erreur de réseau\",\"step\":{\"0\":\"Mise à jour de l'application\",\"1\":\"Vérification de vos consentements pour partager vos données avec Ecolyo\",\"2\":\"Chargement de votre profil\",\"3\":\"Chargement des astuces de consommations\",\"4\":\"Actualisation de votre progression dans les défis\",\"5\":\"Mise à jour des prix\",\"6\":\"Connexion à vos données de consommation\"}},\"timestep\":{\"today\":\"Aujourd'hui\",\"year\":{\"period\":\"5 ans\",\"comparelabel\":\"Comparer à l'année précédente\"},\"month\":{\"period\":\"Année\",\"comparelabel\":\"Comparer à l'année précédente\"},\"day\":{\"period\":\"Mois\",\"comparelabel\":\"Comparer au mois précédent\"},\"week\":{\"period\":\"Semaine\",\"comparelabel\":\"Comparer à la semaine précédente\"},\"half_an_hour\":{\"period\":\"Jour\",\"comparelabel\":\"Comparer à la journée précédente\",\"gather_data_title\":\"La récupération de vos données demi-horaires prend environ 24h.\",\"gather_data_subtitle\":\"Votre connexion a bien été prise en compte mais un délai de 24h est en général nécessaire à l’obtention de vos données.\\nÀ demain !\",\"analysis_waiting_data\":\"Pour bénéficier d'une analyse approfondie de votre consommation électrique, il nous faut récupérer vos données de consommation horaires. La récupération de ces données prend environ 24h. A bientôt !\"},\"accessibility\":{\"button_zoom_in\":\"Sélectionner le pas de temps précédent\",\"button_zoom_out\":\"Sélectionner le pas de temps suivant\"}},\"unsubscribe\":{\"title\":\"Êtes-vous sûr de ne plus vouloir recevoir notre email mensuel ?\",\"content\":\"Dans ce cas, vous ne recevrez plus la notification de votre bilan ainsi que les conseils associés au mois en cours.\",\"button_text\":\"Oui, je me désabonne\",\"button_accessibility\":\"Bouton de désinscription\"},\"welcome_modal\":{\"title\":\"Félicitations\",\"perso\":\"Votre espace personnel a bien été créé.\",\"connect\":\"Vous pouvez maintenant connecter vos compteurs d’énergie à Ecolyo en toute sécurité.\",\"button_valid\":\"Ok\",\"accessibility\":{\"title\":\"Fenêtre de félicitations\",\"button_valid\":\"Valider\"}}}"); /***/ }), @@ -8957,110 +8943,151 @@ var ConsumptionDataManager = /*#__PURE__*/function () { return result; } }, { - key: "fetchAllFirstDateData", + key: "getExportableFluids", value: function () { - var _fetchAllFirstDateData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(fluidTypes, timeStep) { - var firstDay, firstDays, _iterator3, _step3, fluidType; + var _getExportableFluids = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(fluidTypes, timeStep) { + var exportableFluids, _iterator3, _step3, fluidType; return _regenerator.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: - firstDay = null; - firstDays = []; + exportableFluids = []; + _iterator3 = _createForOfIteratorHelper(fluidTypes); + _context6.prev = 2; - if (!(fluidTypes.length === 1)) { + _iterator3.s(); + + case 4: + if ((_step3 = _iterator3.n()).done) { _context6.next = 12; break; } - _context6.next = 5; - return this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep); - - case 5: - _context6.t0 = _context6.sent; + fluidType = _step3.value; + _context6.next = 8; + return this.checkDoctypeEntries(fluidType, timeStep); - if (_context6.t0) { - _context6.next = 8; + case 8: + if (!_context6.sent) { + _context6.next = 10; break; } - _context6.t0 = null; + exportableFluids.push(fluidType); - case 8: - firstDay = _context6.t0; - firstDays.push(firstDay); - _context6.next = 35; + case 10: + _context6.next = 4; break; case 12: - if (!(fluidTypes.length > 1)) { - _context6.next = 35; - break; - } + _context6.next = 17; + break; - _iterator3 = _createForOfIteratorHelper(fluidTypes); + case 14: _context6.prev = 14; + _context6.t0 = _context6["catch"](2); - _iterator3.s(); + _iterator3.e(_context6.t0); - case 16: - if ((_step3 = _iterator3.n()).done) { - _context6.next = 27; + case 17: + _context6.prev = 17; + + _iterator3.f(); + + return _context6.finish(17); + + case 20: + return _context6.abrupt("return", exportableFluids); + + case 21: + case "end": + return _context6.stop(); + } + } + }, _callee6, this, [[2, 14, 17, 20]]); + })); + + function getExportableFluids(_x23, _x24) { + return _getExportableFluids.apply(this, arguments); + } + + return getExportableFluids; + }() + }, { + key: "fetchAllFirstDateData", + value: function () { + var _fetchAllFirstDateData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(fluidTypes, timeStep) { + var firstDay, firstDays, _iterator4, _step4, fluidType; + + return _regenerator.default.wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + firstDay = null; + firstDays = []; + _iterator4 = _createForOfIteratorHelper(fluidTypes); + _context7.prev = 3; + + _iterator4.s(); + + case 5: + if ((_step4 = _iterator4.n()).done) { + _context7.next = 16; break; } - fluidType = _step3.value; - _context6.next = 20; + fluidType = _step4.value; + _context7.next = 9; return this._queryRunnerService.getFirstDateData(fluidType, timeStep); - case 20: - _context6.t1 = _context6.sent; + case 9: + _context7.t0 = _context7.sent; - if (_context6.t1) { - _context6.next = 23; + if (_context7.t0) { + _context7.next = 12; break; } - _context6.t1 = null; + _context7.t0 = null; - case 23: - firstDay = _context6.t1; + case 12: + firstDay = _context7.t0; firstDays.push(firstDay); - case 25: - _context6.next = 16; + case 14: + _context7.next = 5; break; - case 27: - _context6.next = 32; + case 16: + _context7.next = 21; break; - case 29: - _context6.prev = 29; - _context6.t2 = _context6["catch"](14); + case 18: + _context7.prev = 18; + _context7.t1 = _context7["catch"](3); - _iterator3.e(_context6.t2); + _iterator4.e(_context7.t1); - case 32: - _context6.prev = 32; + case 21: + _context7.prev = 21; - _iterator3.f(); + _iterator4.f(); - return _context6.finish(32); + return _context7.finish(21); - case 35: - return _context6.abrupt("return", firstDays); + case 24: + return _context7.abrupt("return", firstDays); - case 36: + case 25: case "end": - return _context6.stop(); + return _context7.stop(); } } - }, _callee6, this, [[14, 29, 32, 35]]); + }, _callee7, this, [[3, 18, 21, 24]]); })); - function fetchAllFirstDateData(_x23, _x24) { + function fetchAllFirstDateData(_x25, _x26) { return _fetchAllFirstDateData.apply(this, arguments); } @@ -9069,108 +9096,108 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "fetchAllLastDateData", value: function () { - var _fetchAllLastDateData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(fluidTypes, timeStep) { - var lastDay, lastDays, _iterator4, _step4, fluidType; + var _fetchAllLastDateData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(fluidTypes, timeStep) { + var lastDay, lastDays, _iterator5, _step5, fluidType; - return _regenerator.default.wrap(function _callee7$(_context7) { + return _regenerator.default.wrap(function _callee8$(_context8) { while (1) { - switch (_context7.prev = _context7.next) { + switch (_context8.prev = _context8.next) { case 0: lastDay = null; lastDays = []; if (!(fluidTypes.length === 1)) { - _context7.next = 12; + _context8.next = 12; break; } - _context7.next = 5; + _context8.next = 5; return this._queryRunnerService.getLastDateData(fluidTypes[0], timeStep); case 5: - _context7.t0 = _context7.sent; + _context8.t0 = _context8.sent; - if (_context7.t0) { - _context7.next = 8; + if (_context8.t0) { + _context8.next = 8; break; } - _context7.t0 = null; + _context8.t0 = null; case 8: - lastDay = _context7.t0; + lastDay = _context8.t0; lastDays.push(lastDay); - _context7.next = 35; + _context8.next = 35; break; case 12: if (!(fluidTypes.length > 1)) { - _context7.next = 35; + _context8.next = 35; break; } - _iterator4 = _createForOfIteratorHelper(fluidTypes); - _context7.prev = 14; + _iterator5 = _createForOfIteratorHelper(fluidTypes); + _context8.prev = 14; - _iterator4.s(); + _iterator5.s(); case 16: - if ((_step4 = _iterator4.n()).done) { - _context7.next = 27; + if ((_step5 = _iterator5.n()).done) { + _context8.next = 27; break; } - fluidType = _step4.value; - _context7.next = 20; + fluidType = _step5.value; + _context8.next = 20; return this._queryRunnerService.getLastDateData(fluidType, timeStep); case 20: - _context7.t1 = _context7.sent; + _context8.t1 = _context8.sent; - if (_context7.t1) { - _context7.next = 23; + if (_context8.t1) { + _context8.next = 23; break; } - _context7.t1 = null; + _context8.t1 = null; case 23: - lastDay = _context7.t1; + lastDay = _context8.t1; lastDays.push(lastDay); case 25: - _context7.next = 16; + _context8.next = 16; break; case 27: - _context7.next = 32; + _context8.next = 32; break; case 29: - _context7.prev = 29; - _context7.t2 = _context7["catch"](14); + _context8.prev = 29; + _context8.t2 = _context8["catch"](14); - _iterator4.e(_context7.t2); + _iterator5.e(_context8.t2); case 32: - _context7.prev = 32; + _context8.prev = 32; - _iterator4.f(); + _iterator5.f(); - return _context7.finish(32); + return _context8.finish(32); case 35: - return _context7.abrupt("return", lastDays); + return _context8.abrupt("return", lastDays); case 36: case "end": - return _context7.stop(); + return _context8.stop(); } } - }, _callee7, this, [[14, 29, 32, 35]]); + }, _callee8, this, [[14, 29, 32, 35]]); })); - function fetchAllLastDateData(_x25, _x26) { + function fetchAllLastDateData(_x27, _x28) { return _fetchAllLastDateData.apply(this, arguments); } @@ -9179,37 +9206,37 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "checkDoctypeEntries", value: function () { - var _checkDoctypeEntries = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(fluideType, timeStep) { + var _checkDoctypeEntries = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(fluideType, timeStep) { var queryResult; - return _regenerator.default.wrap(function _callee8$(_context8) { + return _regenerator.default.wrap(function _callee9$(_context9) { while (1) { - switch (_context8.prev = _context8.next) { + switch (_context9.prev = _context9.next) { case 0: - _context8.next = 2; + _context9.next = 2; return this._queryRunnerService.getEntries(fluideType, timeStep); case 2: - queryResult = _context8.sent; + queryResult = _context9.sent; if (!((queryResult === null || queryResult === void 0 ? void 0 : queryResult.data.length) > 0)) { - _context8.next = 5; + _context9.next = 5; break; } - return _context8.abrupt("return", true); + return _context9.abrupt("return", true); case 5: - return _context8.abrupt("return", false); + return _context9.abrupt("return", false); case 6: case "end": - return _context8.stop(); + return _context9.stop(); } } - }, _callee8, this); + }, _callee9, this); })); - function checkDoctypeEntries(_x27, _x28) { + function checkDoctypeEntries(_x29, _x30) { return _checkDoctypeEntries.apply(this, arguments); } @@ -9242,12 +9269,12 @@ var ConsumptionDataManager = /*#__PURE__*/function () { var convertedValueDetail = []; var comparisonConvertedValueDetail = []; - var _iterator5 = _createForOfIteratorHelper(singleFluidCharts), - _step5; + var _iterator6 = _createForOfIteratorHelper(singleFluidCharts), + _step6; try { - for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { - var singleFluidChart = _step5.value; + for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { + var singleFluidChart = _step6.value; if (!singleFluidChart.chartData) break; if (!singleFluidChart.chartData.actualData[i]) break; var value = singleFluidChart.chartData.actualData[i].value; @@ -9277,9 +9304,9 @@ var ConsumptionDataManager = /*#__PURE__*/function () { } } } catch (err) { - _iterator5.e(err); + _iterator6.e(err); } finally { - _iterator5.f(); + _iterator6.f(); } if (singleFluidCharts.length === noDataCount) agreggatedConvertedValue = -1; @@ -9327,11 +9354,11 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "getLastHourData", value: function () { - var _getLastHourData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee9(client, month) { + var _getLastHourData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(client, month) { var query, data; - return _regenerator.default.wrap(function _callee9$(_context9) { + return _regenerator.default.wrap(function _callee10$(_context10) { while (1) { - switch (_context9.prev = _context9.next) { + switch (_context10.prev = _context10.next) { case 0: query = (0, _cozyClient.Q)(_doctypes.ENEDIS_MINUTE_DOCTYPE).where({ month: { @@ -9344,22 +9371,22 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { day: 'desc' }]).limitBy(1); - _context9.next = 3; + _context10.next = 3; return client.query(query); case 3: - data = _context9.sent; - return _context9.abrupt("return", data.data); + data = _context10.sent; + return _context10.abrupt("return", data.data); case 5: case "end": - return _context9.stop(); + return _context10.stop(); } } - }, _callee9); + }, _callee10); })); - function getLastHourData(_x29, _x30) { + function getLastHourData(_x31, _x32) { return _getLastHourData.apply(this, arguments); } @@ -9374,33 +9401,33 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "getFirsDataDateFromDoctype", value: function () { - var _getFirsDataDateFromDoctype = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10(doctype) { + var _getFirsDataDateFromDoctype = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(doctype) { var query, data; - return _regenerator.default.wrap(function _callee10$(_context10) { + return _regenerator.default.wrap(function _callee11$(_context11) { while (1) { - switch (_context10.prev = _context10.next) { + switch (_context11.prev = _context11.next) { case 0: query = (0, _cozyClient.Q)(doctype).where({}).sortBy([{ year: 'asc' }, { month: 'asc' }]).limitBy(1); - _context10.next = 3; + _context11.next = 3; return this._client.query(query); case 3: - data = _context10.sent; - return _context10.abrupt("return", data.data); + data = _context11.sent; + return _context11.abrupt("return", data.data); case 5: case "end": - return _context10.stop(); + return _context11.stop(); } } - }, _callee10, this); + }, _callee11, this); })); - function getFirsDataDateFromDoctype(_x31) { + function getFirsDataDateFromDoctype(_x33) { return _getFirsDataDateFromDoctype.apply(this, arguments); } @@ -9409,11 +9436,11 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "getFirstDataDateFromDoctypeWithPrice", value: function () { - var _getFirstDataDateFromDoctypeWithPrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee11(doctype) { + var _getFirstDataDateFromDoctypeWithPrice = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(doctype) { var query, data; - return _regenerator.default.wrap(function _callee11$(_context11) { + return _regenerator.default.wrap(function _callee12$(_context12) { while (1) { - switch (_context11.prev = _context11.next) { + switch (_context12.prev = _context12.next) { case 0: query = (0, _cozyClient.Q)(doctype).where({ price: { @@ -9428,22 +9455,22 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { month: 'asc' }]).limitBy(1); - _context11.next = 3; + _context12.next = 3; return this._client.query(query); case 3: - data = _context11.sent; - return _context11.abrupt("return", data.data[0]); + data = _context12.sent; + return _context12.abrupt("return", data.data[0]); case 5: case "end": - return _context11.stop(); + return _context12.stop(); } } - }, _callee11, this); + }, _callee12, this); })); - function getFirstDataDateFromDoctypeWithPrice(_x32) { + function getFirstDataDateFromDoctypeWithPrice(_x34) { return _getFirstDataDateFromDoctypeWithPrice.apply(this, arguments); } @@ -9458,30 +9485,30 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "saveDoc", value: function () { - var _saveDoc = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee12(consumptionDoc) { + var _saveDoc = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(consumptionDoc) { var _yield$this$_client$s, savedDoc; - return _regenerator.default.wrap(function _callee12$(_context12) { + return _regenerator.default.wrap(function _callee13$(_context13) { while (1) { - switch (_context12.prev = _context12.next) { + switch (_context13.prev = _context13.next) { case 0: - _context12.next = 2; + _context13.next = 2; return this._client.save(consumptionDoc); case 2: - _yield$this$_client$s = _context12.sent; + _yield$this$_client$s = _context13.sent; savedDoc = _yield$this$_client$s.data; - return _context12.abrupt("return", savedDoc); + return _context13.abrupt("return", savedDoc); case 5: case "end": - return _context12.stop(); + return _context13.stop(); } } - }, _callee12, this); + }, _callee13, this); })); - function saveDoc(_x33) { + function saveDoc(_x35) { return _saveDoc.apply(this, arguments); } @@ -9496,30 +9523,30 @@ var ConsumptionDataManager = /*#__PURE__*/function () { }, { key: "saveDocs", value: function () { - var _saveDocs = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee13(consumptionDocs) { + var _saveDocs = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(consumptionDocs) { var _yield$this$_client$s2, savedDocs; - return _regenerator.default.wrap(function _callee13$(_context13) { + return _regenerator.default.wrap(function _callee14$(_context14) { while (1) { - switch (_context13.prev = _context13.next) { + switch (_context14.prev = _context14.next) { case 0: - _context13.next = 2; + _context14.next = 2; return this._client.saveAll(consumptionDocs); case 2: - _yield$this$_client$s2 = _context13.sent; + _yield$this$_client$s2 = _context14.sent; savedDocs = _yield$this$_client$s2.data; - return _context13.abrupt("return", savedDocs); + return _context14.abrupt("return", savedDocs); case 5: case "end": - return _context13.stop(); + return _context14.stop(); } } - }, _callee13, this); + }, _callee14, this); })); - function saveDocs(_x34) { + function saveDocs(_x36) { return _saveDocs.apply(this, arguments); } @@ -13715,10 +13742,10 @@ var _extends2 = _interopRequireDefault(__webpack_require__("pVnL")); var _objectWithoutProperties2 = _interopRequireDefault(__webpack_require__("QILm")); -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + var _excluded = ["icon", "ariaHidden", "size"]; var StyledIcon = function StyledIcon(_ref) { @@ -13728,11 +13755,11 @@ var StyledIcon = function StyledIcon(_ref) { _ref$size = _ref.size, size = _ref$size === void 0 ? 16 : _ref$size, props = (0, _objectWithoutProperties2.default)(_ref, _excluded); - return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Icon.default, (0, _extends2.default)({ + return /*#__PURE__*/_react.default.createElement(_Icon.default, (0, _extends2.default)({ "aria-hidden": ariaHidden, icon: icon, size: size - }, props))); + }, props)); }; var _default = StyledIcon; @@ -13822,7 +13849,7 @@ if(false) {} exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.cardContent {\n background: transparent;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.cardContent.onGoing {\n border: 1px solid #e0e0e0;\n background: inherit !important;\n}\n.cardContent.onGoing .challengeTitle {\n margin-top: 0;\n}\n\n.titleBlock {\n position: absolute;\n left: 0;\n right: 0;\n margin: auto;\n top: -1.5rem;\n background: #121212;\n width: fit-content;\n padding: 0 1rem;\n max-width: 235px;\n}\n\n.smallCard {\n display: flex;\n align-items: center;\n border: none;\n width: 100%;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n height: 24%;\n max-height: 90px;\n margin: 0.5rem 0;\n padding: 8%;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #e0e0e0;\n box-sizing: border-box;\n font-family: Lato, sans-serif;\n transition: all 300ms ease;\n}\n@media all and (max-height: 800px) {\n .smallCard {\n max-height: 85px;\n padding: 6%;\n }\n}\n@media all and (max-height: 730px) {\n .smallCard {\n max-height: 70px;\n padding: 3%;\n }\n}\n.smallCard.finished {\n border: 1px solid #7b7b7b;\n background: #1b1c22;\n}\n.smallCard.finished > * {\n color: #7b7b7b;\n}\n.smallCard:hover {\n cursor: pointer;\n}\n.smallCard .content {\n display: flex;\n flex-direction: column;\n align-self: center;\n justify-content: space-between;\n align-items: flex-start;\n}\n.smallCard .content span {\n margin-bottom: 0.3em;\n}\n.smallCard .spinner-container {\n height: 3.75rem;\n width: 3.75rem;\n margin: auto;\n}\n.smallCard .cardIcon {\n margin-right: 1rem;\n}\n.smallCard span {\n font-size: 1.1rem;\n font-weight: 700;\n display: block;\n margin-bottom: 0.6rem;\n}\n@media all and (max-height: 700px) {\n .smallCard span {\n margin-bottom: 0.1rem;\n font-size: 1rem;\n }\n}\n.smallCard .challengeminIcon {\n filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.55));\n}\n.smallCard .duelLocked {\n margin-left: auto;\n}\n.smallCard .starCount {\n display: flex;\n align-items: center;\n margin: 0;\n}\n.smallCard .starCount span {\n margin: 0;\n}\n.smallCard .starCount .blueNumber {\n font-weight: 900;\n color: #61f0f2;\n margin: 0 0.3rem 0 0.7rem;\n}\n.smallCard .finalDuel {\n display: flex;\n flex-direction: column;\n}\n.smallCard .finalDuel .starCount span {\n font-size: 1rem;\n font-weight: 500;\n}\n.smallCard .finalDuel .starCount .blueNumber {\n margin-left: 0;\n}\n.smallCard .finalDuel.result span {\n margin-bottom: 0.2rem;\n font-weight: 600;\n font-size: 1rem;\n}\n\n.duelCard {\n background: #181819;\n border: solid 1px rgba(97, 240, 242, 0.5);\n align-items: center;\n justify-content: space-between;\n position: relative;\n}\n.duelCard.active {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n}\n\n.explorationCard,\n.actionCard {\n position: relative;\n}\n\n.goDuel {\n align-items: center;\n justify-content: space-between;\n height: auto;\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n color: #121212;\n font-weight: 700;\n font-family: Lato, sans-serif;\n}\n\n.notifChallenge {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n right: 4px;\n top: 4px;\n width: 1.25rem;\n height: 1.25rem;\n color: #25262b;\n border-radius: 50%;\n border: 1px solid #25262b;\n z-index: 1;\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n font-size: 12px;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.cardContent {\n background: transparent;\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 1rem;\n}\n.cardContent.onGoing {\n border: 1px solid #e0e0e0;\n background: inherit !important;\n}\n.cardContent.onGoing .challengeTitle {\n margin-top: 0;\n}\n\n.titleBlock {\n position: absolute;\n left: 0;\n right: 0;\n margin: auto;\n top: -1.5rem;\n background: #121212;\n width: fit-content;\n padding: 0 1rem;\n max-width: 235px;\n}\n\n.smallCard {\n display: flex;\n align-items: center;\n border: none;\n width: 100%;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n height: 24%;\n max-height: 90px;\n padding: 1rem;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #e0e0e0;\n box-sizing: border-box;\n font-family: Lato, sans-serif;\n transition: all 300ms ease;\n}\n@media all and (max-height: 800px) {\n .smallCard {\n max-height: 85px;\n padding: 6%;\n }\n}\n@media all and (max-height: 730px) {\n .smallCard {\n max-height: 70px;\n padding: 3%;\n }\n}\n.smallCard.finished {\n border: 1px solid #7b7b7b;\n background: #1b1c22;\n}\n.smallCard.finished > * {\n color: #7b7b7b;\n}\n.smallCard:hover {\n cursor: pointer;\n}\n.smallCard .content {\n display: flex;\n flex-direction: column;\n align-self: center;\n justify-content: space-between;\n align-items: flex-start;\n}\n.smallCard .content span {\n margin-bottom: 0.3em;\n}\n.smallCard .spinner-container {\n height: 3.75rem;\n width: 3.75rem;\n margin: auto;\n}\n.smallCard .cardIcon {\n margin-right: 1rem;\n}\n.smallCard span {\n font-size: 1.1rem;\n font-weight: 700;\n display: block;\n margin-bottom: 0.6rem;\n}\n@media all and (max-height: 700px) {\n .smallCard span {\n margin-bottom: 0.1rem;\n font-size: 1rem;\n }\n}\n.smallCard .challengeminIcon {\n filter: drop-shadow(0px 2px 2px rgba(0, 0, 0, 0.55));\n}\n.smallCard .duelLocked {\n margin-left: auto;\n}\n.smallCard .starCount {\n display: flex;\n align-items: center;\n margin: 0;\n}\n.smallCard .starCount span {\n margin: 0;\n}\n.smallCard .starCount .blueNumber {\n font-weight: 900;\n color: #61f0f2;\n margin: 0 0.3rem 0 0.7rem;\n}\n.smallCard .finalDuel {\n display: flex;\n flex-direction: column;\n}\n.smallCard .finalDuel .starCount span {\n font-size: 1rem;\n font-weight: 500;\n}\n.smallCard .finalDuel .starCount .blueNumber {\n margin-left: 0;\n}\n.smallCard .finalDuel.result span {\n margin-bottom: 0.2rem;\n font-weight: 600;\n font-size: 1rem;\n}\n\n.duelCard {\n background: #181819;\n border: solid 1px rgba(97, 240, 242, 0.5);\n align-items: center;\n justify-content: space-between;\n position: relative;\n}\n.duelCard.active {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n}\n\n.explorationCard,\n.actionCard {\n position: relative;\n}\n\n.goDuel {\n align-items: center;\n justify-content: space-between;\n height: auto;\n background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);\n color: #121212;\n font-weight: 700;\n font-family: Lato, sans-serif;\n}\n\n.notifChallenge {\n position: absolute;\n display: flex;\n justify-content: center;\n align-items: center;\n right: 4px;\n top: 4px;\n width: 1.25rem;\n height: 1.25rem;\n color: #25262b;\n border-radius: 50%;\n border: 1px solid #25262b;\n z-index: 1;\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n font-size: 12px;\n}", ""]); @@ -15769,7 +15796,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.splash-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n.splash-content .splash-loader {\n width: 100%;\n margin-top: 20vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.splash-content .splash-loader span {\n color: #ffffff;\n font-size: 3rem;\n margin: 0;\n letter-spacing: -0.02em;\n font-weight: 400;\n}\n.splash-content .splash-logos-container {\n margin-top: auto;\n margin-bottom: 1rem;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n.splash-content .step-label {\n margin: 1rem 0;\n max-width: 350px;\n color: white;\n text-align: center;\n height: 40px;\n}\n.splash-content .splash-error-text {\n text-align: center;\n color: #d25959;\n margin: 0.5rem;\n}\n\n.splash-footer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n height: 10rem;\n}\n.splash-footer button.btn-highlight {\n max-width: 230px;\n width: 100%;\n margin: 0.5rem 0 0;\n height: 40px;\n}\n\n.splash-progress {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n width: 100%;\n margin: 1rem auto;\n padding: 1rem;\n transition: all 300ms ease;\n border-radius: 12px;\n box-sizing: border-box;\n max-width: 350px;\n}\n.splash-progress .splash-progress-bar-container {\n flex: 1;\n height: 12px;\n box-sizing: border-box;\n background-image: linear-gradient(45deg, #e3b82a 11.11%, #1b1c22 11.11%, #1b1c22 50%, #e3b82a 50%, #e3b82a 61.11%, #1b1c22 61.11%, #1b1c22 100%);\n background-size: 9px 9px;\n border: solid 1px #e3b82a;\n border-radius: 12px;\n}\n.splash-progress .splash-progress-bar-container .splash-progress-bar-content {\n height: 12px;\n box-sizing: border-box;\n background-color: #e3b82a;\n border: solid 1px #e3b82a;\n border-radius: 12px 4px 0 12px;\n border-right: none;\n transition: all 300ms ease;\n position: relative;\n overflow: hidden;\n top: -1px;\n left: -1px;\n}\n.splash-progress .splash-progress-bar-container .splash-progress-bar-content:after {\n content: \"\";\n position: absolute;\n display: block;\n transform: rotate(45deg);\n background-color: #1b1c22;\n width: 15px;\n height: 15px;\n right: -9px;\n top: -8px;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.splash-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n}\n.splash-content .splash-loader {\n width: 100%;\n margin-top: 20vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.splash-content .splash-loader .error {\n margin-bottom: 1rem;\n}\n.splash-content .splash-loader span {\n color: #ffffff;\n font-size: 3rem;\n margin: 0;\n letter-spacing: -0.02em;\n font-weight: 400;\n}\n.splash-content .splash-logos-container {\n margin-top: auto;\n margin-bottom: 1rem;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n}\n.splash-content .step-label {\n margin: 1rem 0;\n max-width: 350px;\n color: white;\n text-align: center;\n height: 40px;\n}\n.splash-content .splash-error-text {\n text-align: center;\n color: #d25959;\n margin: 0.5rem;\n}\n\n.splash-footer {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n height: 10rem;\n}\n.splash-footer button.btn-highlight {\n max-width: 230px;\n width: 100%;\n margin: 0.5rem 0 0;\n height: 40px;\n}\n\n.splash-progress {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n width: 100%;\n margin: 1rem auto;\n padding: 1rem;\n transition: all 300ms ease;\n border-radius: 12px;\n box-sizing: border-box;\n max-width: 350px;\n}\n.splash-progress .splash-progress-bar-container {\n flex: 1;\n height: 12px;\n box-sizing: border-box;\n background-image: linear-gradient(45deg, #e3b82a 11.11%, #1b1c22 11.11%, #1b1c22 50%, #e3b82a 50%, #e3b82a 61.11%, #1b1c22 61.11%, #1b1c22 100%);\n background-size: 9px 9px;\n border: solid 1px #e3b82a;\n border-radius: 12px;\n}\n.splash-progress .splash-progress-bar-container .splash-progress-bar-content {\n height: 12px;\n box-sizing: border-box;\n background-color: #e3b82a;\n border: solid 1px #e3b82a;\n border-radius: 12px 4px 0 12px;\n border-right: none;\n transition: all 300ms ease;\n position: relative;\n overflow: hidden;\n top: -1px;\n left: -1px;\n}\n.splash-progress .splash-progress-bar-container .splash-progress-bar-content:after {\n content: \"\";\n position: absolute;\n display: block;\n transform: rotate(45deg);\n background-color: #1b1c22;\n width: 15px;\n height: 15px;\n right: -9px;\n top: -8px;\n}", ""]); @@ -16894,7 +16921,17 @@ var QueryRunner = /*#__PURE__*/function () { key: "buildFirstDateQuery", value: function buildFirstDateQuery(fluidType, limit, timeStep) { var doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -16906,7 +16943,17 @@ var QueryRunner = /*#__PURE__*/function () { key: "buildLastDateQuery", value: function buildLastDateQuery(fluidType, limit, timeStep) { var doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -16960,11 +17007,21 @@ var QueryRunner = /*#__PURE__*/function () { }() }, { key: "filterDataList", - value: function filterDataList(data, timePeriod) { + value: function filterDataList(data, timePeriod, timeStep) { var _this = this; + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + var filteredResult = data.data.filter(function (entry) { - return _this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + return _this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod); }); @@ -16972,11 +17029,15 @@ var QueryRunner = /*#__PURE__*/function () { } }, { key: "mapDataList", - value: function mapDataList(data) { + value: function mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + var minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; var mappedResult = data.map(function (entry) { return { - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -17038,7 +17099,7 @@ var QueryRunner = /*#__PURE__*/function () { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -17186,8 +17247,8 @@ var QueryRunner = /*#__PURE__*/function () { break; } - filteredResult = this.filterDataList(result, timePeriod); - mappedResult = this.mapDataList(filteredResult); + filteredResult = this.filterDataList(result, timePeriod, timeStep); + mappedResult = this.mapDataList(filteredResult, timeStep); return _context2.abrupt("return", mappedResult); case 8: @@ -17276,8 +17337,8 @@ var QueryRunner = /*#__PURE__*/function () { break; } - filteredResult = this.filterDataList(result, maxTimePeriod); - mappedResult = this.mapDataList(filteredResult); + filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + mappedResult = this.mapDataList(filteredResult, timeStep); if (!withDate) { _context4.next = 16; @@ -17329,7 +17390,7 @@ var QueryRunner = /*#__PURE__*/function () { break; } - return _context5.abrupt("return", _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _context5.abrupt("return", _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true })); @@ -17373,7 +17434,7 @@ var QueryRunner = /*#__PURE__*/function () { break; } - return _context6.abrupt("return", _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _context6.abrupt("return", _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true })); @@ -17405,7 +17466,7 @@ var QueryRunner = /*#__PURE__*/function () { case 0: doctype = this.getRelevantDoctype(fluidType, timeStep); _context7.prev = 1; - query = (0, _cozyClient.Q)(doctype).where({}); + query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); _context7.next = 5; return this._client.query(query); @@ -18877,7 +18938,7 @@ var DateChartService = /*#__PURE__*/function () { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -21347,7 +21408,7 @@ var EnvironmentService = /*#__PURE__*/function () { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com'; } else { - return 'https://ecolyo-agent-rec.grandlyon.com'; + return 'https://ecolyo-agent-rec.apps.grandlyon.com'; } } }]); @@ -21895,14 +21956,14 @@ var _toConsumableArray2 = _interopRequireDefault(__webpack_require__("RIqP")); var _defineProperty2 = _interopRequireDefault(__webpack_require__("lSNA")); -var _global = __webpack_require__("c4IZ"); - -var _screen = __webpack_require__("41Xj"); - var _fluid = __webpack_require__("5Wkc"); var _fluidSlug = __webpack_require__("jFN3"); +var _screen = __webpack_require__("41Xj"); + +var _global = __webpack_require__("c4IZ"); + function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } @@ -21927,6 +21988,7 @@ var initialState = { fluidStatus: [{ fluidType: _fluid.FluidType.ELECTRICITY, status: _fluid.FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -21947,6 +22009,7 @@ var initialState = { }, { fluidType: _fluid.FluidType.WATER, status: _fluid.FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -21967,6 +22030,7 @@ var initialState = { }, { fluidType: _fluid.FluidType.GAS, status: _fluid.FluidState.KONNECTOR_NOT_FOUND, + maintenance: false, firstDataDate: null, lastDataDate: null, connection: { @@ -21989,7 +22053,8 @@ var initialState = { customPopupModal: { popupEnabled: false, title: '', - description: '' + description: '', + endDate: '' }, openPartnersIssueModal: false, shouldRefreshConsent: false, @@ -22734,32 +22799,32 @@ exports.default = void 0; var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); -var _react = _interopRequireDefault(__webpack_require__("q1tI")); - -var _cozyClient = __webpack_require__("SH7X"); - -var _I18n = __webpack_require__("buk/"); - -var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); - -var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); - -var _IconButton = _interopRequireDefault(__webpack_require__("o6Jd")); - var _Button = _interopRequireDefault(__webpack_require__("FtsS")); var _Dialog = _interopRequireDefault(__webpack_require__("HhgX")); +var _IconButton = _interopRequireDefault(__webpack_require__("o6Jd")); + var _close = _interopRequireDefault(__webpack_require__("aodS")); var _ecolyo = _interopRequireDefault(__webpack_require__("nyyM")); -__webpack_require__("K//6"); +var _StyledIcon = _interopRequireDefault(__webpack_require__("I07j")); var _useExploration3 = _interopRequireDefault(__webpack_require__("sU2c")); +var _cozyClient = __webpack_require__("SH7X"); + +var _I18n = __webpack_require__("buk/"); + +var _Icon = _interopRequireDefault(__webpack_require__("y6ex")); + var _userExploration = __webpack_require__("/rev"); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); + +__webpack_require__("K//6"); + var FeedbackModal = function FeedbackModal(_ref) { var open = _ref.open, handleCloseClick = _ref.handleCloseClick; @@ -23919,12 +23984,13 @@ function changeScreenType(screenType) { }; } -function showReleaseNotes(show, notes) { +function showReleaseNotes(show, notes, redirectLink) { return { type: SHOW_RELEASE_NOTES, payload: { show: show, - notes: notes + notes: notes, + redirectLink: redirectLink } }; } @@ -26735,7 +26801,8 @@ var Navbar = function Navbar() { return /*#__PURE__*/_react.default.createElement("aside", { className: "o-sidebar" }, /*#__PURE__*/_react.default.createElement("nav", { - role: "navigation" + role: "navigation", + "aria-label": "navigation" }, /*#__PURE__*/_react.default.createElement("ul", { className: "c-nav" }, /*#__PURE__*/_react.default.createElement("li", { @@ -26987,13 +27054,13 @@ exports.default = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__("lSNA")); -var _react = _interopRequireDefault(__webpack_require__("q1tI")); +var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); var _I18n = __webpack_require__("buk/"); -var _decoreText = __webpack_require__("j5h9"); +var _react = _interopRequireDefault(__webpack_require__("q1tI")); -var _classnames = _interopRequireDefault(__webpack_require__("TSYQ")); +var _decoreText = __webpack_require__("j5h9"); var StepConsent = function StepConsent(_ref) { var sgeState = _ref.sgeState, @@ -29816,7 +29883,7 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE exports = module.exports = __webpack_require__("JPst")(false); // Module -exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.cardContent.cardDone {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n padding: 5% !important;\n}\n.cardContent.cardDone .challengeName {\n margin: 0.5rem 0rem;\n text-align: center;\n}\n.cardContent.cardDone .iconResult {\n display: flex;\n margin: 1rem 0rem;\n}\n@media all and (max-height: 700px) {\n .cardContent.cardDone .iconResult {\n width: 55%;\n margin: auto;\n }\n}\n.cardContent.cardDone .imgResult {\n width: 100%;\n height: 100%;\n}\n.cardContent.cardDone .labelResult {\n font-weight: bold;\n font-size: 28px;\n line-height: 120%;\n text-transform: uppercase;\n margin-bottom: 0.5rem;\n}\n.cardContent.cardDone .win {\n color: #e3b82a;\n}\n.cardContent.cardDone .lost {\n color: #d25959;\n}\n.cardContent.cardDone .statsResult {\n text-align: center;\n}\n.cardContent.cardDone .review-btn {\n padding: 0.625rem;\n border: 1px solid #e0e0e0;\n}", ""]); +exports.push([module.i, "/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.cardContent.cardDone {\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n gap: 1rem;\n align-items: center;\n}\n.cardContent.cardDone .challengeName {\n text-align: center;\n}\n.cardContent.cardDone .iconResult {\n display: flex;\n}\n@media all and (max-height: 700px) {\n .cardContent.cardDone .iconResult {\n width: 55%;\n margin: auto;\n }\n}\n.cardContent.cardDone .imgResult {\n width: 100%;\n height: 100%;\n}\n.cardContent.cardDone .labelResult {\n font-weight: bold;\n font-size: 28px;\n line-height: 120%;\n text-transform: uppercase;\n margin-bottom: 0.5rem;\n}\n.cardContent.cardDone .win {\n color: #e3b82a;\n}\n.cardContent.cardDone .lost {\n color: #d25959;\n}\n.cardContent.cardDone .statsResult {\n text-align: center;\n}\n.cardContent.cardDone .review-btn {\n padding: 0.625rem;\n margin: 0;\n border: 1px solid #e0e0e0;\n}", ""]); @@ -31103,13 +31170,6 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE /***/ }), -/***/ "noA/": -/***/ (function(module) { - -module.exports = JSON.parse("{\"v\":\"5.5.7\",\"meta\":{\"g\":\"LottieFiles AE 0.1.20\",\"a\":\"\",\"k\":\"\",\"d\":\"\",\"tc\":\"\"},\"fr\":25,\"ip\":0,\"op\":13,\"w\":500,\"h\":500,\"nm\":\"splash illu\",\"ddd\":0,\"assets\":[{\"id\":\"image_0\",\"w\":250,\"h\":250,\"u\":\"\",\"p\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAIaElEQVR4Xu3VsZEdVRRF0fdJgBBQGkgGEAGEoBAgA8hAIUAEEIKskUsIkIEw5ehTJQuLUZWezpnXd8me+qd73d5wW/4RIHB5gdvl39ALEiCwhO4jIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ84slckIHTfAIEBAkIfcGSvSEDovgECAwSEPuDIXpGA0H0DBAYICH3Akb0iAaH7BggMEBD6gCN7RQJC9w0QGCAg9AFH9ooEhO4bIDBAQOgDjuwVCQjdN0BggIDQBxzZKxIQum+AwAABoQ848ud6xfub9e2H336/3t5erD8/147f/XQBoX+64ahfuL9Zz9Z9/bjWernW+vI/L//3WuvVerd+vX233o5COeBlhX7AkZ7SI94f1l9rra/+55l+uz3/8B8B/56QgNCf0DGe+qPcH9YPa63fH3nOf9a79cz/1Z/WNYX+tO7xpJ/m/rD+WGt9/xEP+dPt+Xr1EX/nT0ICQg9BX2Hm/rBer7W+efRd7uuX24v186N/5w9iAkKPUZ8/JPRzbyj0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JMLPU6+bVDo2yiv/0NCP/fGQj/3dvEnF3qcfNug0LdRXv+HhH7ujYV+7u3iTy70OPm2QaFvo7z+Dwn93BsL/dzbxZ9c6HHybYNC30Z5/R8S+rk3Fvq5t4s/udDj5NsGhb6N8vo/JPRzbyz0c28Xf3Khx8m3DQp9G+X1f0jo595Y6OfeLv7kQo+TbxsU+jbK6/+Q0M+9sdDPvV38yYUeJ982KPRtlNf/IaGfe2Ohn3u7+JPf36yX6/169ujwF+v17ev1+tG/8wcxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGegNB79pYJxASEHqM2RKAnIPSevWUCMQGhx6gNEegJCL1nb5lATEDoMWpDBHoCQu/ZWyYQExB6jNoQgZ6A0Hv2lgnEBIQeozZEoCcg9J69ZQIxAaHHqA0R6AkIvWdvmUBMQOgxakMEegJC79lbJhATEHqM2hCBnoDQe/aWCcQEhB6jNkSgJyD0nr1lAjEBoceoDRHoCQi9Z2+ZQExA6DFqQwR6AkLv2VsmEBMQeozaEIGewL9Mt+j7O/D7zgAAAABJRU5ErkJggg==\",\"e\":1},{\"id\":\"image_1\",\"w\":250,\"h\":250,\"u\":\"\",\"p\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6CAYAAACI7Fo9AAAWBUlEQVR4Xu2dDXBcxX3A/3f6tCR/q/gLYzlYNoYABkKoxyZ20jIkMAEnBZpCiuWQkJkydTRJmCFDZOQWpqnbtG4yaRnCxIY0CaTtYDeljUsZ2xNsTSBQuxmSgmss2RhbkWzpsCXbsu5eZ59ORBb33r3dW51W9343w0wb7f7f7u+/P+++fV8J4QcBCJQ8gUTJ95AOQgACgugMAgjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIzhiAQAwIIHoMkkwXIYDojAEIxIAAoscgyXQRAojOGIBADAggegySTBchgOiMAQjEgACixyDJdBECiM4YgEAMCCB6DJJMFyGA6IwBCMSAAKLHIMl0EQKIHrMxcOKH8vmZd8uTMet27LuL6DEZAt4eWSYJ2dx9QBp6D/udbmpskV0x6X7su4noJT4EvJ0yTSqlWRLyiOpq9wHp6D0sC/xue7K9PCNNC1ult8QxxL57iF7CQ8Brk9XiyVaRrNijRR/qe0oS0tr4ddlcwihi3zVEL8Eh4LVJg3i+uLeP7t4FM/qFf9wvIs0s50twQIgIopdQXkcv03N1LUT0oeKebB/MSPPSVmkvITSx7wqil8gQ8PZIqySkWUSmhnUpr+jZyp7IU+m0tCJ8aQwQRJ/gefTapEk8aR15Hm5D9OEYCD/BB0i2+Yg+AfPoL9GrpEmdU0cVfLibb+1PpjLdmdBZPxcShJ+AA2VEkxF9AuXP32TLSFOUJXqubu3eV9P/Z1tn1NzUcEruuDJl1nNPtqvr8WzameEbr1qIPl7kNY6bvUymZvC1GtXeK9qdKut/6In6mp++Uvve/7Zo5oD86YpuuXrOWZOQqk6HEr58ULZyHd4UYfHqIXrxWGsdKXuJbI3J8nz4QOfOJ859Z9u0qr/5p+mBx/74klOy7roemTV5UKt9IwurZX1SZNuiFtlmHISKY0oA0ccUr17w9+RO+BtsV+vVvrD01h1Tzm16ZkbVu33JSGHUUn7dh3q82spMIWMi5YlsQ/pIyItaqJCkFrWhpXow/x50kTWSlDWFyq0YPfezuoFNz8yoPNJVro2srjIjd1yVkjuvTBUqvDp2SjzZpcRPZ2QXl+m002G1AqJbxZk/WPZ8W8m9Ovuf9g54rqMUIvjoeJaFHw6/3xPZp+RH/PzjxHYJRLdNNBvPX4aLfyuqklr9p/7/VTYPd3YgMfCD/5pS+eTzU8VkBo/SFhvn8AHHUdv++0Rkl+dJeyIh7eVp2cfGXpSs6JdB9IjM/CV2UqaNKq4udymB1c3EQ2InZJqNJXhYs7p6y85+Z/u06h/vmixRz8EjdjOw2MqGPvnEktOyoqGv0FBR6u8eQir7PBl6sm7k/z0cwEtK7+KH/X8s+OUhgOghgLLL7J2ujKIXX6s5/6MXJ1eMvExW7LbNnjwoapa/ZcmpzEV1g9F2+orTyI9ybT8YNKKHiT50/7j/HPd4/d58u3Lghy9Orizm7B21r2qWX7mwXz6ysC9TU5EZV+k9T9Yt3uA/kssvBwFEd1D0Ybl3vFw7Zufetm1wQPqNjS3+Pf/8EF1vDGSfCBvzGb3/XGLwZ/9TU77jlRppe33ShJE7iOayuWdk2dyzcmNDn1w6c0APunlpRA9hx4w+DjO62kx77UB1dduvqn2xX2+vNB/ejtdUl+qU+IvqB+SauWcKueU2X08RHdHzjZHcf/f2+i9PLOiS2MF3Ks7839HKSUpmJfbbv6mY8DO2Gc3f1lL32S+qPydqY0/JP2/K+YH62nRh/9p5sr1xg6hbhvmxdNcbA2GiHzpWcborVVadyUh5qq/svVn5V+2VkupPIrQear+0+gegrirt/wOg/lO/xuz/lkzI4Lwp5wdn1KSrA0Lvbmzxb0Lih+h6YyBM9Ds3zvGX3fyKR6DpQz3SdF1P0AERnaW72WBEdDNuY1VLXb9/aHUXohsAZjMuBJq3V7ygPzOjG4y2AquoTb3NnzwWFCXV2PK+OxcLPGLpVEd0Q9GXP3BJ7DfViq1BHtGlsYW3GgflBNENRb/4rg8Ue5zH/niIbj4EED2AXfYFjIE7P4huPuhMa6qd+GfuHvpwXK4fM3owWUQPEn3oc0aBD7QguqmuhdXb9cW3wgLwYEsAHUQ3ED3Vl0xdsa7BygsjChv28auN6GY5R3QD0duPV3SsXD9/6Iuk/IpKANHNcCN6kOh7/dspn8v1Z0Q3G2w2av3zZzs662vTswJisXRn6a43zMKeXEN0PZY2S//gM0c65k09H7Sa4sEWRNcbbmGi73iltvO+v5oVNKvoHYjSWgSe+IOjvYvrz41+pddwDERHdK3xJGGib/mPqR0tW2Zyjq6H1EppRDfDyDl60Dl6yGukEN1ssNmo9djNnZ0rGvqCVlPM6MzoesMs7IEWRNdjabP0+hUnOj79wVTQaoon2BBdb7iFif7o92eeffwnU4Oei9Y7EKW1CNx3/clzf3xtb1VAJURHdK3xJDyiqserWKV5Jt2MNOfoQefoIa+R4hFVs8Fmoxaim1FE9CDR2/zvhOX8oimimw02G7XyPMHG0p2lu94w46UTeryKVZpHVc1IM6MHL915u4zZmBrTWohuhhfRDUS/fF1D0T5uaJbW0q2F6Ga5RXQD0XkW3Wyw2aiF6GYUER3RzUbOONVCdDPwiI7oZiNnnGrxOikz8IiO6GYjZxxrhb18gvfG5U4MoiP6OCprdmhE1+eG6IiuP2rGuQai6ycA0XMw89qkQTw5FISTXXf9gWazRpjo5WmZvrBVem0erxRiITqiT7hxHCb6YFoWLm2V9gnXqTFuMKKzdB/jIWY/PEt3faaIjuj6o2acayC6fgIQHdH1R80410B0/QQgOqLrj5pxrFFXmZF/Wxd8Cs519NzJQXREH0dt9Q/NLbD6zFQNREd0s5EzTrUQ3Qw8ohuIvvyBS+RIV7kZcWoVRADRzfAhuoHovErKbLDZqIXoZhQRPVj0XSKyKtefEd1ssNmo9fElp+Sh1V1BoXhnXAAZRDcQ/TN/PqfvpV9OqrUxcImhR4D3uuvxGi6N6Aai86UWs8FmoxZfajGjiOjBom8WkS/l+jOimw02G7U2f/JY97K5Z+oDYvHtNZbuesMs7Guqba/X/PrOjbOX6kWktA0CT//h4aOXTBuch+h6NJnRg2b0NmkST7bk+nP78YqOlevn89lkvbFmpfRPmtpTk6syU3MF8zxZt3iDbLVyoBILgujBoq8WT3bm+vNgOtHf8EcLa0psLEyI7oTd5y4iH21sEXW1hN8oAogeLDovn3BMl0UzB+TJO94ObBXPogcnDNFDBjOfZXLL9JUNffLozZ2BjeKBFkQ3GrFeyIcWW75Xf2TLT6fMNwpMJSMCf7L8ROddV6VmBVTmZpkQqszo4TP6NhG5PVeRf/957a/v/+Ysdt6NlDWrtOXOI50LZ5zPKbon8tTiFmkyi1z6tRA9TPQ90ioJeSRXkSNdZQeXP7Dg0tIfIu708IXPHzpbUeZVB7SIa+jM6GaD1WuTwJ13FZG3wZpxNamV7wst7LiHU2VGD5vRd8o0qZKeoCLc826irFmdWy87debBVV2TgmqzEYfoZiMrWytsQ+77L0x542vfrV9S0AGoHInAX9xy/Mjy+f1Bm5/7G1tkWaRAMS3EjJ4n8d5e/06rtbmKnTxVduSq+xaw814EeV74wqEzFUkv54yeEPm7RS3SXIRmTNhDIHp+0deIyHNBxS5f1yDv9iUn7ACYCA3P97KJhMinFrWIukLCL4AAoucTPc95OtfTx96tB1d1dd962amgJ9aE8/P8OUD0/Iwk7Dydy2wRABZY5Pl17T21lZnpOcN4sr1xg6hVF78QAogeYXh4e/3zv78NKsrLIiNANCyS77ZXnliLBhbRI3DK93VVdt8jQDQs8q3b3jl+1Zyzs4Oq8/XUaGARPRqn0OX72YFE56LPLgy6BzviESg2mkDem2RYtkceNIgeEZUX8iIKFYJNuYggNYrleYhFfX2E3faIPBE9IihvaPddffQr59tNuKYeEWTEYuoba8+t7Qi8di4iHY0t0hAxXOyLIbrGEAi7eUaFueexOZ27909iCa/BNKjo/TecTN29rDfnP6rZOjzEosEZ0TVg5duUS/Un269oamCW0WCaq6iazbet7egvT3qBr+tiE04PMqLr8RJvr38HVs5n1FWojU/NfOO7z0/l/ndNriOLP3ZzZ+eKhr7AlRHPnuvDRXRNZvkeXU1n5PSV9zXUcVusJths8XzvhVPFeDecPltE12emZvXA77KpcP/5as2+z/3lbJ6mMmD743sOd19UNxh4uyuzuQFUvo9uBi3fuTobc2ZcI2zApcrT0rCwVXrNjhDfWszohrnPtwM/cD5xbNn9C+awhI8GOMqSXW2BNLZIa7SIlBpJANENx0O+6+oq7P6D1a/c+rW51xseIjbV1C77s/ccDn5wZYgE180LGBGIXgC8fA+7qNCP/ePM//6Hf516TQGHKfmq+e5nzwLgKywFjARELwCeqppvY06Vuf3heW++eqBqcYGHKsnq+W5zVZ3mDTKFpx7RC2SY3ZjbF3RrrAqf8eTUrQ/NS/zyUFVdgYcrqer5XviY7ez+8rSsZgOusNQjemH8/NreXv/FB4Gvm1Jl+gYSb374iwtmp/qSUywccsKHWPWBvv6NN3Xm/VCll5RrFj8s6h9SfgUQQPQC4I2smm8XHtl/S2tx/bnTj3/6qCQTErrC4aUSlgYn19HtgfRn9pBvtQ0fKe4ze2TJ+cSS1cHJjG4RZ5RLbnGe2dU5+Vc+0pXON5OrK5O8p93iwGRGtwvTn9X3yDJJ+LfIhj1i6Z+z3/XI3Mn7D1bNsd8K9yLedvmpE1++sWtmhJax+RYBkm4RZnRdYhHK53vwZTiE58m7a74+73ipX3rL97rmEUi5xTXC+DIpgugm1CLUyffqqZEh/vrZ6Xs2/8v0FRHCTqgi6o63TbccO3L5rHNRvmaT8pKymh32sUkxoo8NVz+qjuy/eKP6hTUtcz+cb8k/hs21Glptum2+7di5mopMlOU6klul//5giD7GgHVkV+ftn/jqxem3jlcsHeNmjWn4e6/teedz1/fMjXiQ/V5SmpjJI9IyLIbohuB0qkXdoPNXAZ68++1t036+6UczbtI5hgtl1VL97z/19tFLpg3Oi9geNt4igiq0GKIXSjBifR3ZVcjOnrI9v/fl+Zf09iWjnN9GbMXYFfvYpae7Hv5YV01Z0quNdBRPtpdnpIlbWyPRKrgQoheMMHoA/zp7tewST66OUmsizO7qIwubbnlHZxbnIZUoybdcBtEtA80XLntTzeagb67nqn+6v+zVe78xS17+3+rr8sUv5t/XrzjRseaK1MwIN8AMNyvledK8eIP/zXl+RSSA6EWEPfJQUZ5lH900tTPf9I3Zl433cl4t07+6qjsZcUd9uBtsuo3TWFOHRfRxhJ89b1evj14QtRlqOf/Mzrq2Bx+/6HeLfSnu2nln+r5yY3f3vKnnI7dX9Uu90LEiLc2cj0fNsv1yiG6fqVbE7FJevQftSzoVM54ceeL5Ka89+nT96rEWXl0Tf+T3f3NCV3ARSSVEmha1+O/C5zeOBBB9HOGPWsqrZ9rVubvWbDmWwivB1684efCDs89E2jy8ACW76o6MrKFmILpD6TCd3VUXbApvukTPouxIiDQzizs0sBDdrWQMt8Z/KEbN7hEvw43shRJ+20t1r274Xv11upt26gmzu5ed7J09OX2pIZmN5WnZzLm4Ib0xrMaMPoZwCw2d3ZlX5++hj7wGHCf1izeqX37w8d+ZcuBoxQ1BbVF3s911dergHVempmnuoo8MuXswLU1LW/3PSvNzkACiO5iUC87dh77Lrr1ZNzJGz+myXd98drq3dceUa4f/0VDn31+44WTn9RefMZ291SH2i0hzY4v//D0/hwkgusPJuUD4NmkQzxd+rWmT1bJ+z56qN2tSg4unVqcLubW2w/OklRtfTDNR/HqIXnzmBR0x+3ppdWfZKpNA3Qeko/ew3s7+iOMguAl0B+ogugNJMGlC9i02TbozvKHoCG6SJIfqILpDyTBpSnaGj7yk1xR9d0JkM5fKTDLjVh1Edysfxq3xhc9IkySkOWyXPoro6pbVhMhWNtmM0+FcRUR3LiWFNSj7KOya7Mbd++6yCxE9pa7dD6ZlK5fJCsuBi7UR3cWsWGpTrvP4HKLv9jzZyg66JeiOhkF0RxNjs1nZW2vVxl1z9wGR3sN+9K3M3jYpux0L0d3Oj/XWnXxaVs64V16yHpiAThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQKIbocjUSDgNAFEdzo9NA4Cdggguh2ORIGA0wQQ3en00DgI2CGA6HY4EgUCThNAdKfTQ+MgYIcAotvhSBQIOE0A0Z1OD42DgB0CiG6HI1Eg4DQBRHc6PTQOAnYIILodjkSBgNMEEN3p9NA4CNghgOh2OBIFAk4TQHSn00PjIGCHAKLb4UgUCDhNANGdTg+Ng4AdAohuhyNRIOA0AUR3Oj00DgJ2CCC6HY5EgYDTBBDd6fTQOAjYIYDodjgSBQJOE0B0p9ND4yBghwCi2+FIFAg4TQDRnU4PjYOAHQL/Dwaci1WTPknFAAAAAElFTkSuQmCC\",\"e\":1},{\"id\":\"comp_0\",\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":2,\"nm\":\"barre finale.ai\",\"cl\":\"ai\",\"refId\":\"image_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":0,\"s\":[-5,130,0],\"to\":[0,-5.167,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":12,\"s\":[-5,99,0],\"to\":[0,0,0],\"ti\":[0,-5.167,0]},{\"t\":24,\"s\":[-5,130,0]}],\"ix\":2},\"a\":{\"a\":0,\"k\":[125,125,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[150,150,100],\"ix\":6}},\"ao\":0,\"ip\":0,\"op\":24,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":2,\"nm\":\"barre finale.ai\",\"cl\":\"ai\",\"refId\":\"image_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":0,\"s\":[25,111.918,0],\"to\":[0,-2.153,0],\"ti\":[0,-3.833,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":6,\"s\":[25,99,0],\"to\":[0,3.151,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":18,\"s\":[25,130,0],\"to\":[0,0,0],\"ti\":[0,7.793,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":24,\"s\":[25,114.5,0],\"to\":[0,-6.763,0],\"ti\":[0,1.911,0]},{\"t\":30,\"s\":[40.75,99,0]}],\"ix\":2},\"a\":{\"a\":0,\"k\":[125,125,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[150,150,100],\"ix\":6}},\"ao\":0,\"ip\":0,\"op\":24,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":2,\"nm\":\"barre finale.ai\",\"cl\":\"ai\",\"refId\":\"image_0\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":1,\"k\":[{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":0,\"s\":[55,99,0],\"to\":[0,5.167,0],\"ti\":[0,0,0]},{\"i\":{\"x\":0.833,\"y\":0.833},\"o\":{\"x\":0.167,\"y\":0.167},\"t\":12,\"s\":[55,130,0],\"to\":[0,0,0],\"ti\":[0,5.167,0]},{\"t\":24,\"s\":[55,99,0]}],\"ix\":2},\"a\":{\"a\":0,\"k\":[125,125,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[150,150,100],\"ix\":6}},\"ao\":0,\"ip\":0,\"op\":24,\"st\":0,\"bm\":0}]}],\"fonts\":{\"list\":[{\"fName\":\"Lato-Regular\",\"fFamily\":\"Lato\",\"fStyle\":\"Regular\",\"ascent\":73.699951171875}]},\"layers\":[{\"ddd\":0,\"ind\":1,\"ty\":5,\"nm\":\"Ecolyo\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[254,417.75,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[0,0,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"t\":{\"d\":{\"k\":[{\"s\":{\"sz\":[501,112.5],\"ps\":[-255.5,-56.25],\"s\":77,\"f\":\"Lato-Regular\",\"t\":\"Ecolyo\",\"j\":2,\"tr\":0,\"lh\":92.4,\"ls\":0,\"fc\":[0.922,0.922,0.922]},\"t\":0}]},\"p\":{},\"m\":{\"g\":1,\"a\":{\"a\":0,\"k\":[0,0],\"ix\":2}},\"a\":[]},\"ip\":0,\"op\":13,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":2,\"ty\":0,\"nm\":\"compo barre\",\"refId\":\"comp_0\",\"sr\":0.55,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[256,224.5,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[60,70,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[100,100,100],\"ix\":6}},\"ao\":0,\"hasMask\":true,\"masksProperties\":[{\"inv\":false,\"mode\":\"a\",\"pt\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[139.039,-41],[-18,-41],[-18,85.184],[139.039,85.184]],\"c\":true},\"ix\":1},\"o\":{\"a\":0,\"k\":100,\"ix\":3},\"x\":{\"a\":0,\"k\":0,\"ix\":4},\"nm\":\"Masque 1\"}],\"w\":120,\"h\":140,\"ip\":0,\"op\":13.2,\"st\":0,\"bm\":0},{\"ddd\":0,\"ind\":3,\"ty\":2,\"nm\":\"bouclier\",\"refId\":\"image_1\",\"sr\":1,\"ks\":{\"o\":{\"a\":0,\"k\":100,\"ix\":11},\"r\":{\"a\":0,\"k\":0,\"ix\":10},\"p\":{\"a\":0,\"k\":[250,250,0],\"ix\":2},\"a\":{\"a\":0,\"k\":[125,125,0],\"ix\":1},\"s\":{\"a\":0,\"k\":[150,150,100],\"ix\":6}},\"ao\":0,\"ip\":0,\"op\":13,\"st\":0,\"bm\":0}],\"markers\":[],\"chars\":[{\"ch\":\"E\",\"size\":77,\"style\":\"Regular\",\"w\":58.1,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],\"v\":[[8.7,-71.65],[8.7,0],[52.85,0],[52.85,-7.9],[18.45,-7.9],[18.45,-32.35],[46.3,-32.35],[46.3,-39.95],[18.45,-39.95],[18.45,-63.75],[52.85,-63.75],[52.85,-71.65]],\"c\":true},\"ix\":2},\"nm\":\"E\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\"E\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Lato\"},{\"ch\":\"c\",\"size\":77,\"style\":\"Regular\",\"w\":46.7,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[2.733,1.15],[3.533,0],[2.966,-1.3],[2.016,-2.316],[1.05,-3.2],[0,-3.766],[-1.15,-3.233],[-2,-2.216],[-2.717,-1.166],[-3.167,0],[-3.3,1.25],[-2.2,2.7],[0,0],[0.766,0],[0.6,-0.516],[0.933,-0.633],[1.4,-0.516],[2.166,0],[1.816,0.85],[1.266,1.617],[0.7,2.384],[0,3.067],[-0.65,2.367],[-1.284,1.667],[-1.9,0.884],[-2.467,0],[-1.284,-0.416],[-0.9,-0.5],[-0.584,-0.416],[-0.5,0],[-0.267,0.2],[-0.267,0.367]],\"o\":[[-2.1,-2.1],[-2.734,-1.15],[-3.834,0],[-2.967,1.3],[-2.017,2.317],[-1.05,3.2],[0,4.134],[1.15,3.234],[2,2.217],[2.716,1.166],[3.666,0],[3.3,-1.25],[0,0],[-0.367,-0.566],[-0.6,0],[-0.6,0.517],[-0.934,0.634],[-1.4,0.517],[-2.267,0],[-1.817,-0.85],[-1.267,-1.616],[-0.7,-2.383],[0,-2.933],[0.65,-2.366],[1.283,-1.666],[1.9,-0.883],[1.866,0],[1.283,0.417],[0.9,0.5],[0.583,0.417],[0.5,0],[0.266,-0.2],[0,0]],\"v\":[[44.2,-44.85],[36.95,-49.725],[27.55,-51.45],[17.35,-49.5],[9.875,-44.075],[5.275,-35.8],[3.7,-25.35],[5.425,-14.3],[10.15,-6.125],[17.225,-1.05],[26.05,0.7],[36.5,-1.175],[44.75,-7.1],[42.25,-10.35],[40.55,-11.2],[38.75,-10.425],[36.45,-8.7],[32.95,-6.975],[27.6,-6.2],[21.475,-7.475],[16.85,-11.175],[13.9,-17.175],[12.85,-25.35],[13.825,-33.3],[16.725,-39.35],[21.5,-43.175],[28.05,-44.5],[32.775,-43.875],[36.05,-42.5],[38.275,-41.125],[39.9,-40.5],[41.05,-40.8],[41.85,-41.65]],\"c\":true},\"ix\":2},\"nm\":\"c\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\"c\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Lato\"},{\"ch\":\"o\",\"size\":77,\"style\":\"Regular\",\"w\":55.6,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[2.983,-1.233],[2.1,-2.266],[1.133,-3.216],[0,-3.966],[-1.134,-3.2],[-2.1,-2.266],[-2.984,-1.216],[-3.7,0],[-2.984,1.216],[-2.084,2.267],[-1.117,3.2],[0,4],[1.116,3.217],[2.083,2.267],[2.983,1.234],[3.7,0]],\"o\":[[-2.984,1.234],[-2.1,2.267],[-1.134,3.217],[0,4],[1.133,3.2],[2.1,2.267],[2.983,1.216],[3.7,0],[2.983,-1.216],[2.083,-2.266],[1.116,-3.2],[0,-3.966],[-1.117,-3.216],[-2.084,-2.266],[-2.984,-1.233],[-3.7,0]],\"v\":[[17.775,-49.6],[10.15,-44.35],[5.3,-36.125],[3.6,-25.35],[5.3,-14.55],[10.15,-6.35],[17.775,-1.125],[27.8,0.7],[37.825,-1.125],[45.425,-6.35],[50.225,-14.55],[51.9,-25.35],[50.225,-36.125],[45.425,-44.35],[37.825,-49.6],[27.8,-51.45]],\"c\":true},\"ix\":2},\"nm\":\"o\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false},{\"ind\":1,\"ty\":\"sh\",\"ix\":2,\"ks\":{\"a\":0,\"k\":{\"i\":[[1.866,0.867],[1.25,1.617],[0.616,2.367],[0,3],[-0.617,2.384],[-1.25,1.634],[-1.867,0.867],[-2.534,0],[-2.467,-3.366],[0,-6.033],[2.466,-3.35],[5,0]],\"o\":[[-1.867,-0.866],[-1.25,-1.616],[-0.617,-2.366],[0,-3],[0.616,-2.383],[1.25,-1.633],[1.866,-0.866],[5,0],[2.466,3.367],[0,6],[-2.467,3.35],[-2.534,0]],\"v\":[[21.2,-7.55],[16.525,-11.275],[13.725,-17.25],[12.8,-25.3],[13.725,-33.375],[16.525,-39.4],[21.2,-43.15],[27.8,-44.45],[39,-39.4],[42.7,-25.3],[39,-11.275],[27.8,-6.25]],\"c\":true},\"ix\":2},\"nm\":\"o\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\"o\",\"np\":5,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Lato\"},{\"ch\":\"l\",\"size\":77,\"style\":\"Regular\",\"w\":25.6,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0,0],[0,0]],\"o\":[[0,0],[0,0],[0,0],[0,0]],\"v\":[[8.3,-73.65],[8.3,0],[17.2,0],[17.2,-73.65]],\"c\":true},\"ix\":2},\"nm\":\"l\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\"l\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Lato\"},{\"ch\":\"y\",\"size\":77,\"style\":\"Regular\",\"w\":51.2,\"data\":{\"shapes\":[{\"ty\":\"gr\",\"it\":[{\"ind\":0,\"ty\":\"sh\",\"ix\":1,\"ks\":{\"a\":0,\"k\":{\"i\":[[0,0],[0,0],[0.483,-0.35],[0.2,-0.533],[0,0],[0.233,-0.733],[0.233,-0.766],[0.216,0.734],[0.3,0.734],[0,0],[0.433,0.384],[0.766,0],[0,0],[0,0],[0,0],[0,0],[-0.45,0.4],[-0.3,0.666]],\"o\":[[0,0],[-0.567,0],[-0.484,0.35],[0,0],[-0.3,0.767],[-0.234,0.734],[-0.167,-0.766],[-0.217,-0.733],[0,0],[-0.2,-0.466],[-0.434,-0.383],[0,0],[0,0],[0,0],[0,0],[0.933,0],[0.45,-0.4],[0,0]],\"v\":[[50.4,-50.65],[43.3,-50.65],[41.725,-50.125],[40.7,-48.8],[27.55,-16.95],[26.75,-14.7],[26.05,-12.45],[25.475,-14.7],[24.7,-16.9],[11.15,-48.8],[10.2,-50.075],[8.4,-50.65],[0.7,-50.65],[21.6,-2.95],[12.35,17.15],[18.95,17.15],[21.025,16.55],[22.15,14.95]],\"c\":true},\"ix\":2},\"nm\":\"y\",\"mn\":\"ADBE Vector Shape - Group\",\"hd\":false}],\"nm\":\"y\",\"np\":3,\"cix\":2,\"bm\":0,\"ix\":1,\"mn\":\"ADBE Vector Group\",\"hd\":false}]},\"fFamily\":\"Lato\"}]}"); - -/***/ }), - /***/ "nvJ1": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -31442,7 +31502,7 @@ exports.i(__webpack_require__("tgIe"), ""); exports.push([module.i, "@import url(https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap);", ""]); // Module -exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.cv-button {\n width: 4.25rem;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.header {\n display: flex;\n align-items: center;\n flex-direction: column;\n overflow: hidden;\n width: 100%;\n z-index: 18;\n position: fixed;\n top: 48px;\n left: 0;\n}\n@media only screen and (max-width : 768px) {\n .header {\n top: 0;\n }\n}\n.header .header-top {\n background: radial-gradient(circle, rgb(52, 54, 65) 0%, rgb(27, 28, 34) 100%);\n width: 100%;\n}\n.header .header-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n}\n.header .header-content {\n margin: 0 0 0 220px;\n display: flex;\n flex-direction: column;\n}\n@media only screen and (max-width : 1023px) {\n .header .header-content {\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n .header .header-content {\n margin: 60px 0 0 0;\n }\n}\n.header .header-content .header-content-top {\n display: flex;\n flex-direction: row;\n}\n.header .header-content .header-content-top.header-content-top-right {\n justify-content: flex-end;\n}\n.header .header-content .header-content-top .header-text {\n padding: 2rem 1rem;\n flex: 1;\n}\n.header .header-content .header-content-top .header-text-desktop {\n display: flex;\n flex: 1;\n padding: 2rem 1.25rem;\n color: #e0e0e0;\n}\n.header .header-content .header-content-top .header-back-button {\n padding: 0 0.75rem;\n}\n@media only screen and (max-width : 768px) {\n .header .header-content .header-content-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n }\n .header .header-content .header-content-top .header-text-desktop {\n display: none;\n }\n .header .header-content .header-content-top .header-feedbacks-button {\n display: none;\n }\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.isBuilding {\n color: #e3b82a;\n margin-left: 0.8rem;\n margin-right: 0.8rem;\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-result {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: 900;\n font-size: 1.75rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UNCOMING {\n fill: #242633;\n opacity: 0.6;\n}\n.bar-UNCOMING.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-UNCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animatio ndelay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.6s;\n}\n\n.delay--1 {\n animation-duration: 0.7s;\n}\n\n.delay--2 {\n animation-duration: 0.8s;\n}\n\n.delay--3 {\n animation-duration: 0.9s;\n}\n\n.delay--4 {\n animation-duration: 1s;\n}\n\n.delay--5 {\n animation-duration: 1.1s;\n}\n\n.delay--6 {\n animation-duration: 1.2s;\n}\n\n.delay--7 {\n animation-duration: 1.3s;\n}\n\n.delay--8 {\n animation-duration: 1.4s;\n}\n\n.delay--9 {\n animation-duration: 1.5s;\n}\n\n.delay--10 {\n animation-duration: 1.6s;\n}\n\n.delay--11 {\n animation-duration: 1.8s;\n}\n\n.delay--12 {\n animation-duration: 1.9s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton.btn-highlight {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n background-color: #e3b82a;\n border: none;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-highlight span:first-child {\n color: #000000;\n}\nbutton.btn-highlight:hover, button.btn-highlight:focus, button.btn-highlight.active, button.btn-highlight:disabled {\n background-color: #b89318;\n}\nbutton.btn-highlight:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-primary-positive {\n background: transparent;\n background-color: transparent;\n border: 1px solid #121212;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-primary-positive span:first-child {\n color: #e3b82a;\n}\nbutton.btn-primary-positive:hover, button.btn-primary-positive:focus, button.btn-primary-positive.active, button.btn-primary-positive:disabled {\n background-color: rgba(18, 18, 18, 0.2);\n}\nbutton.btn-primary-positive:hover span:first-child, button.btn-primary-positive:focus span:first-child, button.btn-primary-positive.active span:first-child, button.btn-primary-positive:disabled span:first-child {\n color: rgba(227, 184, 42, 0.7);\n}\nbutton.btn-primary-positive:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-primary-negative {\n background: transparent;\n background-color: transparent;\n border: 1px solid #7b7b7b;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-primary-negative span:first-child {\n color: #e3b82a;\n}\nbutton.btn-primary-negative:hover, button.btn-primary-negative:focus, button.btn-primary-negative.active, button.btn-primary-negative:disabled {\n background-color: rgba(123, 123, 123, 0.2);\n}\nbutton.btn-primary-negative:hover span:first-child, button.btn-primary-negative:focus span:first-child, button.btn-primary-negative.active span:first-child, button.btn-primary-negative:disabled span:first-child {\n color: rgba(227, 184, 42, 0.7);\n}\nbutton.btn-primary-negative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-secondary-positive {\n background: transparent;\n background-color: transparent;\n border: 1px solid #121212;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-secondary-positive span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-secondary-positive:hover, button.btn-secondary-positive:focus, button.btn-secondary-positive.active, button.btn-secondary-positive:disabled {\n background-color: rgba(18, 18, 18, 0.2);\n}\nbutton.btn-secondary-positive:hover span:first-child, button.btn-secondary-positive:focus span:first-child, button.btn-secondary-positive.active span:first-child, button.btn-secondary-positive:disabled span:first-child {\n color: rgba(224, 224, 224, 0.7);\n}\nbutton.btn-secondary-positive:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-secondary-negative {\n background: transparent;\n background-color: transparent;\n border: 1px solid #7b7b7b;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-secondary-negative span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-secondary-negative:hover, button.btn-secondary-negative:focus, button.btn-secondary-negative.active, button.btn-secondary-negative:disabled {\n background-color: rgba(123, 123, 123, 0.2);\n}\nbutton.btn-secondary-negative:hover span:first-child, button.btn-secondary-negative:focus span:first-child, button.btn-secondary-negative.active span:first-child, button.btn-secondary-negative:disabled span:first-child {\n color: rgba(224, 224, 224, 0.7);\n}\nbutton.btn-secondary-negative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-off {\n background: #121212;\n background-color: #121212;\n border: 1px solid rgba(97, 240, 242, 0.5);\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-off span:first-child {\n color: #ffffff;\n}\nbutton.btn-duel-off:hover, button.btn-duel-off:focus, button.btn-duel-off.active, button.btn-duel-off:disabled {\n background-color: black;\n}\nbutton.btn-duel-off:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-active {\n border-radius: 4px !important;\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n background-color: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n border: none;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-active span:first-child {\n color: #121212;\n}\nbutton.btn-duel-active:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-on {\n background: radial-gradient(60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100%);\n background-color: #121212;\n border: 1px solid #58ffff;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-on span:first-child {\n color: #ffffff;\n}\nbutton.btn-duel-on:hover, button.btn-duel-on:focus, button.btn-duel-on.active, button.btn-duel-on:disabled {\n background-color: black;\n}\nbutton.btn-duel-on:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-profile-next {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n background-color: #e3b82a;\n border: 1px solid #e3b82a;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-profile-next span:first-child {\n color: #000000;\n}\nbutton.btn-profile-next:hover, button.btn-profile-next:focus, button.btn-profile-next.active, button.btn-profile-next:disabled {\n background-color: #b89318;\n}\nbutton.btn-profile-next:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-profile-back {\n background: none;\n background-color: none;\n border: 1px solid #e0e0e0;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-profile-back span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-profile-back:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n margin-top: 1rem;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 24px 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}", ""]); +exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React components styles */\n/* App styles */\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nhtml {\n background: #121212;\n}\n\nbody {\n background: #121212;\n overflow: unset !important;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n}\n\n.row {\n display: flex;\n flex-direction: row;\n}\n\n.cozy-bar {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: 0;\n}\n\n[role=banner] .coz-bar-container {\n background-color: #ffffff;\n}\n@media only screen and (max-width : 768px) {\n [role=banner] .coz-bar-container {\n padding: 0.6rem 0 0 0;\n background-color: unset;\n }\n}\n\n.coz-bar-wrapper {\n box-shadow: unset !important;\n background: unset !important;\n}\n\n.coz-label {\n color: #32363f;\n}\n\n.header {\n display: flex;\n align-items: center;\n flex-direction: column;\n overflow: hidden;\n width: 100%;\n z-index: 18;\n position: fixed;\n top: 48px;\n left: 0;\n}\n@media only screen and (max-width : 768px) {\n .header {\n top: 0;\n }\n}\n.header .header-top {\n background: radial-gradient(circle, rgb(52, 54, 65) 0%, rgb(27, 28, 34) 100%);\n width: 100%;\n}\n.header .header-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n}\n.header .header-content {\n margin: 0 0 0 220px;\n display: flex;\n flex-direction: column;\n}\n@media only screen and (max-width : 1023px) {\n .header .header-content {\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n .header .header-content {\n margin: 60px 0 0 0;\n }\n}\n.header .header-content .header-content-top {\n display: flex;\n flex-direction: row;\n}\n.header .header-content .header-content-top.header-content-top-right {\n justify-content: flex-end;\n}\n.header .header-content .header-content-top .header-text {\n padding: 2rem 1rem;\n flex: 1;\n}\n.header .header-content .header-content-top .header-text-desktop {\n display: flex;\n flex: 1;\n padding: 2rem 1.25rem;\n color: #e0e0e0;\n}\n.header .header-content .header-content-top .header-back-button {\n padding: 0 0.75rem;\n}\n@media only screen and (max-width : 768px) {\n .header .header-content .header-content-top .header-text {\n padding: 0 1rem 1rem 1rem;\n color: #e0e0e0;\n }\n .header .header-content .header-content-top .header-text-desktop {\n display: none;\n }\n .header .header-content .header-content-top .header-feedbacks-button {\n display: none;\n }\n}\n\n.content-view-loading {\n height: 80vh;\n width: 100%;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n color: #e0e0e0;\n}\n.content-view-loading .content-view-loading-text {\n padding-top: 1rem;\n margin: 0 2rem;\n text-align: center;\n}\n.content-view-loading .content-view-loading-button {\n max-width: 50vw;\n margin-top: 1rem;\n}\n\n[role=main] {\n /* width */\n /* Track */\n /* Handle */\n}\n[role=main]::-webkit-scrollbar {\n width: 10px;\n}\n[role=main]::-webkit-scrollbar-track {\n background: #3e4045;\n}\n[role=main]::-webkit-scrollbar-thumb {\n background: #6f7074;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n* {\n font-family: Lato, sans-serif;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np {\n color: #a0a0a0;\n font-family: Lato, sans-serif;\n}\n\n.home-title {\n font-size: 1rem;\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n line-height: 120%;\n text-transform: uppercase;\n}\n\n.app-title {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 21px;\n line-height: 24px;\n text-align: center;\n letter-spacing: 0.15px;\n color: #e0e0e0;\n text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);\n}\n\n.isBuilding {\n color: #e3b82a;\n margin-left: 0.8rem;\n margin-right: 0.8rem;\n}\n\n.text-10, .text-10-italic, .text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase, .text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-style: normal;\n font-size: 0.625rem;\n line-height: 120%;\n}\n.text-10-normal, .text-10-normal-150, .text-10-normal-uppercase {\n font-weight: normal;\n}\n.text-10-normal-uppercase {\n text-transform: uppercase;\n}\n.text-10-normal-150 {\n line-height: 150%;\n}\n.text-10-bold, .text-10-bold-capitalize, .text-10-bold-uppercase {\n font-weight: 700;\n}\n.text-10-bold-uppercase {\n text-transform: uppercase;\n}\n.text-10-bold-capitalize {\n text-transform: capitalize;\n}\n.text-10-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-14, .text-14-italic, .text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase, .text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-style: normal;\n font-size: 0.875rem;\n line-height: 120%;\n}\n.text-14-normal, .text-14-normal-150, .text-14-normal-uppercase {\n font-weight: normal;\n}\n.text-14-normal-uppercase {\n text-transform: uppercase;\n}\n.text-14-normal-150 {\n line-height: 150%;\n}\n.text-14-bold, .text-14-bold-capitalize, .text-14-bold-uppercase {\n font-weight: 700;\n}\n.text-14-bold-uppercase {\n text-transform: uppercase;\n}\n.text-14-bold-capitalize {\n text-transform: capitalize;\n}\n.text-14-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-15, .text-15-italic, .text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase, .text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-style: normal;\n font-size: 0.938rem;\n line-height: 120%;\n}\n.text-15-normal, .text-15-normal-150, .text-15-normal-uppercase {\n font-weight: normal;\n}\n.text-15-normal-uppercase {\n text-transform: uppercase;\n}\n.text-15-normal-150 {\n line-height: 150%;\n}\n.text-15-bold, .text-15-bold-capitalize, .text-15-bold-uppercase {\n font-weight: 700;\n}\n.text-15-bold-uppercase {\n text-transform: uppercase;\n}\n.text-15-bold-capitalize {\n text-transform: capitalize;\n}\n.text-15-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-16, .text-16-italic, .text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase, .text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-style: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n.text-16-normal, .text-16-normal-150, .text-16-normal-uppercase {\n font-weight: normal;\n}\n.text-16-normal-uppercase {\n text-transform: uppercase;\n}\n.text-16-normal-150 {\n line-height: 150%;\n}\n.text-16-bold, .text-16-bold-capitalize, .text-16-bold-uppercase {\n font-weight: 700;\n}\n.text-16-bold-uppercase {\n text-transform: uppercase;\n}\n.text-16-bold-capitalize {\n text-transform: capitalize;\n}\n.text-16-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-18, .text-18-italic, .text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase, .text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-style: normal;\n font-size: 1.125rem;\n line-height: 120%;\n}\n.text-18-normal, .text-18-normal-150, .text-18-normal-uppercase {\n font-weight: normal;\n}\n.text-18-normal-uppercase {\n text-transform: uppercase;\n}\n.text-18-normal-150 {\n line-height: 150%;\n}\n.text-18-bold, .text-18-bold-capitalize, .text-18-bold-uppercase {\n font-weight: 700;\n}\n.text-18-bold-uppercase {\n text-transform: uppercase;\n}\n.text-18-bold-capitalize {\n text-transform: capitalize;\n}\n.text-18-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-19, .text-19-italic, .text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase, .text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-style: normal;\n font-size: 1.188rem;\n line-height: 120%;\n}\n.text-19-normal, .text-19-normal-150, .text-19-normal-uppercase {\n font-weight: normal;\n}\n.text-19-normal-uppercase {\n text-transform: uppercase;\n}\n.text-19-normal-150 {\n line-height: 150%;\n}\n.text-19-bold, .text-19-bold-capitalize, .text-19-bold-uppercase {\n font-weight: 700;\n}\n.text-19-bold-uppercase {\n text-transform: uppercase;\n}\n.text-19-bold-capitalize {\n text-transform: capitalize;\n}\n.text-19-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-20, .text-20-italic, .text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase, .text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-style: normal;\n font-size: 1.25rem;\n line-height: 120%;\n}\n.text-20-normal, .text-20-normal-150, .text-20-normal-uppercase {\n font-weight: normal;\n}\n.text-20-normal-uppercase {\n text-transform: uppercase;\n}\n.text-20-normal-150 {\n line-height: 150%;\n}\n.text-20-bold, .text-20-bold-capitalize, .text-20-bold-uppercase {\n font-weight: 700;\n}\n.text-20-bold-uppercase {\n text-transform: uppercase;\n}\n.text-20-bold-capitalize {\n text-transform: capitalize;\n}\n.text-20-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-21, .text-21-italic, .text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase, .text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-style: normal;\n font-size: 1.313rem;\n line-height: 120%;\n}\n.text-21-normal, .text-21-normal-150, .text-21-normal-uppercase {\n font-weight: normal;\n}\n.text-21-normal-uppercase {\n text-transform: uppercase;\n}\n.text-21-normal-150 {\n line-height: 150%;\n}\n.text-21-bold, .text-21-bold-capitalize, .text-21-bold-uppercase {\n font-weight: 700;\n}\n.text-21-bold-uppercase {\n text-transform: uppercase;\n}\n.text-21-bold-capitalize {\n text-transform: capitalize;\n}\n.text-21-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-22, .text-22-italic, .text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase, .text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-style: normal;\n font-size: 1.375rem;\n line-height: 120%;\n}\n.text-22-normal, .text-22-normal-150, .text-22-normal-uppercase {\n font-weight: normal;\n}\n.text-22-normal-uppercase {\n text-transform: uppercase;\n}\n.text-22-normal-150 {\n line-height: 150%;\n}\n.text-22-bold, .text-22-bold-capitalize, .text-22-bold-uppercase {\n font-weight: 700;\n}\n.text-22-bold-uppercase {\n text-transform: uppercase;\n}\n.text-22-bold-capitalize {\n text-transform: capitalize;\n}\n.text-22-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-24, .text-24-italic, .text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase, .text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-style: normal;\n font-size: 1.5rem;\n line-height: 120%;\n}\n.text-24-normal, .text-24-normal-150, .text-24-normal-uppercase {\n font-weight: normal;\n}\n.text-24-normal-uppercase {\n text-transform: uppercase;\n}\n.text-24-normal-150 {\n line-height: 150%;\n}\n.text-24-bold, .text-24-bold-capitalize, .text-24-bold-uppercase {\n font-weight: 700;\n}\n.text-24-bold-uppercase {\n text-transform: uppercase;\n}\n.text-24-bold-capitalize {\n text-transform: capitalize;\n}\n.text-24-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-26, .text-26-italic, .text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase, .text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-style: normal;\n font-size: 1.625rem;\n line-height: 120%;\n}\n.text-26-normal, .text-26-normal-150, .text-26-normal-uppercase {\n font-weight: normal;\n}\n.text-26-normal-uppercase {\n text-transform: uppercase;\n}\n.text-26-normal-150 {\n line-height: 150%;\n}\n.text-26-bold, .text-26-bold-capitalize, .text-26-bold-uppercase {\n font-weight: 700;\n}\n.text-26-bold-uppercase {\n text-transform: uppercase;\n}\n.text-26-bold-capitalize {\n text-transform: capitalize;\n}\n.text-26-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-28, .text-28-italic, .text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase, .text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-style: normal;\n font-size: 1.75rem;\n line-height: 120%;\n}\n.text-28-normal, .text-28-normal-150, .text-28-normal-uppercase {\n font-weight: normal;\n}\n.text-28-normal-uppercase {\n text-transform: uppercase;\n}\n.text-28-normal-150 {\n line-height: 150%;\n}\n.text-28-bold, .text-28-bold-capitalize, .text-28-bold-uppercase {\n font-weight: 700;\n}\n.text-28-bold-uppercase {\n text-transform: uppercase;\n}\n.text-28-bold-capitalize {\n text-transform: capitalize;\n}\n.text-28-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n.text-36, .text-36-italic, .text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase, .text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-style: normal;\n font-size: 2.25rem;\n line-height: 120%;\n}\n.text-36-normal, .text-36-normal-150, .text-36-normal-uppercase {\n font-weight: normal;\n}\n.text-36-normal-uppercase {\n text-transform: uppercase;\n}\n.text-36-normal-150 {\n line-height: 150%;\n}\n.text-36-bold, .text-36-bold-capitalize, .text-36-bold-uppercase {\n font-weight: 700;\n}\n.text-36-bold-uppercase {\n text-transform: uppercase;\n}\n.text-36-bold-capitalize {\n text-transform: capitalize;\n}\n.text-36-italic {\n font-style: italic;\n font-weight: normal;\n}\n\n/* Card */\n.card-title-on {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1.125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text-bold {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-result {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: 900;\n font-size: 1.75rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-indicator {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n.card-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/* Chart */\n.chart-ticks-x-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 1rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-x-text {\n font-size: 0.685rem;\n }\n}\n\n.chart-ticks-y-text {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: normal;\n font-size: 0.9rem;\n line-height: 120%;\n}\n@media only screen and (max-width : 768px) {\n .chart-ticks-y-text {\n font-size: 0.75rem;\n }\n}\n\n/* Cozy bar */\n.cozybar {\n font-family: Lato, sans-serif;\n font-style: normal;\n font-weight: bold;\n font-size: 1.3125rem;\n line-height: 120%;\n color: #e0e0e0;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.axis {\n color: #7b7b7b;\n}\n.axis .tick-text {\n fill: #7b7b7b;\n}\n.axis .tick-text.tick-text-selected {\n fill: #e0e0e0;\n}\n.axis .separator {\n text-align: center;\n margin: 0 2px;\n font-size: 1rem !important;\n}\n\n.value-text {\n fill: #7b7b7b;\n}\n.value-text.selected {\n fill: #e0e0e0;\n}\n\n.barContainer:hover,\n.barFill:hover {\n cursor: pointer;\n}\n\n.background-true {\n opacity: 0.1;\n}\n.background-true:hover {\n cursor: pointer;\n}\n\n.background-false {\n opacity: 0;\n}\n\n.bar-compare-ELECTRICITY:hover,\n.bar-compare-GAS:hover,\n.bar-compare-WATER:hover,\n.bar-compare-MULTIFLUID:hover,\n.bar-MULTIFLUID:hover,\n.bar-WATER:hover,\n.bar-GAS:hover,\n.bar-ELECTRICITY:hover {\n cursor: pointer;\n}\n\n.bar-ELECTRICITY {\n fill: #5d3d2a;\n}\n.bar-ELECTRICITY.selected {\n fill: #d87b39;\n filter: drop-shadow(0 -0.1rem 0.2rem #d87b39);\n}\n\n.bar-compare-ELECTRICITY {\n fill: #795c47;\n}\n.bar-compare-ELECTRICITY.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.bar-WATER {\n fill: #20415e;\n}\n.bar-WATER.selected {\n fill: #3a98ec;\n filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec);\n}\n\n.bar-compare-WATER {\n fill: #4d5c6e;\n}\n.bar-compare-WATER.selected {\n fill: #abd4fa;\n filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa);\n}\n\n.bar-GAS {\n fill: #184940;\n}\n.bar-GAS.selected {\n fill: #45d1b8;\n filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8);\n}\n\n.bar-compare-GAS {\n fill: #597773;\n}\n.bar-compare-GAS.selected {\n fill: #a8f7e9;\n filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9);\n}\n\n.bar-MULTIFLUID {\n fill: #705d1d;\n}\n.bar-MULTIFLUID.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-MULTIFLUID.disabled:hover {\n cursor: default;\n}\n\n.bar-duel {\n fill: #61f0f2;\n}\n.bar-duel.selected {\n fill: #61f0f2;\n filter: drop-shadow(0 -0.1rem 0.2rem #61f0f2);\n}\n.bar-duel.disabled:hover {\n cursor: default;\n}\n\n.bar-UNCOMING {\n fill: #242633;\n opacity: 0.6;\n}\n.bar-UNCOMING.selected {\n fill: #e3b82a;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n.bar-UNCOMING.disabled:hover {\n cursor: default;\n}\n\n.bar-compare-MULTIFLUID {\n fill: #7d6a4e;\n}\n.bar-compare-MULTIFLUID.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n.bar-average {\n stroke-width: 2;\n stroke: #e3b82a;\n}\n\n.week {\n fill: #e2bca1;\n}\n.week.selected {\n fill: #e2bca1;\n filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1);\n}\n\n.weekend {\n fill: #ffd597;\n}\n.weekend.selected {\n fill: #ffd597;\n filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a);\n}\n\n/** Animation **/\n.bounce-1 {\n animation-name: bounce-1;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-1 {\n 0% {\n transform: scale(0.1, 0.1);\n }\n 28% {\n transform: scale(0.1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-2 {\n animation-name: bounce-2;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n transform-box: fill-box;\n}\n\n@keyframes bounce-2 {\n 0% {\n transform: scale(1, 1);\n }\n 28% {\n transform: scale(1, 1.1);\n }\n 45% {\n transform: scale(0.8, 0.95);\n }\n 55% {\n transform: scale(1, 1);\n }\n 65% {\n transform: scale(1, 0.98);\n }\n 75% {\n transform: scale(1, 1);\n }\n}\n.bounce-3 {\n animation-name: bounce-3;\n animation-timing-function: cubic-bezier(1, 1, 0.42, 1);\n animation-iteration-count: 1;\n transform-origin: bottom center;\n}\n\n@keyframes bounce-3 {\n 0% {\n opacity: 0.6;\n transform: scaleY(1);\n }\n 50% {\n transform: scaleY(1.1);\n opacity: 0.8;\n }\n 100% {\n transform: scaleY(1);\n opacity: 1;\n }\n}\n/** Animatio ndelay **/\n.delay {\n animation-duration: 0.4s;\n}\n\n.delay--0 {\n animation-duration: 0.6s;\n}\n\n.delay--1 {\n animation-duration: 0.7s;\n}\n\n.delay--2 {\n animation-duration: 0.8s;\n}\n\n.delay--3 {\n animation-duration: 0.9s;\n}\n\n.delay--4 {\n animation-duration: 1s;\n}\n\n.delay--5 {\n animation-duration: 1.1s;\n}\n\n.delay--6 {\n animation-duration: 1.2s;\n}\n\n.delay--7 {\n animation-duration: 1.3s;\n}\n\n.delay--8 {\n animation-duration: 1.4s;\n}\n\n.delay--9 {\n animation-duration: 1.5s;\n}\n\n.delay--10 {\n animation-duration: 1.6s;\n}\n\n.delay--11 {\n animation-duration: 1.8s;\n}\n\n.delay--12 {\n animation-duration: 1.9s;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\nbutton.btn-highlight {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n background-color: #e3b82a;\n border: none;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-highlight span:first-child {\n color: #000000;\n}\nbutton.btn-highlight:hover, button.btn-highlight:focus, button.btn-highlight.active, button.btn-highlight:disabled {\n background-color: #b89318;\n}\nbutton.btn-highlight:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-primary-positive {\n background: transparent;\n background-color: transparent;\n border: 1px solid #121212;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-primary-positive span:first-child {\n color: #e3b82a;\n}\nbutton.btn-primary-positive:hover, button.btn-primary-positive:focus, button.btn-primary-positive.active, button.btn-primary-positive:disabled {\n background-color: rgba(18, 18, 18, 0.2);\n}\nbutton.btn-primary-positive:hover span:first-child, button.btn-primary-positive:focus span:first-child, button.btn-primary-positive.active span:first-child, button.btn-primary-positive:disabled span:first-child {\n color: rgba(227, 184, 42, 0.7);\n}\nbutton.btn-primary-positive:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-primary-negative {\n background: transparent;\n background-color: transparent;\n border: 1px solid #7b7b7b;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-primary-negative span:first-child {\n color: #e3b82a;\n}\nbutton.btn-primary-negative:hover, button.btn-primary-negative:focus, button.btn-primary-negative.active, button.btn-primary-negative:disabled {\n background-color: rgba(123, 123, 123, 0.2);\n}\nbutton.btn-primary-negative:hover span:first-child, button.btn-primary-negative:focus span:first-child, button.btn-primary-negative.active span:first-child, button.btn-primary-negative:disabled span:first-child {\n color: rgba(227, 184, 42, 0.7);\n}\nbutton.btn-primary-negative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-secondary-positive {\n background: transparent;\n background-color: transparent;\n border: 1px solid #121212;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-secondary-positive span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-secondary-positive:hover, button.btn-secondary-positive:focus, button.btn-secondary-positive.active, button.btn-secondary-positive:disabled {\n background-color: rgba(18, 18, 18, 0.2);\n}\nbutton.btn-secondary-positive:hover span:first-child, button.btn-secondary-positive:focus span:first-child, button.btn-secondary-positive.active span:first-child, button.btn-secondary-positive:disabled span:first-child {\n color: rgba(224, 224, 224, 0.7);\n}\nbutton.btn-secondary-positive:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-secondary-negative {\n background: transparent;\n background-color: transparent;\n border: 1px solid #7b7b7b;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-secondary-negative span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-secondary-negative:hover, button.btn-secondary-negative:focus, button.btn-secondary-negative.active, button.btn-secondary-negative:disabled {\n background-color: rgba(123, 123, 123, 0.2);\n}\nbutton.btn-secondary-negative:hover span:first-child, button.btn-secondary-negative:focus span:first-child, button.btn-secondary-negative.active span:first-child, button.btn-secondary-negative:disabled span:first-child {\n color: rgba(224, 224, 224, 0.7);\n}\nbutton.btn-secondary-negative:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-off {\n background: #121212;\n background-color: #121212;\n border: 1px solid rgba(97, 240, 242, 0.5);\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-off span:first-child {\n color: #ffffff;\n}\nbutton.btn-duel-off:hover, button.btn-duel-off:focus, button.btn-duel-off.active, button.btn-duel-off:disabled {\n background-color: black;\n}\nbutton.btn-duel-off:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-active {\n border-radius: 4px !important;\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n background-color: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n border: none;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-active span:first-child {\n color: #121212;\n}\nbutton.btn-duel-active:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-duel-on {\n background: radial-gradient(60.65% 30.62% at 50% 3.13%, #2a2b30 0%, #1b1c22 100%);\n background-color: #121212;\n border: 1px solid #58ffff;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-duel-on span:first-child {\n color: #ffffff;\n}\nbutton.btn-duel-on:hover, button.btn-duel-on:focus, button.btn-duel-on.active, button.btn-duel-on:disabled {\n background-color: black;\n}\nbutton.btn-duel-on:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-profile-next {\n background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n background-color: #e3b82a;\n border: 1px solid #e3b82a;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-profile-next span:first-child {\n color: #000000;\n}\nbutton.btn-profile-next:hover, button.btn-profile-next:focus, button.btn-profile-next.active, button.btn-profile-next:disabled {\n background-color: #b89318;\n}\nbutton.btn-profile-next:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\nbutton.btn-profile-back {\n background: none;\n background-color: none;\n border: 1px solid #e0e0e0;\n border-radius: 2px;\n margin: 1.5rem 0 0;\n width: 100%;\n text-transform: initial;\n cursor: pointer;\n}\nbutton.btn-profile-back span:first-child {\n color: #e0e0e0;\n}\nbutton.btn-profile-back:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\n.card {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n box-sizing: border-box;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n border-radius: 4px;\n margin-top: 1rem;\n padding: 16px;\n}\n.card:hover {\n background: linear-gradient(180deg, rgba(70, 71, 77, 0.7) 0%, rgba(57, 58, 63, 0.7) 100%);\n}\n.card.rich-card {\n padding: 24px 16px;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.modal-root .MuiBackdrop-root {\n background-color: hsla(231deg, 11%, 12%, 0.85);\n}\n\ndiv.modal-paper {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 36rem;\n max-width: 100%;\n max-height: 90vh;\n padding: 2rem;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n margin: 0 0 0 13.75rem;\n align-items: center;\n color: #ffffff;\n}\n@media only screen and (max-width : 1023px) {\n div.modal-paper {\n width: 35rem;\n margin: 0;\n }\n}\n@media only screen and (max-width : 768px) {\n div.modal-paper {\n padding: 1rem 1rem 1.5rem;\n width: 85%;\n max-width: 35rem;\n margin: 0;\n }\n}\ndiv.modal-paper.no-padding {\n padding: 0;\n}\ndiv.modal-paper.blue-border {\n border: 1px solid rgba(88, 255, 255, 0.2509803922);\n}\ndiv.modal-paper.blue-light-border {\n border: 1px solid #61f0f2;\n}\ndiv.modal-paper.yellow-border {\n border: 1px solid rgba(227, 184, 42, 0.4);\n}\ndiv.modal-paper .modal-paper-close-button {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n padding: 5px 5px;\n z-index: 10;\n}\n\ndiv.modal-paper-full-screen {\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n padding: 0;\n margin: 0;\n box-sizing: border-box;\n box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);\n border-radius: 4px;\n color: #ffffff;\n display: flex;\n align-items: center;\n}\ndiv.modal-paper-full-screen.dark-background {\n background: #121212;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\ndiv.expansion-panel-root {\n margin: 1.2rem 0;\n color: #e0e0e0;\n background: linear-gradient(180deg, #323339 0%, #25262b 100%);\n border-radius: 4px;\n box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);\n transition: background-color 0.6s ease;\n box-sizing: border-box;\n}\ndiv.expansion-panel-root.Mui-expanded:first-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.Mui-expanded:last-child {\n margin: 1.2rem 0;\n}\ndiv.expansion-panel-root.red-border {\n border: 1px solid #d25959;\n}\n\ndiv.expansion-panel-summary {\n padding: 0.25rem 1.2rem;\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-focused {\n border-radius: 4px;\n background-color: unset;\n box-shadow: 0 0 0 1px #e0e0e0;\n}\ndiv.expansion-panel-summary.Mui-expanded {\n min-height: 4rem;\n}\ndiv.expansion-panel-summary.Mui-expanded.small {\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.small {\n padding: 0 1.2rem;\n min-height: 3rem;\n}\ndiv.expansion-panel-summary.bold-text {\n font-weight: bold;\n}\n\ndiv.expansion-panel-content {\n display: flex;\n align-items: center;\n}\ndiv.expansion-panel-content.Mui-expanded {\n margin: 0.75rem 0;\n}\n\ndiv.expansion-panel-details {\n padding: 0 1.2rem 1.2rem;\n}\n\n/** BLACK **/\n/** RED **/\n/** YELLOW **/\n/** ORANGE **/\n/** BLUE **/\n/** GREEN **/\n/** WHITE **/\n/** GREY **/\n/** App colors **/\n/** TABS GRADIENT **/\n/** SCROLLBAR **/\na {\n color: #deaf0e;\n}\na:visited {\n color: #deaf0e;\n}\n\na:focus {\n outline: none;\n box-shadow: inset 0 0 0 1px #e0e0e0;\n}\na:focus > div:first-child {\n box-shadow: 0 0 0 1px #e0e0e0;\n}\n\na.MuiLink-underlineHover:hover {\n text-decoration: none;\n}\n\na.MuiTypography-colorPrimary {\n color: #e0e0e0;\n}\n\n:root {\n white-space: pre-line;\n --blue: #58ffff;\n --blue40: rgba(88, 255, 255, 0.2509803922);\n --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;\n --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);\n --elecColor: #d87b39;\n --elecColor40: rgba(216, 123, 57, 0.4);\n --elecCompareColor: #e2bca1;\n --gasColor: #45d1b8;\n --gasColor40: rgba(69, 209, 184, 0.4);\n --gasCompareColor: #a8f7e9;\n --waterColor: #3a98ec;\n --waterColor40: rgba(58, 152, 236, 0.4);\n --waterCompareColor: #abd4fa;\n --multiColor: #e3b82a;\n --multiCompareColor: #ffd597;\n --redPrimary: #d25959;\n --greyBright: #e0e0e0;\n --greyDark: #7b7b7b;\n --textWhite: #ffffff;\n --softGrey: #a0a0a0;\n --darkLight: #25262b;\n --darkLight2: #121212;\n --textFont: Lato, sans-serif;\n --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);\n --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);\n --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);\n --gasColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);\n --multiColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(226, 137, 4, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #f1c017;\n --elecColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(158, 67, 2, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #d87b39;\n --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;\n --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec;\n}\n\n.application {\n overflow-x: hidden;\n background-color: #121212;\n}\n\n.accordion-icon {\n color: #ffffff;\n}", ""]); @@ -31451,7 +31511,7 @@ exports.push([module.i, "/* Cozy UI utilities classes */\n/* Cozy UI React compo /***/ "pZg0": /***/ (function(module, exports) { -module.exports = {"name":"Ecolyo","slug":"ecolyo","icon":"icon.svg","categories":["energy"],"version":"2.0.0","licence":"AGPL-3.0","editor":"Métropole de Lyon","default_locale":"fr","locales":{"fr":{"short_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer.","long_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer afin de vous accompagner dans la gestion quotidienne de ces consommations et ce, de façon ludique en vous lançant des défis personnalisés.","permissions":{"ecolyo":{"description":"Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’astuces personnalisée, …)."},"enedis":{"description":"Requises pour l’affichage et l’analyse de vos consommations électriques dans Ecolyo. Issues du connecteur Enedis."},"grdf":{"description":"Requises pour l’affichage et l’analyse de vos consommations de gaz dans Ecolyo. Issues du connecteur GRDF."},"egl":{"description":"Requises pour l’affichage et l’analyse de vos consommations d’eau dans Ecolyo. Issues du connecteur Eau du Grand Lyon."},"konnectors":{"description":"Requis pour vérifier la présence des connecteurs Enedis, GRDF et Eau du Grand Lyon ainsi que pour pouvoir les configurer à partir de l’application Ecolyo."},"accounts":{"description":"Requis pour stocker des informations propres aux comptes énergie et eau (Enedis, GRDF, Eau du Grand Lyon). Sont stockés votre numéro de PDL pour Enedis, votre numéro de PCE pour GRDF, vos logins et mots de passe pour Eau du Grand Lyon."},"triggers":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"jobs":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"terms":{"description":"Nécessaire pour la gestion des consentements de l'application"},"apps":{"description":"Requis par Cozy pour afficher les icônes des applications installées dans la barre Cozy."},"settings":{"description":"Requis pour afficher les paramètres Cozy dans la barre Cozy."},"ecolyo-dju":{"description":"Requis pour la récupération des DJU (Degrés Jours Unifiés), informations météorologiques permettant d’ajuster le modèle de comparaison des consommations énergétiques."},"dacc-dev":{"description":"Requis pour la récupération et l’envoi de statistiques d’utilisation anonymisées dans un environnement de test."},"dacc":{"description":"Requis pour envoyer des statistiques d'utilisation anonymisées."},"backoffice-prod":{"description":"Requis pour la récupération des données de la newsletter."},"backoffice-rec":{"description":"Requis pour la récupération des données de la newsletter dans un environment de test."},"backoffice-custom-popup":{"description":"Requis pour la récupération des alertes personnalisées."},"backoffice-custom-popup-rec":{"description":"Requis pour la récupération des alertes personnalisées dans un environment de test."},"backoffice-partners-info":{"description":"Requis pour la récupération du status des services partenaires"},"backoffice-partners-info-rec":{"description":"Requis pour la récupération du status des services partenaires dans un environment de test."},"backoffice-prices":{"description":"Requis pour la récupération du prix des fluides."},"backoffice-prices-rec":{"description":"Requis pour la récupération du prix des fluides dans un environnement de test."}}},"en":{"short_description":"Ecolyo a free service developed by Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home.","long_description":"Ecolyo a free service developed by the Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home. To help you in reducing your daily consumption it gives you best energy consumption practices, consumption analysis and challenges to take up. At least one Smartmeter is needed among Linky (for electricity), Gazpar (for gas) or Téléo (for water).","permissions":{"ecolyo":{"description":"Required for the operation of the different parts of the application (Analysis, customized eco-gesture lists, etc...)."},"enedis":{"description":"Required for the display and analysis of your electricity consumption in Ecolyo. Retrieved by the Enedis connector."},"grdf":{"description":"Required for the display and analysis of your gas consumption in Ecolyo. Retrieved by the GRDF connector."},"egl":{"description":"Required for the display and analysis of your water consumption in Ecolyo. Retrieved by the Eau du Grand Lyon connector."},"konnectors":{"description":"Required to verify the presence of the Enedis, GRDF and Eau du Grand Lyon connectors as well as to be able to configure them from the Ecolyo application."},"accounts":{"description":"Required to store information specific to energy and water accounts (Enedis, GRDF, Eau du Grand Lyon). Your PDL number for Enedis, your PCE number for GRDF, your logins and passwords for Eau du Grand Lyon are stored."},"triggers":{"description":"Required for the correct functioning of the energy and water connectors."},"jobs":{"description":"Required for the correct functioning of the energy and water connectors."},"terms":{"description":"Required for the correct managment of CGU."},"apps":{"description":"Required to display the icons of installed applications in the Cozy bar."},"settings":{"description":"Required for the application's consents managment"},"ecolyo-dju":{"description":"Required to gather udd data (Unified Degree Days), a meteorological data allowing the app to adjust our energical consumption model. "},"dacc-dev":{"description":"Required for gathering and sending anonymous usage statistics for test environment."},"dacc":{"description":"Required for sending cozy anonymized stats."},"agent":{"description":"Required for retrieving informations from our partners."},"backoffice-prod":{"description":"Required for retrieving newsletter informations from backoffice prod."},"backoffice-rec":{"description":"Required for retrieving newsletter informations from backoffice rec."},"backoffice-custom-popup":{"description":"Required for retrieving custom alerts."},"backoffice-custom-popup-rec":{"description":"Required for retrieving custom alerts in test environment."},"backoffice-partners-info":{"description":"Required for getting the status of partners' services"},"backoffice-partners-info-rec":{"description":"Required for getting the status of partners' services in test environment."},"backoffice-prices":{"description":"Required for getting fluid prices form backoffice prod"},"backoffice-prices-rec":{"description":"Required for getting fluid prices form backoffice rec."}}}},"langs":["fr"],"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"routes":{"/":{"folder":"/","index":"index.html","public":false}},"services":{"enedisHalfHourMonthlyAnalysis":{"type":"node","file":"services/enedisHalfHourMonthlyAnalysis/ecolyo.js","trigger":"@cron 0 0 8 3 * *"},"monthlyReportNotification":{"type":"node","file":"services/monthlyReportNotification/ecolyo.js","trigger":"@cron 0 0 10 3 * *"},"consumptionAlert":{"type":"node","file":"services/consumptionAlert/ecolyo.js","trigger":"@cron 0 3 * * *"},"aggregatorUsageEvents":{"type":"node","file":"services/aggregatorUsageEvents/ecolyo.js","trigger":"@cron 0 1 * * *"},"fluidsPrices":{"type":"node","file":"services/fluidsPrices/ecolyo.js","trigger":"@cron 0 2 * * *"}},"permissions":{"ecolyo":{"type":"com.grandlyon.ecolyo.*"},"enedis":{"type":"com.grandlyon.enedis.*"},"grdf":{"type":"com.grandlyon.grdf.*"},"egl":{"type":"com.grandlyon.egl.*"},"agent":{"type":"org.ecolyo.agent.*"},"konnectors":{"type":"io.cozy.konnectors"},"accounts":{"type":"io.cozy.accounts"},"triggers":{"type":"io.cozy.triggers"},"jobs":{"type":"io.cozy.jobs"},"terms":{"type":"io.cozy.terms"},"apps":{"type":"io.cozy.apps","verbs":["GET"]},"settings":{"type":"io.cozy.settings","verbs":["GET"]},"ecolyo-dju":{"type":"org.ecolyo.dju","verbs":["GET"]},"dacc":{"type":"cc.cozycloud.dacc_v2","verbs":["ALL"]},"dacc-dev":{"type":"cc.cozycloud.dacc.dev_v2","verbs":["ALL"]},"backoffice-prod":{"type":"org.ecolyo.agent","verbs":["ALL"]},"backoffice-rec":{"type":"org.ecolyo.agent.rec","verbs":["ALL"]},"backoffice-custom-popup":{"type":"org.ecolyo.agent.custom.popup","verbs":["ALL"]},"backoffice-custom-popup-rec":{"type":"org.ecolyo.agent.custom.popup.rec","verbs":["ALL"]},"backoffice-partners-info":{"type":"org.ecolyo.agent.partners.info","verbs":["ALL"]},"backoffice-partners-info-rec":{"type":"org.ecolyo.agent.partners.info.rec","verbs":["ALL"]},"backoffice-prices":{"type":"org.ecolyo.agent.prices","verbs":["ALL"]},"backoffice-prices-rec":{"type":"org.ecolyo.agent.prices.rec","verbs":["ALL"]}}} +module.exports = {"name":"Ecolyo","slug":"ecolyo","icon":"icon.svg","categories":["energy"],"version":"2.0.2","licence":"AGPL-3.0","editor":"Métropole de Lyon","default_locale":"fr","locales":{"fr":{"short_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer.","long_description":"Ecolyo est le service proposé par la Métropole de Lyon pour suivre et comprendre les consommations d’énergie et d’eau de votre foyer afin de vous accompagner dans la gestion quotidienne de ces consommations et ce, de façon ludique en vous lançant des défis personnalisés.","permissions":{"ecolyo":{"description":"Requises pour le fonctionnement des différentes parties de l’application (Analyse, liste d’astuces personnalisée, …)."},"enedis":{"description":"Requises pour l’affichage et l’analyse de vos consommations électriques dans Ecolyo. Issues du connecteur Enedis."},"grdf":{"description":"Requises pour l’affichage et l’analyse de vos consommations de gaz dans Ecolyo. Issues du connecteur GRDF."},"egl":{"description":"Requises pour l’affichage et l’analyse de vos consommations d’eau dans Ecolyo. Issues du connecteur Eau du Grand Lyon."},"konnectors":{"description":"Requis pour vérifier la présence des connecteurs Enedis, GRDF et Eau du Grand Lyon ainsi que pour pouvoir les configurer à partir de l’application Ecolyo."},"accounts":{"description":"Requis pour stocker des informations propres aux comptes énergie et eau (Enedis, GRDF, Eau du Grand Lyon). Sont stockés votre numéro de PDL pour Enedis, votre numéro de PCE pour GRDF, vos logins et mots de passe pour Eau du Grand Lyon."},"triggers":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"jobs":{"description":"Requis pour le bon fonctionnement des connecteurs énergie et eau."},"terms":{"description":"Nécessaire pour la gestion des consentements de l'application"},"apps":{"description":"Requis par Cozy pour afficher les icônes des applications installées dans la barre Cozy."},"settings":{"description":"Requis pour afficher les paramètres Cozy dans la barre Cozy."},"ecolyo-dju":{"description":"Requis pour la récupération des DJU (Degrés Jours Unifiés), informations météorologiques permettant d’ajuster le modèle de comparaison des consommations énergétiques."},"dacc-dev":{"description":"Requis pour la récupération et l’envoi de statistiques d’utilisation anonymisées dans un environnement de test."},"dacc":{"description":"Requis pour envoyer des statistiques d'utilisation anonymisées."},"backoffice-prod":{"description":"Requis pour la récupération des données de la newsletter."},"backoffice-rec":{"description":"Requis pour la récupération des données de la newsletter dans un environment de test."},"backoffice-custom-popup":{"description":"Requis pour la récupération des alertes personnalisées."},"backoffice-custom-popup-rec":{"description":"Requis pour la récupération des alertes personnalisées dans un environment de test."},"backoffice-partners-info":{"description":"Requis pour la récupération du status des services partenaires"},"backoffice-partners-info-rec":{"description":"Requis pour la récupération du status des services partenaires dans un environment de test."},"backoffice-prices":{"description":"Requis pour la récupération du prix des fluides."},"backoffice-prices-rec":{"description":"Requis pour la récupération du prix des fluides dans un environnement de test."}}},"en":{"short_description":"Ecolyo a free service developed by Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home.","long_description":"Ecolyo a free service developed by the Métropole de Lyon to help you to monitor and understand the energy and water consumption of your home. To help you in reducing your daily consumption it gives you best energy consumption practices, consumption analysis and challenges to take up. At least one Smartmeter is needed among Linky (for electricity), Gazpar (for gas) or Téléo (for water).","permissions":{"ecolyo":{"description":"Required for the operation of the different parts of the application (Analysis, customized eco-gesture lists, etc...)."},"enedis":{"description":"Required for the display and analysis of your electricity consumption in Ecolyo. Retrieved by the Enedis connector."},"grdf":{"description":"Required for the display and analysis of your gas consumption in Ecolyo. Retrieved by the GRDF connector."},"egl":{"description":"Required for the display and analysis of your water consumption in Ecolyo. Retrieved by the Eau du Grand Lyon connector."},"konnectors":{"description":"Required to verify the presence of the Enedis, GRDF and Eau du Grand Lyon connectors as well as to be able to configure them from the Ecolyo application."},"accounts":{"description":"Required to store information specific to energy and water accounts (Enedis, GRDF, Eau du Grand Lyon). Your PDL number for Enedis, your PCE number for GRDF, your logins and passwords for Eau du Grand Lyon are stored."},"triggers":{"description":"Required for the correct functioning of the energy and water connectors."},"jobs":{"description":"Required for the correct functioning of the energy and water connectors."},"terms":{"description":"Required for the correct managment of CGU."},"apps":{"description":"Required to display the icons of installed applications in the Cozy bar."},"settings":{"description":"Required for the application's consents managment"},"ecolyo-dju":{"description":"Required to gather udd data (Unified Degree Days), a meteorological data allowing the app to adjust our energical consumption model. "},"dacc-dev":{"description":"Required for gathering and sending anonymous usage statistics for test environment."},"dacc":{"description":"Required for sending cozy anonymized stats."},"agent":{"description":"Required for retrieving informations from our partners."},"backoffice-prod":{"description":"Required for retrieving newsletter informations from backoffice prod."},"backoffice-rec":{"description":"Required for retrieving newsletter informations from backoffice rec."},"backoffice-custom-popup":{"description":"Required for retrieving custom alerts."},"backoffice-custom-popup-rec":{"description":"Required for retrieving custom alerts in test environment."},"backoffice-partners-info":{"description":"Required for getting the status of partners' services"},"backoffice-partners-info-rec":{"description":"Required for getting the status of partners' services in test environment."},"backoffice-prices":{"description":"Required for getting fluid prices form backoffice prod"},"backoffice-prices-rec":{"description":"Required for getting fluid prices form backoffice rec."}}}},"langs":["fr"],"developer":{"name":"Métropole de Lyon","url":"https://www.grandlyon.com/"},"routes":{"/":{"folder":"/","index":"index.html","public":false}},"services":{"enedisHalfHourMonthlyAnalysis":{"type":"node","file":"services/enedisHalfHourMonthlyAnalysis/ecolyo.js","trigger":"@cron 0 0 8 3 * *"},"monthlyReportNotification":{"type":"node","file":"services/monthlyReportNotification/ecolyo.js","trigger":"@cron 0 0 10 3 * *"},"consumptionAlert":{"type":"node","file":"services/consumptionAlert/ecolyo.js","trigger":"@cron 0 3 * * *"},"aggregatorUsageEvents":{"type":"node","file":"services/aggregatorUsageEvents/ecolyo.js","trigger":"@cron 0 1 * * *"},"fluidsPrices":{"type":"node","file":"services/fluidsPrices/ecolyo.js","trigger":"@cron 0 2 * * *"}},"permissions":{"ecolyo":{"type":"com.grandlyon.ecolyo.*"},"enedis":{"type":"com.grandlyon.enedis.*"},"grdf":{"type":"com.grandlyon.grdf.*"},"egl":{"type":"com.grandlyon.egl.*"},"agent":{"type":"org.ecolyo.agent.*"},"konnectors":{"type":"io.cozy.konnectors"},"accounts":{"type":"io.cozy.accounts"},"triggers":{"type":"io.cozy.triggers"},"jobs":{"type":"io.cozy.jobs"},"terms":{"type":"io.cozy.terms"},"apps":{"type":"io.cozy.apps","verbs":["GET"]},"settings":{"type":"io.cozy.settings","verbs":["GET"]},"ecolyo-dju":{"type":"org.ecolyo.dju","verbs":["GET"]},"dacc":{"type":"cc.cozycloud.dacc_v2","verbs":["ALL"]},"dacc-dev":{"type":"cc.cozycloud.dacc.dev_v2","verbs":["ALL"]},"backoffice-prod":{"type":"org.ecolyo.agent","verbs":["ALL"]},"backoffice-rec":{"type":"org.ecolyo.agent.rec","verbs":["ALL"]},"backoffice-custom-popup":{"type":"org.ecolyo.agent.custom.popup","verbs":["ALL"]},"backoffice-custom-popup-rec":{"type":"org.ecolyo.agent.custom.popup.rec","verbs":["ALL"]},"backoffice-partners-info":{"type":"org.ecolyo.agent.partners.info","verbs":["ALL"]},"backoffice-partners-info-rec":{"type":"org.ecolyo.agent.partners.info.rec","verbs":["ALL"]},"backoffice-prices":{"type":"org.ecolyo.agent.prices","verbs":["ALL"]},"backoffice-prices-rec":{"type":"org.ecolyo.agent.prices.rec","verbs":["ALL"]}}} /***/ }), @@ -32482,19 +32542,19 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } var ConsumptionView = /*#__PURE__*/(0, _react.lazy)(function () { - return Promise.all(/* import() */[__webpack_require__.e(0), __webpack_require__.e(5), __webpack_require__.e(8), __webpack_require__.e(3)]).then(__webpack_require__.t.bind(null, "Fz84", 7)); + return Promise.all(/* import() */[__webpack_require__.e(0), __webpack_require__.e(5), __webpack_require__.e(3)]).then(__webpack_require__.t.bind(null, "Fz84", 7)); }); var EcogestureView = /*#__PURE__*/(0, _react.lazy)(function () { return __webpack_require__.e(/* import() */ 4).then(__webpack_require__.t.bind(null, "1MlH", 7)); }); var SingleEcogesture = /*#__PURE__*/(0, _react.lazy)(function () { - return __webpack_require__.e(/* import() */ 9).then(__webpack_require__.t.bind(null, "GwQd", 7)); + return __webpack_require__.e(/* import() */ 8).then(__webpack_require__.t.bind(null, "GwQd", 7)); }); var OptionsView = /*#__PURE__*/(0, _react.lazy)(function () { - return Promise.all(/* import() */[__webpack_require__.e(0), __webpack_require__.e(8), __webpack_require__.e(6)]).then(__webpack_require__.t.bind(null, "e+zH", 7)); + return Promise.all(/* import() */[__webpack_require__.e(0), __webpack_require__.e(6)]).then(__webpack_require__.t.bind(null, "e+zH", 7)); }); var LegalNoticeView = /*#__PURE__*/(0, _react.lazy)(function () { - return __webpack_require__.e(/* import() */ 10).then(__webpack_require__.t.bind(null, "LUT6", 7)); + return __webpack_require__.e(/* import() */ 9).then(__webpack_require__.t.bind(null, "LUT6", 7)); }); var GCUView = /*#__PURE__*/(0, _react.lazy)(function () { return __webpack_require__.e(/* import() */ 7).then(__webpack_require__.t.bind(null, "1usQ", 7)); @@ -33912,7 +33972,8 @@ var MigrationService = /*#__PURE__*/function () { notes: [{ title: '', description: '' - }] + }], + redirectLink: '' }; _context2.next = 5; return this.currentSchemaVersion(this._client); @@ -33979,6 +34040,10 @@ var MigrationService = /*#__PURE__*/function () { if (migration.releaseNotes !== null && migrationResult.type === _migration2.MIGRATION_RESULT_COMPLETE) { releaseNotes.notes.push(migration.releaseNotes); releaseStatus = true; + + if (migration.redirectLink) { + releaseNotes.redirectLink = migration.redirectLink; + } } case 32: @@ -34069,11 +34134,11 @@ var result = _node_modules_svg_sprite_loader_runtime_browser_sprite_build_js__WE Object.defineProperty(exports, "__esModule", { value: true }); -exports.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC = exports.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO = void 0; -var REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO = '/remote/org.ecolyo.agent.partners.info'; -exports.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO = REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO; -var REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC = '/remote/org.ecolyo.agent.partners.info.rec'; -exports.REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC = REMOTE_ORG_ECOLYO_AGENT_PARTERS_INFO_REC; +exports.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC = exports.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO = void 0; +var REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO = '/remote/org.ecolyo.agent.partners.info'; +exports.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO = REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO; +var REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC = '/remote/org.ecolyo.agent.partners.info.rec'; +exports.REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC = REMOTE_ORG_ECOLYO_AGENT_PARTNERS_INFO_REC; /***/ }), @@ -34140,6 +34205,7 @@ var MatomoTracker = /*#__PURE__*/function () { MatomoTracker.push(['setSiteId', this.siteId]); MatomoTracker.push(['setReferrerUrl', 'https://ecolyo.com']); MatomoTracker.push(['setTrackerUrl', "".concat(this.url + this.phpFilename)]); + MatomoTracker.push(['HeatmapSessionRecording::disable']); } return { @@ -35277,9 +35343,20 @@ var ConsumptionFormatterService = /*#__PURE__*/function () { var filledData = []; var parsingDate = timePeriod.startDate; + var endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + var dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { var filtereddata = data.filter(function (dt) { return dateChartService.compareStepDate(timeStep, dt.date, parsingDate); }); @@ -36300,21 +36377,21 @@ var _slicedToArray2 = _interopRequireDefault(__webpack_require__("J4zp")); var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("yXPU")); -var _createClass2 = _interopRequireDefault(__webpack_require__("W8MJ")); - var _classCallCheck2 = _interopRequireDefault(__webpack_require__("lwsE")); +var _createClass2 = _interopRequireDefault(__webpack_require__("W8MJ")); + var _defineProperty2 = _interopRequireDefault(__webpack_require__("lSNA")); var _fluid = __webpack_require__("5Wkc"); -var _fluidConfig = _interopRequireDefault(__webpack_require__("JIzA")); - -var _konnector = _interopRequireDefault(__webpack_require__("kFhK")); +var _account = _interopRequireDefault(__webpack_require__("gucQ")); var _consumption = _interopRequireDefault(__webpack_require__("AVq/")); -var _account = _interopRequireDefault(__webpack_require__("gucQ")); +var _fluidConfig = _interopRequireDefault(__webpack_require__("JIzA")); + +var _konnector = _interopRequireDefault(__webpack_require__("kFhK")); var _triggers = _interopRequireDefault(__webpack_require__("7d5P")); @@ -36324,14 +36401,18 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o = function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } -var FluidService = /*#__PURE__*/(0, _createClass2.default)(function FluidService(_client) { - var _this = this; +var FluidService = /*#__PURE__*/function () { + function FluidService(_client) { + var _this = this; + + (0, _classCallCheck2.default)(this, FluidService); + (0, _defineProperty2.default)(this, "_client", void 0); + (0, _defineProperty2.default)(this, "parseFluidStatus", function (konnector, state) { + if (!konnector) return _fluid.FluidState.KONNECTOR_NOT_FOUND; - (0, _classCallCheck2.default)(this, FluidService); - (0, _defineProperty2.default)(this, "_client", void 0); - (0, _defineProperty2.default)(this, "parseFluidStatus", function (konnector, state) { - if (konnector) { - if (state) { + if (!state) { + return _fluid.FluidState.NOT_CONNECTED; + } else { switch (state.status) { case 'done': return _fluid.FluidState.DONE; @@ -36342,181 +36423,162 @@ var FluidService = /*#__PURE__*/(0, _createClass2.default)(function FluidService default: return _fluid.FluidState.NOT_CONNECTED; } - } else { - return _fluid.FluidState.NOT_CONNECTED; } - } else { - return _fluid.FluidState.KONNECTOR_NOT_FOUND; - } - }); - (0, _defineProperty2.default)(this, "isFluidInPartnerIssue", function (fluidType, fluidState, partnersInfo) { - if (fluidType === _fluid.FluidType.GAS && partnersInfo.grdf_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { - return true; - } + }); + (0, _defineProperty2.default)(this, "isFluidInPartnerIssue", function (fluidType, fluidState, partnersInfo) { + if (fluidType === _fluid.FluidType.GAS && partnersInfo.grdf_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { + return true; + } - if (fluidType === _fluid.FluidType.ELECTRICITY && partnersInfo.enedis_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { - return true; - } + if (fluidType === _fluid.FluidType.ELECTRICITY && partnersInfo.enedis_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { + return true; + } - if (fluidType === _fluid.FluidType.WATER && partnersInfo.egl_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { - return true; - } + if (fluidType === _fluid.FluidType.WATER && partnersInfo.egl_failure && fluidState !== _fluid.FluidState.NOT_CONNECTED && fluidState !== _fluid.FluidState.KONNECTOR_NOT_FOUND) { + return true; + } - return false; - }); - (0, _defineProperty2.default)(this, "getFluidsConcernedByPartnerIssue", /*#__PURE__*/function () { - var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(statusArray) { - var concernedFluids; - return _regenerator.default.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - concernedFluids = []; - statusArray.forEach(function (fluid) { - if (fluid.status === _fluid.FluidState.PARTNER_ISSUE) { - concernedFluids.push(fluid.fluidType); - } - }); - return _context.abrupt("return", concernedFluids); + return false; + }); + (0, _defineProperty2.default)(this, "getFluidStatus", /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(partnersInfo) { + var fluidConfig, accountService, _yield$Promise$all, _yield$Promise$all2, elecAccount, waterAccount, gasAccount, konnectorService, _yield$Promise$all3, _yield$Promise$all4, elecKonnector, waterKonnector, gasKonnector, triggerService, _yield$Promise$all5, _yield$Promise$all6, elecTrigger, waterTrigger, gasTrigger, consumptionService, _yield$Promise$all7, _yield$Promise$all8, elecStatus, waterStatus, gasStatus, firstDataDates, lastDataDates, result; - case 3: - case "end": - return _context.stop(); - } - } - }, _callee); - })); + return _regenerator.default.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + fluidConfig = new _fluidConfig.default().getFluidConfig(); + accountService = new _account.default(_this._client); + _context.next = 4; + return Promise.all([accountService.getAccountByType(fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig.slug), accountService.getAccountByType(fluidConfig[_fluid.FluidType.WATER].konnectorConfig.slug), accountService.getAccountByType(fluidConfig[_fluid.FluidType.GAS].konnectorConfig.slug)]); - return function (_x) { - return _ref.apply(this, arguments); - }; - }()); - (0, _defineProperty2.default)(this, "getFluidStatus", /*#__PURE__*/function () { - var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(partnersInfo) { - var fluidConfig, accountService, _yield$Promise$all, _yield$Promise$all2, elecAccount, waterAccount, gasAccount, konnectorService, _yield$Promise$all3, _yield$Promise$all4, elecKonnector, waterKonnector, gasKonnector, triggerService, _yield$Promise$all5, _yield$Promise$all6, elecTrigger, waterTrigger, gasTrigger, consumptionService, _yield$Promise$all7, _yield$Promise$all8, elecStatus, waterStatus, gasStatus, firstDataDates, lastDataDates, result; + case 4: + _yield$Promise$all = _context.sent; + _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 3); + elecAccount = _yield$Promise$all2[0]; + waterAccount = _yield$Promise$all2[1]; + gasAccount = _yield$Promise$all2[2]; + konnectorService = new _konnector.default(_this._client); + _context.next = 12; + return Promise.all([konnectorService.getKonnector(fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig.slug), konnectorService.getKonnector(fluidConfig[_fluid.FluidType.WATER].konnectorConfig.slug), konnectorService.getKonnector(fluidConfig[_fluid.FluidType.GAS].konnectorConfig.slug)]); - return _regenerator.default.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - fluidConfig = new _fluidConfig.default().getFluidConfig(); - accountService = new _account.default(_this._client); - _context2.next = 4; - return Promise.all([accountService.getAccountByType(fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig.slug), accountService.getAccountByType(fluidConfig[_fluid.FluidType.WATER].konnectorConfig.slug), accountService.getAccountByType(fluidConfig[_fluid.FluidType.GAS].konnectorConfig.slug)]); + case 12: + _yield$Promise$all3 = _context.sent; + _yield$Promise$all4 = (0, _slicedToArray2.default)(_yield$Promise$all3, 3); + elecKonnector = _yield$Promise$all4[0]; + waterKonnector = _yield$Promise$all4[1]; + gasKonnector = _yield$Promise$all4[2]; + triggerService = new _triggers.default(_this._client); + _context.next = 20; + return Promise.all([elecAccount && elecKonnector ? triggerService.getTrigger(elecAccount, elecKonnector) : null, waterAccount && waterKonnector ? triggerService.getTrigger(waterAccount, waterKonnector) : null, gasAccount && gasKonnector ? triggerService.getTrigger(gasAccount, gasKonnector) : null]); - case 4: - _yield$Promise$all = _context2.sent; - _yield$Promise$all2 = (0, _slicedToArray2.default)(_yield$Promise$all, 3); - elecAccount = _yield$Promise$all2[0]; - waterAccount = _yield$Promise$all2[1]; - gasAccount = _yield$Promise$all2[2]; - konnectorService = new _konnector.default(_this._client); - _context2.next = 12; - return Promise.all([konnectorService.getKonnector(fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig.slug), konnectorService.getKonnector(fluidConfig[_fluid.FluidType.WATER].konnectorConfig.slug), konnectorService.getKonnector(fluidConfig[_fluid.FluidType.GAS].konnectorConfig.slug)]); + case 20: + _yield$Promise$all5 = _context.sent; + _yield$Promise$all6 = (0, _slicedToArray2.default)(_yield$Promise$all5, 3); + elecTrigger = _yield$Promise$all6[0]; + waterTrigger = _yield$Promise$all6[1]; + gasTrigger = _yield$Promise$all6[2]; + consumptionService = new _consumption.default(_this._client); + _context.next = 28; + return Promise.all([elecTrigger ? triggerService.fetchTriggerState(elecTrigger) : null, waterTrigger ? triggerService.fetchTriggerState(waterTrigger) : null, gasTrigger ? triggerService.fetchTriggerState(gasTrigger) : null]); - case 12: - _yield$Promise$all3 = _context2.sent; - _yield$Promise$all4 = (0, _slicedToArray2.default)(_yield$Promise$all3, 3); - elecKonnector = _yield$Promise$all4[0]; - waterKonnector = _yield$Promise$all4[1]; - gasKonnector = _yield$Promise$all4[2]; - triggerService = new _triggers.default(_this._client); - _context2.next = 20; - return Promise.all([elecAccount && elecKonnector ? triggerService.getTrigger(elecAccount, elecKonnector) : null, waterAccount && waterKonnector ? triggerService.getTrigger(waterAccount, waterKonnector) : null, gasAccount && gasKonnector ? triggerService.getTrigger(gasAccount, gasKonnector) : null]); - - case 20: - _yield$Promise$all5 = _context2.sent; - _yield$Promise$all6 = (0, _slicedToArray2.default)(_yield$Promise$all5, 3); - elecTrigger = _yield$Promise$all6[0]; - waterTrigger = _yield$Promise$all6[1]; - gasTrigger = _yield$Promise$all6[2]; - consumptionService = new _consumption.default(_this._client); - _context2.next = 28; - return Promise.all([elecTrigger ? triggerService.fetchTriggerState(elecTrigger) : null, waterTrigger ? triggerService.fetchTriggerState(waterTrigger) : null, gasTrigger ? triggerService.fetchTriggerState(gasTrigger) : null]); - - case 28: - _yield$Promise$all7 = _context2.sent; - _yield$Promise$all8 = (0, _slicedToArray2.default)(_yield$Promise$all7, 3); - elecStatus = _yield$Promise$all8[0]; - waterStatus = _yield$Promise$all8[1]; - gasStatus = _yield$Promise$all8[2]; - _context2.next = 35; - return consumptionService.fetchAllFirstDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); - - case 35: - firstDataDates = _context2.sent; - _context2.next = 38; - return consumptionService.fetchAllLastDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); - - case 38: - lastDataDates = _context2.sent; - result = [{ - fluidType: _fluid.FluidType.ELECTRICITY, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && _this.isFluidInPartnerIssue(_fluid.FluidType.ELECTRICITY, _this.parseFluidStatus(elecKonnector, elecStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : _this.parseFluidStatus(elecKonnector, elecStatus), - firstDataDate: firstDataDates[_fluid.FluidType.ELECTRICITY], - lastDataDate: lastDataDates[_fluid.FluidType.ELECTRICITY], - connection: { - shouldLaunchKonnector: false, - isUpdating: false, - konnector: elecKonnector, - account: elecAccount, - trigger: elecTrigger, - triggerState: elecStatus, - konnectorConfig: fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig - } - }, { - fluidType: _fluid.FluidType.WATER, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && _this.isFluidInPartnerIssue(_fluid.FluidType.WATER, _this.parseFluidStatus(waterKonnector, waterStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : _this.parseFluidStatus(waterKonnector, waterStatus), - firstDataDate: firstDataDates[_fluid.FluidType.WATER], - lastDataDate: lastDataDates[_fluid.FluidType.WATER], - connection: { - shouldLaunchKonnector: false, - isUpdating: false, - konnector: waterKonnector, - account: waterAccount, - trigger: waterTrigger, - triggerState: waterStatus, - konnectorConfig: fluidConfig[_fluid.FluidType.WATER].konnectorConfig - } - }, { - fluidType: _fluid.FluidType.GAS, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && _this.isFluidInPartnerIssue(_fluid.FluidType.GAS, _this.parseFluidStatus(gasKonnector, gasStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : _this.parseFluidStatus(gasKonnector, gasStatus), - firstDataDate: firstDataDates[_fluid.FluidType.GAS], - lastDataDate: lastDataDates[_fluid.FluidType.GAS], - connection: { - shouldLaunchKonnector: false, - isUpdating: false, - konnector: gasKonnector, - account: gasAccount, - trigger: gasTrigger, - triggerState: gasStatus, - konnectorConfig: fluidConfig[_fluid.FluidType.GAS].konnectorConfig - } - }]; - return _context2.abrupt("return", result); + case 28: + _yield$Promise$all7 = _context.sent; + _yield$Promise$all8 = (0, _slicedToArray2.default)(_yield$Promise$all7, 3); + elecStatus = _yield$Promise$all8[0]; + waterStatus = _yield$Promise$all8[1]; + gasStatus = _yield$Promise$all8[2]; + _context.next = 35; + return consumptionService.fetchAllFirstDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); - case 41: - case "end": - return _context2.stop(); + case 35: + firstDataDates = _context.sent; + _context.next = 38; + return consumptionService.fetchAllLastDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); + + case 38: + lastDataDates = _context.sent; + result = [{ + fluidType: _fluid.FluidType.ELECTRICITY, + status: _this.parseFluidStatus(elecKonnector, elecStatus), + maintenance: _this.parseFluidMaintenance(_fluid.FluidType.ELECTRICITY, partnersInfo), + firstDataDate: firstDataDates[_fluid.FluidType.ELECTRICITY], + lastDataDate: lastDataDates[_fluid.FluidType.ELECTRICITY], + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: elecKonnector, + account: elecAccount, + trigger: elecTrigger, + triggerState: elecStatus, + konnectorConfig: fluidConfig[_fluid.FluidType.ELECTRICITY].konnectorConfig + } + }, { + fluidType: _fluid.FluidType.WATER, + status: _this.parseFluidStatus(waterKonnector, waterStatus), + maintenance: _this.parseFluidMaintenance(_fluid.FluidType.WATER, partnersInfo), + firstDataDate: firstDataDates[_fluid.FluidType.WATER], + lastDataDate: lastDataDates[_fluid.FluidType.WATER], + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: waterKonnector, + account: waterAccount, + trigger: waterTrigger, + triggerState: waterStatus, + konnectorConfig: fluidConfig[_fluid.FluidType.WATER].konnectorConfig + } + }, { + fluidType: _fluid.FluidType.GAS, + status: _this.parseFluidStatus(gasKonnector, gasStatus), + maintenance: _this.parseFluidMaintenance(_fluid.FluidType.GAS, partnersInfo), + firstDataDate: firstDataDates[_fluid.FluidType.GAS], + lastDataDate: lastDataDates[_fluid.FluidType.GAS], + connection: { + shouldLaunchKonnector: false, + isUpdating: false, + konnector: gasKonnector, + account: gasAccount, + trigger: gasTrigger, + triggerState: gasStatus, + konnectorConfig: fluidConfig[_fluid.FluidType.GAS].konnectorConfig + } + }]; + return _context.abrupt("return", result); + + case 41: + case "end": + return _context.stop(); + } } - } - }, _callee2); - })); + }, _callee); + })); + + return function (_x) { + return _ref.apply(this, arguments); + }; + }()); + this._client = _client; + } + + (0, _createClass2.default)(FluidService, [{ + key: "parseFluidMaintenance", + value: function parseFluidMaintenance(fluidType, partnersInfo) { + return Boolean((partnersInfo === null || partnersInfo === void 0 ? void 0 : partnersInfo.notification_activated) && (fluidType === _fluid.FluidType.GAS && partnersInfo.grdf_failure || fluidType === _fluid.FluidType.ELECTRICITY && partnersInfo.enedis_failure || fluidType === _fluid.FluidType.WATER && partnersInfo.egl_failure)); + } + }]); + return FluidService; +}(); - return function (_x2) { - return _ref2.apply(this, arguments); - }; - }()); - this._client = _client; -}); exports.default = FluidService; (0, _defineProperty2.default)(FluidService, "getOldFluidData", /*#__PURE__*/function () { - var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(fluidStatus) { + var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(fluidStatus) { var fluidOldData, _iterator, _step, fluid, diffInDays, dateToCompare; - return _regenerator.default.wrap(function _callee3$(_context3) { + return _regenerator.default.wrap(function _callee2$(_context2) { while (1) { - switch (_context3.prev = _context3.next) { + switch (_context2.prev = _context2.next) { case 0: fluidOldData = []; @@ -36544,18 +36606,18 @@ exports.default = FluidService; } } - return _context3.abrupt("return", fluidOldData); + return _context2.abrupt("return", fluidOldData); case 3: case "end": - return _context3.stop(); + return _context2.stop(); } } - }, _callee3); + }, _callee2); })); - return function (_x3) { - return _ref3.apply(this, arguments); + return function (_x2) { + return _ref2.apply(this, arguments); }; }()); diff --git a/index.html b/index.html index 62e04e2e44bf8b730e9178e9f6ff2348f80c4766..9a023c6b40131bfa432394abc440db591e210885 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,user-scalable=0,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212"><!-- PWA iOS title --><meta name="apple-mobile-web-app-title" content="Ecolyo">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.0406c2464c616499bece.js"></script><script src="app/ecolyo.17095a8e1054979f03da.js"></script></div></body></html> \ No newline at end of file +<!DOCTYPE html><html lang="{{.Locale}}"><head><meta charset="utf-8"><title>Ecolyo</title><link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32"><link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16"><!-- PWA Manifest --><link rel="manifest" href="/manifest.json" crossorigin="use-credentials"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2"><meta name="viewport" content="width=device-width,height=device-height,initial-scale=1,viewport-fit=cover"><!-- PWA Chrome --><link rel="icon" sizes="192x192" href="/android-chrome-192x192.png"><link rel="icon" sizes="512x512" href="/android-chrome-512x512.png"><!-- PWA iOS --><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="apple-touch-startup-image" href="/apple-touch-icon.png"><meta name="apple-mobile-web-app-title" content="Ecolyo"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- PWA Colors --><meta name="theme-color" content="#343641"><meta name="background-color" content="#121212"><!-- PWA iOS title --><meta name="apple-mobile-web-app-title" content="Ecolyo">{{.ThemeCSS}} {{.CozyBar}}<script src="//{{.Domain}}/assets/js/piwik.js"></script></head><body><div role="application" class="application" data-cozy="{{.CozyData}}"><script src="vendors/ecolyo.71f31ccb2e4e3905e912.js"></script><script src="app/ecolyo.91537fe32e1b24dcf7fb.js"></script></div></body></html> \ No newline at end of file diff --git a/manifest.webapp b/manifest.webapp index ad1afb374af512479fc7433971f2847ae49f3f9f..bb4ea8c4840a3c4025f5eb7e9a101417e7b6ec4e 100644 --- a/manifest.webapp +++ b/manifest.webapp @@ -5,7 +5,7 @@ "categories": [ "energy" ], - "version": "2.0.0", + "version": "2.0.2", "licence": "AGPL-3.0", "editor": "Métropole de Lyon", "default_locale": "fr", diff --git a/services/aggregatorUsageEvents/ecolyo.js b/services/aggregatorUsageEvents/ecolyo.js index 72d962bfb2d11b0c62352cdf1fa054e916b0254d..f7226b5c9daae47736f9ab8880108a93d40a5ec7 100644 --- a/services/aggregatorUsageEvents/ecolyo.js +++ b/services/aggregatorUsageEvents/ecolyo.js @@ -94525,18 +94525,25 @@ class ConsumptionDataManager { return result; } + async getExportableFluids(fluidTypes, timeStep) { + const exportableFluids = []; + + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType); + } + } + + return exportableFluids; + } + async fetchAllFirstDateData(fluidTypes, timeStep) { let firstDay = null; const firstDays = []; - if (fluidTypes.length === 1) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep)) || null; + for (const fluidType of fluidTypes) { + firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; firstDays.push(firstDay); - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; - firstDays.push(firstDay); - } } return firstDays; @@ -94811,9 +94818,20 @@ class ConsumptionFormatterService { const filledData = []; let parsingDate = timePeriod.startDate; + let endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + const dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate)); const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : { date: parsingDate, @@ -95046,7 +95064,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -95222,7 +95239,7 @@ class DateChartService { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -95821,7 +95838,17 @@ class QueryRunner { buildFirstDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -95832,7 +95859,17 @@ class QueryRunner { buildLastDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -95855,17 +95892,31 @@ class QueryRunner { return result; } - filterDataList(data, timePeriod) { - const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + filterDataList(data, timePeriod, timeStep) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + + const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod)); return filteredResult; } - mapDataList(data) { + mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; const mappedResult = data.map(entry => ({ - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -95922,7 +95973,7 @@ class QueryRunner { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -96054,8 +96105,8 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, timePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, timePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); return mappedResult; } @@ -96086,8 +96137,8 @@ class QueryRunner { } if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0]; @@ -96106,7 +96157,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && _result$data$.year && result !== null && result !== void 0 && (_result$data$2 = result.data[0]) !== null && _result$data$2 !== void 0 && _result$data$2.month && (result === null || result === void 0 ? void 0 : (_result$data$3 = result.data[0]) === null || _result$data$3 === void 0 ? void 0 : _result$data$3.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -96121,7 +96172,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$4 = result.data[0]) !== null && _result$data$4 !== void 0 && _result$data$4.year && result !== null && result !== void 0 && (_result$data$5 = result.data[0]) !== null && _result$data$5 !== void 0 && _result$data$5.month && (result === null || result === void 0 ? void 0 : (_result$data$6 = result.data[0]) === null || _result$data$6 === void 0 ? void 0 : _result$data$6.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -96133,7 +96184,7 @@ class QueryRunner { const doctype = this.getRelevantDoctype(fluidType, timeStep); try { - const query = (0, _cozyClient.Q)(doctype).where({}); + const query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); const result = await this._client.query(query); return result; } catch (error) { @@ -96163,37 +96214,35 @@ var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); var _fluid = __webpack_require__(717); -var _fluidConfig = _interopRequireDefault(__webpack_require__(719)); - -var _konnector = _interopRequireDefault(__webpack_require__(726)); +var _account = _interopRequireDefault(__webpack_require__(726)); var _consumption = _interopRequireDefault(__webpack_require__(713)); -var _account = _interopRequireDefault(__webpack_require__(958)); +var _fluidConfig = _interopRequireDefault(__webpack_require__(719)); + +var _konnector = _interopRequireDefault(__webpack_require__(958)); -var _triggers = _interopRequireDefault(__webpack_require__(727)); +var _triggers = _interopRequireDefault(__webpack_require__(905)); class FluidService { constructor(_client) { (0, _defineProperty2.default)(this, "_client", void 0); (0, _defineProperty2.default)(this, "parseFluidStatus", (konnector, state) => { - if (konnector) { - if (state) { - switch (state.status) { - case 'done': - return _fluid.FluidState.DONE; + if (!konnector) return _fluid.FluidState.KONNECTOR_NOT_FOUND; - case 'errored': - if ((state === null || state === void 0 ? void 0 : state.last_error) === 'LOGIN_FAILED') return _fluid.FluidState.ERROR_LOGIN_FAILED;else return _fluid.FluidState.ERROR; + if (!state) { + return _fluid.FluidState.NOT_CONNECTED; + } else { + switch (state.status) { + case 'done': + return _fluid.FluidState.DONE; - default: - return _fluid.FluidState.NOT_CONNECTED; - } - } else { - return _fluid.FluidState.NOT_CONNECTED; + case 'errored': + if ((state === null || state === void 0 ? void 0 : state.last_error) === 'LOGIN_FAILED') return _fluid.FluidState.ERROR_LOGIN_FAILED;else return _fluid.FluidState.ERROR; + + default: + return _fluid.FluidState.NOT_CONNECTED; } - } else { - return _fluid.FluidState.KONNECTOR_NOT_FOUND; } }); (0, _defineProperty2.default)(this, "isFluidInPartnerIssue", (fluidType, fluidState, partnersInfo) => { @@ -96211,15 +96260,6 @@ class FluidService { return false; }); - (0, _defineProperty2.default)(this, "getFluidsConcernedByPartnerIssue", async statusArray => { - const concernedFluids = []; - statusArray.forEach(fluid => { - if (fluid.status === _fluid.FluidState.PARTNER_ISSUE) { - concernedFluids.push(fluid.fluidType); - } - }); - return concernedFluids; - }); (0, _defineProperty2.default)(this, "getFluidStatus", async partnersInfo => { const fluidConfig = new _fluidConfig.default().getFluidConfig(); const accountService = new _account.default(this._client); @@ -96234,7 +96274,8 @@ class FluidService { const lastDataDates = await consumptionService.fetchAllLastDateData([_fluid.FluidType.ELECTRICITY, _fluid.FluidType.WATER, _fluid.FluidType.GAS]); const result = [{ fluidType: _fluid.FluidType.ELECTRICITY, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && this.isFluidInPartnerIssue(_fluid.FluidType.ELECTRICITY, this.parseFluidStatus(elecKonnector, elecStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : this.parseFluidStatus(elecKonnector, elecStatus), + status: this.parseFluidStatus(elecKonnector, elecStatus), + maintenance: this.parseFluidMaintenance(_fluid.FluidType.ELECTRICITY, partnersInfo), firstDataDate: firstDataDates[_fluid.FluidType.ELECTRICITY], lastDataDate: lastDataDates[_fluid.FluidType.ELECTRICITY], connection: { @@ -96248,7 +96289,8 @@ class FluidService { } }, { fluidType: _fluid.FluidType.WATER, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && this.isFluidInPartnerIssue(_fluid.FluidType.WATER, this.parseFluidStatus(waterKonnector, waterStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : this.parseFluidStatus(waterKonnector, waterStatus), + status: this.parseFluidStatus(waterKonnector, waterStatus), + maintenance: this.parseFluidMaintenance(_fluid.FluidType.WATER, partnersInfo), firstDataDate: firstDataDates[_fluid.FluidType.WATER], lastDataDate: lastDataDates[_fluid.FluidType.WATER], connection: { @@ -96262,7 +96304,8 @@ class FluidService { } }, { fluidType: _fluid.FluidType.GAS, - status: partnersInfo !== null && partnersInfo !== void 0 && partnersInfo.notification_activated && this.isFluidInPartnerIssue(_fluid.FluidType.GAS, this.parseFluidStatus(gasKonnector, gasStatus), partnersInfo) ? _fluid.FluidState.PARTNER_ISSUE : this.parseFluidStatus(gasKonnector, gasStatus), + status: this.parseFluidStatus(gasKonnector, gasStatus), + maintenance: this.parseFluidMaintenance(_fluid.FluidType.GAS, partnersInfo), firstDataDate: firstDataDates[_fluid.FluidType.GAS], lastDataDate: lastDataDates[_fluid.FluidType.GAS], connection: { @@ -96280,6 +96323,10 @@ class FluidService { this._client = _client; } + parseFluidMaintenance(fluidType, partnersInfo) { + return Boolean((partnersInfo === null || partnersInfo === void 0 ? void 0 : partnersInfo.notification_activated) && (fluidType === _fluid.FluidType.GAS && partnersInfo.grdf_failure || fluidType === _fluid.FluidType.ELECTRICITY && partnersInfo.enedis_failure || fluidType === _fluid.FluidType.WATER && partnersInfo.egl_failure)); + } + } exports.default = FluidService; @@ -96320,199 +96367,212 @@ exports.default = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); -var _cozyClient = __webpack_require__(39); +var Sentry = _interopRequireWildcard(__webpack_require__(590)); -var _doctypes = __webpack_require__(559); +var _cozyClient = __webpack_require__(39); -var _triggers = _interopRequireDefault(__webpack_require__(727)); +var _accounts = __webpack_require__(727); -class KonnectorService { - constructor(_client) { - (0, _defineProperty2.default)(this, "_client", void 0); - this._client = _client; - } +var _accounts2 = __webpack_require__(897); - async getKonnector(id) { - const query = (0, _cozyClient.Q)(_doctypes.KONNECTORS_DOCTYPE).where({ - _id: _doctypes.KONNECTORS_DOCTYPE + '/' + id - }); - const { - data: konnector - } = await this._client.query(query); - return konnector[0] ? konnector[0] : null; - } +var _cozyLogger = _interopRequireDefault(__webpack_require__(3)); - async getKonnectorLastState(konnector, account) { - const triggerService = new _triggers.default(this._client); - const trigger = await triggerService.getTrigger(account, konnector); +var _doctypes = __webpack_require__(559); - if (trigger) { - const triggerState = await triggerService.fetchTriggerState(trigger); - return triggerState; - } +var _luxon = __webpack_require__(687); - return null; - } +var _logger = _interopRequireDefault(__webpack_require__(711)); - async createIndexKonnector() { - const query = (0, _cozyClient.Q)(_doctypes.KONNECTORS_DOCTYPE).where({ - _id: 'index' - }).limitBy(1); - const { - data: result - } = await this._client.query(query); - return result; - } +var _triggers = _interopRequireDefault(__webpack_require__(905)); -} +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -exports.default = KonnectorService; +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } -/***/ }), -/* 727 */ -/***/ (function(module, exports, __webpack_require__) { +const logStack = _cozyLogger.default.namespace('accountService'); -"use strict"; +class AccountService { + constructor(_client) { + (0, _defineProperty2.default)(this, "_client", void 0); + this._client = _client; + } + buildAccountAttributes(konnector, authData) { + return (0, _accounts2.build)(konnector, authData); + } -var _interopRequireDefault = __webpack_require__(1); + async createAccount(konnector, accountAuthData) { + const accountAttributes = this.buildAccountAttributes(konnector, accountAuthData); + return (0, _accounts.createAccount)(this._client, konnector, accountAttributes); + } -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = void 0; + async getAccount(id) { + try { + const account = await (0, _accounts.fetchAccount)(this._client, id); + return account; + } catch (error) { + const errorMessage = `Get account failed :${JSON.stringify(error)}`; + logStack('error', errorMessage); -var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); + _logger.default.error(errorMessage); -var Sentry = _interopRequireWildcard(__webpack_require__(590)); + Sentry.captureException(errorMessage); + throw new Error('Get account failed'); + } + } -var _cozyClient = __webpack_require__(39); + async getAccountByType(type) { + try { + const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ + account_type: type + }); // .indexFields(['account_type']) -var _triggers = _interopRequireDefault(__webpack_require__(728)); + const { + data: accounts + } = await this._client.query(query); -var _triggers2 = __webpack_require__(784); + if (accounts.length > 1) { + // If several account are found we will used trigger date to select the older + const triggerService = new _triggers.default(this._client); + const triggers = await Promise.all(accounts.map(_account => triggerService.getTriggerForAccount(_account))); // Keep the accountid which have the older trigger -var _cozyLogger = _interopRequireDefault(__webpack_require__(3)); + let olderDate = _luxon.DateTime.now(); -var _doctypes = __webpack_require__(559); + let olderAccountId = null; -var _fluidConfig = _interopRequireDefault(__webpack_require__(719)); + for (const _trigger of triggers) { + var _trigger$cozyMetadata; -var _logger = _interopRequireDefault(__webpack_require__(711)); + if (_trigger !== null && _trigger !== void 0 && (_trigger$cozyMetadata = _trigger.cozyMetadata) !== null && _trigger$cozyMetadata !== void 0 && _trigger$cozyMetadata.createdAt && _luxon.DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc' + }) < olderDate) { + olderDate = _luxon.DateTime.fromISO(_trigger.cozyMetadata.createdAt, { + zone: 'utc' + }); + olderAccountId = _trigger.message.account; + } + } // Retrieve the accountId and return it -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + const filteredAccounts = accounts.filter(_account => _account._id === olderAccountId); + return filteredAccounts[0] ? filteredAccounts[0] : null; + } else { + return accounts[0] ? accounts[0] : null; + } + } catch (error) { + const errorMessage = `Error GetAccountByType: ${JSON.stringify(error)}`; + logStack('error', errorMessage); -const logStack = _cozyLogger.default.namespace('triggersService'); + _logger.default.error(errorMessage); -class TriggerService { - constructor(_client) { - (0, _defineProperty2.default)(this, "_client", void 0); - this._client = _client; + Sentry.captureException(errorMessage); + return null; + } } - createTriggerAttributes(account, konnector) { - const configService = new _fluidConfig.default(); - const cronArgs = configService.getCronArgs(); - const triggerAttributes = (0, _triggers2.buildAttributes)({ - account: account, - cron: cronArgs, - folder: null, - konnector: konnector - }); - return triggerAttributes; - } + async getAccountsByType(type) { + try { + const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ + account_type: type + }); // .indexFields(['account_type']) - async createTrigger(account, konnector) { - const triggerAttributes = this.createTriggerAttributes(account, konnector); - const trigger = await (0, _triggers.default)(this._client).createTrigger(triggerAttributes); - return trigger; - } + const { + data: accounts + } = await this._client.query(query); + return accounts; + } catch (error) { + const errorMessage = `Error: GetAccountsByType: ${JSON.stringify(error)}`; + logStack('error', errorMessage); - async getTrigger(account, konnector) { - const query = (0, _cozyClient.Q)(_doctypes.TRIGGERS_DOCTYPE).where({ - 'message.account': account._id, - 'message.konnector': konnector.slug - }).indexFields(['cozyMetadata.updatedAt']).sortBy([{ - 'cozyMetadata.updatedAt': 'desc' - }]).limitBy(1); - const { - data: triggers - } = await this._client.query(query); - return triggers[0] ? triggers[0] : null; - } + _logger.default.error(errorMessage); - async getTriggerForAccount(account) { - const query = (0, _cozyClient.Q)(_doctypes.TRIGGERS_DOCTYPE).where({ - 'message.account': account._id, - 'message.konnector': account.account_type - }).indexFields(['cozyMetadata.createdAt']).sortBy([{ - 'cozyMetadata.createdAt': 'desc' - }]).limitBy(1); - const { - data: triggers - } = await this._client.query(query); - return triggers[0] ? triggers[0] : null; + Sentry.captureException(errorMessage); + return []; + } } - async fetchTriggerState(trigger) { + async updateAccount(account) { try { - const triggerState = await this._client.getStackClient().fetchJSON('GET', `/jobs/triggers/${trigger._id}`); // eslint-disable-next-line camelcase - - return triggerState.data.attributes.current_state ? triggerState.data.attributes.current_state : null; + const updatedAccount = await (0, _accounts.updateAccount)(this._client, account); + return updatedAccount; } catch (error) { - throw new Error('Fetch trigger state failed'); + const errorMessage = `Update account failed: ${JSON.stringify(error)}`; + logStack('error', errorMessage); + + _logger.default.error(errorMessage); + + Sentry.captureException(errorMessage); + throw new Error('Update account failed'); } } - async deleteTrigger(trigger) { + async deleteAccount(account) { try { - await this._client.destroy(trigger); + await (0, _accounts.deleteAccount)(this._client, account); return true; } catch (error) { - const errorMessage = `Delete trigger failed: ${JSON.stringify(error)}`; + const errorMessage = `Delete account failed`; logStack('error', errorMessage); _logger.default.error(errorMessage); Sentry.captureException(errorMessage); - throw new Error('Delete trigger failed'); + throw new Error(errorMessage); } } + async createIndexAccount() { + const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ + account_type: 'index' + }) // .indexFields(['account_type']) + .limitBy(1); + const { + data: result + } = await this._client.query(query); + return result; + } + } -exports.default = TriggerService; +exports.default = AccountService; /***/ }), -/* 728 */ +/* 727 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createTrigger", function() { return createTrigger; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchTrigger", function() { return fetchTrigger; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "launchTrigger", function() { return launchTrigger; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareTriggerAccount", function() { return prepareTriggerAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "triggersMutations", function() { return triggersMutations; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ensureTrigger", function() { return ensureTrigger; }); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ACCOUNTS_DOCTYPE", function() { return ACCOUNTS_DOCTYPE; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createAccount", function() { return createAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createAccountQuerySpec", function() { return createAccountQuerySpec; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccount", function() { return fetchAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccount", function() { return updateAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveAccount", function() { return saveAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteAccount", function() { return deleteAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccountsFromTriggers", function() { return fetchAccountsFromTriggers; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccountsWithoutTriggers", function() { return fetchAccountsWithoutTriggers; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchReusableAccount", function() { return fetchReusableAccount; }); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58); /* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); /* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(729); -/* harmony import */ var cozy_doctypes__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(784); -/* harmony import */ var _helpers_accounts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(948); -/* harmony import */ var _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(940); -/* harmony import */ var _helpers_cron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(952); -/* harmony import */ var _accounts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(955); -/* harmony import */ var _files__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(957); +/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39); +/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cozy_client__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(728); +/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(295); +/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_merge__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var lodash_keyBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(381); +/* harmony import */ var lodash_keyBy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash_keyBy__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(899); +/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(904); + +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } @@ -96521,33 +96581,49 @@ __webpack_require__.r(__webpack_exports__); -var FILES_DOCTYPE = 'io.cozy.files'; +var ACCOUNTS_DOCTYPE = 'io.cozy.accounts'; var PERMISSIONS_DOCTYPE = 'io.cozy.permissions'; -var TRIGGERS_DOCTYPE = 'io.cozy.triggers'; /** - * Creates a trigger with given attributes - * @param {Object} client CozyClient - * @param {Object} attributes - * @return {Object} Created trigger + * Create an account for the given konnector. + * @param {Object} client CozyClient + * @param {Object} konnector io.cozy.konnectors document + * @param {Object} attributes Account attributes */ -var createTrigger = /*#__PURE__*/function () { - var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee(client, attributes) { - var _yield$client$collect, data; +var createAccount = /*#__PURE__*/function () { + var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee(client, konnector, attributes) { + var _ref2, data; return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: - _context.next = 2; - return client.collection(TRIGGERS_DOCTYPE).create(attributes); + if (!konnector.aggregator) { + _context.next = 6; + break; + } - case 2: - _yield$client$collect = _context.sent; - data = _yield$client$collect.data; + _context.next = 3; + return createChildAccount(client, konnector, attributes); + + case 3: + _context.t0 = _context.sent; + _context.next = 9; + break; + + case 6: + _context.next = 8; + return client.create(ACCOUNTS_DOCTYPE, attributes); + + case 8: + _context.t0 = _context.sent; + + case 9: + _ref2 = _context.t0; + data = _ref2.data; return _context.abrupt("return", data); - case 5: + case 12: case "end": return _context.stop(); } @@ -96555,15556 +96631,15648 @@ var createTrigger = /*#__PURE__*/function () { }, _callee); })); - return function createTrigger(_x, _x2) { + return function createAccount(_x, _x2, _x3) { return _ref.apply(this, arguments); }; }(); +var createAccountQuerySpec = function createAccountQuerySpec(accountId) { + if (!accountId) { + throw new Error('createAccountQuerySpec called with undefined accountId'); + } + + return { + query: Object(cozy_client__WEBPACK_IMPORTED_MODULE_3__["Q"])(ACCOUNTS_DOCTYPE).getById(accountId), + as: "io.cozy.accounts/".concat(accountId) + }; +}; /** - * Fetch the trigger based on its id - * @param {Object} client CozyClient - * @param {string} id - * @return {Object} Fetched trigger data + * Fetches an account + * Returns null if the account does not exist + * @param {Object} client CozyClient + * @param {string} id io.cozy.accounts document's id + * @return {Object} Retrieved account */ -var fetchTrigger = /*#__PURE__*/function () { - var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee2(client, id) { - var _yield$client$collect2, data; +var fetchAccount = /*#__PURE__*/function () { + var _ref3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee2(client, id) { + var qspec, _yield$client$query, data; return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: - _context2.next = 2; - return client.collection(TRIGGERS_DOCTYPE).get(id); + _context2.prev = 0; + qspec = createAccountQuerySpec(id); + _context2.next = 4; + return client.query(qspec.query, qspec); - case 2: - _yield$client$collect2 = _context2.sent; - data = _yield$client$collect2.data; + case 4: + _yield$client$query = _context2.sent; + data = _yield$client$query.data; return _context2.abrupt("return", data); - case 5: + case 9: + _context2.prev = 9; + _context2.t0 = _context2["catch"](0); + + if (!(_context2.t0.status === 404)) { + _context2.next = 13; + break; + } + + return _context2.abrupt("return", null); + + case 13: + throw _context2.t0; + + case 14: case "end": return _context2.stop(); } } - }, _callee2); + }, _callee2, null, [[0, 9]]); })); - return function fetchTrigger(_x3, _x4) { - return _ref2.apply(this, arguments); + return function fetchAccount(_x4, _x5) { + return _ref3.apply(this, arguments); }; }(); /** - * Triggers job associated to given trigger - * @param {Object} client CozyClient - * @param {Object} Trigger to launch - * @return {Object} Job document + * Creates an account for an konnector needing an aggregator account. + * Creates the aggregator account as well if it does not exist. + * @param {Object} client CozyClient + * @param {Object} konnector io.cozy.konnectors document + * @param {Object} attributes Account attibutes + * @return {Object} The created io.cozy.accounts document */ -var launchTrigger = /*#__PURE__*/function () { - var _ref3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee3(client, trigger) { - var _yield$client$collect3, data; - +var createChildAccount = /*#__PURE__*/function () { + var _ref4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee3(client, konnector, attributes) { + var aggregator, parentAccountId, parentAccount; return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: - _context3.next = 2; - return client.collection(TRIGGERS_DOCTYPE).launch(trigger); - - case 2: - _yield$client$collect3 = _context3.sent; - data = _yield$client$collect3.data; - return _context3.abrupt("return", data); - - case 5: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })); - - return function launchTrigger(_x5, _x6) { - return _ref3.apply(this, arguments); - }; -}(); -var prepareTriggerAccount = /*#__PURE__*/function () { - var _ref4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee4(client, trigger) { - var accountId, account; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - accountId = _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"](trigger); + aggregator = konnector.aggregator; - if (accountId) { - _context4.next = 3; + if (!(!aggregator || !aggregator.accountId)) { + _context3.next = 3; break; } - throw new Error('No account id in the trigger'); + throw new Error('Konnector does not provide aggregator account id'); case 3: - _context4.next = 5; - return Object(_accounts__WEBPACK_IMPORTED_MODULE_8__["fetchAccount"])(client, accountId); + parentAccountId = aggregator.accountId; + _context3.prev = 4; + _context3.next = 7; + return fetchAccount(client, parentAccountId); - case 5: - account = _context4.sent; + case 7: + parentAccount = _context3.sent; + _context3.next = 13; + break; - if (account) { - _context4.next = 8; + case 10: + _context3.prev = 10; + _context3.t0 = _context3["catch"](4); + throw new Error("An error occurred when finding parent account ".concat(parentAccountId, " (").concat(_context3.t0.message, ")")); + + case 13: + if (parentAccount) { + _context3.next = 23; break; } - throw new Error("Could not find account ".concat(accountId, " for trigger ").concat(trigger._id)); + _context3.prev = 14; + _context3.next = 17; + return client.create(ACCOUNTS_DOCTYPE, { + _id: parentAccountId + }); - case 8: - return _context4.abrupt("return", Object(_accounts__WEBPACK_IMPORTED_MODULE_8__["updateAccount"])(client, _helpers_accounts__WEBPACK_IMPORTED_MODULE_5__["resetState"](account))); + case 17: + parentAccount = _context3.sent; + _context3.next = 23; + break; - case 9: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); + case 20: + _context3.prev = 20; + _context3.t1 = _context3["catch"](14); + throw new Error("Cannot create parent account ".concat(parentAccountId, " (").concat(_context3.t1.message, ")")); - return function prepareTriggerAccount(_x7, _x8) { - return _ref4.apply(this, arguments); - }; -}(); -/** - * Return triggers mutations - * @param {Object} client CozyClient - * @return {Object} Object containing mutations - */ + case 23: + _context3.prev = 23; + _context3.next = 26; + return client.collection(PERMISSIONS_DOCTYPE).add(konnector, { + aggregatorAccount: { + type: ACCOUNTS_DOCTYPE, + verbs: ['GET', 'PUT'], + values: ["".concat(ACCOUNTS_DOCTYPE, ".").concat(parentAccountId)] + } + }); -var triggersMutations = function triggersMutations(client) { - return { - createTrigger: createTrigger.bind(null, client), - fetchTrigger: fetchTrigger.bind(null, client), - launchTrigger: launchTrigger.bind(null, client) + case 26: + _context3.next = 32; + break; + + case 28: + _context3.prev = 28; + _context3.t2 = _context3["catch"](23); + _logger__WEBPACK_IMPORTED_MODULE_8__["default"].warn(_context3.t2); + throw new Error("Cannot set permission for account ".concat(parentAccountId, " (").concat(_context3.t2.message, ")")); + + case 32: + _context3.next = 34; + return client.create(ACCOUNTS_DOCTYPE, _objectSpread(_objectSpread({}, attributes), {}, { + relationships: { + parent: { + data: { + _id: parentAccountId, + _type: ACCOUNTS_DOCTYPE + } + } + } + })); + + case 34: + return _context3.abrupt("return", _context3.sent); + + case 35: + case "end": + return _context3.stop(); + } + } + }, _callee3, null, [[4, 10], [14, 20], [23, 28]]); + })); + + return function createChildAccount(_x6, _x7, _x8) { + return _ref4.apply(this, arguments); }; -}; +}(); +/** + * Updates existing account + * @param {Object} client CozyClient + * @param {Object} account io.cozy.accounts document to update + * @return {Object} Updated io.cozy.accounts document + */ -var ensureKonnectorFolder = /*#__PURE__*/function () { - var _ref6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee5(client, _ref5) { - var konnector, account, t, permissions, files, CozyFolder, _yield$Promise$all, _yield$Promise$all2, adminFolder, photosFolder, path, folder; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee5$(_context5) { +var updateAccount = /*#__PURE__*/function () { + var _ref5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee4(client, account) { + var _yield$client$save, data, upToDateAccount, _yield$client$save2, _data; + + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee4$(_context4) { while (1) { - switch (_context5.prev = _context5.next) { + switch (_context4.prev = _context4.next) { case 0: - konnector = _ref5.konnector, account = _ref5.account, t = _ref5.t; - permissions = client.collection(PERMISSIONS_DOCTYPE); - files = client.collection(FILES_DOCTYPE); - CozyFolder = cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__["CozyFolder"].copyWithClient(client); - _context5.next = 6; - return Promise.all([CozyFolder.ensureMagicFolder(CozyFolder.magicFolders.ADMINISTRATIVE, "/".concat(t('folder.administrative'))), CozyFolder.ensureMagicFolder(CozyFolder.magicFolders.PHOTOS, "/".concat(t('folder.photos')))]); + _context4.prev = 0; + _context4.next = 3; + return client.save(account); - case 6: - _yield$Promise$all = _context5.sent; - _yield$Promise$all2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_yield$Promise$all, 2); - adminFolder = _yield$Promise$all2[0]; - photosFolder = _yield$Promise$all2[1]; - path = _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["buildFolderPath"](konnector, account, { - administrative: adminFolder.path, - photos: photosFolder.path - }); - _context5.next = 13; - return Object(_files__WEBPACK_IMPORTED_MODULE_9__["statDirectoryByPath"])(client, path); + case 3: + _yield$client$save = _context4.sent; + data = _yield$client$save.data; + return _context4.abrupt("return", data); - case 13: - _context5.t0 = _context5.sent; + case 8: + _context4.prev = 8; + _context4.t0 = _context4["catch"](0); - if (_context5.t0) { - _context5.next = 18; + if (!(_context4.t0.status === 409)) { + _context4.next = 22; break; } - _context5.next = 17; - return Object(_files__WEBPACK_IMPORTED_MODULE_9__["createDirectoryByPath"])(client, path); + _context4.next = 13; + return fetchAccount(client, account._id); - case 17: - _context5.t0 = _context5.sent; + case 13: + upToDateAccount = _context4.sent; + delete account._rev; + _context4.next = 17; + return client.save(lodash_merge__WEBPACK_IMPORTED_MODULE_5___default()(upToDateAccount, account)); - case 18: - folder = _context5.t0; - _context5.next = 21; - return permissions.add(konnector, _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["buildFolderPermission"](folder)); + case 17: + _yield$client$save2 = _context4.sent; + _data = _yield$client$save2.data; + return _context4.abrupt("return", _data); - case 21: - _context5.next = 23; - return files.addReferencesTo(konnector, [folder]); + case 22: + throw _context4.t0; case 23: - return _context5.abrupt("return", folder); - - case 24: case "end": - return _context5.stop(); + return _context4.stop(); } } - }, _callee5); + }, _callee4, null, [[0, 8]]); })); - return function ensureKonnectorFolder(_x9, _x10) { - return _ref6.apply(this, arguments); + return function updateAccount(_x9, _x10) { + return _ref5.apply(this, arguments); }; }(); +/** + * Creates or updates account + * @param {Object} client CozyClient + * @param {Object} konnector io.cozy.konnectors document + * @param {Object} authData Account auth attribute + */ -var ensureTrigger = /*#__PURE__*/function () { - var _ref8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee6(client, _ref7) { - var trigger, account, konnector, t, folder; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee6$(_context6) { +var saveAccount = function saveAccount(client, konnector, account) { + Object(_assert__WEBPACK_IMPORTED_MODULE_7__["default"])(client && konnector && account, 'Must pass both client, konnector and account to saveAccount'); + return account._id ? updateAccount(client, account) : createAccount(client, konnector, account); +}; +/** + * Deletes an account. + * @param {Object} client CozyClient + * @param {Object} account io.cozy.accounts document + */ + +var deleteAccount = /*#__PURE__*/function () { + var _ref6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee5(client, account) { + var syncedAccount; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee5$(_context5) { while (1) { - switch (_context6.prev = _context6.next) { + switch (_context5.prev = _context5.next) { case 0: - trigger = _ref7.trigger, account = _ref7.account, konnector = _ref7.konnector, t = _ref7.t; + _context5.prev = 0; + _context5.next = 3; + return client.destroy(account); - if (!trigger) { - _context6.next = 3; - break; - } + case 3: + _context5.next = 16; + break; - return _context6.abrupt("return", trigger); + case 5: + _context5.prev = 5; + _context5.t0 = _context5["catch"](0); - case 3: - if (!_helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["needsFolder"](konnector)) { - _context6.next = 7; + if (!(_context5.t0.status === 409)) { + _context5.next = 15; break; } - _context6.next = 6; - return ensureKonnectorFolder(client, { - konnector: konnector, - account: account, - t: t - }); + _context5.next = 10; + return fetchAccount(client, account._id); - case 6: - folder = _context6.sent; + case 10: + syncedAccount = _context5.sent; + _context5.next = 13; + return client.destroy(syncedAccount); - case 7: - _context6.next = 9; - return createTrigger(client, _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["buildAttributes"]({ - account: account, - cron: _helpers_cron__WEBPACK_IMPORTED_MODULE_7__["default"].fromKonnector(konnector), - folder: folder, - konnector: konnector - })); + case 13: + _context5.next = 16; + break; - case 9: - return _context6.abrupt("return", _context6.sent); + case 15: + throw _context5.t0; - case 10: + case 16: case "end": - return _context6.stop(); + return _context5.stop(); } } - }, _callee6); + }, _callee5, null, [[0, 5]]); })); - return function ensureTrigger(_x11, _x12) { - return _ref8.apply(this, arguments); + return function deleteAccount(_x11, _x12) { + return _ref6.apply(this, arguments); }; }(); -/* harmony default export */ __webpack_exports__["default"] = (triggersMutations); +/** + * Returns { trigger, account } list + */ -/***/ }), -/* 729 */ -/***/ (function(module, exports, __webpack_require__) { +var fetchAccountsFromTriggers = /*#__PURE__*/function () { + var _ref7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee6(client, triggers) { + var accountCol, accountIdToTrigger, accountIds, _yield$accountCol$get, accounts; -const Account = __webpack_require__(730) -const AdministrativeProcedure = __webpack_require__(754) -const Application = __webpack_require__(759) -const Document = __webpack_require__(731) -const BalanceHistory = __webpack_require__(760) -const BankAccount = __webpack_require__(761) -const BankingReconciliator = __webpack_require__(766) -const BankTransaction = __webpack_require__(767) -const BankAccountStats = __webpack_require__(777) -const Contact = __webpack_require__(755) -const CozyFile = __webpack_require__(780) -const CozyFolder = __webpack_require__(781) -const Group = __webpack_require__(782) -const Permission = __webpack_require__(783) + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + accountCol = client.collection('io.cozy.accounts'); + accountIdToTrigger = lodash_keyBy__WEBPACK_IMPORTED_MODULE_6___default()(triggers, _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"]); + accountIds = Object.keys(accountIdToTrigger); + _context6.next = 5; + return accountCol.getAll(accountIds); -module.exports = { - Account, - AdministrativeProcedure, - Application, - Document, - BalanceHistory, - BankAccount, - BankingReconciliator, - BankTransaction, - BankAccountStats, - Contact, - CozyFile, - CozyFolder, - Group, - registerClient: Document.registerClient, - Permission -} - - -/***/ }), -/* 730 */ -/***/ (function(module, exports, __webpack_require__) { + case 5: + _yield$accountCol$get = _context6.sent; + accounts = _yield$accountCol$get.data; + return _context6.abrupt("return", accounts.filter(Boolean).map(function (account) { + return { + account: account, + trigger: accountIdToTrigger[account._id] + }; + })); -/* eslint-disable node/no-unsupported-features/es-syntax */ -const Document = __webpack_require__(731) -const pickBy = __webpack_require__(329) -const get = __webpack_require__(162) + case 8: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); -const ACCOUNTS_DOCTYPE = 'io.cozy.accounts' + return function fetchAccountsFromTriggers(_x13, _x14) { + return _ref7.apply(this, arguments); + }; +}(); +/** + * Returns the list of accounts which do not have any associated trigger + * + * @param {CozyClient} client CozyClient + * @param {Array} triggers io.cozy.triggers documents + */ -// Order matters -const probableLoginFieldNames = [ - 'login', - 'identifier', - 'new_identifier', - 'email' -] +var fetchAccountsWithoutTriggers = /*#__PURE__*/function () { + var _ref8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee7(client, triggers) { + var triggerAccountIds; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee7$(_context7) { + while (1) { + switch (_context7.prev = _context7.next) { + case 0: + triggerAccountIds = triggers.map(function (trigger) { + return _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"](trigger); + }).filter(function (id) { + return !!id; + }); + _context7.next = 3; + return client.query(Object(cozy_client__WEBPACK_IMPORTED_MODULE_3__["Q"])(ACCOUNTS_DOCTYPE).where({ + _id: { + $nin: triggerAccountIds + } + })); -class Account extends Document { - static getAccountName(account) { - if (!account) return null - if (account.auth) { - return ( - account.auth.accountName || this.getAccountLogin(account) || account._id - ) - } else { - return account._id - } - } + case 3: + return _context7.abrupt("return", _context7.sent.data); - static getAccountLogin(account) { - if (account && account.auth) { - for (const fieldName of probableLoginFieldNames) { - if (account.auth[fieldName]) return account.auth[fieldName] + case 4: + case "end": + return _context7.stop(); + } } - } - } + }, _callee7); + })); - /** - * Create an account document from a vault cipher - * - * @param {Object} cipher - * @param {Object} [options={}] - * @param {string} [options.identifierProperty=login] - The name of the identifier property to use for this account - * - * @returns {Object} - */ - static fromCipher(cipher, options = {}) { - const opts = { - identifierProperty: 'login', - ...options - } + return function fetchAccountsWithoutTriggers(_x15, _x16) { + return _ref8.apply(this, arguments); + }; +}(); +/** + * Returns an account without trigger for the given konnector + * + * @param {CozyClient} client - Cozy client + * @param {Konnector} konnector - Konnector + * @return {Account} An account without trigger for the given konnector + */ - const customFields = (get(cipher, 'fields') || []).reduce( - (fields, field) => { - fields[field.name] = field.value +var fetchReusableAccount = /*#__PURE__*/function () { + var _ref9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee8(client, konnector) { + var _yield$client$collect, triggers, accountsWithoutTrigger; - return fields - }, - {} - ) + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee8$(_context8) { + while (1) { + switch (_context8.prev = _context8.next) { + case 0: + _context8.next = 2; + return client.collection('io.cozy.triggers').all(); - const account = { - auth: pickBy( - { - [opts.identifierProperty]: get(cipher, 'login.username', ''), - password: get(cipher, 'login.password', ''), - ...customFields - }, - value => Boolean(value) - ) - } + case 2: + _yield$client$collect = _context8.sent; + triggers = _yield$client$collect.data; + _context8.next = 6; + return fetchAccountsWithoutTriggers(client, triggers); - if (cipher) { - account.relationships = { - vaultCipher: { - _id: cipher.id, - _type: 'com.bitwarden.ciphers', - _protocol: 'bitwarden' + case 6: + accountsWithoutTrigger = _context8.sent; + return _context8.abrupt("return", accountsWithoutTrigger.find(function (account) { + return account.account_type === konnector.slug; + })); + + case 8: + case "end": + return _context8.stop(); } } - } + }, _callee8); + })); - return account - } -} + return function fetchReusableAccount(_x17, _x18) { + return _ref9.apply(this, arguments); + }; +}(); -Account.schema = { - doctype: ACCOUNTS_DOCTYPE, - attributes: {}, - relationships: { - master: { - type: 'has-one', - doctype: ACCOUNTS_DOCTYPE - } - } -} +/***/ }), +/* 728 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -Account.probableLoginFieldNames = probableLoginFieldNames +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildAttributes", function() { return buildAttributes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAccountId", function() { return getAccountId; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorJobError", function() { return getKonnectorJobError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLastSuccessDate", function() { return getLastSuccessDate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorSlug", function() { return getKonnectorSlug; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorStatus", function() { return getKonnectorStatus; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isKonnectorRunning", function() { return isKonnectorRunning; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFrequency", function() { return getFrequency; }); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(729); +/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(date_fns__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(162); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _konnectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(889); +/* harmony import */ var _cron__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(901); -module.exports = Account +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -/***/ }), -/* 731 */ -/***/ (function(module, exports, __webpack_require__) { +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -/* eslint-disable node/no-unsupported-features/es-syntax */ -const omit = __webpack_require__(286) -const pick = __webpack_require__(346) -const size = __webpack_require__(434) -const omitBy = __webpack_require__(732) -const isUndefined = __webpack_require__(734) -const fromPairs = __webpack_require__(181) -const pickBy = __webpack_require__(329) -const flatMap = __webpack_require__(735) -const groupBy = __webpack_require__(386) -const sortBy = __webpack_require__(485) -const get = __webpack_require__(162) -const { parallelMap } = __webpack_require__(737) -const CozyClient = __webpack_require__(42).default -const Q = __webpack_require__(260).Q -const log = __webpack_require__(739).namespace('Document') -const querystring = __webpack_require__(753) -const DATABASE_DOES_NOT_EXIST = 'Database does not exist.' + + + +var DEFAULT_CRON = '0 0 0 * * 0'; // Once a week, sunday at midnight /** - * Tell of two object attributes have any difference + * Build trigger attributes given konnector and account + * @param {object} konnector + * @param {object} account + * @return {object} created trigger */ -function isDifferent(o1, o2) { - // This is not supposed to happen - if (Object.keys(o1).length === 0) return true - for (let key in o1) { - if (o1[key] !== o2[key]) { - return true - } - } - return false -} +var buildAttributes = function buildAttributes(_ref) { + var account = _ref.account, + _ref$cron = _ref.cron, + cron = _ref$cron === void 0 ? DEFAULT_CRON : _ref$cron, + folder = _ref.folder, + konnector = _ref.konnector; + var message = { + account: account._id, + konnector: konnector.slug + }; -const indexes = {} + if (folder) { + message['folder_to_save'] = folder._id; + } -// Attributes that will not be updated since the -// user can change them -const userAttributes = ['shortLabel'] - -function sanitizeKey(key) { - if (key.startsWith('\\')) { - return key.slice(1) - } + var result = { + worker: 'konnector', + message: message + }; + var options = konnector.clientSide ? { + type: '@client' + } : { + type: '@cron', + arguments: cron + }; + return _objectSpread(_objectSpread({}, result), options); +}; +var getAccountId = function getAccountId(trigger) { + return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'message.account'); +}; +/** + * Get error for a given trigger document + * @param {Object} trigger io.cozy.trigger as returned by stack + * @return {KonnectorJobError} [description] + */ - return key -} +var getKonnectorJobError = function getKonnectorJobError(trigger) { + var status = lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.status'); + return status === 'errored' ? new _konnectors__WEBPACK_IMPORTED_MODULE_3__["KonnectorJobError"](lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.last_error')) : null; +}; +/** + * Get last success date + * @param {Object} trigger io.cozy.trigger as returned by stack + * @return {Date} Last success date or null if the trigger has never been + * launched. + */ -function updateCreatedByApp(cozyMetadata, appSlug) { - if (!cozyMetadata.updatedByApps) { - cozyMetadata.updatedByApps = [] - } - const now = new Date() - for (const appInfo of cozyMetadata.updatedByApps) { - if (appInfo.slug === appSlug) { - appInfo.date = now - return - } - } - cozyMetadata.updatedByApps.push({ slug: appSlug, date: now }) -} +var getLastSuccessDate = function getLastSuccessDate(trigger) { + var lastSuccessDate = !!trigger && !!trigger.current_state && trigger.current_state.last_success; + if (!lastSuccessDate) return null; + return date_fns__WEBPACK_IMPORTED_MODULE_1___default.a.parse(lastSuccessDate); +}; +var getKonnectorSlug = function getKonnectorSlug(trigger) { + return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'message.konnector'); +}; +var getKonnectorStatus = function getKonnectorStatus(trigger) { + return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.status'); +}; +var isKonnectorRunning = function isKonnectorRunning(trigger) { + return getKonnectorStatus(trigger) === 'running'; +}; +/** + * Get frenquency of a cron trigger, based on its arguments. + * @param {Object} trigger io.cozy.triggers as returned by stack + * @return {String} Frequency value, between 'monthly', 'weekly', + * 'daily', 'hourly' or null. + */ -const withoutUndefined = x => omitBy(x, isUndefined) +var getFrequency = function getFrequency(trigger) { + if (!trigger || !trigger.type === '@cron') return null; + return Object(_cron__WEBPACK_IMPORTED_MODULE_4__["toFrequency"])(trigger.arguments); +}; +var helpers = { + buildAttributes: buildAttributes, + isKonnectorRunning: isKonnectorRunning, + getAccountId: getAccountId, + getKonnectorJobError: getKonnectorJobError, + getFrequency: getFrequency, + getKonnectorSlug: getKonnectorSlug, + getKonnectorStatus: getKonnectorStatus, + getLastSuccessDate: getLastSuccessDate +}; +/* harmony default export */ __webpack_exports__["default"] = (helpers); -const flagForDeletion = x => Object.assign({}, x, { _deleted: true }) +/***/ }), +/* 729 */ +/***/ (function(module, exports, __webpack_require__) { -const getDocumentUpdateDate = doc => { - const d = doc.cozyMetadata && doc.cozyMetadata.updatedAt - return d ? new Date(d) : null +module.exports = { + addDays: __webpack_require__(730), + addHours: __webpack_require__(734), + addISOYears: __webpack_require__(736), + addMilliseconds: __webpack_require__(735), + addMinutes: __webpack_require__(744), + addMonths: __webpack_require__(745), + addQuarters: __webpack_require__(747), + addSeconds: __webpack_require__(748), + addWeeks: __webpack_require__(749), + addYears: __webpack_require__(750), + areRangesOverlapping: __webpack_require__(751), + closestIndexTo: __webpack_require__(752), + closestTo: __webpack_require__(753), + compareAsc: __webpack_require__(754), + compareDesc: __webpack_require__(755), + differenceInCalendarDays: __webpack_require__(742), + differenceInCalendarISOWeeks: __webpack_require__(756), + differenceInCalendarISOYears: __webpack_require__(757), + differenceInCalendarMonths: __webpack_require__(758), + differenceInCalendarQuarters: __webpack_require__(759), + differenceInCalendarWeeks: __webpack_require__(761), + differenceInCalendarYears: __webpack_require__(762), + differenceInDays: __webpack_require__(763), + differenceInHours: __webpack_require__(764), + differenceInISOYears: __webpack_require__(766), + differenceInMilliseconds: __webpack_require__(765), + differenceInMinutes: __webpack_require__(768), + differenceInMonths: __webpack_require__(769), + differenceInQuarters: __webpack_require__(770), + differenceInSeconds: __webpack_require__(771), + differenceInWeeks: __webpack_require__(772), + differenceInYears: __webpack_require__(773), + distanceInWords: __webpack_require__(774), + distanceInWordsStrict: __webpack_require__(779), + distanceInWordsToNow: __webpack_require__(780), + eachDay: __webpack_require__(781), + endOfDay: __webpack_require__(782), + endOfHour: __webpack_require__(783), + endOfISOWeek: __webpack_require__(784), + endOfISOYear: __webpack_require__(786), + endOfMinute: __webpack_require__(787), + endOfMonth: __webpack_require__(788), + endOfQuarter: __webpack_require__(789), + endOfSecond: __webpack_require__(790), + endOfToday: __webpack_require__(791), + endOfTomorrow: __webpack_require__(792), + endOfWeek: __webpack_require__(785), + endOfYear: __webpack_require__(793), + endOfYesterday: __webpack_require__(794), + format: __webpack_require__(795), + getDate: __webpack_require__(800), + getDay: __webpack_require__(801), + getDayOfYear: __webpack_require__(796), + getDaysInMonth: __webpack_require__(746), + getDaysInYear: __webpack_require__(802), + getHours: __webpack_require__(804), + getISODay: __webpack_require__(805), + getISOWeek: __webpack_require__(798), + getISOWeeksInYear: __webpack_require__(806), + getISOYear: __webpack_require__(737), + getMilliseconds: __webpack_require__(807), + getMinutes: __webpack_require__(808), + getMonth: __webpack_require__(809), + getOverlappingDaysInRanges: __webpack_require__(810), + getQuarter: __webpack_require__(760), + getSeconds: __webpack_require__(811), + getTime: __webpack_require__(812), + getYear: __webpack_require__(813), + isAfter: __webpack_require__(814), + isBefore: __webpack_require__(815), + isDate: __webpack_require__(733), + isEqual: __webpack_require__(816), + isFirstDayOfMonth: __webpack_require__(817), + isFriday: __webpack_require__(818), + isFuture: __webpack_require__(819), + isLastDayOfMonth: __webpack_require__(820), + isLeapYear: __webpack_require__(803), + isMonday: __webpack_require__(821), + isPast: __webpack_require__(822), + isSameDay: __webpack_require__(823), + isSameHour: __webpack_require__(824), + isSameISOWeek: __webpack_require__(826), + isSameISOYear: __webpack_require__(828), + isSameMinute: __webpack_require__(829), + isSameMonth: __webpack_require__(831), + isSameQuarter: __webpack_require__(832), + isSameSecond: __webpack_require__(834), + isSameWeek: __webpack_require__(827), + isSameYear: __webpack_require__(836), + isSaturday: __webpack_require__(837), + isSunday: __webpack_require__(838), + isThisHour: __webpack_require__(839), + isThisISOWeek: __webpack_require__(840), + isThisISOYear: __webpack_require__(841), + isThisMinute: __webpack_require__(842), + isThisMonth: __webpack_require__(843), + isThisQuarter: __webpack_require__(844), + isThisSecond: __webpack_require__(845), + isThisWeek: __webpack_require__(846), + isThisYear: __webpack_require__(847), + isThursday: __webpack_require__(848), + isToday: __webpack_require__(849), + isTomorrow: __webpack_require__(850), + isTuesday: __webpack_require__(851), + isValid: __webpack_require__(799), + isWednesday: __webpack_require__(852), + isWeekend: __webpack_require__(853), + isWithinRange: __webpack_require__(854), + isYesterday: __webpack_require__(855), + lastDayOfISOWeek: __webpack_require__(856), + lastDayOfISOYear: __webpack_require__(858), + lastDayOfMonth: __webpack_require__(859), + lastDayOfQuarter: __webpack_require__(860), + lastDayOfWeek: __webpack_require__(857), + lastDayOfYear: __webpack_require__(861), + max: __webpack_require__(862), + min: __webpack_require__(863), + parse: __webpack_require__(731), + setDate: __webpack_require__(864), + setDay: __webpack_require__(865), + setDayOfYear: __webpack_require__(866), + setHours: __webpack_require__(867), + setISODay: __webpack_require__(868), + setISOWeek: __webpack_require__(869), + setISOYear: __webpack_require__(740), + setMilliseconds: __webpack_require__(870), + setMinutes: __webpack_require__(871), + setMonth: __webpack_require__(872), + setQuarter: __webpack_require__(873), + setSeconds: __webpack_require__(874), + setYear: __webpack_require__(875), + startOfDay: __webpack_require__(743), + startOfHour: __webpack_require__(825), + startOfISOWeek: __webpack_require__(738), + startOfISOYear: __webpack_require__(741), + startOfMinute: __webpack_require__(830), + startOfMonth: __webpack_require__(876), + startOfQuarter: __webpack_require__(833), + startOfSecond: __webpack_require__(835), + startOfToday: __webpack_require__(877), + startOfTomorrow: __webpack_require__(878), + startOfWeek: __webpack_require__(739), + startOfYear: __webpack_require__(797), + startOfYesterday: __webpack_require__(879), + subDays: __webpack_require__(880), + subHours: __webpack_require__(881), + subISOYears: __webpack_require__(767), + subMilliseconds: __webpack_require__(882), + subMinutes: __webpack_require__(883), + subMonths: __webpack_require__(884), + subQuarters: __webpack_require__(885), + subSeconds: __webpack_require__(886), + subWeeks: __webpack_require__(887), + subYears: __webpack_require__(888) } -const newestDocumentComparisonFunc = doc => { - const d = getDocumentUpdateDate(doc) - return d ? -d : 0 -} -class Document { - /** - * Registers a client - * - * @param {Client} client - Cozy client from either cozy-client or cozy-client-js - */ - static registerClient(client) { - if (!this.cozyClient) { - this.cozyClient = client - } else { - // eslint-disable-next-line no-console - console.warn( - 'Document already has been registered, this is not possible to re-register as the client is shared globally between all classes. This is to prevent concurrency bugs.' - ) - throw new Error('Document cannot be re-registered to a client.') - } - } +/***/ }), +/* 730 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * @static copyWithClient - Returns a new class bound to a client - * - * @param {type} client Client instance - * @returns {type} A new class, with the client registered - */ - static copyWithClient(client) { - const BaseClass = this - class ExtendedClass extends BaseClass {} - ExtendedClass.cozyClient = null - ExtendedClass.registerClient(client) - return ExtendedClass - } +var parse = __webpack_require__(731) - /** - * Returns true if Document uses a CozyClient (from cozy-client package) - * - * @returns {boolean} true if Document uses a CozyClient - **/ - static usesCozyClient() { - return this.cozyClient instanceof CozyClient - } +/** + * @category Day Helpers + * @summary Add the specified number of days to the given date. + * + * @description + * Add the specified number of days to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of days to be added + * @returns {Date} the new date with the days added + * + * @example + * // Add 10 days to 1 September 2014: + * var result = addDays(new Date(2014, 8, 1), 10) + * //=> Thu Sep 11 2014 00:00:00 + */ +function addDays (dirtyDate, dirtyAmount) { + var date = parse(dirtyDate) + var amount = Number(dirtyAmount) + date.setDate(date.getDate() + amount) + return date +} - static getIndex(doctype, fields) { - if (this.usesCozyClient()) { - throw new Error('This method is not implemented yet with CozyClient') - } +module.exports = addDays - return this.getIndexViaOldClient(doctype, fields) - } - static getIndexViaOldClient(doctype, fields) { - const key = `${doctype}:${fields.slice().join(',')}` - const index = indexes[key] - if (!index) { - indexes[key] = this.cozyClient.data - .defineIndex(doctype, fields) - .then(index => { - indexes[key] = index - return index - }) - } - return Promise.resolve(indexes[key]) - } +/***/ }), +/* 731 */ +/***/ (function(module, exports, __webpack_require__) { - static addCozyMetadata(attributes) { - if (!attributes.cozyMetadata) { - attributes.cozyMetadata = {} - } +var getTimezoneOffsetInMilliseconds = __webpack_require__(732) +var isDate = __webpack_require__(733) - attributes.cozyMetadata.updatedAt = new Date() +var MILLISECONDS_IN_HOUR = 3600000 +var MILLISECONDS_IN_MINUTE = 60000 +var DEFAULT_ADDITIONAL_DIGITS = 2 - if (!attributes.cozyMetadata.createdByApp && this.createdByApp) { - attributes.cozyMetadata.createdByApp = this.createdByApp - } +var parseTokenDateTimeDelimeter = /[T ]/ +var parseTokenPlainTime = /:/ - if (this.createdByApp) { - updateCreatedByApp(attributes.cozyMetadata, this.createdByApp) - } +// year tokens +var parseTokenYY = /^(\d{2})$/ +var parseTokensYYY = [ + /^([+-]\d{2})$/, // 0 additional digits + /^([+-]\d{3})$/, // 1 additional digit + /^([+-]\d{4})$/ // 2 additional digits +] - return attributes - } +var parseTokenYYYY = /^(\d{4})/ +var parseTokensYYYYY = [ + /^([+-]\d{4})/, // 0 additional digits + /^([+-]\d{5})/, // 1 additional digit + /^([+-]\d{6})/ // 2 additional digits +] - /** - * Returns the item that has this id - * - * @param {string} id - The id of an item in the collection - * @returns {object} - The collection's item that has this id - * - */ - static async get(id) { - if (!this.usesCozyClient()) { - throw new Error('This method is not implemented with cozy-client-js') - } +// date tokens +var parseTokenMM = /^-(\d{2})$/ +var parseTokenDDD = /^-?(\d{3})$/ +var parseTokenMMDD = /^-?(\d{2})-?(\d{2})$/ +var parseTokenWww = /^-?W(\d{2})$/ +var parseTokenWwwD = /^-?W(\d{2})-?(\d{1})$/ - if (!this.doctype) { - throw new Error('doctype is not defined') - } +// time tokens +var parseTokenHH = /^(\d{2}([.,]\d*)?)$/ +var parseTokenHHMM = /^(\d{2}):?(\d{2}([.,]\d*)?)$/ +var parseTokenHHMMSS = /^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/ - const resp = await this.cozyClient.collection(this.doctype).get(id) - return resp.data - } +// timezone tokens +var parseTokenTimezone = /([Z+-].*)$/ +var parseTokenTimezoneZ = /^(Z)$/ +var parseTokenTimezoneHH = /^([+-])(\d{2})$/ +var parseTokenTimezoneHHMM = /^([+-])(\d{2}):?(\d{2})$/ - /** - * Creates or updates a document. - * - * Before creating/updating, we try to find an existing document by - * building a selector with the idAttributes. - * - * - If not document is found, document is created - * - If a document is found, it is updated - * - If duplicates are found, it depends on options.handleDuplicates - * - * @param {String|Function} options.handleDuplicates - How duplicates are handled, see Document.duplicateHandlingStrategies - */ - static async createOrUpdate(attributes, options = {}) { - if (this.usesCozyClient()) { - return this.createOrUpdateViaNewClient(attributes, options) - } +/** + * @category Common Helpers + * @summary Convert the given argument to an instance of Date. + * + * @description + * Convert the given argument to an instance of Date. + * + * If the argument is an instance of Date, the function returns its clone. + * + * If the argument is a number, it is treated as a timestamp. + * + * If an argument is a string, the function tries to parse it. + * Function accepts complete ISO 8601 formats as well as partial implementations. + * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 + * + * If all above fails, the function passes the given argument to Date constructor. + * + * @param {Date|String|Number} argument - the value to convert + * @param {Object} [options] - the object with options + * @param {0 | 1 | 2} [options.additionalDigits=2] - the additional number of digits in the extended year format + * @returns {Date} the parsed date in the local time zone + * + * @example + * // Convert string '2014-02-11T11:30:30' to date: + * var result = parse('2014-02-11T11:30:30') + * //=> Tue Feb 11 2014 11:30:30 + * + * @example + * // Parse string '+02014101', + * // if the additional number of digits in the extended year format is 1: + * var result = parse('+02014101', {additionalDigits: 1}) + * //=> Fri Apr 11 2014 00:00:00 + */ +function parse (argument, dirtyOptions) { + if (isDate(argument)) { + // Prevent the date to lose the milliseconds when passed to new Date() in IE10 + return new Date(argument.getTime()) + } else if (typeof argument !== 'string') { + return new Date(argument) + } - return this.createOrUpdateViaOldClient(attributes, options) + var options = dirtyOptions || {} + var additionalDigits = options.additionalDigits + if (additionalDigits == null) { + additionalDigits = DEFAULT_ADDITIONAL_DIGITS + } else { + additionalDigits = Number(additionalDigits) } - /** - * Update a document with `update` attributes. If the - * `update` does not concern "important" attributes, the original - * document is returned. Otherwise, the update document is - * returned with metadata updated. - * - * @private - */ - static applyUpdateIfDifferent(doc, update) { - // only update if some fields are different - if ( - !this.checkAttributes || - isDifferent( - pick(doc, this.checkAttributes), - pick(update, this.checkAttributes) - ) - ) { - // do not emit a mail for those attribute updates - delete update.dateImport + var dateStrings = splitDateString(argument) - const updatedDoc = this.addCozyMetadata({ - ...doc, - ...update - }) + var parseYearResult = parseYear(dateStrings.date, additionalDigits) + var year = parseYearResult.year + var restDateString = parseYearResult.restDateString - return updatedDoc - } else { - log( - 'debug', - `[updateIfDifferent] No need to update ${update._id} because its \`checkedAttributes\` (${this.checkAttributes}) didn't change.` - ) - return doc + var date = parseDate(restDateString, year) + + if (date) { + var timestamp = date.getTime() + var time = 0 + var offset + + if (dateStrings.time) { + time = parseTime(dateStrings.time) } - } - static getHandleDuplicateStrategy(name) { - if (Document.duplicateHandlingStrategies[name]) { - return Document.duplicateHandlingStrategies[name] + if (dateStrings.timezone) { + offset = parseTimezone(dateStrings.timezone) * MILLISECONDS_IN_MINUTE } else { - throw new Error( - `${name} is not a know duplication handling strategy. Known strategies are ${Object.keys( - Document.duplicateHandlingStrategies - )}` - ) + var fullTime = timestamp + time + var fullTimeDate = new Date(fullTime) + + offset = getTimezoneOffsetInMilliseconds(fullTimeDate) + + // Adjust time when it's coming from DST + var fullTimeDateNextDay = new Date(fullTime) + fullTimeDateNextDay.setDate(fullTimeDate.getDate() + 1) + var offsetDiff = + getTimezoneOffsetInMilliseconds(fullTimeDateNextDay) - + getTimezoneOffsetInMilliseconds(fullTimeDate) + if (offsetDiff > 0) { + offset += offsetDiff + } } + + return new Date(timestamp + time + offset) + } else { + return new Date(argument) } +} - static async handleDuplicates(strategyNameOrFnArg, duplicates, selector) { - const strategyNameOrFn = - strategyNameOrFnArg || this.defaultDuplicateHandling - const strategyFn = - typeof strategyNameOrFn === 'string' - ? this.getHandleDuplicateStrategy(strategyNameOrFn) - : strategyNameOrFn +function splitDateString (dateString) { + var dateStrings = {} + var array = dateString.split(parseTokenDateTimeDelimeter) + var timeString - return await strategyFn.call(this, duplicates, selector) + if (parseTokenPlainTime.test(array[0])) { + dateStrings.date = null + timeString = array[0] + } else { + dateStrings.date = array[0] + timeString = array[1] } - static async createOrUpdateViaNewClient(attributes, options) { - const selector = fromPairs( - this.idAttributes.map(idAttribute => [ - idAttribute, - get(attributes, sanitizeKey(idAttribute)) - ]) - ) - let results = [] - const compactedSelector = withoutUndefined(selector) - if (size(compactedSelector) === this.idAttributes.length) { - results = await this.queryAll(selector) - } - - if (results.length === 0) { - return this.create(this.addCozyMetadata(attributes)) + if (timeString) { + var token = parseTokenTimezone.exec(timeString) + if (token) { + dateStrings.time = timeString.replace(token[1], '') + dateStrings.timezone = token[1] } else { - results = sortBy(results, newestDocumentComparisonFunc) - if (results.length > 1) { - await this.handleDuplicates(options.handleDuplicates, results, selector) - } - const doc = results[0] - const update = omit(attributes, userAttributes) - const updatedDoc = this.applyUpdateIfDifferent(doc, update) - if (updatedDoc !== doc) { - return this.cozyClient.save(updatedDoc) - } else { - return updatedDoc - } + dateStrings.time = timeString } } - static async createOrUpdateViaOldClient(attributes, options) { - const selector = fromPairs( - this.idAttributes.map(idAttribute => [ - idAttribute, - get(attributes, sanitizeKey(idAttribute)) - ]) - ) - let results = [] - const compactedSelector = withoutUndefined(selector) - if (size(compactedSelector) === this.idAttributes.length) { - const index = await this.getIndex(this.doctype, this.idAttributes) - results = await this.cozyClient.data.query(index, { selector }) - } + return dateStrings +} - if (results.length === 0) { - return this.cozyClient.data.create( - this.doctype, - this.addCozyMetadata(attributes) - ) - } else { - results = sortBy(results, newestDocumentComparisonFunc) - if (results.length > 1) { - await this.handleDuplicates(options.handleDuplicates, results, selector) - } +function parseYear (dateString, additionalDigits) { + var parseTokenYYY = parseTokensYYY[additionalDigits] + var parseTokenYYYYY = parseTokensYYYYY[additionalDigits] - const doc = results[0] - const update = omit(attributes, userAttributes) - const updatedDoc = this.applyUpdateIfDifferent(doc, update) - if (updatedDoc !== doc) { - return this.cozyClient.data.updateAttributes( - this.doctype, - updatedDoc._id, - updatedDoc - ) - } else { - return doc - } + var token + + // YYYY or ±YYYYY + token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString) + if (token) { + var yearString = token[1] + return { + year: parseInt(yearString, 10), + restDateString: dateString.slice(yearString.length) } } - static create(attributes) { - if (this.usesCozyClient()) { - return this.createViaNewClient(attributes) + // YY or ±YYY + token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString) + if (token) { + var centuryString = token[1] + return { + year: parseInt(centuryString, 10) * 100, + restDateString: dateString.slice(centuryString.length) } - - return this.createViaOldClient(attributes) } - static createViaNewClient(attributes) { - return this.cozyClient.create(this.doctype, attributes) + // Invalid ISO-formatted year + return { + year: null } +} - static createViaOldClient(attributes) { - return this.cozyClient.data.create(this.doctype, attributes) +function parseDate (dateString, year) { + // Invalid ISO-formatted year + if (year === null) { + return null } - /** - * Save many documents concurrently - */ - static bulkSave(documents, optionsOrConcurrency, logProgressOrNothing) { - if (logProgressOrNothing || typeof optionsOrConcurrency !== 'object') { - log( - 'warn', - 'Second argument of bulkSave is now an object, please use bulkSave(documents, { logProgress, concurrency })' - ) - } - - const options = {} + var token + var date + var month + var week - if (typeof optionsOrConcurrency === 'number') { - options.concurrency = optionsOrConcurrency - } + // YYYY + if (dateString.length === 0) { + date = new Date(0) + date.setUTCFullYear(year) + return date + } - if (typeof logProgressOrNothing === 'function') { - options.logProgress = logProgressOrNothing - } + // YYYY-MM + token = parseTokenMM.exec(dateString) + if (token) { + date = new Date(0) + month = parseInt(token[1], 10) - 1 + date.setUTCFullYear(year, month) + return date + } - if (typeof optionsOrConcurrency === 'object') { - Object.assign(options, optionsOrConcurrency) - } + // YYYY-DDD or YYYYDDD + token = parseTokenDDD.exec(dateString) + if (token) { + date = new Date(0) + var dayOfYear = parseInt(token[1], 10) + date.setUTCFullYear(year, 0, dayOfYear) + return date + } - return this._bulkSave(documents, options) + // YYYY-MM-DD or YYYYMMDD + token = parseTokenMMDD.exec(dateString) + if (token) { + date = new Date(0) + month = parseInt(token[1], 10) - 1 + var day = parseInt(token[2], 10) + date.setUTCFullYear(year, month, day) + return date } - /** - * @private - * - * Meat of the method bulkSave - */ - static _bulkSave(documents, options = {}) { - const { concurrency = 30, logProgress, ...createOrUpdateOptions } = options + // YYYY-Www or YYYYWww + token = parseTokenWww.exec(dateString) + if (token) { + week = parseInt(token[1], 10) - 1 + return dayOfISOYear(year, week) + } - return parallelMap( - documents, - async doc => { - if (logProgress) { - logProgress(doc) - } - try { - const newDoc = await this.createOrUpdate(doc, createOrUpdateOptions) - return newDoc - } catch (e) { - if (options.onCreateOrUpdateError) { - return options.onCreateOrUpdateError(e, doc) - } else { - throw e - } - } - }, - concurrency - ) + // YYYY-Www-D or YYYYWwwD + token = parseTokenWwwD.exec(dateString) + if (token) { + week = parseInt(token[1], 10) - 1 + var dayOfWeek = parseInt(token[2], 10) - 1 + return dayOfISOYear(year, week, dayOfWeek) } - static query(index, options) { - if (this.usesCozyClient()) { - throw new Error('This method is not implemented yet with CozyClient') - } + // Invalid ISO-formatted date + return null +} - return this.queryViaOldClient(index, options) - } +function parseTime (timeString) { + var token + var hours + var minutes - static queryViaOldClient(index, options) { - return this.cozyClient.data.query(index, options) + // hh + token = parseTokenHH.exec(timeString) + if (token) { + hours = parseFloat(token[1].replace(',', '.')) + return (hours % 24) * MILLISECONDS_IN_HOUR } - static async fetchAll() { - const stackClient = this.usesCozyClient() - ? this.cozyClient.stackClient - : this.cozyClient + // hh:mm or hhmm + token = parseTokenHHMM.exec(timeString) + if (token) { + hours = parseInt(token[1], 10) + minutes = parseFloat(token[2].replace(',', '.')) + return (hours % 24) * MILLISECONDS_IN_HOUR + + minutes * MILLISECONDS_IN_MINUTE + } - try { - const result = await stackClient.fetchJSON( - 'GET', - `/data/${this.doctype}/_all_docs?include_docs=true` - ) - return result.rows - .filter(x => x.id.indexOf('_design') !== 0 && x.doc) - .map(x => x.doc) - } catch (e) { - if (e && e.response && e.response.status && e.response.status === 404) { - return [] - } else { - return [] - } - } + // hh:mm:ss or hhmmss + token = parseTokenHHMMSS.exec(timeString) + if (token) { + hours = parseInt(token[1], 10) + minutes = parseInt(token[2], 10) + var seconds = parseFloat(token[3].replace(',', '.')) + return (hours % 24) * MILLISECONDS_IN_HOUR + + minutes * MILLISECONDS_IN_MINUTE + + seconds * 1000 } - static async updateAll(docs) { - const stackClient = this.usesCozyClient() - ? this.cozyClient.stackClient - : this.cozyClient + // Invalid ISO-formatted time + return null +} - if (!docs || !docs.length) { - return Promise.resolve([]) - } - try { - const update = await stackClient.fetchJSON( - 'POST', - `/data/${this.doctype}/_bulk_docs`, - { - docs - } - ) - return update - } catch (e) { - if ( - e.reason && - e.reason.reason && - e.reason.reason == DATABASE_DOES_NOT_EXIST - ) { - const firstDoc = await this.create(docs[0]) - const resp = await this.updateAll(docs.slice(1)) - resp.unshift({ ok: true, id: firstDoc._id, rev: firstDoc._rev }) - return resp - } else { - throw e - } - } - } +function parseTimezone (timezoneString) { + var token + var absoluteOffset - static async deleteAll(docs) { - return this.updateAll(docs.map(flagForDeletion)) + // Z + token = parseTokenTimezoneZ.exec(timezoneString) + if (token) { + return 0 } - /** - * Find duplicates in a list of documents according to the - * idAttributes of the class. Priority is given to the document - * prior in the list. - * - * To introduce the notion of priority, you can sort your input docs - * according to this priorirty. - * - * @param {Array[object]} docs - * @return {Array[object]} Duplicates - */ - static findDuplicates(docs) { - const fieldSeparator = '#$$$$#' - const idAttributes = this.idAttributes - const key = doc => { - return idAttributes - .map(idAttrPath => get(doc, idAttrPath)) - .join(fieldSeparator) - } - const groups = pickBy(groupBy(docs, key), group => group.length > 1) - const duplicates = flatMap(groups, group => group.slice(1)) - return duplicates + // ±hh + token = parseTokenTimezoneHH.exec(timezoneString) + if (token) { + absoluteOffset = parseInt(token[2], 10) * 60 + return (token[1] === '+') ? -absoluteOffset : absoluteOffset } - /** - * Delete duplicates on the server. Find duplicates according to the - * idAttributes. - * - * @param {Function} Priority (optional). Among duplicates, which one should be prioritized) - * @return {Promise} - * @example - * ``` - * deleteDuplicates(doc => -doc.dateImport) // will duplicate documents so that the oldest document is conserved - * ``` - */ - static async deleteDuplicates(priorityFn) { - let allDocs = await this.fetchAll() - if (priorityFn) { - allDocs = sortBy(allDocs, priorityFn) - } - const duplicates = this.findDuplicates(allDocs) - return this.deleteAll(duplicates) + // ±hh:mm or ±hhmm + token = parseTokenTimezoneHHMM.exec(timezoneString) + if (token) { + absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10) + return (token[1] === '+') ? -absoluteOffset : absoluteOffset } - /** - * Use Couch _changes API - * - * @param {string} since Starting sequence for changes - * @param {[type]} options { includeDesign: false, includeDeleted: false } - */ - static async fetchChanges(since, options = {}) { - const stackClient = this.usesCozyClient() - ? this.cozyClient.stackClient - : this.cozyClient + return 0 +} - const queryParams = { - since, - include_docs: 'true' - } - if (options.params) { - Object.assign(queryParams, options.params) - } - const result = await stackClient.fetchJSON( - 'GET', - `/data/${this.doctype}/_changes?${querystring.stringify(queryParams)}` - ) - - const newLastSeq = result.last_seq - let docs = result.results.map(x => x.doc).filter(Boolean) - - if (!options.includeDesign) { - docs = docs.filter(doc => doc._id.indexOf('_design') !== 0) - } - - if (!options.includeDeleted) { - docs = docs.filter(doc => !doc._deleted) - } - - return { newLastSeq, documents: docs } - } - - /** - * Fetches all documents for a given doctype exceeding the 100 limit. - * It is slower that fetchAll because it fetches the data 100 by 100 but allows to filter the data - * with a selector and an index - * - * Parameters: - * - * * `selector` (object): the mango query selector - * * `index` (object): (optional) the query selector index. If not defined, the function will - * create it's own index with the keys specified in the selector - * - * - * ```javascript - * const documents = await Bills.queryAll({vendor: 'Direct Energie'}) - * ``` - * - */ - static async queryAll(selector, index) { - if (this.usesCozyClient()) { - return this.queryAllViaNewClient(selector) - } - - return this.queryAllViaOldClient(selector, index) - } - - static async queryAllViaNewClient(selector) { - if (!selector) { - return this.fetchAll() - } - - let query - // let's deal with very old cozy-client where Q doesn't exist. - if (Q !== undefined) { - query = Q(this.doctype).where(selector) - } else { - query = this.cozyClient.find(this.doctype).where(selector) - } - - let resp = await this.cozyClient.query(query) - let result = resp.data - - while (resp && resp.next) { - if (resp.bookmark && query.offsetBookmark) { - resp = await this.cozyClient.query(query.offsetBookmark(resp.bookmark)) - } else { - resp = await this.cozyClient.query(query.offset(result.length)) - } - - result.push(...resp.data) - } - - return result - } - - static async queryAllViaOldClient(selector, indexArg) { - if (!selector) { - // fetchAll is faster in this case - return await this.fetchAll() - } - - let index = indexArg - if (!index) { - index = await this.cozyClient.data.defineIndex( - this.doctype, - Object.keys(selector) - ) - } - - const result = [] - let resp = { next: true } - while (resp && resp.next) { - resp = await this.cozyClient.data.query(index, { - selector, - wholeResponse: true, - skip: result.length - }) - result.push(...resp.docs) - } - return result - } - - /** - * Fetch in one request a batch of documents by id. - * @param {String[]} ids - Ids of documents to fetch - * @return {Promise} - Promise resolving to an array of documents, unfound document are filtered - */ - static async getAll(ids) { - const stackClient = this.usesCozyClient() - ? this.cozyClient.stackClient - : this.cozyClient - let resp - try { - resp = await stackClient.fetchJSON( - 'POST', - `/data/${this.doctype}/_all_docs?include_docs=true`, - { - keys: ids - } - ) - } catch (error) { - if (error.message.match(/not_found/)) { - return [] - } - throw error - } - const rows = resp.rows.filter(row => row.doc) - return rows.map(row => row.doc) - } -} - -Document.defaultDuplicateHandling = 'throw' - -Document.duplicateHandlingStrategies = { - throw: function (duplicates, selector) { - throw new Error( - 'Create or update with selectors that returns more than 1 result\n' + - JSON.stringify(selector) + - '\n' + - JSON.stringify(duplicates) - ) - }, - - remove: async function (duplicates) { - const docsToRemove = duplicates.slice(1) - if (docsToRemove.length > 0) { - log( - 'warn', - `Cleaning duplicates for doctype ${this.doctype} (kept: ${ - duplicates[0]._id - }, removed: ${docsToRemove.map(x => x._id)})` - ) - await this.deleteAll(docsToRemove) - } - } +function dayOfISOYear (isoYear, week, day) { + week = week || 0 + day = day || 0 + var date = new Date(0) + date.setUTCFullYear(isoYear, 0, 4) + var fourthOfJanuaryDay = date.getUTCDay() || 7 + var diff = week * 7 + day + 1 - fourthOfJanuaryDay + date.setUTCDate(date.getUTCDate() + diff) + return date } -module.exports = Document +module.exports = parse /***/ }), /* 732 */ -/***/ (function(module, exports, __webpack_require__) { +/***/ (function(module, exports) { -var baseIteratee = __webpack_require__(101), - negate = __webpack_require__(733), - pickBy = __webpack_require__(329); +var MILLISECONDS_IN_MINUTE = 60000 /** - * The opposite of `_.pickBy`; this method creates an object composed of - * the own and inherited enumerable string keyed properties of `object` that - * `predicate` doesn't return truthy for. The predicate is invoked with two - * arguments: (value, key). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Object - * @param {Object} object The source object. - * @param {Function} [predicate=_.identity] The function invoked per property. - * @returns {Object} Returns the new object. - * @example + * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds. + * They usually appear for dates that denote time before the timezones were introduced + * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891 + * and GMT+01:00:00 after that date) * - * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above, + * which would lead to incorrect calculations. * - * _.omitBy(object, _.isNumber); - * // => { 'b': '2' } + * This function returns the timezone offset in milliseconds that takes seconds in account. */ -function omitBy(object, predicate) { - return pickBy(object, negate(baseIteratee(predicate))); -} +module.exports = function getTimezoneOffsetInMilliseconds (dirtyDate) { + var date = new Date(dirtyDate.getTime()) + var baseTimezoneOffset = date.getTimezoneOffset() + date.setSeconds(0, 0) + var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE -module.exports = omitBy; + return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset +} /***/ }), /* 733 */ /***/ (function(module, exports) { -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - /** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. + * @category Common Helpers + * @summary Is the given argument an instance of Date? * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example + * @description + * Is the given argument an instance of Date? * - * function isEven(n) { - * return n % 2 == 0; - * } + * @param {*} argument - the argument to check + * @returns {Boolean} the given argument is an instance of Date * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] + * @example + * // Is 'mayonnaise' a Date? + * var result = isDate('mayonnaise') + * //=> false */ -function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - switch (args.length) { - case 0: return !predicate.call(this); - case 1: return !predicate.call(this, args[0]); - case 2: return !predicate.call(this, args[0], args[1]); - case 3: return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; +function isDate (argument) { + return argument instanceof Date } -module.exports = negate; +module.exports = isDate /***/ }), /* 734 */ -/***/ (function(module, exports) { +/***/ (function(module, exports, __webpack_require__) { + +var addMilliseconds = __webpack_require__(735) + +var MILLISECONDS_IN_HOUR = 3600000 /** - * Checks if `value` is `undefined`. + * @category Hour Helpers + * @summary Add the specified number of hours to the given date. * - * @static - * @since 0.1.0 - * @memberOf _ - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. - * @example + * @description + * Add the specified number of hours to the given date. * - * _.isUndefined(void 0); - * // => true + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of hours to be added + * @returns {Date} the new date with the hours added * - * _.isUndefined(null); - * // => false + * @example + * // Add 2 hours to 10 July 2014 23:00:00: + * var result = addHours(new Date(2014, 6, 10, 23, 0), 2) + * //=> Fri Jul 11 2014 01:00:00 */ -function isUndefined(value) { - return value === undefined; +function addHours (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR) } -module.exports = isUndefined; +module.exports = addHours /***/ }), /* 735 */ /***/ (function(module, exports, __webpack_require__) { -var baseFlatten = __webpack_require__(183), - map = __webpack_require__(736); +var parse = __webpack_require__(731) /** - * Creates a flattened array of values by running each element in `collection` - * thru `iteratee` and flattening the mapped results. The iteratee is invoked - * with three arguments: (value, index|key, collection). + * @category Millisecond Helpers + * @summary Add the specified number of milliseconds to the given date. * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new flattened array. - * @example + * @description + * Add the specified number of milliseconds to the given date. * - * function duplicate(n) { - * return [n, n]; - * } + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of milliseconds to be added + * @returns {Date} the new date with the milliseconds added * - * _.flatMap([1, 2], duplicate); - * // => [1, 1, 2, 2] + * @example + * // Add 750 milliseconds to 10 July 2014 12:45:30.000: + * var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) + * //=> Thu Jul 10 2014 12:45:30.750 */ -function flatMap(collection, iteratee) { - return baseFlatten(map(collection, iteratee), 1); +function addMilliseconds (dirtyDate, dirtyAmount) { + var timestamp = parse(dirtyDate).getTime() + var amount = Number(dirtyAmount) + return new Date(timestamp + amount) } -module.exports = flatMap; +module.exports = addMilliseconds /***/ }), /* 736 */ /***/ (function(module, exports, __webpack_require__) { -var arrayMap = __webpack_require__(172), - baseIteratee = __webpack_require__(101), - baseMap = __webpack_require__(395), - isArray = __webpack_require__(87); +var getISOYear = __webpack_require__(737) +var setISOYear = __webpack_require__(740) /** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } + * @category ISO Week-Numbering Year Helpers + * @summary Add the specified number of ISO week-numbering years to the given date. * - * _.map([4, 8], square); - * // => [16, 64] + * @description + * Add the specified number of ISO week-numbering years to the given date. * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of ISO week-numbering years to be added + * @returns {Date} the new date with the ISO week-numbering years added * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] + * @example + * // Add 5 ISO week-numbering years to 2 July 2010: + * var result = addISOYears(new Date(2010, 6, 2), 5) + * //=> Fri Jun 26 2015 00:00:00 */ -function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, baseIteratee(iteratee, 3)); +function addISOYears (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount) } -module.exports = map; +module.exports = addISOYears /***/ }), /* 737 */ /***/ (function(module, exports, __webpack_require__) { -const PromisePool = __webpack_require__(738) +var parse = __webpack_require__(731) +var startOfISOWeek = __webpack_require__(738) /** - * Like a map, executed in parallel via a promise pool + * @category ISO Week-Numbering Year Helpers + * @summary Get the ISO week-numbering year of the given date. * - * @param {Array} arr Items to process - * @param {Function} fn Promise creator (will be passed each item) - * @param {Number} concurrency How many promise can be in flight at the same time - * @return {Promise} Resolved with the results of the promise, not necessary in order + * @description + * Get the ISO week-numbering year of the given date, + * which always starts 3 days before the year's first Thursday. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the ISO week-numbering year + * + * @example + * // Which ISO-week numbering year is 2 January 2005? + * var result = getISOYear(new Date(2005, 0, 2)) + * //=> 2004 */ -const parallelMap = (iterable, fn, concurrencyArg) => { - const concurrency = concurrencyArg || 30 - const res = [] - const pool = new PromisePool(function* () { - for (let item of iterable) { - yield fn(item).then(x => res.push(x)) - } - }, concurrency) - return pool.start().then(() => res) -} +function getISOYear (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() -module.exports = { - parallelMap + var fourthOfJanuaryOfNextYear = new Date(0) + fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) + fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) + var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear) + + var fourthOfJanuaryOfThisYear = new Date(0) + fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4) + fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0) + var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear) + + if (date.getTime() >= startOfNextYear.getTime()) { + return year + 1 + } else if (date.getTime() >= startOfThisYear.getTime()) { + return year + } else { + return year - 1 + } } +module.exports = getISOYear + /***/ }), /* 738 */ /***/ (function(module, exports, __webpack_require__) { -var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { - /* istanbul ignore next */ - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), - __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? - (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), - __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) - } else {} -})(this, function () { - 'use strict' - - var EventTarget = function () { - this._listeners = {} - } +var startOfWeek = __webpack_require__(739) - EventTarget.prototype.addEventListener = function (type, listener) { - this._listeners[type] = this._listeners[type] || [] - if (this._listeners[type].indexOf(listener) < 0) { - this._listeners[type].push(listener) - } - } +/** + * @category ISO Week Helpers + * @summary Return the start of an ISO week for the given date. + * + * @description + * Return the start of an ISO week for the given date. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of an ISO week + * + * @example + * // The start of an ISO week for 2 September 2014 11:55:00: + * var result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Mon Sep 01 2014 00:00:00 + */ +function startOfISOWeek (dirtyDate) { + return startOfWeek(dirtyDate, {weekStartsOn: 1}) +} - EventTarget.prototype.removeEventListener = function (type, listener) { - if (this._listeners[type]) { - var p = this._listeners[type].indexOf(listener) - if (p >= 0) { - this._listeners[type].splice(p, 1) - } - } - } +module.exports = startOfISOWeek - EventTarget.prototype.dispatchEvent = function (evt) { - if (this._listeners[evt.type] && this._listeners[evt.type].length) { - var listeners = this._listeners[evt.type].slice() - for (var i = 0, l = listeners.length; i < l; ++i) { - listeners[i].call(this, evt) - } - } - } - var isGenerator = function (func) { - return (typeof func.constructor === 'function' && - func.constructor.name === 'GeneratorFunction') - } +/***/ }), +/* 739 */ +/***/ (function(module, exports, __webpack_require__) { - var functionToIterator = function (func) { - return { - next: function () { - var promise = func() - return promise ? {value: promise} : {done: true} - } - } - } +var parse = __webpack_require__(731) - var promiseToIterator = function (promise) { - var called = false - return { - next: function () { - if (called) { - return {done: true} - } - called = true - return {value: promise} - } - } - } - - var toIterator = function (obj, Promise) { - var type = typeof obj - if (type === 'object') { - if (typeof obj.next === 'function') { - return obj - } - /* istanbul ignore else */ - if (typeof obj.then === 'function') { - return promiseToIterator(obj) - } - } - if (type === 'function') { - return isGenerator(obj) ? obj() : functionToIterator(obj) - } - return promiseToIterator(Promise.resolve(obj)) - } - - var PromisePoolEvent = function (target, type, data) { - this.target = target - this.type = type - this.data = data - } - - var PromisePool = function (source, concurrency, options) { - EventTarget.call(this) - if (typeof concurrency !== 'number' || - Math.floor(concurrency) !== concurrency || - concurrency < 1) { - throw new Error('Invalid concurrency') - } - this._concurrency = concurrency - this._options = options || {} - this._options.promise = this._options.promise || Promise - this._iterator = toIterator(source, this._options.promise) - this._done = false - this._size = 0 - this._promise = null - this._callbacks = null - } - PromisePool.prototype = new EventTarget() - PromisePool.prototype.constructor = PromisePool +/** + * @category Week Helpers + * @summary Return the start of a week for the given date. + * + * @description + * Return the start of a week for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Date} the start of a week + * + * @example + * // The start of a week for 2 September 2014 11:55:00: + * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sun Aug 31 2014 00:00:00 + * + * @example + * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00: + * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) + * //=> Mon Sep 01 2014 00:00:00 + */ +function startOfWeek (dirtyDate, dirtyOptions) { + var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - PromisePool.prototype.concurrency = function (value) { - if (typeof value !== 'undefined') { - this._concurrency = value - if (this.active()) { - this._proceed() - } - } - return this._concurrency - } + var date = parse(dirtyDate) + var day = date.getDay() + var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn - PromisePool.prototype.size = function () { - return this._size - } + date.setDate(date.getDate() - diff) + date.setHours(0, 0, 0, 0) + return date +} - PromisePool.prototype.active = function () { - return !!this._promise - } +module.exports = startOfWeek - PromisePool.prototype.promise = function () { - return this._promise - } - PromisePool.prototype.start = function () { - var that = this - var Promise = this._options.promise - this._promise = new Promise(function (resolve, reject) { - that._callbacks = { - reject: reject, - resolve: resolve - } - that._proceed() - }) - return this._promise - } +/***/ }), +/* 740 */ +/***/ (function(module, exports, __webpack_require__) { - PromisePool.prototype._fireEvent = function (type, data) { - this.dispatchEvent(new PromisePoolEvent(this, type, data)) - } +var parse = __webpack_require__(731) +var startOfISOYear = __webpack_require__(741) +var differenceInCalendarDays = __webpack_require__(742) - PromisePool.prototype._settle = function (error) { - if (error) { - this._callbacks.reject(error) - } else { - this._callbacks.resolve() - } - this._promise = null - this._callbacks = null - } +/** + * @category ISO Week-Numbering Year Helpers + * @summary Set the ISO week-numbering year to the given date. + * + * @description + * Set the ISO week-numbering year to the given date, + * saving the week number and the weekday number. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} isoYear - the ISO week-numbering year of the new date + * @returns {Date} the new date with the ISO week-numbering year setted + * + * @example + * // Set ISO week-numbering year 2007 to 29 December 2008: + * var result = setISOYear(new Date(2008, 11, 29), 2007) + * //=> Mon Jan 01 2007 00:00:00 + */ +function setISOYear (dirtyDate, dirtyISOYear) { + var date = parse(dirtyDate) + var isoYear = Number(dirtyISOYear) + var diff = differenceInCalendarDays(date, startOfISOYear(date)) + var fourthOfJanuary = new Date(0) + fourthOfJanuary.setFullYear(isoYear, 0, 4) + fourthOfJanuary.setHours(0, 0, 0, 0) + date = startOfISOYear(fourthOfJanuary) + date.setDate(date.getDate() + diff) + return date +} - PromisePool.prototype._onPooledPromiseFulfilled = function (promise, result) { - this._size-- - if (this.active()) { - this._fireEvent('fulfilled', { - promise: promise, - result: result - }) - this._proceed() - } - } +module.exports = setISOYear - PromisePool.prototype._onPooledPromiseRejected = function (promise, error) { - this._size-- - if (this.active()) { - this._fireEvent('rejected', { - promise: promise, - error: error - }) - this._settle(error || new Error('Unknown error')) - } - } - PromisePool.prototype._trackPromise = function (promise) { - var that = this - promise - .then(function (result) { - that._onPooledPromiseFulfilled(promise, result) - }, function (error) { - that._onPooledPromiseRejected(promise, error) - })['catch'](function (err) { - that._settle(new Error('Promise processing failed: ' + err)) - }) - } +/***/ }), +/* 741 */ +/***/ (function(module, exports, __webpack_require__) { - PromisePool.prototype._proceed = function () { - if (!this._done) { - var result = { done: false } - while (this._size < this._concurrency && - !(result = this._iterator.next()).done) { - this._size++ - this._trackPromise(result.value) - } - this._done = (result === null || !!result.done) - } - if (this._done && this._size === 0) { - this._settle() - } - } +var getISOYear = __webpack_require__(737) +var startOfISOWeek = __webpack_require__(738) - PromisePool.PromisePoolEvent = PromisePoolEvent - // Legacy API - PromisePool.PromisePool = PromisePool +/** + * @category ISO Week-Numbering Year Helpers + * @summary Return the start of an ISO week-numbering year for the given date. + * + * @description + * Return the start of an ISO week-numbering year, + * which always starts 3 days before the year's first Thursday. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of an ISO year + * + * @example + * // The start of an ISO week-numbering year for 2 July 2005: + * var result = startOfISOYear(new Date(2005, 6, 2)) + * //=> Mon Jan 03 2005 00:00:00 + */ +function startOfISOYear (dirtyDate) { + var year = getISOYear(dirtyDate) + var fourthOfJanuary = new Date(0) + fourthOfJanuary.setFullYear(year, 0, 4) + fourthOfJanuary.setHours(0, 0, 0, 0) + var date = startOfISOWeek(fourthOfJanuary) + return date +} - return PromisePool -}) +module.exports = startOfISOYear /***/ }), -/* 739 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { -const { filterLevel, filterSecrets } = __webpack_require__(740) -const Secret = __webpack_require__(741) -const { LOG_LEVEL } = process.env -let level = LOG_LEVEL || 'debug' -const format = __webpack_require__(742) -const filters = [filterLevel, filterSecrets] +var startOfDay = __webpack_require__(743) -const filterOut = function () { - for (const filter of filters) { - if (filter.apply(null, arguments) === false) { - return true - } - } - return false -} +var MILLISECONDS_IN_MINUTE = 60000 +var MILLISECONDS_IN_DAY = 86400000 /** - * Use it to log messages in your konnector. Typical types are + * @category Day Helpers + * @summary Get the number of calendar days between the given dates. * - * - `debug` - * - `warning` - * - `info` - * - `error` - * - `ok` + * @description + * Get the number of calendar days between the given dates. * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar days * * @example - * - * They will be colored in development mode. In production mode, those logs are formatted in JSON to be interpreted by the stack and possibly sent to the client. `error` will stop the konnector. - * - * ```js - * logger = log('my-namespace') - * logger('debug', '365 bills') - * // my-namespace : debug : 365 bills - * logger('info', 'Page fetched') - * // my-namespace : info : Page fetched - * ``` - * @param {string} type - * @param {string} message - * @param {string} label - * @param {string} namespace + * // How many calendar days are between + * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? + * var result = differenceInCalendarDays( + * new Date(2012, 6, 2, 0, 0), + * new Date(2011, 6, 2, 23, 0) + * ) + * //=> 366 */ -function log(type, message, label, namespace) { - if (filterOut(level, type, message, label, namespace)) { - return - } - // eslint-disable-next-line no-console - console.log(format(type, message, label, namespace)) -} +function differenceInCalendarDays (dirtyDateLeft, dirtyDateRight) { + var startOfDayLeft = startOfDay(dirtyDateLeft) + var startOfDayRight = startOfDay(dirtyDateRight) -log.addFilter = function (filter) { - return filters.push(filter) -} + var timestampLeft = startOfDayLeft.getTime() - + startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE + var timestampRight = startOfDayRight.getTime() - + startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE -log.setLevel = function (lvl) { - level = lvl + // Round the number of days to the nearest integer + // because the number of milliseconds in a day is not constant + // (e.g. it's different in the day of the daylight saving time clock shift) + return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY) } -// Short-hands -const methods = ['debug', 'info', 'warn', 'error', 'ok', 'critical'] -methods.forEach(level => { - log[level] = function (message, label, namespace) { - return log(level, message, label, namespace) - } -}) +module.exports = differenceInCalendarDays -module.exports = log -log.setNoRetry = obj => { - if (obj) obj.no_retry = true - else obj = { no_retry: true } - return obj.no_retry -} -log.Secret = Secret -log.namespace = function (namespace) { - return function (type, message, label, ns = namespace) { - log(type, message, label, ns) - } +/***/ }), +/* 743 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + +/** + * @category Day Helpers + * @summary Return the start of a day for the given date. + * + * @description + * Return the start of a day for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a day + * + * @example + * // The start of a day for 2 September 2014 11:55:00: + * var result = startOfDay(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 02 2014 00:00:00 + */ +function startOfDay (dirtyDate) { + var date = parse(dirtyDate) + date.setHours(0, 0, 0, 0) + return date } +module.exports = startOfDay + /***/ }), -/* 740 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { -const levels = { - secret: 0, - debug: 10, - info: 20, - warn: 30, - error: 40, - ok: 50, - critical: 50 -} - -const Secret = __webpack_require__(741) +var addMilliseconds = __webpack_require__(735) -const filterSecrets = function (level, type, message) { - if (type !== 'secret' && message instanceof Secret) { - throw new Error('You should log a secret with log.secret') - } -} +var MILLISECONDS_IN_MINUTE = 60000 -const filterLevel = function (level, type) { - return levels[type] >= levels[level] +/** + * @category Minute Helpers + * @summary Add the specified number of minutes to the given date. + * + * @description + * Add the specified number of minutes to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of minutes to be added + * @returns {Date} the new date with the minutes added + * + * @example + * // Add 30 minutes to 10 July 2014 12:00:00: + * var result = addMinutes(new Date(2014, 6, 10, 12, 0), 30) + * //=> Thu Jul 10 2014 12:30:00 + */ +function addMinutes (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE) } -module.exports = { - filterSecrets, - filterLevel -} +module.exports = addMinutes /***/ }), -/* 741 */ -/***/ (function(module, exports) { +/* 745 */ +/***/ (function(module, exports, __webpack_require__) { -const Secret = function (data) { - Object.assign(this, data) - return this -} +var parse = __webpack_require__(731) +var getDaysInMonth = __webpack_require__(746) -Secret.prototype.toString = function () { - throw new Error('Cannot convert Secret to string') +/** + * @category Month Helpers + * @summary Add the specified number of months to the given date. + * + * @description + * Add the specified number of months to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of months to be added + * @returns {Date} the new date with the months added + * + * @example + * // Add 5 months to 1 September 2014: + * var result = addMonths(new Date(2014, 8, 1), 5) + * //=> Sun Feb 01 2015 00:00:00 + */ +function addMonths (dirtyDate, dirtyAmount) { + var date = parse(dirtyDate) + var amount = Number(dirtyAmount) + var desiredMonth = date.getMonth() + amount + var dateWithDesiredMonth = new Date(0) + dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1) + dateWithDesiredMonth.setHours(0, 0, 0, 0) + var daysInMonth = getDaysInMonth(dateWithDesiredMonth) + // Set the last day of the new month + // if the original date was the last day of the longer month + date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate())) + return date } -module.exports = Secret +module.exports = addMonths /***/ }), -/* 742 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { -const prodFormat = __webpack_require__(743) -const devFormat = __webpack_require__(744) +var parse = __webpack_require__(731) -switch ("none") { - case 'production': - module.exports = prodFormat - break - case 'development': - module.exports = devFormat - break - case 'standalone': - module.exports = devFormat - break - case 'test': - module.exports = devFormat - break - default: - module.exports = prodFormat +/** + * @category Month Helpers + * @summary Get the number of days in a month of the given date. + * + * @description + * Get the number of days in a month of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the number of days in a month + * + * @example + * // How many days are in February 2000? + * var result = getDaysInMonth(new Date(2000, 1)) + * //=> 29 + */ +function getDaysInMonth (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() + var monthIndex = date.getMonth() + var lastDayOfMonth = new Date(0) + lastDayOfMonth.setFullYear(year, monthIndex + 1, 0) + lastDayOfMonth.setHours(0, 0, 0, 0) + return lastDayOfMonth.getDate() } +module.exports = getDaysInMonth + /***/ }), -/* 743 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { -const stringify = __webpack_require__(8) +var addMonths = __webpack_require__(745) -const LOG_LENGTH_LIMIT = 64 * 1024 - 1 +/** + * @category Quarter Helpers + * @summary Add the specified number of year quarters to the given date. + * + * @description + * Add the specified number of year quarters to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of quarters to be added + * @returns {Date} the new date with the quarters added + * + * @example + * // Add 1 quarter to 1 September 2014: + * var result = addQuarters(new Date(2014, 8, 1), 1) + * //=> Mon Dec 01 2014 00:00:00 + */ +function addQuarters (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + var months = amount * 3 + return addMonths(dirtyDate, months) +} -function prodFormat(type, message, label, namespace) { - const log = { time: new Date(), type, label, namespace } +module.exports = addQuarters - if (typeof message === 'object') { - if (message && message.no_retry) { - log.no_retry = message.no_retry - } - if (message && message.message) { - log.message = message.message - } - } else { - log.message = message - } - // properly display error messages - if (log.message && log.message.stack) { - log.message = log.message.stack - } +/***/ }), +/* 748 */ +/***/ (function(module, exports, __webpack_require__) { - // cut the string to avoid a fail in the stack - let result = log - try { - result = stringify(log).substr(0, LOG_LENGTH_LIMIT) - } catch (err) { - // eslint-disable-next-line no-console - console.log(err.message, 'cozy-logger: Failed to convert message to JSON') - } - return result +var addMilliseconds = __webpack_require__(735) + +/** + * @category Second Helpers + * @summary Add the specified number of seconds to the given date. + * + * @description + * Add the specified number of seconds to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of seconds to be added + * @returns {Date} the new date with the seconds added + * + * @example + * // Add 30 seconds to 10 July 2014 12:45:00: + * var result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) + * //=> Thu Jul 10 2014 12:45:30 + */ +function addSeconds (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addMilliseconds(dirtyDate, amount * 1000) } -module.exports = prodFormat +module.exports = addSeconds /***/ }), -/* 744 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { -const util = __webpack_require__(10) -const chalk = __webpack_require__(745) - -if (util && util.inspect && util.inspect.defaultOptions) { - util.inspect.defaultOptions.maxArrayLength = null - util.inspect.defaultOptions.depth = 2 - util.inspect.defaultOptions.colors = true -} +var addDays = __webpack_require__(730) -const type2color = { - debug: 'cyan', - warn: 'yellow', - info: 'blue', - error: 'red', - ok: 'green', - secret: 'red', - critical: 'red' +/** + * @category Week Helpers + * @summary Add the specified number of weeks to the given date. + * + * @description + * Add the specified number of week to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of weeks to be added + * @returns {Date} the new date with the weeks added + * + * @example + * // Add 4 weeks to 1 September 2014: + * var result = addWeeks(new Date(2014, 8, 1), 4) + * //=> Mon Sep 29 2014 00:00:00 + */ +function addWeeks (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + var days = amount * 7 + return addDays(dirtyDate, days) } -function devFormat(type, message, label, namespace) { - let formatmessage = message +module.exports = addWeeks - if (typeof formatmessage !== 'string') { - formatmessage = util.inspect(formatmessage) - } - let formatlabel = label ? ` : "${label}" ` : '' - let formatnamespace = namespace ? chalk.magenta(`${namespace}: `) : '' +/***/ }), +/* 750 */ +/***/ (function(module, exports, __webpack_require__) { - let color = type2color[type] - let formattype = color ? chalk[color](type) : type +var addMonths = __webpack_require__(745) - return `${formatnamespace}${formattype}${formatlabel} : ${formatmessage}` +/** + * @category Year Helpers + * @summary Add the specified number of years to the given date. + * + * @description + * Add the specified number of years to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of years to be added + * @returns {Date} the new date with the years added + * + * @example + * // Add 5 years to 1 September 2014: + * var result = addYears(new Date(2014, 8, 1), 5) + * //=> Sun Sep 01 2019 00:00:00 + */ +function addYears (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addMonths(dirtyDate, amount * 12) } -module.exports = devFormat +module.exports = addYears /***/ }), -/* 745 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -const escapeStringRegexp = __webpack_require__(12); -const ansiStyles = __webpack_require__(746); -const stdoutColor = __webpack_require__(751).stdout; - -const template = __webpack_require__(752); +var parse = __webpack_require__(731) -const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); +/** + * @category Range Helpers + * @summary Is the given date range overlapping with another date range? + * + * @description + * Is the given date range overlapping with another date range? + * + * @param {Date|String|Number} initialRangeStartDate - the start of the initial range + * @param {Date|String|Number} initialRangeEndDate - the end of the initial range + * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with + * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with + * @returns {Boolean} whether the date ranges are overlapping + * @throws {Error} startDate of a date range cannot be after its endDate + * + * @example + * // For overlapping date ranges: + * areRangesOverlapping( + * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) + * ) + * //=> true + * + * @example + * // For non-overlapping date ranges: + * areRangesOverlapping( + * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) + * ) + * //=> false + */ +function areRangesOverlapping (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { + var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() + var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() + var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() + var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() -// `supportsColor.level` → `ansiStyles.color[name]` mapping -const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { + throw new Error('The start of the range cannot be after the end of the range') + } -// `color-convert` models to exclude from the Chalk API due to conflicts and such -const skipModels = new Set(['gray']); + return initialStartTime < comparedEndTime && comparedStartTime < initialEndTime +} -const styles = Object.create(null); +module.exports = areRangesOverlapping -function applyOptions(obj, options) { - options = options || {}; - // Detect level if not set manually - const scLevel = stdoutColor ? stdoutColor.level : 0; - obj.level = options.level === undefined ? scLevel : options.level; - obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; -} +/***/ }), +/* 752 */ +/***/ (function(module, exports, __webpack_require__) { -function Chalk(options) { - // We check for this.template here since calling `chalk.constructor()` - // by itself will have a `this` of a previously constructed chalk object - if (!this || !(this instanceof Chalk) || this.template) { - const chalk = {}; - applyOptions(chalk, options); +var parse = __webpack_require__(731) - chalk.template = function () { - const args = [].slice.call(arguments); - return chalkTag.apply(null, [chalk.template].concat(args)); - }; +/** + * @category Common Helpers + * @summary Return an index of the closest date from the array comparing to the given date. + * + * @description + * Return an index of the closest date from the array comparing to the given date. + * + * @param {Date|String|Number} dateToCompare - the date to compare with + * @param {Date[]|String[]|Number[]} datesArray - the array to search + * @returns {Number} an index of the date closest to the given date + * @throws {TypeError} the second argument must be an instance of Array + * + * @example + * // Which date is closer to 6 September 2015? + * var dateToCompare = new Date(2015, 8, 6) + * var datesArray = [ + * new Date(2015, 0, 1), + * new Date(2016, 0, 1), + * new Date(2017, 0, 1) + * ] + * var result = closestIndexTo(dateToCompare, datesArray) + * //=> 1 + */ +function closestIndexTo (dirtyDateToCompare, dirtyDatesArray) { + if (!(dirtyDatesArray instanceof Array)) { + throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') + } - Object.setPrototypeOf(chalk, Chalk.prototype); - Object.setPrototypeOf(chalk.template, chalk); + var dateToCompare = parse(dirtyDateToCompare) + var timeToCompare = dateToCompare.getTime() - chalk.template.constructor = Chalk; + var result + var minDistance - return chalk.template; - } + dirtyDatesArray.forEach(function (dirtyDate, index) { + var currentDate = parse(dirtyDate) + var distance = Math.abs(timeToCompare - currentDate.getTime()) + if (result === undefined || distance < minDistance) { + result = index + minDistance = distance + } + }) - applyOptions(this, options); + return result } -// Use bright blue on Windows as the normal blue color is illegible -if (isSimpleWindowsTerm) { - ansiStyles.blue.open = '\u001B[94m'; -} +module.exports = closestIndexTo -for (const key of Object.keys(ansiStyles)) { - ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); - styles[key] = { - get() { - const codes = ansiStyles[key]; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); - } - }; -} +/***/ }), +/* 753 */ +/***/ (function(module, exports, __webpack_require__) { -styles.visible = { - get() { - return build.call(this, this._styles || [], true, 'visible'); - } -}; +var parse = __webpack_require__(731) -ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); -for (const model of Object.keys(ansiStyles.color.ansi)) { - if (skipModels.has(model)) { - continue; - } +/** + * @category Common Helpers + * @summary Return a date from the array closest to the given date. + * + * @description + * Return a date from the array closest to the given date. + * + * @param {Date|String|Number} dateToCompare - the date to compare with + * @param {Date[]|String[]|Number[]} datesArray - the array to search + * @returns {Date} the date from the array closest to the given date + * @throws {TypeError} the second argument must be an instance of Array + * + * @example + * // Which date is closer to 6 September 2015: 1 January 2000 or 1 January 2030? + * var dateToCompare = new Date(2015, 8, 6) + * var result = closestTo(dateToCompare, [ + * new Date(2000, 0, 1), + * new Date(2030, 0, 1) + * ]) + * //=> Tue Jan 01 2030 00:00:00 + */ +function closestTo (dirtyDateToCompare, dirtyDatesArray) { + if (!(dirtyDatesArray instanceof Array)) { + throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') + } - styles[model] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.color.close, - closeRe: ansiStyles.color.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + var dateToCompare = parse(dirtyDateToCompare) + var timeToCompare = dateToCompare.getTime() -ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); -for (const model of Object.keys(ansiStyles.bgColor.ansi)) { - if (skipModels.has(model)) { - continue; - } + var result + var minDistance - const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); - styles[bgModel] = { - get() { - const level = this.level; - return function () { - const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); - const codes = { - open, - close: ansiStyles.bgColor.close, - closeRe: ansiStyles.bgColor.closeRe - }; - return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); - }; - } - }; -} + dirtyDatesArray.forEach(function (dirtyDate) { + var currentDate = parse(dirtyDate) + var distance = Math.abs(timeToCompare - currentDate.getTime()) + if (result === undefined || distance < minDistance) { + result = currentDate + minDistance = distance + } + }) -const proto = Object.defineProperties(() => {}, styles); + return result +} -function build(_styles, _empty, key) { - const builder = function () { - return applyStyle.apply(builder, arguments); - }; +module.exports = closestTo - builder._styles = _styles; - builder._empty = _empty; - const self = this; +/***/ }), +/* 754 */ +/***/ (function(module, exports, __webpack_require__) { - Object.defineProperty(builder, 'level', { - enumerable: true, - get() { - return self.level; - }, - set(level) { - self.level = level; - } - }); +var parse = __webpack_require__(731) - Object.defineProperty(builder, 'enabled', { - enumerable: true, - get() { - return self.enabled; - }, - set(enabled) { - self.enabled = enabled; - } - }); +/** + * @category Common Helpers + * @summary Compare the two dates and return -1, 0 or 1. + * + * @description + * Compare the two dates and return 1 if the first date is after the second, + * -1 if the first date is before the second or 0 if dates are equal. + * + * @param {Date|String|Number} dateLeft - the first date to compare + * @param {Date|String|Number} dateRight - the second date to compare + * @returns {Number} the result of the comparison + * + * @example + * // Compare 11 February 1987 and 10 July 1989: + * var result = compareAsc( + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ) + * //=> -1 + * + * @example + * // Sort the array of dates: + * var result = [ + * new Date(1995, 6, 2), + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ].sort(compareAsc) + * //=> [ + * // Wed Feb 11 1987 00:00:00, + * // Mon Jul 10 1989 00:00:00, + * // Sun Jul 02 1995 00:00:00 + * // ] + */ +function compareAsc (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var timeLeft = dateLeft.getTime() + var dateRight = parse(dirtyDateRight) + var timeRight = dateRight.getTime() - // See below for fix regarding invisible grey/dim combination on Windows - builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + if (timeLeft < timeRight) { + return -1 + } else if (timeLeft > timeRight) { + return 1 + } else { + return 0 + } +} - // `__proto__` is used because we must return a function, but there is - // no way to create a function with a different prototype - builder.__proto__ = proto; // eslint-disable-line no-proto +module.exports = compareAsc - return builder; -} -function applyStyle() { - // Support varags, but simply cast to string in case there's only one arg - const args = arguments; - const argsLen = args.length; - let str = String(arguments[0]); +/***/ }), +/* 755 */ +/***/ (function(module, exports, __webpack_require__) { - if (argsLen === 0) { - return ''; - } +var parse = __webpack_require__(731) - if (argsLen > 1) { - // Don't slice `arguments`, it prevents V8 optimizations - for (let a = 1; a < argsLen; a++) { - str += ' ' + args[a]; - } - } +/** + * @category Common Helpers + * @summary Compare the two dates reverse chronologically and return -1, 0 or 1. + * + * @description + * Compare the two dates and return -1 if the first date is after the second, + * 1 if the first date is before the second or 0 if dates are equal. + * + * @param {Date|String|Number} dateLeft - the first date to compare + * @param {Date|String|Number} dateRight - the second date to compare + * @returns {Number} the result of the comparison + * + * @example + * // Compare 11 February 1987 and 10 July 1989 reverse chronologically: + * var result = compareDesc( + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ) + * //=> 1 + * + * @example + * // Sort the array of dates in reverse chronological order: + * var result = [ + * new Date(1995, 6, 2), + * new Date(1987, 1, 11), + * new Date(1989, 6, 10) + * ].sort(compareDesc) + * //=> [ + * // Sun Jul 02 1995 00:00:00, + * // Mon Jul 10 1989 00:00:00, + * // Wed Feb 11 1987 00:00:00 + * // ] + */ +function compareDesc (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var timeLeft = dateLeft.getTime() + var dateRight = parse(dirtyDateRight) + var timeRight = dateRight.getTime() - if (!this.enabled || this.level <= 0 || !str) { - return this._empty ? '' : str; - } + if (timeLeft > timeRight) { + return -1 + } else if (timeLeft < timeRight) { + return 1 + } else { + return 0 + } +} - // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, - // see https://github.com/chalk/chalk/issues/58 - // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. - const originalDim = ansiStyles.dim.open; - if (isSimpleWindowsTerm && this.hasGrey) { - ansiStyles.dim.open = ''; - } +module.exports = compareDesc - for (const code of this._styles.slice().reverse()) { - // Replace any instances already present with a re-opening code - // otherwise only the part of the string until said closing code - // will be colored, and the rest will simply be 'plain'. - str = code.open + str.replace(code.closeRe, code.open) + code.close; - // Close the styling before a linebreak and reopen - // after next line to fix a bleed issue on macOS - // https://github.com/chalk/chalk/pull/92 - str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); - } +/***/ }), +/* 756 */ +/***/ (function(module, exports, __webpack_require__) { - // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue - ansiStyles.dim.open = originalDim; +var startOfISOWeek = __webpack_require__(738) - return str; -} - -function chalkTag(chalk, strings) { - if (!Array.isArray(strings)) { - // If chalk() was called by itself or with a string, - // return the string itself as a string. - return [].slice.call(arguments, 1).join(' '); - } +var MILLISECONDS_IN_MINUTE = 60000 +var MILLISECONDS_IN_WEEK = 604800000 - const args = [].slice.call(arguments, 2); - const parts = [strings.raw[0]]; +/** + * @category ISO Week Helpers + * @summary Get the number of calendar ISO weeks between the given dates. + * + * @description + * Get the number of calendar ISO weeks between the given dates. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar ISO weeks + * + * @example + * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014? + * var result = differenceInCalendarISOWeeks( + * new Date(2014, 6, 21), + * new Date(2014, 6, 6) + * ) + * //=> 3 + */ +function differenceInCalendarISOWeeks (dirtyDateLeft, dirtyDateRight) { + var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft) + var startOfISOWeekRight = startOfISOWeek(dirtyDateRight) - for (let i = 1; i < strings.length; i++) { - parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); - parts.push(String(strings.raw[i])); - } + var timestampLeft = startOfISOWeekLeft.getTime() - + startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE + var timestampRight = startOfISOWeekRight.getTime() - + startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - return template(chalk, parts.join('')); + // Round the number of days to the nearest integer + // because the number of milliseconds in a week is not constant + // (e.g. it's different in the week of the daylight saving time clock shift) + return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) } -Object.defineProperties(Chalk.prototype, styles); - -module.exports = Chalk(); // eslint-disable-line new-cap -module.exports.supportsColor = stdoutColor; -module.exports.default = module.exports; // For TypeScript +module.exports = differenceInCalendarISOWeeks /***/ }), -/* 746 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; -/* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(747); - -const wrapAnsi16 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${code + offset}m`; -}; +var getISOYear = __webpack_require__(737) -const wrapAnsi256 = (fn, offset) => function () { - const code = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};5;${code}m`; -}; +/** + * @category ISO Week-Numbering Year Helpers + * @summary Get the number of calendar ISO week-numbering years between the given dates. + * + * @description + * Get the number of calendar ISO week-numbering years between the given dates. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar ISO week-numbering years + * + * @example + * // How many calendar ISO week-numbering years are 1 January 2010 and 1 January 2012? + * var result = differenceInCalendarISOYears( + * new Date(2012, 0, 1), + * new Date(2010, 0, 1) + * ) + * //=> 2 + */ +function differenceInCalendarISOYears (dirtyDateLeft, dirtyDateRight) { + return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight) +} -const wrapAnsi16m = (fn, offset) => function () { - const rgb = fn.apply(colorConvert, arguments); - return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; -}; +module.exports = differenceInCalendarISOYears -function assembleStyles() { - const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29] - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - gray: [90, 39], - // Bright color - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39] - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], +/***/ }), +/* 758 */ +/***/ (function(module, exports, __webpack_require__) { - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49] - } - }; +var parse = __webpack_require__(731) - // Fix humans - styles.color.grey = styles.color.gray; +/** + * @category Month Helpers + * @summary Get the number of calendar months between the given dates. + * + * @description + * Get the number of calendar months between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar months + * + * @example + * // How many calendar months are between 31 January 2014 and 1 September 2014? + * var result = differenceInCalendarMonths( + * new Date(2014, 8, 1), + * new Date(2014, 0, 31) + * ) + * //=> 8 + */ +function differenceInCalendarMonths (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) - for (const groupName of Object.keys(styles)) { - const group = styles[groupName]; + var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() + var monthDiff = dateLeft.getMonth() - dateRight.getMonth() - for (const styleName of Object.keys(group)) { - const style = group[styleName]; + return yearDiff * 12 + monthDiff +} - styles[styleName] = { - open: `\u001B[${style[0]}m`, - close: `\u001B[${style[1]}m` - }; +module.exports = differenceInCalendarMonths - group[styleName] = styles[styleName]; - codes.set(style[0], style[1]); - } +/***/ }), +/* 759 */ +/***/ (function(module, exports, __webpack_require__) { - Object.defineProperty(styles, groupName, { - value: group, - enumerable: false - }); +var getQuarter = __webpack_require__(760) +var parse = __webpack_require__(731) - Object.defineProperty(styles, 'codes', { - value: codes, - enumerable: false - }); - } +/** + * @category Quarter Helpers + * @summary Get the number of calendar quarters between the given dates. + * + * @description + * Get the number of calendar quarters between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar quarters + * + * @example + * // How many calendar quarters are between 31 December 2013 and 2 July 2014? + * var result = differenceInCalendarQuarters( + * new Date(2014, 6, 2), + * new Date(2013, 11, 31) + * ) + * //=> 3 + */ +function differenceInCalendarQuarters (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) - const ansi2ansi = n => n; - const rgb2rgb = (r, g, b) => [r, g, b]; + var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() + var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight) - styles.color.close = '\u001B[39m'; - styles.bgColor.close = '\u001B[49m'; + return yearDiff * 4 + quarterDiff +} - styles.color.ansi = { - ansi: wrapAnsi16(ansi2ansi, 0) - }; - styles.color.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 0) - }; - styles.color.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 0) - }; +module.exports = differenceInCalendarQuarters - styles.bgColor.ansi = { - ansi: wrapAnsi16(ansi2ansi, 10) - }; - styles.bgColor.ansi256 = { - ansi256: wrapAnsi256(ansi2ansi, 10) - }; - styles.bgColor.ansi16m = { - rgb: wrapAnsi16m(rgb2rgb, 10) - }; - for (let key of Object.keys(colorConvert)) { - if (typeof colorConvert[key] !== 'object') { - continue; - } - - const suite = colorConvert[key]; - - if (key === 'ansi16') { - key = 'ansi'; - } - - if ('ansi16' in suite) { - styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); - styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); - } - - if ('ansi256' in suite) { - styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); - styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); - } +/***/ }), +/* 760 */ +/***/ (function(module, exports, __webpack_require__) { - if ('rgb' in suite) { - styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); - styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); - } - } +var parse = __webpack_require__(731) - return styles; +/** + * @category Quarter Helpers + * @summary Get the year quarter of the given date. + * + * @description + * Get the year quarter of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the quarter + * + * @example + * // Which quarter is 2 July 2014? + * var result = getQuarter(new Date(2014, 6, 2)) + * //=> 3 + */ +function getQuarter (dirtyDate) { + var date = parse(dirtyDate) + var quarter = Math.floor(date.getMonth() / 3) + 1 + return quarter } -// Make the export immutable -Object.defineProperty(module, 'exports', { - enumerable: true, - get: assembleStyles -}); +module.exports = getQuarter -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(14)(module))) /***/ }), -/* 747 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(748); -var route = __webpack_require__(750); +var startOfWeek = __webpack_require__(739) -var convert = {}; +var MILLISECONDS_IN_MINUTE = 60000 +var MILLISECONDS_IN_WEEK = 604800000 -var models = Object.keys(conversions); +/** + * @category Week Helpers + * @summary Get the number of calendar weeks between the given dates. + * + * @description + * Get the number of calendar weeks between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Number} the number of calendar weeks + * + * @example + * // How many calendar weeks are between 5 July 2014 and 20 July 2014? + * var result = differenceInCalendarWeeks( + * new Date(2014, 6, 20), + * new Date(2014, 6, 5) + * ) + * //=> 3 + * + * @example + * // If the week starts on Monday, + * // how many calendar weeks are between 5 July 2014 and 20 July 2014? + * var result = differenceInCalendarWeeks( + * new Date(2014, 6, 20), + * new Date(2014, 6, 5), + * {weekStartsOn: 1} + * ) + * //=> 2 + */ +function differenceInCalendarWeeks (dirtyDateLeft, dirtyDateRight, dirtyOptions) { + var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions) + var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions) -function wrapRaw(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } + var timestampLeft = startOfWeekLeft.getTime() - + startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE + var timestampRight = startOfWeekRight.getTime() - + startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } + // Round the number of days to the nearest integer + // because the number of milliseconds in a week is not constant + // (e.g. it's different in the week of the daylight saving time clock shift) + return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) +} - return fn(args); - }; +module.exports = differenceInCalendarWeeks - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } - return wrappedFn; +/***/ }), +/* 762 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + +/** + * @category Year Helpers + * @summary Get the number of calendar years between the given dates. + * + * @description + * Get the number of calendar years between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of calendar years + * + * @example + * // How many calendar years are between 31 December 2013 and 11 February 2015? + * var result = differenceInCalendarYears( + * new Date(2015, 1, 11), + * new Date(2013, 11, 31) + * ) + * //=> 2 + */ +function differenceInCalendarYears (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) + + return dateLeft.getFullYear() - dateRight.getFullYear() } -function wrapRounded(fn) { - var wrappedFn = function (args) { - if (args === undefined || args === null) { - return args; - } +module.exports = differenceInCalendarYears - if (arguments.length > 1) { - args = Array.prototype.slice.call(arguments); - } - var result = fn(args); +/***/ }), +/* 763 */ +/***/ (function(module, exports, __webpack_require__) { - // we're assuming the result is an array here. - // see notice in conversions.js; don't use box types - // in conversion functions. - if (typeof result === 'object') { - for (var len = result.length, i = 0; i < len; i++) { - result[i] = Math.round(result[i]); - } - } +var parse = __webpack_require__(731) +var differenceInCalendarDays = __webpack_require__(742) +var compareAsc = __webpack_require__(754) - return result; - }; +/** + * @category Day Helpers + * @summary Get the number of full days between the given dates. + * + * @description + * Get the number of full days between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full days + * + * @example + * // How many full days are between + * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? + * var result = differenceInDays( + * new Date(2012, 6, 2, 0, 0), + * new Date(2011, 6, 2, 23, 0) + * ) + * //=> 365 + */ +function differenceInDays (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) - // preserve .conversion property if there is one - if ('conversion' in fn) { - wrappedFn.conversion = fn.conversion; - } + var sign = compareAsc(dateLeft, dateRight) + var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)) + dateLeft.setDate(dateLeft.getDate() - sign * difference) - return wrappedFn; + // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full + // If so, result must be decreased by 1 in absolute value + var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign + return sign * (difference - isLastDayNotFull) } -models.forEach(function (fromModel) { - convert[fromModel] = {}; +module.exports = differenceInDays - Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); - Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); - var routes = route(fromModel); - var routeModels = Object.keys(routes); +/***/ }), +/* 764 */ +/***/ (function(module, exports, __webpack_require__) { - routeModels.forEach(function (toModel) { - var fn = routes[toModel]; +var differenceInMilliseconds = __webpack_require__(765) - convert[fromModel][toModel] = wrapRounded(fn); - convert[fromModel][toModel].raw = wrapRaw(fn); - }); -}); +var MILLISECONDS_IN_HOUR = 3600000 -module.exports = convert; +/** + * @category Hour Helpers + * @summary Get the number of hours between the given dates. + * + * @description + * Get the number of hours between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of hours + * + * @example + * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00? + * var result = differenceInHours( + * new Date(2014, 6, 2, 19, 0), + * new Date(2014, 6, 2, 6, 50) + * ) + * //=> 12 + */ +function differenceInHours (dirtyDateLeft, dirtyDateRight) { + var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} + +module.exports = differenceInHours /***/ }), -/* 748 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { -/* MIT license */ -var cssKeywords = __webpack_require__(749); - -// NOTE: conversions should only return primitive values (i.e. arrays, or -// values that give correct `typeof` results). -// do not use box values types (i.e. Number(), String(), etc.) +var parse = __webpack_require__(731) -var reverseKeywords = {}; -for (var key in cssKeywords) { - if (cssKeywords.hasOwnProperty(key)) { - reverseKeywords[cssKeywords[key]] = key; - } +/** + * @category Millisecond Helpers + * @summary Get the number of milliseconds between the given dates. + * + * @description + * Get the number of milliseconds between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of milliseconds + * + * @example + * // How many milliseconds are between + * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700? + * var result = differenceInMilliseconds( + * new Date(2014, 6, 2, 12, 30, 21, 700), + * new Date(2014, 6, 2, 12, 30, 20, 600) + * ) + * //=> 1100 + */ +function differenceInMilliseconds (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) + return dateLeft.getTime() - dateRight.getTime() } -var convert = module.exports = { - rgb: {channels: 3, labels: 'rgb'}, - hsl: {channels: 3, labels: 'hsl'}, - hsv: {channels: 3, labels: 'hsv'}, - hwb: {channels: 3, labels: 'hwb'}, - cmyk: {channels: 4, labels: 'cmyk'}, - xyz: {channels: 3, labels: 'xyz'}, - lab: {channels: 3, labels: 'lab'}, - lch: {channels: 3, labels: 'lch'}, - hex: {channels: 1, labels: ['hex']}, - keyword: {channels: 1, labels: ['keyword']}, - ansi16: {channels: 1, labels: ['ansi16']}, - ansi256: {channels: 1, labels: ['ansi256']}, - hcg: {channels: 3, labels: ['h', 'c', 'g']}, - apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, - gray: {channels: 1, labels: ['gray']} -}; +module.exports = differenceInMilliseconds -// hide .channels and .labels properties -for (var model in convert) { - if (convert.hasOwnProperty(model)) { - if (!('channels' in convert[model])) { - throw new Error('missing channels property: ' + model); - } - if (!('labels' in convert[model])) { - throw new Error('missing channel labels property: ' + model); - } +/***/ }), +/* 766 */ +/***/ (function(module, exports, __webpack_require__) { - if (convert[model].labels.length !== convert[model].channels) { - throw new Error('channel and label counts mismatch: ' + model); - } +var parse = __webpack_require__(731) +var differenceInCalendarISOYears = __webpack_require__(757) +var compareAsc = __webpack_require__(754) +var subISOYears = __webpack_require__(767) - var channels = convert[model].channels; - var labels = convert[model].labels; - delete convert[model].channels; - delete convert[model].labels; - Object.defineProperty(convert[model], 'channels', {value: channels}); - Object.defineProperty(convert[model], 'labels', {value: labels}); - } -} +/** + * @category ISO Week-Numbering Year Helpers + * @summary Get the number of full ISO week-numbering years between the given dates. + * + * @description + * Get the number of full ISO week-numbering years between the given dates. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full ISO week-numbering years + * + * @example + * // How many full ISO week-numbering years are between 1 January 2010 and 1 January 2012? + * var result = differenceInISOYears( + * new Date(2012, 0, 1), + * new Date(2010, 0, 1) + * ) + * //=> 1 + */ +function differenceInISOYears (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) -convert.rgb.hsl = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var min = Math.min(r, g, b); - var max = Math.max(r, g, b); - var delta = max - min; - var h; - var s; - var l; + var sign = compareAsc(dateLeft, dateRight) + var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight)) + dateLeft = subISOYears(dateLeft, sign * difference) - if (max === min) { - h = 0; - } else if (r === max) { - h = (g - b) / delta; - } else if (g === max) { - h = 2 + (b - r) / delta; - } else if (b === max) { - h = 4 + (r - g) / delta; - } + // Math.abs(diff in full ISO years - diff in calendar ISO years) === 1 + // if last calendar ISO year is not full + // If so, result must be decreased by 1 in absolute value + var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign + return sign * (difference - isLastISOYearNotFull) +} - h = Math.min(h * 60, 360); +module.exports = differenceInISOYears - if (h < 0) { - h += 360; - } - l = (min + max) / 2; +/***/ }), +/* 767 */ +/***/ (function(module, exports, __webpack_require__) { - if (max === min) { - s = 0; - } else if (l <= 0.5) { - s = delta / (max + min); - } else { - s = delta / (2 - max - min); - } +var addISOYears = __webpack_require__(736) - return [h, s * 100, l * 100]; -}; +/** + * @category ISO Week-Numbering Year Helpers + * @summary Subtract the specified number of ISO week-numbering years from the given date. + * + * @description + * Subtract the specified number of ISO week-numbering years from the given date. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of ISO week-numbering years to be subtracted + * @returns {Date} the new date with the ISO week-numbering years subtracted + * + * @example + * // Subtract 5 ISO week-numbering years from 1 September 2014: + * var result = subISOYears(new Date(2014, 8, 1), 5) + * //=> Mon Aug 31 2009 00:00:00 + */ +function subISOYears (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addISOYears(dirtyDate, -amount) +} -convert.rgb.hsv = function (rgb) { - var rdif; - var gdif; - var bdif; - var h; - var s; +module.exports = subISOYears - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var v = Math.max(r, g, b); - var diff = v - Math.min(r, g, b); - var diffc = function (c) { - return (v - c) / 6 / diff + 1 / 2; - }; - if (diff === 0) { - h = s = 0; - } else { - s = diff / v; - rdif = diffc(r); - gdif = diffc(g); - bdif = diffc(b); +/***/ }), +/* 768 */ +/***/ (function(module, exports, __webpack_require__) { - if (r === v) { - h = bdif - gdif; - } else if (g === v) { - h = (1 / 3) + rdif - bdif; - } else if (b === v) { - h = (2 / 3) + gdif - rdif; - } - if (h < 0) { - h += 1; - } else if (h > 1) { - h -= 1; - } - } +var differenceInMilliseconds = __webpack_require__(765) - return [ - h * 360, - s * 100, - v * 100 - ]; -}; +var MILLISECONDS_IN_MINUTE = 60000 -convert.rgb.hwb = function (rgb) { - var r = rgb[0]; - var g = rgb[1]; - var b = rgb[2]; - var h = convert.rgb.hsl(rgb)[0]; - var w = 1 / 255 * Math.min(r, Math.min(g, b)); +/** + * @category Minute Helpers + * @summary Get the number of minutes between the given dates. + * + * @description + * Get the number of minutes between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of minutes + * + * @example + * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00? + * var result = differenceInMinutes( + * new Date(2014, 6, 2, 12, 20, 0), + * new Date(2014, 6, 2, 12, 7, 59) + * ) + * //=> 12 + */ +function differenceInMinutes (dirtyDateLeft, dirtyDateRight) { + var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} - b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); +module.exports = differenceInMinutes - return [h, w * 100, b * 100]; -}; -convert.rgb.cmyk = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var c; - var m; - var y; - var k; +/***/ }), +/* 769 */ +/***/ (function(module, exports, __webpack_require__) { - k = Math.min(1 - r, 1 - g, 1 - b); - c = (1 - r - k) / (1 - k) || 0; - m = (1 - g - k) / (1 - k) || 0; - y = (1 - b - k) / (1 - k) || 0; - - return [c * 100, m * 100, y * 100, k * 100]; -}; +var parse = __webpack_require__(731) +var differenceInCalendarMonths = __webpack_require__(758) +var compareAsc = __webpack_require__(754) /** - * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance - * */ -function comparativeDistance(x, y) { - return ( - Math.pow(x[0] - y[0], 2) + - Math.pow(x[1] - y[1], 2) + - Math.pow(x[2] - y[2], 2) - ); + * @category Month Helpers + * @summary Get the number of full months between the given dates. + * + * @description + * Get the number of full months between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full months + * + * @example + * // How many full months are between 31 January 2014 and 1 September 2014? + * var result = differenceInMonths( + * new Date(2014, 8, 1), + * new Date(2014, 0, 31) + * ) + * //=> 7 + */ +function differenceInMonths (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) + + var sign = compareAsc(dateLeft, dateRight) + var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight)) + dateLeft.setMonth(dateLeft.getMonth() - sign * difference) + + // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full + // If so, result must be decreased by 1 in absolute value + var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign + return sign * (difference - isLastMonthNotFull) } -convert.rgb.keyword = function (rgb) { - var reversed = reverseKeywords[rgb]; - if (reversed) { - return reversed; - } +module.exports = differenceInMonths - var currentClosestDistance = Infinity; - var currentClosestKeyword; - for (var keyword in cssKeywords) { - if (cssKeywords.hasOwnProperty(keyword)) { - var value = cssKeywords[keyword]; +/***/ }), +/* 770 */ +/***/ (function(module, exports, __webpack_require__) { - // Compute comparative distance - var distance = comparativeDistance(rgb, value); +var differenceInMonths = __webpack_require__(769) - // Check if its less, if so set as closest - if (distance < currentClosestDistance) { - currentClosestDistance = distance; - currentClosestKeyword = keyword; - } - } - } +/** + * @category Quarter Helpers + * @summary Get the number of full quarters between the given dates. + * + * @description + * Get the number of full quarters between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full quarters + * + * @example + * // How many full quarters are between 31 December 2013 and 2 July 2014? + * var result = differenceInQuarters( + * new Date(2014, 6, 2), + * new Date(2013, 11, 31) + * ) + * //=> 2 + */ +function differenceInQuarters (dirtyDateLeft, dirtyDateRight) { + var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3 + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} - return currentClosestKeyword; -}; +module.exports = differenceInQuarters -convert.keyword.rgb = function (keyword) { - return cssKeywords[keyword]; -}; -convert.rgb.xyz = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; +/***/ }), +/* 771 */ +/***/ (function(module, exports, __webpack_require__) { - // assume sRGB - r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); - g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); - b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); +var differenceInMilliseconds = __webpack_require__(765) - var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); - var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); - var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); +/** + * @category Second Helpers + * @summary Get the number of seconds between the given dates. + * + * @description + * Get the number of seconds between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of seconds + * + * @example + * // How many seconds are between + * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000? + * var result = differenceInSeconds( + * new Date(2014, 6, 2, 12, 30, 20, 0), + * new Date(2014, 6, 2, 12, 30, 7, 999) + * ) + * //=> 12 + */ +function differenceInSeconds (dirtyDateLeft, dirtyDateRight) { + var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000 + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} - return [x * 100, y * 100, z * 100]; -}; +module.exports = differenceInSeconds -convert.rgb.lab = function (rgb) { - var xyz = convert.rgb.xyz(rgb); - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; - x /= 95.047; - y /= 100; - z /= 108.883; +/***/ }), +/* 772 */ +/***/ (function(module, exports, __webpack_require__) { - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); +var differenceInDays = __webpack_require__(763) - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); +/** + * @category Week Helpers + * @summary Get the number of full weeks between the given dates. + * + * @description + * Get the number of full weeks between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full weeks + * + * @example + * // How many full weeks are between 5 July 2014 and 20 July 2014? + * var result = differenceInWeeks( + * new Date(2014, 6, 20), + * new Date(2014, 6, 5) + * ) + * //=> 2 + */ +function differenceInWeeks (dirtyDateLeft, dirtyDateRight) { + var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7 + return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +} - return [l, a, b]; -}; +module.exports = differenceInWeeks -convert.hsl.rgb = function (hsl) { - var h = hsl[0] / 360; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var t1; - var t2; - var t3; - var rgb; - var val; - if (s === 0) { - val = l * 255; - return [val, val, val]; - } +/***/ }), +/* 773 */ +/***/ (function(module, exports, __webpack_require__) { - if (l < 0.5) { - t2 = l * (1 + s); - } else { - t2 = l + s - l * s; - } +var parse = __webpack_require__(731) +var differenceInCalendarYears = __webpack_require__(762) +var compareAsc = __webpack_require__(754) - t1 = 2 * l - t2; +/** + * @category Year Helpers + * @summary Get the number of full years between the given dates. + * + * @description + * Get the number of full years between the given dates. + * + * @param {Date|String|Number} dateLeft - the later date + * @param {Date|String|Number} dateRight - the earlier date + * @returns {Number} the number of full years + * + * @example + * // How many full years are between 31 December 2013 and 11 February 2015? + * var result = differenceInYears( + * new Date(2015, 1, 11), + * new Date(2013, 11, 31) + * ) + * //=> 1 + */ +function differenceInYears (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) - rgb = [0, 0, 0]; - for (var i = 0; i < 3; i++) { - t3 = h + 1 / 3 * -(i - 1); - if (t3 < 0) { - t3++; - } - if (t3 > 1) { - t3--; - } + var sign = compareAsc(dateLeft, dateRight) + var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)) + dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference) - if (6 * t3 < 1) { - val = t1 + (t2 - t1) * 6 * t3; - } else if (2 * t3 < 1) { - val = t2; - } else if (3 * t3 < 2) { - val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; - } else { - val = t1; - } + // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full + // If so, result must be decreased by 1 in absolute value + var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign + return sign * (difference - isLastYearNotFull) +} - rgb[i] = val * 255; - } +module.exports = differenceInYears - return rgb; -}; -convert.hsl.hsv = function (hsl) { - var h = hsl[0]; - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var smin = s; - var lmin = Math.max(l, 0.01); - var sv; - var v; +/***/ }), +/* 774 */ +/***/ (function(module, exports, __webpack_require__) { - l *= 2; - s *= (l <= 1) ? l : 2 - l; - smin *= lmin <= 1 ? lmin : 2 - lmin; - v = (l + s) / 2; - sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); +var compareDesc = __webpack_require__(755) +var parse = __webpack_require__(731) +var differenceInSeconds = __webpack_require__(771) +var differenceInMonths = __webpack_require__(769) +var enLocale = __webpack_require__(775) - return [h, sv * 100, v * 100]; -}; +var MINUTES_IN_DAY = 1440 +var MINUTES_IN_ALMOST_TWO_DAYS = 2520 +var MINUTES_IN_MONTH = 43200 +var MINUTES_IN_TWO_MONTHS = 86400 -convert.hsv.rgb = function (hsv) { - var h = hsv[0] / 60; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var hi = Math.floor(h) % 6; +/** + * @category Common Helpers + * @summary Return the distance between the given dates in words. + * + * @description + * Return the distance between the given dates in words. + * + * | Distance between dates | Result | + * |-------------------------------------------------------------------|---------------------| + * | 0 ... 30 secs | less than a minute | + * | 30 secs ... 1 min 30 secs | 1 minute | + * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | + * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | + * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | + * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | + * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | + * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | + * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | + * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | + * | 1 yr ... 1 yr 3 months | about 1 year | + * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | + * | 1 yr 9 months ... 2 yrs | almost 2 years | + * | N yrs ... N yrs 3 months | about N years | + * | N yrs 3 months ... N yrs 9 months | over N years | + * | N yrs 9 months ... N+1 yrs | almost N+1 years | + * + * With `options.includeSeconds == true`: + * | Distance between dates | Result | + * |------------------------|----------------------| + * | 0 secs ... 5 secs | less than 5 seconds | + * | 5 secs ... 10 secs | less than 10 seconds | + * | 10 secs ... 20 secs | less than 20 seconds | + * | 20 secs ... 40 secs | half a minute | + * | 40 secs ... 60 secs | less than a minute | + * | 60 secs ... 90 secs | 1 minute | + * + * @param {Date|String|Number} dateToCompare - the date to compare with + * @param {Date|String|Number} date - the other date + * @param {Object} [options] - the object with options + * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed + * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the distance in words + * + * @example + * // What is the distance between 2 July 2014 and 1 January 2015? + * var result = distanceInWords( + * new Date(2014, 6, 2), + * new Date(2015, 0, 1) + * ) + * //=> '6 months' + * + * @example + * // What is the distance between 1 January 2015 00:00:15 + * // and 1 January 2015 00:00:00, including seconds? + * var result = distanceInWords( + * new Date(2015, 0, 1, 0, 0, 15), + * new Date(2015, 0, 1, 0, 0, 0), + * {includeSeconds: true} + * ) + * //=> 'less than 20 seconds' + * + * @example + * // What is the distance from 1 January 2016 + * // to 1 January 2015, with a suffix? + * var result = distanceInWords( + * new Date(2016, 0, 1), + * new Date(2015, 0, 1), + * {addSuffix: true} + * ) + * //=> 'about 1 year ago' + * + * @example + * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? + * var eoLocale = require('date-fns/locale/eo') + * var result = distanceInWords( + * new Date(2016, 7, 1), + * new Date(2015, 0, 1), + * {locale: eoLocale} + * ) + * //=> 'pli ol 1 jaro' + */ +function distanceInWords (dirtyDateToCompare, dirtyDate, dirtyOptions) { + var options = dirtyOptions || {} - var f = h - Math.floor(h); - var p = 255 * v * (1 - s); - var q = 255 * v * (1 - (s * f)); - var t = 255 * v * (1 - (s * (1 - f))); - v *= 255; + var comparison = compareDesc(dirtyDateToCompare, dirtyDate) - switch (hi) { - case 0: - return [v, t, p]; - case 1: - return [q, v, p]; - case 2: - return [p, v, t]; - case 3: - return [p, q, v]; - case 4: - return [t, p, v]; - case 5: - return [v, p, q]; - } -}; + var locale = options.locale + var localize = enLocale.distanceInWords.localize + if (locale && locale.distanceInWords && locale.distanceInWords.localize) { + localize = locale.distanceInWords.localize + } -convert.hsv.hsl = function (hsv) { - var h = hsv[0]; - var s = hsv[1] / 100; - var v = hsv[2] / 100; - var vmin = Math.max(v, 0.01); - var lmin; - var sl; - var l; + var localizeOptions = { + addSuffix: Boolean(options.addSuffix), + comparison: comparison + } - l = (2 - s) * v; - lmin = (2 - s) * vmin; - sl = s * vmin; - sl /= (lmin <= 1) ? lmin : 2 - lmin; - sl = sl || 0; - l /= 2; + var dateLeft, dateRight + if (comparison > 0) { + dateLeft = parse(dirtyDateToCompare) + dateRight = parse(dirtyDate) + } else { + dateLeft = parse(dirtyDate) + dateRight = parse(dirtyDateToCompare) + } - return [h, sl * 100, l * 100]; -}; + var seconds = differenceInSeconds(dateRight, dateLeft) + var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() + var minutes = Math.round(seconds / 60) - offset + var months -// http://dev.w3.org/csswg/css-color/#hwb-to-rgb -convert.hwb.rgb = function (hwb) { - var h = hwb[0] / 360; - var wh = hwb[1] / 100; - var bl = hwb[2] / 100; - var ratio = wh + bl; - var i; - var v; - var f; - var n; + // 0 up to 2 mins + if (minutes < 2) { + if (options.includeSeconds) { + if (seconds < 5) { + return localize('lessThanXSeconds', 5, localizeOptions) + } else if (seconds < 10) { + return localize('lessThanXSeconds', 10, localizeOptions) + } else if (seconds < 20) { + return localize('lessThanXSeconds', 20, localizeOptions) + } else if (seconds < 40) { + return localize('halfAMinute', null, localizeOptions) + } else if (seconds < 60) { + return localize('lessThanXMinutes', 1, localizeOptions) + } else { + return localize('xMinutes', 1, localizeOptions) + } + } else { + if (minutes === 0) { + return localize('lessThanXMinutes', 1, localizeOptions) + } else { + return localize('xMinutes', minutes, localizeOptions) + } + } - // wh + bl cant be > 1 - if (ratio > 1) { - wh /= ratio; - bl /= ratio; - } + // 2 mins up to 0.75 hrs + } else if (minutes < 45) { + return localize('xMinutes', minutes, localizeOptions) - i = Math.floor(6 * h); - v = 1 - bl; - f = 6 * h - i; + // 0.75 hrs up to 1.5 hrs + } else if (minutes < 90) { + return localize('aboutXHours', 1, localizeOptions) - if ((i & 0x01) !== 0) { - f = 1 - f; - } + // 1.5 hrs up to 24 hrs + } else if (minutes < MINUTES_IN_DAY) { + var hours = Math.round(minutes / 60) + return localize('aboutXHours', hours, localizeOptions) - n = wh + f * (v - wh); // linear interpolation + // 1 day up to 1.75 days + } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) { + return localize('xDays', 1, localizeOptions) - var r; - var g; - var b; - switch (i) { - default: - case 6: - case 0: r = v; g = n; b = wh; break; - case 1: r = n; g = v; b = wh; break; - case 2: r = wh; g = v; b = n; break; - case 3: r = wh; g = n; b = v; break; - case 4: r = n; g = wh; b = v; break; - case 5: r = v; g = wh; b = n; break; - } + // 1.75 days up to 30 days + } else if (minutes < MINUTES_IN_MONTH) { + var days = Math.round(minutes / MINUTES_IN_DAY) + return localize('xDays', days, localizeOptions) - return [r * 255, g * 255, b * 255]; -}; + // 1 month up to 2 months + } else if (minutes < MINUTES_IN_TWO_MONTHS) { + months = Math.round(minutes / MINUTES_IN_MONTH) + return localize('aboutXMonths', months, localizeOptions) + } -convert.cmyk.rgb = function (cmyk) { - var c = cmyk[0] / 100; - var m = cmyk[1] / 100; - var y = cmyk[2] / 100; - var k = cmyk[3] / 100; - var r; - var g; - var b; - - r = 1 - Math.min(1, c * (1 - k) + k); - g = 1 - Math.min(1, m * (1 - k) + k); - b = 1 - Math.min(1, y * (1 - k) + k); - - return [r * 255, g * 255, b * 255]; -}; + months = differenceInMonths(dateRight, dateLeft) -convert.xyz.rgb = function (xyz) { - var x = xyz[0] / 100; - var y = xyz[1] / 100; - var z = xyz[2] / 100; - var r; - var g; - var b; + // 2 months up to 12 months + if (months < 12) { + var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH) + return localize('xMonths', nearestMonth, localizeOptions) - r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); - g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); - b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + // 1 year up to max Date + } else { + var monthsSinceStartOfYear = months % 12 + var years = Math.floor(months / 12) - // assume sRGB - r = r > 0.0031308 - ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) - : r * 12.92; + // N years up to 1 years 3 months + if (monthsSinceStartOfYear < 3) { + return localize('aboutXYears', years, localizeOptions) - g = g > 0.0031308 - ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) - : g * 12.92; + // N years 3 months up to N years 9 months + } else if (monthsSinceStartOfYear < 9) { + return localize('overXYears', years, localizeOptions) - b = b > 0.0031308 - ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) - : b * 12.92; + // N years 9 months up to N year 12 months + } else { + return localize('almostXYears', years + 1, localizeOptions) + } + } +} - r = Math.min(Math.max(0, r), 1); - g = Math.min(Math.max(0, g), 1); - b = Math.min(Math.max(0, b), 1); +module.exports = distanceInWords - return [r * 255, g * 255, b * 255]; -}; -convert.xyz.lab = function (xyz) { - var x = xyz[0]; - var y = xyz[1]; - var z = xyz[2]; - var l; - var a; - var b; +/***/ }), +/* 775 */ +/***/ (function(module, exports, __webpack_require__) { - x /= 95.047; - y /= 100; - z /= 108.883; +var buildDistanceInWordsLocale = __webpack_require__(776) +var buildFormatLocale = __webpack_require__(777) - x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); - y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); - z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); +/** + * @category Locales + * @summary English locale. + */ +module.exports = { + distanceInWords: buildDistanceInWordsLocale(), + format: buildFormatLocale() +} - l = (116 * y) - 16; - a = 500 * (x - y); - b = 200 * (y - z); - return [l, a, b]; -}; +/***/ }), +/* 776 */ +/***/ (function(module, exports) { -convert.lab.xyz = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var x; - var y; - var z; +function buildDistanceInWordsLocale () { + var distanceInWordsLocale = { + lessThanXSeconds: { + one: 'less than a second', + other: 'less than {{count}} seconds' + }, - y = (l + 16) / 116; - x = a / 500 + y; - z = y - b / 200; + xSeconds: { + one: '1 second', + other: '{{count}} seconds' + }, - var y2 = Math.pow(y, 3); - var x2 = Math.pow(x, 3); - var z2 = Math.pow(z, 3); - y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; - x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; - z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; + halfAMinute: 'half a minute', - x *= 95.047; - y *= 100; - z *= 108.883; + lessThanXMinutes: { + one: 'less than a minute', + other: 'less than {{count}} minutes' + }, - return [x, y, z]; -}; + xMinutes: { + one: '1 minute', + other: '{{count}} minutes' + }, -convert.lab.lch = function (lab) { - var l = lab[0]; - var a = lab[1]; - var b = lab[2]; - var hr; - var h; - var c; + aboutXHours: { + one: 'about 1 hour', + other: 'about {{count}} hours' + }, - hr = Math.atan2(b, a); - h = hr * 360 / 2 / Math.PI; + xHours: { + one: '1 hour', + other: '{{count}} hours' + }, - if (h < 0) { - h += 360; - } + xDays: { + one: '1 day', + other: '{{count}} days' + }, - c = Math.sqrt(a * a + b * b); + aboutXMonths: { + one: 'about 1 month', + other: 'about {{count}} months' + }, - return [l, c, h]; -}; + xMonths: { + one: '1 month', + other: '{{count}} months' + }, -convert.lch.lab = function (lch) { - var l = lch[0]; - var c = lch[1]; - var h = lch[2]; - var a; - var b; - var hr; + aboutXYears: { + one: 'about 1 year', + other: 'about {{count}} years' + }, - hr = h / 360 * 2 * Math.PI; - a = c * Math.cos(hr); - b = c * Math.sin(hr); + xYears: { + one: '1 year', + other: '{{count}} years' + }, - return [l, a, b]; -}; + overXYears: { + one: 'over 1 year', + other: 'over {{count}} years' + }, -convert.rgb.ansi16 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization + almostXYears: { + one: 'almost 1 year', + other: 'almost {{count}} years' + } + } - value = Math.round(value / 50); + function localize (token, count, options) { + options = options || {} - if (value === 0) { - return 30; - } + var result + if (typeof distanceInWordsLocale[token] === 'string') { + result = distanceInWordsLocale[token] + } else if (count === 1) { + result = distanceInWordsLocale[token].one + } else { + result = distanceInWordsLocale[token].other.replace('{{count}}', count) + } - var ansi = 30 - + ((Math.round(b / 255) << 2) - | (Math.round(g / 255) << 1) - | Math.round(r / 255)); + if (options.addSuffix) { + if (options.comparison > 0) { + return 'in ' + result + } else { + return result + ' ago' + } + } - if (value === 2) { - ansi += 60; - } + return result + } - return ansi; -}; + return { + localize: localize + } +} -convert.hsv.ansi16 = function (args) { - // optimization here; we already know the value and don't need to get - // it converted for us. - return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); -}; +module.exports = buildDistanceInWordsLocale -convert.rgb.ansi256 = function (args) { - var r = args[0]; - var g = args[1]; - var b = args[2]; - // we use the extended greyscale palette here, with the exception of - // black and white. normal palette only has 4 greyscale shades. - if (r === g && g === b) { - if (r < 8) { - return 16; - } +/***/ }), +/* 777 */ +/***/ (function(module, exports, __webpack_require__) { - if (r > 248) { - return 231; - } +var buildFormattingTokensRegExp = __webpack_require__(778) - return Math.round(((r - 8) / 247) * 24) + 232; - } - - var ansi = 16 - + (36 * Math.round(r / 255 * 5)) - + (6 * Math.round(g / 255 * 5)) - + Math.round(b / 255 * 5); - - return ansi; -}; - -convert.ansi16.rgb = function (args) { - var color = args % 10; - - // handle greyscale - if (color === 0 || color === 7) { - if (args > 50) { - color += 3.5; - } - - color = color / 10.5 * 255; - - return [color, color, color]; - } - - var mult = (~~(args > 50) + 1) * 0.5; - var r = ((color & 1) * mult) * 255; - var g = (((color >> 1) & 1) * mult) * 255; - var b = (((color >> 2) & 1) * mult) * 255; - - return [r, g, b]; -}; - -convert.ansi256.rgb = function (args) { - // handle greyscale - if (args >= 232) { - var c = (args - 232) * 10 + 8; - return [c, c, c]; - } - - args -= 16; - - var rem; - var r = Math.floor(args / 36) / 5 * 255; - var g = Math.floor((rem = args % 36) / 6) / 5 * 255; - var b = (rem % 6) / 5 * 255; - - return [r, g, b]; -}; +function buildFormatLocale () { + // Note: in English, the names of days of the week and months are capitalized. + // If you are making a new locale based on this one, check if the same is true for the language you're working on. + // Generally, formatted dates should look like they are in the middle of a sentence, + // e.g. in Spanish language the weekdays and months should be in the lowercase. + var months3char = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] + var weekdays2char = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] + var weekdays3char = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] + var weekdaysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] + var meridiemUppercase = ['AM', 'PM'] + var meridiemLowercase = ['am', 'pm'] + var meridiemFull = ['a.m.', 'p.m.'] -convert.rgb.hex = function (args) { - var integer = ((Math.round(args[0]) & 0xFF) << 16) - + ((Math.round(args[1]) & 0xFF) << 8) - + (Math.round(args[2]) & 0xFF); + var formatters = { + // Month: Jan, Feb, ..., Dec + 'MMM': function (date) { + return months3char[date.getMonth()] + }, - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + // Month: January, February, ..., December + 'MMMM': function (date) { + return monthsFull[date.getMonth()] + }, -convert.hex.rgb = function (args) { - var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); - if (!match) { - return [0, 0, 0]; - } + // Day of week: Su, Mo, ..., Sa + 'dd': function (date) { + return weekdays2char[date.getDay()] + }, - var colorString = match[0]; + // Day of week: Sun, Mon, ..., Sat + 'ddd': function (date) { + return weekdays3char[date.getDay()] + }, - if (match[0].length === 3) { - colorString = colorString.split('').map(function (char) { - return char + char; - }).join(''); - } + // Day of week: Sunday, Monday, ..., Saturday + 'dddd': function (date) { + return weekdaysFull[date.getDay()] + }, - var integer = parseInt(colorString, 16); - var r = (integer >> 16) & 0xFF; - var g = (integer >> 8) & 0xFF; - var b = integer & 0xFF; + // AM, PM + 'A': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemUppercase[1] : meridiemUppercase[0] + }, - return [r, g, b]; -}; + // am, pm + 'a': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemLowercase[1] : meridiemLowercase[0] + }, -convert.rgb.hcg = function (rgb) { - var r = rgb[0] / 255; - var g = rgb[1] / 255; - var b = rgb[2] / 255; - var max = Math.max(Math.max(r, g), b); - var min = Math.min(Math.min(r, g), b); - var chroma = (max - min); - var grayscale; - var hue; + // a.m., p.m. + 'aa': function (date) { + return (date.getHours() / 12) >= 1 ? meridiemFull[1] : meridiemFull[0] + } + } - if (chroma < 1) { - grayscale = min / (1 - chroma); - } else { - grayscale = 0; - } + // Generate ordinal version of formatters: M -> Mo, D -> Do, etc. + var ordinalFormatters = ['M', 'D', 'DDD', 'd', 'Q', 'W'] + ordinalFormatters.forEach(function (formatterToken) { + formatters[formatterToken + 'o'] = function (date, formatters) { + return ordinal(formatters[formatterToken](date)) + } + }) - if (chroma <= 0) { - hue = 0; - } else - if (max === r) { - hue = ((g - b) / chroma) % 6; - } else - if (max === g) { - hue = 2 + (b - r) / chroma; - } else { - hue = 4 + (r - g) / chroma + 4; - } + return { + formatters: formatters, + formattingTokensRegExp: buildFormattingTokensRegExp(formatters) + } +} - hue /= 6; - hue %= 1; +function ordinal (number) { + var rem100 = number % 100 + if (rem100 > 20 || rem100 < 10) { + switch (rem100 % 10) { + case 1: + return number + 'st' + case 2: + return number + 'nd' + case 3: + return number + 'rd' + } + } + return number + 'th' +} - return [hue * 360, chroma * 100, grayscale * 100]; -}; +module.exports = buildFormatLocale -convert.hsl.hcg = function (hsl) { - var s = hsl[1] / 100; - var l = hsl[2] / 100; - var c = 1; - var f = 0; - if (l < 0.5) { - c = 2.0 * s * l; - } else { - c = 2.0 * s * (1.0 - l); - } +/***/ }), +/* 778 */ +/***/ (function(module, exports) { - if (c < 1.0) { - f = (l - 0.5 * c) / (1.0 - c); - } +var commonFormatterKeys = [ + 'M', 'MM', 'Q', 'D', 'DD', 'DDD', 'DDDD', 'd', + 'E', 'W', 'WW', 'YY', 'YYYY', 'GG', 'GGGG', + 'H', 'HH', 'h', 'hh', 'm', 'mm', + 's', 'ss', 'S', 'SS', 'SSS', + 'Z', 'ZZ', 'X', 'x' +] - return [hsl[0], c * 100, f * 100]; -}; +function buildFormattingTokensRegExp (formatters) { + var formatterKeys = [] + for (var key in formatters) { + if (formatters.hasOwnProperty(key)) { + formatterKeys.push(key) + } + } -convert.hsv.hcg = function (hsv) { - var s = hsv[1] / 100; - var v = hsv[2] / 100; + var formattingTokens = commonFormatterKeys + .concat(formatterKeys) + .sort() + .reverse() + var formattingTokensRegExp = new RegExp( + '(\\[[^\\[]*\\])|(\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g' + ) - var c = s * v; - var f = 0; + return formattingTokensRegExp +} - if (c < 1.0) { - f = (v - c) / (1 - c); - } +module.exports = buildFormattingTokensRegExp - return [hsv[0], c * 100, f * 100]; -}; -convert.hcg.rgb = function (hcg) { - var h = hcg[0] / 360; - var c = hcg[1] / 100; - var g = hcg[2] / 100; +/***/ }), +/* 779 */ +/***/ (function(module, exports, __webpack_require__) { - if (c === 0.0) { - return [g * 255, g * 255, g * 255]; - } +var compareDesc = __webpack_require__(755) +var parse = __webpack_require__(731) +var differenceInSeconds = __webpack_require__(771) +var enLocale = __webpack_require__(775) - var pure = [0, 0, 0]; - var hi = (h % 1) * 6; - var v = hi % 1; - var w = 1 - v; - var mg = 0; +var MINUTES_IN_DAY = 1440 +var MINUTES_IN_MONTH = 43200 +var MINUTES_IN_YEAR = 525600 - switch (Math.floor(hi)) { - case 0: - pure[0] = 1; pure[1] = v; pure[2] = 0; break; - case 1: - pure[0] = w; pure[1] = 1; pure[2] = 0; break; - case 2: - pure[0] = 0; pure[1] = 1; pure[2] = v; break; - case 3: - pure[0] = 0; pure[1] = w; pure[2] = 1; break; - case 4: - pure[0] = v; pure[1] = 0; pure[2] = 1; break; - default: - pure[0] = 1; pure[1] = 0; pure[2] = w; - } - - mg = (1.0 - c) * g; - - return [ - (c * pure[0] + mg) * 255, - (c * pure[1] + mg) * 255, - (c * pure[2] + mg) * 255 - ]; -}; - -convert.hcg.hsv = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - - var v = c + g * (1.0 - c); - var f = 0; - - if (v > 0.0) { - f = c / v; - } - - return [hcg[0], f * 100, v * 100]; -}; - -convert.hcg.hsl = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - - var l = g * (1.0 - c) + 0.5 * c; - var s = 0; - - if (l > 0.0 && l < 0.5) { - s = c / (2 * l); - } else - if (l >= 0.5 && l < 1.0) { - s = c / (2 * (1 - l)); - } - - return [hcg[0], s * 100, l * 100]; -}; +/** + * @category Common Helpers + * @summary Return the distance between the given dates in words. + * + * @description + * Return the distance between the given dates in words, using strict units. + * This is like `distanceInWords`, but does not use helpers like 'almost', 'over', + * 'less than' and the like. + * + * | Distance between dates | Result | + * |------------------------|---------------------| + * | 0 ... 59 secs | [0..59] seconds | + * | 1 ... 59 mins | [1..59] minutes | + * | 1 ... 23 hrs | [1..23] hours | + * | 1 ... 29 days | [1..29] days | + * | 1 ... 11 months | [1..11] months | + * | 1 ... N years | [1..N] years | + * + * @param {Date|String|Number} dateToCompare - the date to compare with + * @param {Date|String|Number} date - the other date + * @param {Object} [options] - the object with options + * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first + * @param {'s'|'m'|'h'|'d'|'M'|'Y'} [options.unit] - if specified, will force a unit + * @param {'floor'|'ceil'|'round'} [options.partialMethod='floor'] - which way to round partial units + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the distance in words + * + * @example + * // What is the distance between 2 July 2014 and 1 January 2015? + * var result = distanceInWordsStrict( + * new Date(2014, 6, 2), + * new Date(2015, 0, 2) + * ) + * //=> '6 months' + * + * @example + * // What is the distance between 1 January 2015 00:00:15 + * // and 1 January 2015 00:00:00? + * var result = distanceInWordsStrict( + * new Date(2015, 0, 1, 0, 0, 15), + * new Date(2015, 0, 1, 0, 0, 0), + * ) + * //=> '15 seconds' + * + * @example + * // What is the distance from 1 January 2016 + * // to 1 January 2015, with a suffix? + * var result = distanceInWordsStrict( + * new Date(2016, 0, 1), + * new Date(2015, 0, 1), + * {addSuffix: true} + * ) + * //=> '1 year ago' + * + * @example + * // What is the distance from 1 January 2016 + * // to 1 January 2015, in minutes? + * var result = distanceInWordsStrict( + * new Date(2016, 0, 1), + * new Date(2015, 0, 1), + * {unit: 'm'} + * ) + * //=> '525600 minutes' + * + * @example + * // What is the distance from 1 January 2016 + * // to 28 January 2015, in months, rounded up? + * var result = distanceInWordsStrict( + * new Date(2015, 0, 28), + * new Date(2015, 0, 1), + * {unit: 'M', partialMethod: 'ceil'} + * ) + * //=> '1 month' + * + * @example + * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? + * var eoLocale = require('date-fns/locale/eo') + * var result = distanceInWordsStrict( + * new Date(2016, 7, 1), + * new Date(2015, 0, 1), + * {locale: eoLocale} + * ) + * //=> '1 jaro' + */ +function distanceInWordsStrict (dirtyDateToCompare, dirtyDate, dirtyOptions) { + var options = dirtyOptions || {} -convert.hcg.hwb = function (hcg) { - var c = hcg[1] / 100; - var g = hcg[2] / 100; - var v = c + g * (1.0 - c); - return [hcg[0], (v - c) * 100, (1 - v) * 100]; -}; + var comparison = compareDesc(dirtyDateToCompare, dirtyDate) -convert.hwb.hcg = function (hwb) { - var w = hwb[1] / 100; - var b = hwb[2] / 100; - var v = 1 - b; - var c = v - w; - var g = 0; + var locale = options.locale + var localize = enLocale.distanceInWords.localize + if (locale && locale.distanceInWords && locale.distanceInWords.localize) { + localize = locale.distanceInWords.localize + } - if (c < 1) { - g = (v - c) / (1 - c); - } + var localizeOptions = { + addSuffix: Boolean(options.addSuffix), + comparison: comparison + } - return [hwb[0], c * 100, g * 100]; -}; + var dateLeft, dateRight + if (comparison > 0) { + dateLeft = parse(dirtyDateToCompare) + dateRight = parse(dirtyDate) + } else { + dateLeft = parse(dirtyDate) + dateRight = parse(dirtyDateToCompare) + } -convert.apple.rgb = function (apple) { - return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; -}; + var unit + var mathPartial = Math[options.partialMethod ? String(options.partialMethod) : 'floor'] + var seconds = differenceInSeconds(dateRight, dateLeft) + var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() + var minutes = mathPartial(seconds / 60) - offset + var hours, days, months, years -convert.rgb.apple = function (rgb) { - return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; -}; + if (options.unit) { + unit = String(options.unit) + } else { + if (minutes < 1) { + unit = 's' + } else if (minutes < 60) { + unit = 'm' + } else if (minutes < MINUTES_IN_DAY) { + unit = 'h' + } else if (minutes < MINUTES_IN_MONTH) { + unit = 'd' + } else if (minutes < MINUTES_IN_YEAR) { + unit = 'M' + } else { + unit = 'Y' + } + } -convert.gray.rgb = function (args) { - return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; -}; + // 0 up to 60 seconds + if (unit === 's') { + return localize('xSeconds', seconds, localizeOptions) -convert.gray.hsl = convert.gray.hsv = function (args) { - return [0, 0, args[0]]; -}; + // 1 up to 60 mins + } else if (unit === 'm') { + return localize('xMinutes', minutes, localizeOptions) -convert.gray.hwb = function (gray) { - return [0, 100, gray[0]]; -}; + // 1 up to 24 hours + } else if (unit === 'h') { + hours = mathPartial(minutes / 60) + return localize('xHours', hours, localizeOptions) -convert.gray.cmyk = function (gray) { - return [0, 0, 0, gray[0]]; -}; + // 1 up to 30 days + } else if (unit === 'd') { + days = mathPartial(minutes / MINUTES_IN_DAY) + return localize('xDays', days, localizeOptions) -convert.gray.lab = function (gray) { - return [gray[0], 0, 0]; -}; + // 1 up to 12 months + } else if (unit === 'M') { + months = mathPartial(minutes / MINUTES_IN_MONTH) + return localize('xMonths', months, localizeOptions) -convert.gray.hex = function (gray) { - var val = Math.round(gray[0] / 100 * 255) & 0xFF; - var integer = (val << 16) + (val << 8) + val; + // 1 year up to max Date + } else if (unit === 'Y') { + years = mathPartial(minutes / MINUTES_IN_YEAR) + return localize('xYears', years, localizeOptions) + } - var string = integer.toString(16).toUpperCase(); - return '000000'.substring(string.length) + string; -}; + throw new Error('Unknown unit: ' + unit) +} -convert.rgb.gray = function (rgb) { - var val = (rgb[0] + rgb[1] + rgb[2]) / 3; - return [val / 255 * 100]; -}; +module.exports = distanceInWordsStrict /***/ }), -/* 749 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -module.exports = { - "aliceblue": [240, 248, 255], - "antiquewhite": [250, 235, 215], - "aqua": [0, 255, 255], - "aquamarine": [127, 255, 212], - "azure": [240, 255, 255], - "beige": [245, 245, 220], - "bisque": [255, 228, 196], - "black": [0, 0, 0], - "blanchedalmond": [255, 235, 205], - "blue": [0, 0, 255], - "blueviolet": [138, 43, 226], - "brown": [165, 42, 42], - "burlywood": [222, 184, 135], - "cadetblue": [95, 158, 160], - "chartreuse": [127, 255, 0], - "chocolate": [210, 105, 30], - "coral": [255, 127, 80], - "cornflowerblue": [100, 149, 237], - "cornsilk": [255, 248, 220], - "crimson": [220, 20, 60], - "cyan": [0, 255, 255], - "darkblue": [0, 0, 139], - "darkcyan": [0, 139, 139], - "darkgoldenrod": [184, 134, 11], - "darkgray": [169, 169, 169], - "darkgreen": [0, 100, 0], - "darkgrey": [169, 169, 169], - "darkkhaki": [189, 183, 107], - "darkmagenta": [139, 0, 139], - "darkolivegreen": [85, 107, 47], - "darkorange": [255, 140, 0], - "darkorchid": [153, 50, 204], - "darkred": [139, 0, 0], - "darksalmon": [233, 150, 122], - "darkseagreen": [143, 188, 143], - "darkslateblue": [72, 61, 139], - "darkslategray": [47, 79, 79], - "darkslategrey": [47, 79, 79], - "darkturquoise": [0, 206, 209], - "darkviolet": [148, 0, 211], - "deeppink": [255, 20, 147], - "deepskyblue": [0, 191, 255], - "dimgray": [105, 105, 105], - "dimgrey": [105, 105, 105], - "dodgerblue": [30, 144, 255], - "firebrick": [178, 34, 34], - "floralwhite": [255, 250, 240], - "forestgreen": [34, 139, 34], - "fuchsia": [255, 0, 255], - "gainsboro": [220, 220, 220], - "ghostwhite": [248, 248, 255], - "gold": [255, 215, 0], - "goldenrod": [218, 165, 32], - "gray": [128, 128, 128], - "green": [0, 128, 0], - "greenyellow": [173, 255, 47], - "grey": [128, 128, 128], - "honeydew": [240, 255, 240], - "hotpink": [255, 105, 180], - "indianred": [205, 92, 92], - "indigo": [75, 0, 130], - "ivory": [255, 255, 240], - "khaki": [240, 230, 140], - "lavender": [230, 230, 250], - "lavenderblush": [255, 240, 245], - "lawngreen": [124, 252, 0], - "lemonchiffon": [255, 250, 205], - "lightblue": [173, 216, 230], - "lightcoral": [240, 128, 128], - "lightcyan": [224, 255, 255], - "lightgoldenrodyellow": [250, 250, 210], - "lightgray": [211, 211, 211], - "lightgreen": [144, 238, 144], - "lightgrey": [211, 211, 211], - "lightpink": [255, 182, 193], - "lightsalmon": [255, 160, 122], - "lightseagreen": [32, 178, 170], - "lightskyblue": [135, 206, 250], - "lightslategray": [119, 136, 153], - "lightslategrey": [119, 136, 153], - "lightsteelblue": [176, 196, 222], - "lightyellow": [255, 255, 224], - "lime": [0, 255, 0], - "limegreen": [50, 205, 50], - "linen": [250, 240, 230], - "magenta": [255, 0, 255], - "maroon": [128, 0, 0], - "mediumaquamarine": [102, 205, 170], - "mediumblue": [0, 0, 205], - "mediumorchid": [186, 85, 211], - "mediumpurple": [147, 112, 219], - "mediumseagreen": [60, 179, 113], - "mediumslateblue": [123, 104, 238], - "mediumspringgreen": [0, 250, 154], - "mediumturquoise": [72, 209, 204], - "mediumvioletred": [199, 21, 133], - "midnightblue": [25, 25, 112], - "mintcream": [245, 255, 250], - "mistyrose": [255, 228, 225], - "moccasin": [255, 228, 181], - "navajowhite": [255, 222, 173], - "navy": [0, 0, 128], - "oldlace": [253, 245, 230], - "olive": [128, 128, 0], - "olivedrab": [107, 142, 35], - "orange": [255, 165, 0], - "orangered": [255, 69, 0], - "orchid": [218, 112, 214], - "palegoldenrod": [238, 232, 170], - "palegreen": [152, 251, 152], - "paleturquoise": [175, 238, 238], - "palevioletred": [219, 112, 147], - "papayawhip": [255, 239, 213], - "peachpuff": [255, 218, 185], - "peru": [205, 133, 63], - "pink": [255, 192, 203], - "plum": [221, 160, 221], - "powderblue": [176, 224, 230], - "purple": [128, 0, 128], - "rebeccapurple": [102, 51, 153], - "red": [255, 0, 0], - "rosybrown": [188, 143, 143], - "royalblue": [65, 105, 225], - "saddlebrown": [139, 69, 19], - "salmon": [250, 128, 114], - "sandybrown": [244, 164, 96], - "seagreen": [46, 139, 87], - "seashell": [255, 245, 238], - "sienna": [160, 82, 45], - "silver": [192, 192, 192], - "skyblue": [135, 206, 235], - "slateblue": [106, 90, 205], - "slategray": [112, 128, 144], - "slategrey": [112, 128, 144], - "snow": [255, 250, 250], - "springgreen": [0, 255, 127], - "steelblue": [70, 130, 180], - "tan": [210, 180, 140], - "teal": [0, 128, 128], - "thistle": [216, 191, 216], - "tomato": [255, 99, 71], - "turquoise": [64, 224, 208], - "violet": [238, 130, 238], - "wheat": [245, 222, 179], - "white": [255, 255, 255], - "whitesmoke": [245, 245, 245], - "yellow": [255, 255, 0], - "yellowgreen": [154, 205, 50] -}; - - -/***/ }), -/* 750 */ -/***/ (function(module, exports, __webpack_require__) { - -var conversions = __webpack_require__(748); - -/* - this function routes a model to all other models. - - all functions that are routed have a property `.conversion` attached - to the returned synthetic function. This property is an array - of strings, each with the steps in between the 'from' and 'to' - color models (inclusive). - - conversions that are not possible simply are not included. -*/ - -function buildGraph() { - var graph = {}; - // https://jsperf.com/object-keys-vs-for-in-with-closure/3 - var models = Object.keys(conversions); - - for (var len = models.length, i = 0; i < len; i++) { - graph[models[i]] = { - // http://jsperf.com/1-vs-infinity - // micro-opt, but this is simple. - distance: -1, - parent: null - }; - } - - return graph; -} - -// https://en.wikipedia.org/wiki/Breadth-first_search -function deriveBFS(fromModel) { - var graph = buildGraph(); - var queue = [fromModel]; // unshift -> queue -> pop +var distanceInWords = __webpack_require__(774) - graph[fromModel].distance = 0; - - while (queue.length) { - var current = queue.pop(); - var adjacents = Object.keys(conversions[current]); - - for (var len = adjacents.length, i = 0; i < len; i++) { - var adjacent = adjacents[i]; - var node = graph[adjacent]; - - if (node.distance === -1) { - node.distance = graph[current].distance + 1; - node.parent = current; - queue.unshift(adjacent); - } - } - } - - return graph; -} - -function link(from, to) { - return function (args) { - return to(from(args)); - }; -} - -function wrapConversion(toModel, graph) { - var path = [graph[toModel].parent, toModel]; - var fn = conversions[graph[toModel].parent][toModel]; - - var cur = graph[toModel].parent; - while (graph[cur].parent) { - path.unshift(graph[cur].parent); - fn = link(conversions[graph[cur].parent][cur], fn); - cur = graph[cur].parent; - } - - fn.conversion = path; - return fn; -} - -module.exports = function (fromModel) { - var graph = deriveBFS(fromModel); - var conversion = {}; - - var models = Object.keys(graph); - for (var len = models.length, i = 0; i < len; i++) { - var toModel = models[i]; - var node = graph[toModel]; - - if (node.parent === null) { - // no possible conversion, or this node is the source model. - continue; - } - - conversion[toModel] = wrapConversion(toModel, graph); - } - - return conversion; -}; - - - -/***/ }), -/* 751 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(20); -const hasFlag = __webpack_require__(21); - -const env = process.env; - -let forceColor; -if (hasFlag('no-color') || - hasFlag('no-colors') || - hasFlag('color=false')) { - forceColor = false; -} else if (hasFlag('color') || - hasFlag('colors') || - hasFlag('color=true') || - hasFlag('color=always')) { - forceColor = true; -} -if ('FORCE_COLOR' in env) { - forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; -} - -function translateLevel(level) { - if (level === 0) { - return false; - } - - return { - level, - hasBasic: true, - has256: level >= 2, - has16m: level >= 3 - }; -} - -function supportsColor(stream) { - if (forceColor === false) { - return 0; - } - - if (hasFlag('color=16m') || - hasFlag('color=full') || - hasFlag('color=truecolor')) { - return 3; - } - - if (hasFlag('color=256')) { - return 2; - } - - if (stream && !stream.isTTY && forceColor !== true) { - return 0; - } - - const min = forceColor ? 1 : 0; - - if (process.platform === 'win32') { - // Node.js 7.5.0 is the first version of Node.js to include a patch to - // libuv that enables 256 color output on Windows. Anything earlier and it - // won't work. However, here we target Node.js 8 at minimum as it is an LTS - // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows - // release that supports 256 colors. Windows 10 build 14931 is the first release - // that supports 16m/TrueColor. - const osRelease = os.release().split('.'); - if ( - Number(process.versions.node.split('.')[0]) >= 8 && - Number(osRelease[0]) >= 10 && - Number(osRelease[2]) >= 10586 - ) { - return Number(osRelease[2]) >= 14931 ? 3 : 2; - } - - return 1; - } - - if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { - return 1; - } +/** + * @category Common Helpers + * @summary Return the distance between the given date and now in words. + * + * @description + * Return the distance between the given date and now in words. + * + * | Distance to now | Result | + * |-------------------------------------------------------------------|---------------------| + * | 0 ... 30 secs | less than a minute | + * | 30 secs ... 1 min 30 secs | 1 minute | + * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | + * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | + * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | + * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | + * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | + * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | + * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | + * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | + * | 1 yr ... 1 yr 3 months | about 1 year | + * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | + * | 1 yr 9 months ... 2 yrs | almost 2 years | + * | N yrs ... N yrs 3 months | about N years | + * | N yrs 3 months ... N yrs 9 months | over N years | + * | N yrs 9 months ... N+1 yrs | almost N+1 years | + * + * With `options.includeSeconds == true`: + * | Distance to now | Result | + * |---------------------|----------------------| + * | 0 secs ... 5 secs | less than 5 seconds | + * | 5 secs ... 10 secs | less than 10 seconds | + * | 10 secs ... 20 secs | less than 20 seconds | + * | 20 secs ... 40 secs | half a minute | + * | 40 secs ... 60 secs | less than a minute | + * | 60 secs ... 90 secs | 1 minute | + * + * @param {Date|String|Number} date - the given date + * @param {Object} [options] - the object with options + * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed + * @param {Boolean} [options.addSuffix=false] - result specifies if the second date is earlier or later than the first + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the distance in words + * + * @example + * // If today is 1 January 2015, what is the distance to 2 July 2014? + * var result = distanceInWordsToNow( + * new Date(2014, 6, 2) + * ) + * //=> '6 months' + * + * @example + * // If now is 1 January 2015 00:00:00, + * // what is the distance to 1 January 2015 00:00:15, including seconds? + * var result = distanceInWordsToNow( + * new Date(2015, 0, 1, 0, 0, 15), + * {includeSeconds: true} + * ) + * //=> 'less than 20 seconds' + * + * @example + * // If today is 1 January 2015, + * // what is the distance to 1 January 2016, with a suffix? + * var result = distanceInWordsToNow( + * new Date(2016, 0, 1), + * {addSuffix: true} + * ) + * //=> 'in about 1 year' + * + * @example + * // If today is 1 January 2015, + * // what is the distance to 1 August 2016 in Esperanto? + * var eoLocale = require('date-fns/locale/eo') + * var result = distanceInWordsToNow( + * new Date(2016, 7, 1), + * {locale: eoLocale} + * ) + * //=> 'pli ol 1 jaro' + */ +function distanceInWordsToNow (dirtyDate, dirtyOptions) { + return distanceInWords(Date.now(), dirtyDate, dirtyOptions) +} - return min; - } +module.exports = distanceInWordsToNow - if ('TEAMCITY_VERSION' in env) { - return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; - } - if (env.COLORTERM === 'truecolor') { - return 3; - } +/***/ }), +/* 781 */ +/***/ (function(module, exports, __webpack_require__) { - if ('TERM_PROGRAM' in env) { - const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); +var parse = __webpack_require__(731) - switch (env.TERM_PROGRAM) { - case 'iTerm.app': - return version >= 3 ? 3 : 2; - case 'Apple_Terminal': - return 2; - // No default - } - } +/** + * @category Day Helpers + * @summary Return the array of dates within the specified range. + * + * @description + * Return the array of dates within the specified range. + * + * @param {Date|String|Number} startDate - the first date + * @param {Date|String|Number} endDate - the last date + * @param {Number} [step=1] - the step between each day + * @returns {Date[]} the array with starts of days from the day of startDate to the day of endDate + * @throws {Error} startDate cannot be after endDate + * + * @example + * // Each day between 6 October 2014 and 10 October 2014: + * var result = eachDay( + * new Date(2014, 9, 6), + * new Date(2014, 9, 10) + * ) + * //=> [ + * // Mon Oct 06 2014 00:00:00, + * // Tue Oct 07 2014 00:00:00, + * // Wed Oct 08 2014 00:00:00, + * // Thu Oct 09 2014 00:00:00, + * // Fri Oct 10 2014 00:00:00 + * // ] + */ +function eachDay (dirtyStartDate, dirtyEndDate, dirtyStep) { + var startDate = parse(dirtyStartDate) + var endDate = parse(dirtyEndDate) + var step = dirtyStep !== undefined ? dirtyStep : 1 - if (/-256(color)?$/i.test(env.TERM)) { - return 2; - } + var endTime = endDate.getTime() - if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { - return 1; - } + if (startDate.getTime() > endTime) { + throw new Error('The first date cannot be after the second date') + } - if ('COLORTERM' in env) { - return 1; - } + var dates = [] - if (env.TERM === 'dumb') { - return min; - } + var currentDate = startDate + currentDate.setHours(0, 0, 0, 0) - return min; -} + while (currentDate.getTime() <= endTime) { + dates.push(parse(currentDate)) + currentDate.setDate(currentDate.getDate() + step) + } -function getSupportLevel(stream) { - const level = supportsColor(stream); - return translateLevel(level); + return dates } -module.exports = { - supportsColor: getSupportLevel, - stdout: getSupportLevel(process.stdout), - stderr: getSupportLevel(process.stderr) -}; +module.exports = eachDay /***/ }), -/* 752 */ +/* 782 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - -const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'] -]); - -function unescape(c) { - if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); - } - - return ESCAPES.get(c) || c; -} - -function parseArguments(name, args) { - const results = []; - const chunks = args.trim().split(/\s*,\s*/g); - let matches; - - for (const chunk of chunks) { - if (!isNaN(chunk)) { - results.push(Number(chunk)); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } +var parse = __webpack_require__(731) - return results; +/** + * @category Day Helpers + * @summary Return the end of a day for the given date. + * + * @description + * Return the end of a day for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a day + * + * @example + * // The end of a day for 2 September 2014 11:55:00: + * var result = endOfDay(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 02 2014 23:59:59.999 + */ +function endOfDay (dirtyDate) { + var date = parse(dirtyDate) + date.setHours(23, 59, 59, 999) + return date } -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; +module.exports = endOfDay - const results = []; - let matches; - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; +/***/ }), +/* 783 */ +/***/ (function(module, exports, __webpack_require__) { - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); - } else { - results.push([name]); - } - } +var parse = __webpack_require__(731) - return results; +/** + * @category Hour Helpers + * @summary Return the end of an hour for the given date. + * + * @description + * Return the end of an hour for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of an hour + * + * @example + * // The end of an hour for 2 September 2014 11:55:00: + * var result = endOfHour(new Date(2014, 8, 2, 11, 55)) + * //=> Tue Sep 02 2014 11:59:59.999 + */ +function endOfHour (dirtyDate) { + var date = parse(dirtyDate) + date.setMinutes(59, 59, 999) + return date } -function buildStyle(chalk, styles) { - const enabled = {}; +module.exports = endOfHour - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } - let current = chalk; - for (const styleName of Object.keys(enabled)) { - if (Array.isArray(enabled[styleName])) { - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } +/***/ }), +/* 784 */ +/***/ (function(module, exports, __webpack_require__) { - if (enabled[styleName].length > 0) { - current = current[styleName].apply(current, enabled[styleName]); - } else { - current = current[styleName]; - } - } - } +var endOfWeek = __webpack_require__(785) - return current; +/** + * @category ISO Week Helpers + * @summary Return the end of an ISO week for the given date. + * + * @description + * Return the end of an ISO week for the given date. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of an ISO week + * + * @example + * // The end of an ISO week for 2 September 2014 11:55:00: + * var result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sun Sep 07 2014 23:59:59.999 + */ +function endOfISOWeek (dirtyDate) { + return endOfWeek(dirtyDate, {weekStartsOn: 1}) } -module.exports = (chalk, tmp) => { - const styles = []; - const chunks = []; - let chunk = []; +module.exports = endOfISOWeek - // eslint-disable-next-line max-params - tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { - if (escapeChar) { - chunk.push(unescape(escapeChar)); - } else if (style) { - const str = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(chr); - } - }); +/***/ }), +/* 785 */ +/***/ (function(module, exports, __webpack_require__) { - chunks.push(chunk.join('')); +var parse = __webpack_require__(731) - if (styles.length > 0) { - const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMsg); - } +/** + * @category Week Helpers + * @summary Return the end of a week for the given date. + * + * @description + * Return the end of a week for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Date} the end of a week + * + * @example + * // The end of a week for 2 September 2014 11:55:00: + * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sat Sep 06 2014 23:59:59.999 + * + * @example + * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00: + * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) + * //=> Sun Sep 07 2014 23:59:59.999 + */ +function endOfWeek (dirtyDate, dirtyOptions) { + var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - return chunks.join(''); -}; + var date = parse(dirtyDate) + var day = date.getDay() + var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) + date.setDate(date.getDate() + diff) + date.setHours(23, 59, 59, 999) + return date +} -/***/ }), -/* 753 */ -/***/ (function(module, exports) { +module.exports = endOfWeek -module.exports = require("querystring"); /***/ }), -/* 754 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { -const get = __webpack_require__(162) -const flatten = __webpack_require__(182) - -const Contact = __webpack_require__(755) -const Document = __webpack_require__(731) - -class AdministrativeProcedure extends Document { - /** - * Returns personal data for the contact - * - * @param {Contact} contact - A contact - * @param {Array} fields - The list of fields to retrieve - * @return {Object} - the personal data - **/ - static getPersonalData(contact, fields) { - const mapping = { - firstname: { - path: 'name.givenName' - }, - lastname: { - path: 'name.familyName' - }, - address: { - getter: Contact.getPrimaryAddress - }, - email: { - getter: Contact.getPrimaryEmail - }, - phone: { - getter: Contact.getPrimaryPhone - } - } - let personalData = {} - fields.forEach(field => { - const contactField = get(mapping, field, field) - let value - if (contactField.getter) { - value = contactField.getter(contact) - } else { - const path = get(contactField, 'path', field) - value = get(contact, path) - } +var getISOYear = __webpack_require__(737) +var startOfISOWeek = __webpack_require__(738) - if (value !== undefined) { - personalData[field] = value - } - }) +/** + * @category ISO Week-Numbering Year Helpers + * @summary Return the end of an ISO week-numbering year for the given date. + * + * @description + * Return the end of an ISO week-numbering year, + * which always starts 3 days before the year's first Thursday. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of an ISO week-numbering year + * + * @example + * // The end of an ISO week-numbering year for 2 July 2005: + * var result = endOfISOYear(new Date(2005, 6, 2)) + * //=> Sun Jan 01 2006 23:59:59.999 + */ +function endOfISOYear (dirtyDate) { + var year = getISOYear(dirtyDate) + var fourthOfJanuaryOfNextYear = new Date(0) + fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) + fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) + var date = startOfISOWeek(fourthOfJanuaryOfNextYear) + date.setMilliseconds(date.getMilliseconds() - 1) + return date +} - return personalData - } - /** - * Method to generate a query based on a few rules given by the template - * @param {Object} docRules - * @param {Object} docRules.rules - * @param {int} docRules.count - */ - static async getFilesByRules(docRules) { - const { rules, count } = docRules - const cozyRules = { - trashed: false, - type: 'file', - // eslint-disable-next-line node/no-unsupported-features/es-syntax - ...rules - } - // Create an index in order to query and sort - await this.cozyClient - .collection('io.cozy.files') - .createIndex(['metadata.datetime', 'metadata.qualification']) - // Use the index - const files = await this.cozyClient - .collection('io.cozy.files') - .find(cozyRules, { - indexedFields: ['metadata.datetime', 'metadata.qualification'], - sort: [ - { - 'metadata.datetime': 'desc' - }, - { - 'metadata.qualification': 'desc' - } - ], - limit: count ? count : 1 - }) +module.exports = endOfISOYear - return files - } - /** - * Returns a io.cozy.procedures.administratives object - * - * @param {object} data - The data we need for this type of procedure - * @param {ProcedureTemplate} template - The procedure's template - * @return {AdministrativeProcedure} the administrative procedure - */ - static create(data, template) { - const { documentsData, personalData, procedureData } = data - const files = Object.keys(documentsData).map(identifier => { - return documentsData[identifier].files.map(file => { - // TODO Remove this check. it has to be done before - if (file) - return { - _id: file.id, - _type: 'io.cozy.files', - templateDocumentId: identifier - } - }) - }) - return { - personalData, - procedureData, - submissionDate: new Date(), - templateId: template.type, - templateVersion: template.version, - relationships: { - files: { - data: flatten(files) - } - } - } - } +/***/ }), +/* 787 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Returns json that represents the administative procedure - * - * @param {AdministrativeProcedure} - * @return {string} - the json that represents this procedure - * - */ - static createJson(administrativeProcedure) { - return JSON.stringify(administrativeProcedure) - } -} +var parse = __webpack_require__(731) -AdministrativeProcedure.doctype = 'io.cozy.procedures.administratives' +/** + * @category Minute Helpers + * @summary Return the end of a minute for the given date. + * + * @description + * Return the end of a minute for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a minute + * + * @example + * // The end of a minute for 1 December 2014 22:15:45.400: + * var result = endOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) + * //=> Mon Dec 01 2014 22:15:59.999 + */ +function endOfMinute (dirtyDate) { + var date = parse(dirtyDate) + date.setSeconds(59, 999) + return date +} -module.exports = AdministrativeProcedure +module.exports = endOfMinute /***/ }), -/* 755 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { -const PropTypes = __webpack_require__(756) -const get = __webpack_require__(162) - -const log = __webpack_require__(758) -const Document = __webpack_require__(731) +var parse = __webpack_require__(731) -const getPrimaryOrFirst = property => obj => { - if (!obj[property] || obj[property].length === 0) return '' - return obj[property].find(property => property.primary) || obj[property][0] +/** + * @category Month Helpers + * @summary Return the end of a month for the given date. + * + * @description + * Return the end of a month for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a month + * + * @example + * // The end of a month for 2 September 2014 11:55:00: + * var result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 30 2014 23:59:59.999 + */ +function endOfMonth (dirtyDate) { + var date = parse(dirtyDate) + var month = date.getMonth() + date.setFullYear(date.getFullYear(), month + 1, 0) + date.setHours(23, 59, 59, 999) + return date } -const logDeprecated = methodName => - log( - 'warn', - `${methodName} from cozy-doctypes contact is deprecated, use cozy-client/models/contacts/${methodName} instead` - ) +module.exports = endOfMonth + + +/***/ }), +/* 789 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) /** - * Class representing the contact model. - * @extends Document + * @category Quarter Helpers + * @summary Return the end of a year quarter for the given date. + * + * @description + * Return the end of a year quarter for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a quarter + * + * @example + * // The end of a quarter for 2 September 2014 11:55:00: + * var result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 30 2014 23:59:59.999 */ -class Contact extends Document { - /** - * Returns true if candidate is a contact - * - * @param {Object} candidate - * @return {boolean} - whether the candidate is a contact - */ - static isContact(candidate) { - return candidate._type === Contact.doctype - } +function endOfQuarter (dirtyDate) { + var date = parse(dirtyDate) + var currentMonth = date.getMonth() + var month = currentMonth - currentMonth % 3 + 3 + date.setMonth(month, 0) + date.setHours(23, 59, 59, 999) + return date +} - /** - * Returns the initials of the contact. - * - * @param {Contact|string} contact - A contact or a string - * @return {string} - the contact's initials - */ - static getInitials(contact) { - logDeprecated('getInitials') - if (typeof contact === 'string') { - log( - 'warn', - 'Passing a string to Contact.getInitials will be deprecated soon.' - ) - return contact[0].toUpperCase() - } +module.exports = endOfQuarter - if (contact.name) { - return ['givenName', 'familyName'] - .map(part => get(contact, ['name', part, 0], '')) - .join('') - .toUpperCase() - } - const email = Contact.getPrimaryEmail(contact) - if (email) { - return email[0].toUpperCase() - } +/***/ }), +/* 790 */ +/***/ (function(module, exports, __webpack_require__) { - log('warn', 'Contact has no name and no email.') - return '' - } +var parse = __webpack_require__(731) - /** - * Returns the contact's main email - * - * @param {Contact} contact - A contact - * @return {string} - The contact's main email - */ - // TODO: sadly we have different versions of contacts' doctype to handle... - // A migration tool on the stack side is needed here - static getPrimaryEmail(contact) { - logDeprecated('getPrimaryEmail') - return Array.isArray(contact.email) - ? getPrimaryOrFirst('email')(contact).address - : contact.email - } +/** + * @category Second Helpers + * @summary Return the end of a second for the given date. + * + * @description + * Return the end of a second for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a second + * + * @example + * // The end of a second for 1 December 2014 22:15:45.400: + * var result = endOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) + * //=> Mon Dec 01 2014 22:15:45.999 + */ +function endOfSecond (dirtyDate) { + var date = parse(dirtyDate) + date.setMilliseconds(999) + return date +} - /** - * Returns the contact's main cozy - * - * @param {Contact} contact - A contact - * @return {string} - The contact's main cozy - */ - static getPrimaryCozy(contact) { - logDeprecated('getPrimaryCozy') - return Array.isArray(contact.cozy) - ? getPrimaryOrFirst('cozy')(contact).url - : contact.url - } +module.exports = endOfSecond - /** - * Returns the contact's main phone number - * - * @param {Contact} contact - A contact - * @return {string} - The contact's main phone number - */ - static getPrimaryPhone(contact) { - logDeprecated('getPrimaryPhone') - return getPrimaryOrFirst('phone')(contact).number - } - /** - * Returns the contact's main address - * - * @param {Contact} contact - A contact - * @return {string} - The contact's main address - */ - static getPrimaryAddress(contact) { - logDeprecated('getPrimaryAddress') - return getPrimaryOrFirst('address')(contact).formattedAddress - } +/***/ }), +/* 791 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Returns the contact's fullname - * - * @param {Contact} contact - A contact - * @return {string} - The contact's fullname - */ - static getFullname(contact) { - logDeprecated('getFullname') - if (contact.fullname) { - return contact.fullname - } else if (contact.name) { - return [ - 'namePrefix', - 'givenName', - 'additionalName', - 'familyName', - 'nameSuffix' - ] - .map(part => contact.name[part]) - .filter(part => part !== undefined) - .join(' ') - .trim() - } +var endOfDay = __webpack_require__(782) - return undefined - } +/** + * @category Day Helpers + * @summary Return the end of today. + * + * @description + * Return the end of today. + * + * @returns {Date} the end of today + * + * @example + * // If today is 6 October 2014: + * var result = endOfToday() + * //=> Mon Oct 6 2014 23:59:59.999 + */ +function endOfToday () { + return endOfDay(new Date()) +} - /** - * Returns a display name for the contact - * - * @param {Contact} contact - A contact - * @return {string} - the contact's display name - **/ - static getDisplayName(contact) { - logDeprecated('getDisplayName') - return Contact.getFullname(contact) || Contact.getPrimaryEmail(contact) - } +module.exports = endOfToday + + +/***/ }), +/* 792 */ +/***/ (function(module, exports) { + +/** + * @category Day Helpers + * @summary Return the end of tomorrow. + * + * @description + * Return the end of tomorrow. + * + * @returns {Date} the end of tomorrow + * + * @example + * // If today is 6 October 2014: + * var result = endOfTomorrow() + * //=> Tue Oct 7 2014 23:59:59.999 + */ +function endOfTomorrow () { + var now = new Date() + var year = now.getFullYear() + var month = now.getMonth() + var day = now.getDate() + + var date = new Date(0) + date.setFullYear(year, month, day + 1) + date.setHours(23, 59, 59, 999) + return date } -const ContactShape = PropTypes.shape({ - _id: PropTypes.string.isRequired, - _type: PropTypes.string.isRequired, - fullname: PropTypes.string, - name: PropTypes.shape({ - givenName: PropTypes.string, - familyName: PropTypes.string, - additionalName: PropTypes.string, - namePrefix: PropTypes.string, - nameSuffix: PropTypes.string - }), - birthday: PropTypes.string, - note: PropTypes.string, - email: PropTypes.arrayOf( - PropTypes.shape({ - address: PropTypes.string.isRequired, - label: PropTypes.string, - type: PropTypes.string, - primary: PropTypes.bool - }) - ), - address: PropTypes.arrayOf( - PropTypes.shape({ - street: PropTypes.string, - pobox: PropTypes.string, - city: PropTypes.string, - region: PropTypes.string, - postcode: PropTypes.string, - country: PropTypes.string, - type: PropTypes.string, - primary: PropTypes.bool, - label: PropTypes.string, - formattedAddress: PropTypes.string - }) - ), - phone: PropTypes.arrayOf( - PropTypes.shape({ - number: PropTypes.string.isRequired, - type: PropTypes.string, - label: PropTypes.string, - primary: PropTypes.bool - }) - ), - cozy: PropTypes.arrayOf( - PropTypes.shape({ - url: PropTypes.string.isRequired, - label: PropTypes.string, - primary: PropTypes.bool - }) - ), - company: PropTypes.string, - jobTitle: PropTypes.string, - trashed: PropTypes.bool, - me: PropTypes.bool, - relationships: PropTypes.shape({ - accounts: PropTypes.shape({ - data: PropTypes.arrayOf( - PropTypes.shape({ - _id: PropTypes.string.isRequired, - _type: PropTypes.string.isRequired - }) - ) - }), - groups: PropTypes.shape({ - data: PropTypes.arrayOf( - PropTypes.shape({ - _id: PropTypes.string.isRequired, - _type: PropTypes.string.isRequired - }) - ) - }) - }) -}) +module.exports = endOfTomorrow -Contact.doctype = 'io.cozy.contacts' -Contact.propType = ContactShape -module.exports = Contact +/***/ }), +/* 793 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + +/** + * @category Year Helpers + * @summary Return the end of a year for the given date. + * + * @description + * Return the end of a year for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of a year + * + * @example + * // The end of a year for 2 September 2014 11:55:00: + * var result = endOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Dec 31 2014 23:59:59.999 + */ +function endOfYear (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() + date.setFullYear(year + 1, 0, 0) + date.setHours(23, 59, 59, 999) + return date +} + +module.exports = endOfYear /***/ }), -/* 756 */ -/***/ (function(module, exports, __webpack_require__) { +/* 794 */ +/***/ (function(module, exports) { /** - * Copyright (c) 2013-present, Facebook, Inc. + * @category Day Helpers + * @summary Return the end of yesterday. * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * @description + * Return the end of yesterday. + * + * @returns {Date} the end of yesterday + * + * @example + * // If today is 6 October 2014: + * var result = endOfYesterday() + * //=> Sun Oct 5 2014 23:59:59.999 */ +function endOfYesterday () { + var now = new Date() + var year = now.getFullYear() + var month = now.getMonth() + var day = now.getDate() -if (true) { - var ReactIs = __webpack_require__(672); + var date = new Date(0) + date.setFullYear(year, month, day - 1) + date.setHours(23, 59, 59, 999) + return date +} - // By explicitly using `prop-types` you are opting into new development behavior. - // http://fb.me/prop-types-in-prod - var throwOnDirectAccess = true; - module.exports = __webpack_require__(757)(ReactIs.isElement, throwOnDirectAccess); -} else {} +module.exports = endOfYesterday /***/ }), -/* 757 */ +/* 795 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +var getDayOfYear = __webpack_require__(796) +var getISOWeek = __webpack_require__(798) +var getISOYear = __webpack_require__(737) +var parse = __webpack_require__(731) +var isValid = __webpack_require__(799) +var enLocale = __webpack_require__(775) + /** - * Copyright (c) 2013-present, Facebook, Inc. + * @category Common Helpers + * @summary Format the date. * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. + * @description + * Return the formatted date string in the given format. + * + * Accepted tokens: + * | Unit | Token | Result examples | + * |-------------------------|-------|----------------------------------| + * | Month | M | 1, 2, ..., 12 | + * | | Mo | 1st, 2nd, ..., 12th | + * | | MM | 01, 02, ..., 12 | + * | | MMM | Jan, Feb, ..., Dec | + * | | MMMM | January, February, ..., December | + * | Quarter | Q | 1, 2, 3, 4 | + * | | Qo | 1st, 2nd, 3rd, 4th | + * | Day of month | D | 1, 2, ..., 31 | + * | | Do | 1st, 2nd, ..., 31st | + * | | DD | 01, 02, ..., 31 | + * | Day of year | DDD | 1, 2, ..., 366 | + * | | DDDo | 1st, 2nd, ..., 366th | + * | | DDDD | 001, 002, ..., 366 | + * | Day of week | d | 0, 1, ..., 6 | + * | | do | 0th, 1st, ..., 6th | + * | | dd | Su, Mo, ..., Sa | + * | | ddd | Sun, Mon, ..., Sat | + * | | dddd | Sunday, Monday, ..., Saturday | + * | Day of ISO week | E | 1, 2, ..., 7 | + * | ISO week | W | 1, 2, ..., 53 | + * | | Wo | 1st, 2nd, ..., 53rd | + * | | WW | 01, 02, ..., 53 | + * | Year | YY | 00, 01, ..., 99 | + * | | YYYY | 1900, 1901, ..., 2099 | + * | ISO week-numbering year | GG | 00, 01, ..., 99 | + * | | GGGG | 1900, 1901, ..., 2099 | + * | AM/PM | A | AM, PM | + * | | a | am, pm | + * | | aa | a.m., p.m. | + * | Hour | H | 0, 1, ... 23 | + * | | HH | 00, 01, ... 23 | + * | | h | 1, 2, ..., 12 | + * | | hh | 01, 02, ..., 12 | + * | Minute | m | 0, 1, ..., 59 | + * | | mm | 00, 01, ..., 59 | + * | Second | s | 0, 1, ..., 59 | + * | | ss | 00, 01, ..., 59 | + * | 1/10 of second | S | 0, 1, ..., 9 | + * | 1/100 of second | SS | 00, 01, ..., 99 | + * | Millisecond | SSS | 000, 001, ..., 999 | + * | Timezone | Z | -01:00, +00:00, ... +12:00 | + * | | ZZ | -0100, +0000, ..., +1200 | + * | Seconds timestamp | X | 512969520 | + * | Milliseconds timestamp | x | 512969520900 | + * + * The characters wrapped in square brackets are escaped. + * + * The result may vary by locale. + * + * @param {Date|String|Number} date - the original date + * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens + * @param {Object} [options] - the object with options + * @param {Object} [options.locale=enLocale] - the locale object + * @returns {String} the formatted date string + * + * @example + * // Represent 11 February 2014 in middle-endian format: + * var result = format( + * new Date(2014, 1, 11), + * 'MM/DD/YYYY' + * ) + * //=> '02/11/2014' + * + * @example + * // Represent 2 July 2014 in Esperanto: + * var eoLocale = require('date-fns/locale/eo') + * var result = format( + * new Date(2014, 6, 2), + * 'Do [de] MMMM YYYY', + * {locale: eoLocale} + * ) + * //=> '2-a de julio 2014' */ +function format (dirtyDate, dirtyFormatStr, dirtyOptions) { + var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ' + var options = dirtyOptions || {} + var locale = options.locale + var localeFormatters = enLocale.format.formatters + var formattingTokensRegExp = enLocale.format.formattingTokensRegExp + if (locale && locale.format && locale.format.formatters) { + localeFormatters = locale.format.formatters + if (locale.format.formattingTokensRegExp) { + formattingTokensRegExp = locale.format.formattingTokensRegExp + } + } -var ReactIs = __webpack_require__(672); -var assign = __webpack_require__(676); + var date = parse(dirtyDate) -var ReactPropTypesSecret = __webpack_require__(678); -var has = __webpack_require__(679); -var checkPropTypes = __webpack_require__(677); + if (!isValid(date)) { + return 'Invalid Date' + } -var printWarning = function() {}; + var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp) -if (true) { - printWarning = function(text) { - var message = 'Warning: ' + text; - if (typeof console !== 'undefined') { - console.error(message); - } - try { - // --- Welcome to debugging React --- - // This error was thrown as a convenience so that you can use this stack - // to find the callsite that caused this warning to fire. - throw new Error(message); - } catch (x) {} - }; + return formatFn(date) } -function emptyFunctionThatReturnsNull() { - return null; -} +var formatters = { + // Month: 1, 2, ..., 12 + 'M': function (date) { + return date.getMonth() + 1 + }, -module.exports = function(isValidElement, throwOnDirectAccess) { - /* global Symbol */ - var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; - var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + // Month: 01, 02, ..., 12 + 'MM': function (date) { + return addLeadingZeros(date.getMonth() + 1, 2) + }, - /** - * Returns the iterator method function contained on the iterable object. - * - * Be sure to invoke the function with the iterable as context: - * - * var iteratorFn = getIteratorFn(myIterable); - * if (iteratorFn) { - * var iterator = iteratorFn.call(myIterable); - * ... - * } - * - * @param {?object} maybeIterable - * @return {?function} - */ - function getIteratorFn(maybeIterable) { - var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); - if (typeof iteratorFn === 'function') { - return iteratorFn; - } - } + // Quarter: 1, 2, 3, 4 + 'Q': function (date) { + return Math.ceil((date.getMonth() + 1) / 3) + }, - /** - * Collection of methods that allow declaration and validation of props that are - * supplied to React components. Example usage: - * - * var Props = require('ReactPropTypes'); - * var MyArticle = React.createClass({ - * propTypes: { - * // An optional string prop named "description". - * description: Props.string, - * - * // A required enum prop named "category". - * category: Props.oneOf(['News','Photos']).isRequired, - * - * // A prop named "dialog" that requires an instance of Dialog. - * dialog: Props.instanceOf(Dialog).isRequired - * }, - * render: function() { ... } - * }); - * - * A more formal specification of how these methods are used: - * - * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) - * decl := ReactPropTypes.{type}(.isRequired)? - * - * Each and every declaration produces a function with the same signature. This - * allows the creation of custom validation functions. For example: - * - * var MyLink = React.createClass({ - * propTypes: { - * // An optional string or URI prop named "href". - * href: function(props, propName, componentName) { - * var propValue = props[propName]; - * if (propValue != null && typeof propValue !== 'string' && - * !(propValue instanceof URI)) { - * return new Error( - * 'Expected a string or an URI for ' + propName + ' in ' + - * componentName - * ); - * } - * } - * }, - * render: function() {...} - * }); - * - * @internal - */ + // Day of month: 1, 2, ..., 31 + 'D': function (date) { + return date.getDate() + }, - var ANONYMOUS = '<<anonymous>>'; + // Day of month: 01, 02, ..., 31 + 'DD': function (date) { + return addLeadingZeros(date.getDate(), 2) + }, - // Important! - // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. - var ReactPropTypes = { - array: createPrimitiveTypeChecker('array'), - bigint: createPrimitiveTypeChecker('bigint'), - bool: createPrimitiveTypeChecker('boolean'), - func: createPrimitiveTypeChecker('function'), - number: createPrimitiveTypeChecker('number'), - object: createPrimitiveTypeChecker('object'), - string: createPrimitiveTypeChecker('string'), - symbol: createPrimitiveTypeChecker('symbol'), + // Day of year: 1, 2, ..., 366 + 'DDD': function (date) { + return getDayOfYear(date) + }, - any: createAnyTypeChecker(), - arrayOf: createArrayOfTypeChecker, - element: createElementTypeChecker(), - elementType: createElementTypeTypeChecker(), - instanceOf: createInstanceTypeChecker, - node: createNodeChecker(), - objectOf: createObjectOfTypeChecker, - oneOf: createEnumTypeChecker, - oneOfType: createUnionTypeChecker, - shape: createShapeTypeChecker, - exact: createStrictShapeTypeChecker, - }; + // Day of year: 001, 002, ..., 366 + 'DDDD': function (date) { + return addLeadingZeros(getDayOfYear(date), 3) + }, - /** - * inlined Object.is polyfill to avoid requiring consumers ship their own - * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is - */ - /*eslint-disable no-self-compare*/ - function is(x, y) { - // SameValue algorithm - if (x === y) { - // Steps 1-5, 7-10 - // Steps 6.b-6.e: +0 != -0 - return x !== 0 || 1 / x === 1 / y; - } else { - // Step 6.a: NaN == NaN - return x !== x && y !== y; - } - } - /*eslint-enable no-self-compare*/ + // Day of week: 0, 1, ..., 6 + 'd': function (date) { + return date.getDay() + }, - /** - * We use an Error-like object for backward compatibility as people may call - * PropTypes directly and inspect their output. However, we don't use real - * Errors anymore. We don't inspect their stack anyway, and creating them - * is prohibitively expensive if they are created too often, such as what - * happens in oneOfType() for any type before the one that matched. - */ - function PropTypeError(message, data) { - this.message = message; - this.data = data && typeof data === 'object' ? data: {}; - this.stack = ''; - } - // Make `instanceof Error` still work for returned errors. - PropTypeError.prototype = Error.prototype; + // Day of ISO week: 1, 2, ..., 7 + 'E': function (date) { + return date.getDay() || 7 + }, - function createChainableTypeChecker(validate) { - if (true) { - var manualPropTypeCallCache = {}; - var manualPropTypeWarningCount = 0; - } - function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { - componentName = componentName || ANONYMOUS; - propFullName = propFullName || propName; + // ISO week: 1, 2, ..., 53 + 'W': function (date) { + return getISOWeek(date) + }, - if (secret !== ReactPropTypesSecret) { - if (throwOnDirectAccess) { - // New behavior only for users of `prop-types` package - var err = new Error( - 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + - 'Use `PropTypes.checkPropTypes()` to call them. ' + - 'Read more at http://fb.me/use-check-prop-types' - ); - err.name = 'Invariant Violation'; - throw err; - } else if ( true && typeof console !== 'undefined') { - // Old behavior for people using React.PropTypes - var cacheKey = componentName + ':' + propName; - if ( - !manualPropTypeCallCache[cacheKey] && - // Avoid spamming the console because they are often not actionable except for lib authors - manualPropTypeWarningCount < 3 - ) { - printWarning( - 'You are manually calling a React.PropTypes validation ' + - 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + - 'and will throw in the standalone `prop-types` package. ' + - 'You may be seeing this warning due to a third-party PropTypes ' + - 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' - ); - manualPropTypeCallCache[cacheKey] = true; - manualPropTypeWarningCount++; - } - } - } - if (props[propName] == null) { - if (isRequired) { - if (props[propName] === null) { - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); - } - return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); - } - return null; - } else { - return validate(props, propName, componentName, location, propFullName); - } - } + // ISO week: 01, 02, ..., 53 + 'WW': function (date) { + return addLeadingZeros(getISOWeek(date), 2) + }, + + // Year: 00, 01, ..., 99 + 'YY': function (date) { + return addLeadingZeros(date.getFullYear(), 4).substr(2) + }, + + // Year: 1900, 1901, ..., 2099 + 'YYYY': function (date) { + return addLeadingZeros(date.getFullYear(), 4) + }, + + // ISO week-numbering year: 00, 01, ..., 99 + 'GG': function (date) { + return String(getISOYear(date)).substr(2) + }, - var chainedCheckType = checkType.bind(null, false); - chainedCheckType.isRequired = checkType.bind(null, true); + // ISO week-numbering year: 1900, 1901, ..., 2099 + 'GGGG': function (date) { + return getISOYear(date) + }, - return chainedCheckType; - } + // Hour: 0, 1, ... 23 + 'H': function (date) { + return date.getHours() + }, - function createPrimitiveTypeChecker(expectedType) { - function validate(props, propName, componentName, location, propFullName, secret) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== expectedType) { - // `propValue` being instance of, say, date/regexp, pass the 'object' - // check, but we can offer a more precise error message here rather than - // 'of type `object`'. - var preciseType = getPreciseType(propValue); + // Hour: 00, 01, ..., 23 + 'HH': function (date) { + return addLeadingZeros(date.getHours(), 2) + }, - return new PropTypeError( - 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), - {expectedType: expectedType} - ); - } - return null; + // Hour: 1, 2, ..., 12 + 'h': function (date) { + var hours = date.getHours() + if (hours === 0) { + return 12 + } else if (hours > 12) { + return hours % 12 + } else { + return hours } - return createChainableTypeChecker(validate); - } + }, - function createAnyTypeChecker() { - return createChainableTypeChecker(emptyFunctionThatReturnsNull); - } + // Hour: 01, 02, ..., 12 + 'hh': function (date) { + return addLeadingZeros(formatters['h'](date), 2) + }, - function createArrayOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); - } - var propValue = props[propName]; - if (!Array.isArray(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); - } - for (var i = 0; i < propValue.length; i++) { - var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); - } + // Minute: 0, 1, ..., 59 + 'm': function (date) { + return date.getMinutes() + }, - function createElementTypeChecker() { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - if (!isValidElement(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); - } - return null; - } - return createChainableTypeChecker(validate); - } + // Minute: 00, 01, ..., 59 + 'mm': function (date) { + return addLeadingZeros(date.getMinutes(), 2) + }, - function createElementTypeTypeChecker() { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - if (!ReactIs.isValidElementType(propValue)) { - var propType = getPropType(propValue); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); - } - return null; - } - return createChainableTypeChecker(validate); - } + // Second: 0, 1, ..., 59 + 's': function (date) { + return date.getSeconds() + }, - function createInstanceTypeChecker(expectedClass) { - function validate(props, propName, componentName, location, propFullName) { - if (!(props[propName] instanceof expectedClass)) { - var expectedClassName = expectedClass.name || ANONYMOUS; - var actualClassName = getClassName(props[propName]); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); - } - return null; - } - return createChainableTypeChecker(validate); - } + // Second: 00, 01, ..., 59 + 'ss': function (date) { + return addLeadingZeros(date.getSeconds(), 2) + }, - function createEnumTypeChecker(expectedValues) { - if (!Array.isArray(expectedValues)) { - if (true) { - if (arguments.length > 1) { - printWarning( - 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + - 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' - ); - } else { - printWarning('Invalid argument supplied to oneOf, expected an array.'); - } - } - return emptyFunctionThatReturnsNull; - } + // 1/10 of second: 0, 1, ..., 9 + 'S': function (date) { + return Math.floor(date.getMilliseconds() / 100) + }, - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - for (var i = 0; i < expectedValues.length; i++) { - if (is(propValue, expectedValues[i])) { - return null; - } - } + // 1/100 of second: 00, 01, ..., 99 + 'SS': function (date) { + return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2) + }, - var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { - var type = getPreciseType(value); - if (type === 'symbol') { - return String(value); - } - return value; - }); - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); - } - return createChainableTypeChecker(validate); - } + // Millisecond: 000, 001, ..., 999 + 'SSS': function (date) { + return addLeadingZeros(date.getMilliseconds(), 3) + }, - function createObjectOfTypeChecker(typeChecker) { - function validate(props, propName, componentName, location, propFullName) { - if (typeof typeChecker !== 'function') { - return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); - } - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); - } - for (var key in propValue) { - if (has(propValue, key)) { - var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error instanceof Error) { - return error; - } - } - } - return null; - } - return createChainableTypeChecker(validate); - } + // Timezone: -01:00, +00:00, ... +12:00 + 'Z': function (date) { + return formatTimezone(date.getTimezoneOffset(), ':') + }, - function createUnionTypeChecker(arrayOfTypeCheckers) { - if (!Array.isArray(arrayOfTypeCheckers)) { - true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined; - return emptyFunctionThatReturnsNull; - } + // Timezone: -0100, +0000, ... +1200 + 'ZZ': function (date) { + return formatTimezone(date.getTimezoneOffset()) + }, - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - if (typeof checker !== 'function') { - printWarning( - 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + - 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' - ); - return emptyFunctionThatReturnsNull; - } - } + // Seconds timestamp: 512969520 + 'X': function (date) { + return Math.floor(date.getTime() / 1000) + }, - function validate(props, propName, componentName, location, propFullName) { - var expectedTypes = []; - for (var i = 0; i < arrayOfTypeCheckers.length; i++) { - var checker = arrayOfTypeCheckers[i]; - var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret); - if (checkerResult == null) { - return null; - } - if (checkerResult.data && has(checkerResult.data, 'expectedType')) { - expectedTypes.push(checkerResult.data.expectedType); - } - } - var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': ''; - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); + // Milliseconds timestamp: 512969520900 + 'x': function (date) { + return date.getTime() + } +} + +function buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) { + var array = formatStr.match(formattingTokensRegExp) + var length = array.length + + var i + var formatter + for (i = 0; i < length; i++) { + formatter = localeFormatters[array[i]] || formatters[array[i]] + if (formatter) { + array[i] = formatter + } else { + array[i] = removeFormattingTokens(array[i]) } - return createChainableTypeChecker(validate); } - function createNodeChecker() { - function validate(props, propName, componentName, location, propFullName) { - if (!isNode(props[propName])) { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + return function (date) { + var output = '' + for (var i = 0; i < length; i++) { + if (array[i] instanceof Function) { + output += array[i](date, formatters) + } else { + output += array[i] } - return null; } - return createChainableTypeChecker(validate); + return output } +} - function invalidValidatorError(componentName, location, propFullName, key, type) { - return new PropTypeError( - (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + - 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.' - ); +function removeFormattingTokens (input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|]$/g, '') } + return input.replace(/\\/g, '') +} - function createShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - for (var key in shapeTypes) { - var checker = shapeTypes[key]; - if (typeof checker !== 'function') { - return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } - return createChainableTypeChecker(validate); +function formatTimezone (offset, delimeter) { + delimeter = delimeter || '' + var sign = offset > 0 ? '-' : '+' + var absOffset = Math.abs(offset) + var hours = Math.floor(absOffset / 60) + var minutes = absOffset % 60 + return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2) +} + +function addLeadingZeros (number, targetLength) { + var output = Math.abs(number).toString() + while (output.length < targetLength) { + output = '0' + output } + return output +} - function createStrictShapeTypeChecker(shapeTypes) { - function validate(props, propName, componentName, location, propFullName) { - var propValue = props[propName]; - var propType = getPropType(propValue); - if (propType !== 'object') { - return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); - } - // We need to check all keys in case some are required but missing from props. - var allKeys = assign({}, props[propName], shapeTypes); - for (var key in allKeys) { - var checker = shapeTypes[key]; - if (has(shapeTypes, key) && typeof checker !== 'function') { - return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); - } - if (!checker) { - return new PropTypeError( - 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + - '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + - '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') - ); - } - var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); - if (error) { - return error; - } - } - return null; - } +module.exports = format - return createChainableTypeChecker(validate); - } - function isNode(propValue) { - switch (typeof propValue) { - case 'number': - case 'string': - case 'undefined': - return true; - case 'boolean': - return !propValue; - case 'object': - if (Array.isArray(propValue)) { - return propValue.every(isNode); - } - if (propValue === null || isValidElement(propValue)) { - return true; - } +/***/ }), +/* 796 */ +/***/ (function(module, exports, __webpack_require__) { - var iteratorFn = getIteratorFn(propValue); - if (iteratorFn) { - var iterator = iteratorFn.call(propValue); - var step; - if (iteratorFn !== propValue.entries) { - while (!(step = iterator.next()).done) { - if (!isNode(step.value)) { - return false; - } - } - } else { - // Iterator will provide entry [k,v] tuples rather than values. - while (!(step = iterator.next()).done) { - var entry = step.value; - if (entry) { - if (!isNode(entry[1])) { - return false; - } - } - } - } - } else { - return false; - } +var parse = __webpack_require__(731) +var startOfYear = __webpack_require__(797) +var differenceInCalendarDays = __webpack_require__(742) - return true; - default: - return false; - } - } +/** + * @category Day Helpers + * @summary Get the day of the year of the given date. + * + * @description + * Get the day of the year of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the day of year + * + * @example + * // Which day of the year is 2 July 2014? + * var result = getDayOfYear(new Date(2014, 6, 2)) + * //=> 183 + */ +function getDayOfYear (dirtyDate) { + var date = parse(dirtyDate) + var diff = differenceInCalendarDays(date, startOfYear(date)) + var dayOfYear = diff + 1 + return dayOfYear +} - function isSymbol(propType, propValue) { - // Native Symbol. - if (propType === 'symbol') { - return true; - } +module.exports = getDayOfYear - // falsy value can't be a Symbol - if (!propValue) { - return false; - } - // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' - if (propValue['@@toStringTag'] === 'Symbol') { - return true; - } +/***/ }), +/* 797 */ +/***/ (function(module, exports, __webpack_require__) { - // Fallback for non-spec compliant Symbols which are polyfilled. - if (typeof Symbol === 'function' && propValue instanceof Symbol) { - return true; - } +var parse = __webpack_require__(731) - return false; - } +/** + * @category Year Helpers + * @summary Return the start of a year for the given date. + * + * @description + * Return the start of a year for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a year + * + * @example + * // The start of a year for 2 September 2014 11:55:00: + * var result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Jan 01 2014 00:00:00 + */ +function startOfYear (dirtyDate) { + var cleanDate = parse(dirtyDate) + var date = new Date(0) + date.setFullYear(cleanDate.getFullYear(), 0, 1) + date.setHours(0, 0, 0, 0) + return date +} - // Equivalent of `typeof` but with special handling for array and regexp. - function getPropType(propValue) { - var propType = typeof propValue; - if (Array.isArray(propValue)) { - return 'array'; - } - if (propValue instanceof RegExp) { - // Old webkits (at least until Android 4.0) return 'function' rather than - // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ - // passes PropTypes.object. - return 'object'; - } - if (isSymbol(propType, propValue)) { - return 'symbol'; - } - return propType; - } +module.exports = startOfYear - // This handles more types than `getPropType`. Only used for error messages. - // See `createPrimitiveTypeChecker`. - function getPreciseType(propValue) { - if (typeof propValue === 'undefined' || propValue === null) { - return '' + propValue; - } - var propType = getPropType(propValue); - if (propType === 'object') { - if (propValue instanceof Date) { - return 'date'; - } else if (propValue instanceof RegExp) { - return 'regexp'; - } - } - return propType; - } - // Returns a string that is postfixed to a warning about an invalid type. - // For example, "undefined" or "of type array" - function getPostfixForTypeWarning(value) { - var type = getPreciseType(value); - switch (type) { - case 'array': - case 'object': - return 'an ' + type; - case 'boolean': - case 'date': - case 'regexp': - return 'a ' + type; - default: - return type; - } - } +/***/ }), +/* 798 */ +/***/ (function(module, exports, __webpack_require__) { - // Returns class name of the object, if any. - function getClassName(propValue) { - if (!propValue.constructor || !propValue.constructor.name) { - return ANONYMOUS; - } - return propValue.constructor.name; - } +var parse = __webpack_require__(731) +var startOfISOWeek = __webpack_require__(738) +var startOfISOYear = __webpack_require__(741) + +var MILLISECONDS_IN_WEEK = 604800000 - ReactPropTypes.checkPropTypes = checkPropTypes; - ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; - ReactPropTypes.PropTypes = ReactPropTypes; +/** + * @category ISO Week Helpers + * @summary Get the ISO week of the given date. + * + * @description + * Get the ISO week of the given date. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the ISO week + * + * @example + * // Which week of the ISO-week numbering year is 2 January 2005? + * var result = getISOWeek(new Date(2005, 0, 2)) + * //=> 53 + */ +function getISOWeek (dirtyDate) { + var date = parse(dirtyDate) + var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime() - return ReactPropTypes; -}; + // Round the number of days to the nearest integer + // because the number of milliseconds in a week is not constant + // (e.g. it's different in the week of the daylight saving time clock shift) + return Math.round(diff / MILLISECONDS_IN_WEEK) + 1 +} + +module.exports = getISOWeek /***/ }), -/* 758 */ +/* 799 */ /***/ (function(module, exports, __webpack_require__) { -const log = __webpack_require__(739).namespace('doctypes') +var isDate = __webpack_require__(733) -module.exports = log +/** + * @category Common Helpers + * @summary Is the given date valid? + * + * @description + * Returns false if argument is Invalid Date and true otherwise. + * Invalid Date is a Date, whose time value is NaN. + * + * Time value of Date: http://es5.github.io/#x15.9.1.1 + * + * @param {Date} date - the date to check + * @returns {Boolean} the date is valid + * @throws {TypeError} argument must be an instance of Date + * + * @example + * // For the valid date: + * var result = isValid(new Date(2014, 1, 31)) + * //=> true + * + * @example + * // For the invalid date: + * var result = isValid(new Date('')) + * //=> false + */ +function isValid (dirtyDate) { + if (isDate(dirtyDate)) { + return !isNaN(dirtyDate) + } else { + throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date') + } +} + +module.exports = isValid /***/ }), -/* 759 */ +/* 800 */ /***/ (function(module, exports, __webpack_require__) { -const Document = __webpack_require__(731) - -const APP_DOCTYPE = 'io.cozy.apps' -const STORE_SLUG = 'store' +var parse = __webpack_require__(731) -class Application extends Document { - /** - * Return Store URL where an app/konnector can be installed / updated - * @param {Array} [appData=[]] Apps data, as returned by endpoint /apps/ or - * /konnectors/ - * @param {Object} [app={}] AppObject - * @return {String} URL as string - */ - static getStoreInstallationURL(appData = [], app = {}) { - if (!app.slug) { - throw new Error('Expected app / konnector with the defined slug') - } +/** + * @category Day Helpers + * @summary Get the day of the month of the given date. + * + * @description + * Get the day of the month of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the day of month + * + * @example + * // Which day of the month is 29 February 2012? + * var result = getDate(new Date(2012, 1, 29)) + * //=> 29 + */ +function getDate (dirtyDate) { + var date = parse(dirtyDate) + var dayOfMonth = date.getDate() + return dayOfMonth +} - const storeApp = this.isInstalled(appData, { slug: STORE_SLUG }) - if (!storeApp) return null +module.exports = getDate - const storeUrl = storeApp.links && storeApp.links.related - if (!storeUrl) return null +/***/ }), +/* 801 */ +/***/ (function(module, exports, __webpack_require__) { - return `${storeUrl}#/discover/${app.slug}/install` - } +var parse = __webpack_require__(731) - /** - * - * @param {Array} apps Array of apps returned by /apps /konnectors - * @param {Object} wantedApp io.cozy.app with at least a slug - * @return {Object} The io.cozy.app is installed or undefined if not - */ - static isInstalled(apps = [], wantedApp = {}) { - return apps.find( - app => app.attributes && app.attributes.slug === wantedApp.slug - ) - } - /** - * - * @param {Object} app io.cozy.app object - * @return {String} url to the app - */ - static getUrl(app) { - return app.links && app.links.related - } +/** + * @category Weekday Helpers + * @summary Get the day of the week of the given date. + * + * @description + * Get the day of the week of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the day of week + * + * @example + * // Which day of the week is 29 February 2012? + * var result = getDay(new Date(2012, 1, 29)) + * //=> 3 + */ +function getDay (dirtyDate) { + var date = parse(dirtyDate) + var day = date.getDay() + return day } -Application.schema = { - doctype: APP_DOCTYPE, - attributes: {} -} +module.exports = getDay -Application.doctype = APP_DOCTYPE -module.exports = Application +/***/ }), +/* 802 */ +/***/ (function(module, exports, __webpack_require__) { + +var isLeapYear = __webpack_require__(803) + +/** + * @category Year Helpers + * @summary Get the number of days in a year of the given date. + * + * @description + * Get the number of days in a year of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the number of days in a year + * + * @example + * // How many days are in 2012? + * var result = getDaysInYear(new Date(2012, 0, 1)) + * //=> 366 + */ +function getDaysInYear (dirtyDate) { + return isLeapYear(dirtyDate) ? 366 : 365 +} + +module.exports = getDaysInYear /***/ }), -/* 760 */ +/* 803 */ /***/ (function(module, exports, __webpack_require__) { -const Document = __webpack_require__(731) -const BankAccount = __webpack_require__(761) +var parse = __webpack_require__(731) -class BalanceHistory extends Document { - static async getByYearAndAccount(year, accountId) { - const index = await Document.getIndex(this.doctype, this.idAttributes) - const options = { - selector: { year, 'relationships.account.data._id': accountId }, - limit: 1 - } - const [balance] = await Document.query(index, options) +/** + * @category Year Helpers + * @summary Is the given date in the leap year? + * + * @description + * Is the given date in the leap year? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in the leap year + * + * @example + * // Is 1 September 2012 in the leap year? + * var result = isLeapYear(new Date(2012, 8, 1)) + * //=> true + */ +function isLeapYear (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() + return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0 +} - if (balance) { - return balance - } +module.exports = isLeapYear - return this.getEmptyDocument(year, accountId) - } - static getEmptyDocument(year, accountId) { - return { - year, - balances: {}, - metadata: { - version: this.version - }, - relationships: { - account: { - data: { - _id: accountId, - _type: BankAccount.doctype - } - } - } - } - } +/***/ }), +/* 804 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + +/** + * @category Hour Helpers + * @summary Get the hours of the given date. + * + * @description + * Get the hours of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the hours + * + * @example + * // Get the hours of 29 February 2012 11:45:00: + * var result = getHours(new Date(2012, 1, 29, 11, 45)) + * //=> 11 + */ +function getHours (dirtyDate) { + var date = parse(dirtyDate) + var hours = date.getHours() + return hours } -BalanceHistory.doctype = 'io.cozy.bank.balancehistories' -BalanceHistory.idAttributes = ['year', 'relationships.account.data._id'] -BalanceHistory.version = 1 -BalanceHistory.checkedAttributes = ['balances'] - -module.exports = BalanceHistory +module.exports = getHours /***/ }), -/* 761 */ +/* 805 */ /***/ (function(module, exports, __webpack_require__) { -const groupBy = __webpack_require__(386) -const get = __webpack_require__(162) -const merge = __webpack_require__(295) -const Document = __webpack_require__(731) -const matching = __webpack_require__(762) -const { getSlugFromInstitutionLabel } = __webpack_require__(764) -const log = __webpack_require__(739).namespace('BankAccount') - -class BankAccount extends Document { - /** - * Adds _id of existing accounts to fetched accounts - */ - static reconciliate(fetchedAccounts, localAccounts) { - const matchings = matching.matchAccounts(fetchedAccounts, localAccounts) - return matchings.map(matching => { - log( - 'info', - matching.match - ? `${matching.account.label} matched with ${matching.match.label} via ${matching.method}` - : `${matching.account.label} did not match with an existing account` - ) - return { - // eslint-disable-next-line node/no-unsupported-features/es-syntax - ...matching.account, - relationships: merge( - {}, - matching.match ? matching.match.relationships : null, - matching.account.relationships - ), - _id: matching.match ? matching.match._id : undefined - } - }) - } - - static findDuplicateAccountsWithNoOperations(accounts, operations) { - const opsByAccountId = groupBy(operations, op => op.account) +var parse = __webpack_require__(731) - const duplicateAccountGroups = Object.entries( - groupBy(accounts, x => x.institutionLabel + ' > ' + x.label) - ) - .map(([, duplicateGroup]) => duplicateGroup) - .filter(duplicateGroup => duplicateGroup.length > 1) +/** + * @category Weekday Helpers + * @summary Get the day of the ISO week of the given date. + * + * @description + * Get the day of the ISO week of the given date, + * which is 7 for Sunday, 1 for Monday etc. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the day of ISO week + * + * @example + * // Which day of the ISO week is 26 February 2012? + * var result = getISODay(new Date(2012, 1, 26)) + * //=> 7 + */ +function getISODay (dirtyDate) { + var date = parse(dirtyDate) + var day = date.getDay() - const res = [] - for (const duplicateAccounts of duplicateAccountGroups) { - for (const account of duplicateAccounts) { - const accountOperations = opsByAccountId[account._id] || [] - if (accountOperations.length === 0) { - res.push(account) - } - } - } - return res + if (day === 0) { + day = 7 } - static hasIncoherentCreatedByApp(account) { - const predictedSlug = getSlugFromInstitutionLabel(account.institutionLabel) - const createdByApp = - account.cozyMetadata && account.cozyMetadata.createdByApp - return Boolean( - predictedSlug && createdByApp && predictedSlug !== createdByApp - ) - } + return day +} - static getUpdatedAt(account) { - const vendorUpdatedAt = get(account, 'metadata.updatedAt') +module.exports = getISODay - if (vendorUpdatedAt) { - return vendorUpdatedAt - } - const cozyUpdatedAt = get(account, 'cozyMetadata.updatedAt') +/***/ }), +/* 806 */ +/***/ (function(module, exports, __webpack_require__) { - if (cozyUpdatedAt) { - return cozyUpdatedAt - } +var startOfISOYear = __webpack_require__(741) +var addWeeks = __webpack_require__(749) - return null - } -} +var MILLISECONDS_IN_WEEK = 604800000 -BankAccount.normalizeAccountNumber = matching.normalizeAccountNumber -BankAccount.doctype = 'io.cozy.bank.accounts' -BankAccount.idAttributes = ['_id'] -BankAccount.version = 1 -BankAccount.checkedAttributes = null -BankAccount.vendorIdAttr = 'vendorId' +/** + * @category ISO Week-Numbering Year Helpers + * @summary Get the number of weeks in an ISO week-numbering year of the given date. + * + * @description + * Get the number of weeks in an ISO week-numbering year of the given date. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the number of ISO weeks in a year + * + * @example + * // How many weeks are in ISO week-numbering year 2015? + * var result = getISOWeeksInYear(new Date(2015, 1, 11)) + * //=> 53 + */ +function getISOWeeksInYear (dirtyDate) { + var thisYear = startOfISOYear(dirtyDate) + var nextYear = startOfISOYear(addWeeks(thisYear, 60)) + var diff = nextYear.valueOf() - thisYear.valueOf() + // Round the number of weeks to the nearest integer + // because the number of milliseconds in a week is not constant + // (e.g. it's different in the week of the daylight saving time clock shift) + return Math.round(diff / MILLISECONDS_IN_WEEK) +} -module.exports = BankAccount +module.exports = getISOWeeksInYear /***/ }), -/* 762 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { -const sortBy = __webpack_require__(485) -const get = __webpack_require__(162) -const { eitherIncludes } = __webpack_require__(763) -const { getSlugFromInstitutionLabel } = __webpack_require__(764) +var parse = __webpack_require__(731) -const findExactMatch = (attr, account, existingAccounts) => { - const sameAttr = existingAccounts.filter( - existingAccount => existingAccount[attr] === account[attr] - ) - if (sameAttr.length === 1) { - return { match: sameAttr[0], method: attr + '-exact' } - } else if (sameAttr.length > 1) { - return { matches: sameAttr, method: attr + '-exact' } - } else { - return null - } +/** + * @category Millisecond Helpers + * @summary Get the milliseconds of the given date. + * + * @description + * Get the milliseconds of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the milliseconds + * + * @example + * // Get the milliseconds of 29 February 2012 11:45:05.123: + * var result = getMilliseconds(new Date(2012, 1, 29, 11, 45, 5, 123)) + * //=> 123 + */ +function getMilliseconds (dirtyDate) { + var date = parse(dirtyDate) + var milliseconds = date.getMilliseconds() + return milliseconds } -const untrimmedAccountNumber = /^(?:[A-Za-z]+)?-?([0-9]+)-?(?:[A-Za-z]+)?$/ -// Regexp targeting hidden credit card number like -// ****-****-****-1234;xxxx xxxx xxxx 1234;************1234 -const redactedCreditCard = /[x*]{4}[ -]?[x*]{4}[ -]?[x*]{4}[ -]?(\d{4})/ +module.exports = getMilliseconds -const normalizeAccountNumber = (numberArg, ibanArg) => { - const iban = ibanArg && ibanArg.replace(/\s/g, '') - const number = - numberArg && !numberArg.match(redactedCreditCard) - ? numberArg.replace(/\s/g, '') - : numberArg - let match - if (iban && iban.length == 27) { - return iban.substr(14, 11) - } - if (!number) { - return number - } +/***/ }), +/* 808 */ +/***/ (function(module, exports, __webpack_require__) { - if (number.length == 23) { - // Must be an IBAN without the COUNTRY code - // See support demand #9102 with BI - // We extract the account number from the IBAN - // COUNTRY (4) BANK (5) COUNTER (5) NUMBER (11) KEY (2) - // FRXX 16275 10501 00300060030 00 - return number.substr(10, 11) - } else if (number.length == 16) { - // Linxo sends Bank account number that contains - // the counter number - return number.substr(5, 11) - } else if ( - number.length > 11 && - (match = number.match(untrimmedAccountNumber)) - ) { - // Some account numbers from BI are in the form - // CC-00300060030 (CC for Compte Courant) or - // LEO-00300060030 - return match[1] - } else { - return number - } -} +var parse = __webpack_require__(731) /** - * If either of the account numbers has length 11 and one is contained - * in the other, it's a match + * @category Minute Helpers + * @summary Get the minutes of the given date. + * + * @description + * Get the minutes of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the minutes + * + * @example + * // Get the minutes of 29 February 2012 11:45:05: + * var result = getMinutes(new Date(2012, 1, 29, 11, 45, 5)) + * //=> 45 */ -const approxNumberMatch = (account, existingAccount) => { - return ( - existingAccount.number && - account.number && - (existingAccount.number.length === 11 || account.number.length === 11) && - eitherIncludes(existingAccount.number, account.number) && - Math.min(existingAccount.number.length, account.number.length) >= 4 - ) +function getMinutes (dirtyDate) { + var date = parse(dirtyDate) + var minutes = date.getMinutes() + return minutes } +module.exports = getMinutes + + +/***/ }), +/* 809 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + /** - * If there is no "number" attribute or null, "id" attribute is used - * in the other, it's not a match + * @category Month Helpers + * @summary Get the month of the given date. * - * @param account - * @param existingAccount - * @returns {boolean} + * @description + * Get the month of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the month + * + * @example + * // Which month is 29 February 2012? + * var result = getMonth(new Date(2012, 1, 29)) + * //=> 1 */ -const noNumberMatch = (account, existingAccount) => { - const accNumber = account.number || String(account.id) - const existingAccNumber = existingAccount.number || String(existingAccount.id) - if (!account.number || !existingAccount.number) { - return eitherIncludes(accNumber, existingAccNumber) - } - return false +function getMonth (dirtyDate) { + var date = parse(dirtyDate) + var month = date.getMonth() + return month } -const creditCardMatch = (account, existingAccount) => { - if (account.type !== 'CreditCard' && existingAccount.type !== 'CreditCard') { - return false - } - let ccAccount, lastDigits - for (let acc of [account, existingAccount]) { - const match = acc && acc.number && acc.number.match(redactedCreditCard) - if (match) { - ccAccount = acc - lastDigits = match[1] - } - } - const other = ccAccount === account ? existingAccount : account - if (other && other.number && other.number.slice(-4) === lastDigits) { - return true - } - return false -} +module.exports = getMonth -const slugMatch = (account, existingAccount) => { - const possibleSlug = getSlugFromInstitutionLabel(account.institutionLabel) - const possibleSlugExisting = getSlugFromInstitutionLabel( - existingAccount.institutionLabel - ) - return ( - !possibleSlug || - !possibleSlugExisting || - possibleSlug === possibleSlugExisting - ) -} -const currencyMatch = (account, existingAccount) => { - if (!account.currency) { - return false - } - return ( - (existingAccount.rawNumber && - existingAccount.rawNumber.includes(account.currency)) || - (existingAccount.label && - existingAccount.label.includes(account.currency)) || - (existingAccount.originalBankLabel && - existingAccount.originalBankLabel.includes(account.currency)) - ) -} +/***/ }), +/* 810 */ +/***/ (function(module, exports, __webpack_require__) { -const sameTypeMatch = (account, existingAccount) => { - return account.type === existingAccount.type -} +var parse = __webpack_require__(731) -const rules = [ - { rule: slugMatch, bonus: 0, malus: -1000 }, - { rule: approxNumberMatch, bonus: 50, malus: -50, name: 'approx-number' }, - { rule: noNumberMatch, bonus: 10, malus: -10, name: 'no-number-attr' }, - { rule: sameTypeMatch, bonus: 50, malus: 0, name: 'same-type' }, - { rule: creditCardMatch, bonus: 150, malus: 0, name: 'credit-card-number' }, - { rule: currencyMatch, bonus: 50, malus: 0, name: 'currency' } -] +var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000 -const score = (account, existingAccount) => { - const methods = [] - const res = { - account: existingAccount, - methods - } +/** + * @category Range Helpers + * @summary Get the number of days that overlap in two date ranges + * + * @description + * Get the number of days that overlap in two date ranges + * + * @param {Date|String|Number} initialRangeStartDate - the start of the initial range + * @param {Date|String|Number} initialRangeEndDate - the end of the initial range + * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with + * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with + * @returns {Number} the number of days that overlap in two date ranges + * @throws {Error} startDate of a date range cannot be after its endDate + * + * @example + * // For overlapping date ranges adds 1 for each started overlapping day: + * getOverlappingDaysInRanges( + * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) + * ) + * //=> 3 + * + * @example + * // For non-overlapping date ranges returns 0: + * getOverlappingDaysInRanges( + * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) + * ) + * //=> 0 + */ +function getOverlappingDaysInRanges (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { + var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() + var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() + var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() + var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() - let points = 0 - for (let { rule, bonus, malus, name } of rules) { - const ok = rule(account, existingAccount) - if (ok && bonus) { - points += bonus - } - if (!ok && malus) { - points += malus - } - if (name && ok) { - methods.push(name) - } + if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { + throw new Error('The start of the range cannot be after the end of the range') } - res.points = points - return res -} + var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime -const normalizeAccount = account => { - const normalizedAccountNumber = normalizeAccountNumber( - account.number, - account.iban - ) - return { - // eslint-disable-next-line node/no-unsupported-features/es-syntax - ...account, - rawNumber: account.number, - number: normalizedAccountNumber + if (!isOverlapping) { + return 0 } -} -const exactMatchAttributes = ['iban', 'number'] + var overlapStartDate = comparedStartTime < initialStartTime + ? initialStartTime + : comparedStartTime -const eqNotUndefined = (attr1, attr2) => { - return attr1 && attr1 === attr2 + var overlapEndDate = comparedEndTime > initialEndTime + ? initialEndTime + : comparedEndTime + + var differenceInMs = overlapEndDate - overlapStartDate + + return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY) } -const findMatch = (account, existingAccounts) => { - // Start with exact attribute matches - for (const exactAttribute of exactMatchAttributes) { - if (account[exactAttribute]) { - const result = findExactMatch(exactAttribute, account, existingAccounts) - if (result && result.match) { - return result - } - } - } +module.exports = getOverlappingDaysInRanges - const matchOriginalNumber = existingAccounts.find( - otherAccount => - eqNotUndefined(account.originalNumber, otherAccount.number) || - eqNotUndefined(account.number, otherAccount.originalNumber) - ) - if (matchOriginalNumber) { - return { - match: matchOriginalNumber, - method: 'originalNumber-exact' - } - } - const matchRawNumberCurrencyType = existingAccounts.find( - otherAccount => - (eqNotUndefined(account.rawNumber, otherAccount.number) || - eqNotUndefined(account.number, otherAccount.rawNumber)) && - otherAccount.type == account.type && - otherAccount.currency == account.currency - ) - if (matchRawNumberCurrencyType) { - return { - match: matchRawNumberCurrencyType, - method: 'rawNumber-exact-currency-type' - } - } +/***/ }), +/* 811 */ +/***/ (function(module, exports, __webpack_require__) { - // Now we get more fuzzy and score accounts - const scored = sortBy( - existingAccounts.map(existingAccount => score(account, existingAccount)), - x => -x.points - ) - const candidates = scored.filter(x => x.points > 0) - if (candidates.length > 0) { - return { - match: candidates[0].account, - method: candidates[0].methods.join('-') - } - } +var parse = __webpack_require__(731) + +/** + * @category Second Helpers + * @summary Get the seconds of the given date. + * + * @description + * Get the seconds of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the seconds + * + * @example + * // Get the seconds of 29 February 2012 11:45:05.123: + * var result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123)) + * //=> 5 + */ +function getSeconds (dirtyDate) { + var date = parse(dirtyDate) + var seconds = date.getSeconds() + return seconds } +module.exports = getSeconds + + +/***/ }), +/* 812 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + /** - * Matches existing accounts with accounts fetched on a vendor + * @category Timestamp Helpers + * @summary Get the milliseconds timestamp of the given date. + * + * @description + * Get the milliseconds timestamp of the given date. * - * @typedef {MatchResult} - * @property {io.cozy.account} account - Account from fetched accounts - * @property {io.cozy.account} match - Existing account that was matched. Null if no match was found. - * @property {string} method - How the two accounts were matched + * @param {Date|String|Number} date - the given date + * @returns {Number} the timestamp * - * @param {io.cozy.account} fetchedAccounts - Account that have been fetched - * on the vendor and that will be matched with existing accounts - * @param {io.cozy.accounts} existingAccounts - Will be match against (those - * io.cozy.accounts already have an _id) - * @return {Array<MatchResult>} - Match results (as many results as fetchedAccounts.length) + * @example + * // Get the timestamp of 29 February 2012 11:45:05.123: + * var result = getTime(new Date(2012, 1, 29, 11, 45, 5, 123)) + * //=> 1330515905123 */ -const matchAccounts = (fetchedAccountsArg, existingAccounts) => { - const fetchedAccounts = fetchedAccountsArg.map(normalizeAccount) - const toMatch = [...existingAccounts].map(normalizeAccount) - const results = [] - for (let fetchedAccount of fetchedAccounts) { - const matchResult = findMatch(fetchedAccount, toMatch) - if (matchResult) { - const i = toMatch.indexOf(matchResult.match) - toMatch.splice(i, 1) - if ( - !get(fetchedAccount, 'metadata.disabledAt') || - !get(matchResult, 'metadata.disabledAt') - ) { - // eslint-disable-next-line node/no-unsupported-features/es-syntax - results.push({ account: fetchedAccount, ...matchResult }) - } - } else { - if (!get(fetchedAccount, 'metadata.disabledAt')) { - results.push({ account: fetchedAccount }) - } - } - } - return results +function getTime (dirtyDate) { + var date = parse(dirtyDate) + var timestamp = date.getTime() + return timestamp } -module.exports = { - matchAccounts, - normalizeAccountNumber, - score, - creditCardMatch, - approxNumberMatch -} +module.exports = getTime /***/ }), -/* 763 */ -/***/ (function(module, exports) { +/* 813 */ +/***/ (function(module, exports, __webpack_require__) { -const eitherIncludes = (str1, str2) => { - return Boolean(str1 && str2 && (str1.includes(str2) || str2.includes(str1))) -} +var parse = __webpack_require__(731) -module.exports = { - eitherIncludes +/** + * @category Year Helpers + * @summary Get the year of the given date. + * + * @description + * Get the year of the given date. + * + * @param {Date|String|Number} date - the given date + * @returns {Number} the year + * + * @example + * // Which year is 2 July 2014? + * var result = getYear(new Date(2014, 6, 2)) + * //=> 2014 + */ +function getYear (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() + return year } +module.exports = getYear + /***/ }), -/* 764 */ +/* 814 */ /***/ (function(module, exports, __webpack_require__) { -const log = __webpack_require__(739).namespace('slug-account') -const labelSlugs = __webpack_require__(765) - -const institutionLabelsCompiled = Object.entries(labelSlugs).map( - ([ilabelRx, slug]) => { - if (ilabelRx[0] === '/' && ilabelRx[ilabelRx.length - 1] === '/') { - return [new RegExp(ilabelRx.substr(1, ilabelRx.length - 2), 'i'), slug] - } else { - return [ilabelRx, slug] - } - } -) +var parse = __webpack_require__(731) -const getSlugFromInstitutionLabel = institutionLabel => { - if (!institutionLabel) { - log('warn', 'No institution label, cannot compute slug') - return - } - for (const [rx, slug] of institutionLabelsCompiled) { - if (rx instanceof RegExp) { - const match = institutionLabel.match(rx) - if (match) { - return slug - } - } else if (rx.toLowerCase() === institutionLabel.toLowerCase()) { - return slug - } - } - log('warn', `Could not compute slug for ${institutionLabel}`) +/** + * @category Common Helpers + * @summary Is the first date after the second one? + * + * @description + * Is the first date after the second one? + * + * @param {Date|String|Number} date - the date that should be after the other one to return true + * @param {Date|String|Number} dateToCompare - the date to compare with + * @returns {Boolean} the first date is after the second date + * + * @example + * // Is 10 July 1989 after 11 February 1987? + * var result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11)) + * //=> true + */ +function isAfter (dirtyDate, dirtyDateToCompare) { + var date = parse(dirtyDate) + var dateToCompare = parse(dirtyDateToCompare) + return date.getTime() > dateToCompare.getTime() } -module.exports = { - getSlugFromInstitutionLabel -} +module.exports = isAfter /***/ }), -/* 765 */ -/***/ (function(module, exports) { +/* 815 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports = { - 'AXA Banque': 'axabanque102', - '/Banque Populaire.*/': 'banquepopulaire', - BforBank: 'bforbank97', - 'BNP Paribas': 'bnpparibas82', - BNPP: 'bnpparibas82', - '/Boursorama.*/': 'boursorama83', - casden: 'casden173', - '/Hello bank!.*/': 'hellobank145', - Bred: 'bred', - CA: 'caatlantica3', - 'Carrefour Banque': 'carrefour159', - "/Caisse d'Épargne.*/": 'caissedepargne1', - 'Compte Nickel': 'comptenickel168', - '/^CIC.*/': 'cic63', - 'Crédit Agricole': 'caatlantica3', - 'Crédit Coopératif': 'creditcooperatif148', - '/Crédit du Nord.*/': 'cdngroup88', - '/Crédit Maritime.*/': 'creditmaritime', - '/Crédit Mutuel.*/': 'cic45', - '/Linxea/': 'linxea', - Fortuneo: 'fortuneo84', - 'Hello bank!': 'hellobank145', - 'HSBC France': 'hsbc119', - HSBC: 'hsbc119', - '/^ING.*/': 'ingdirect95', - '/La Banque Postale.*/': 'labanquepostale44', - '/LCL.*/': 'lcl-linxo', - Milleis: 'barclays136', - Monabanq: 'monabanq96', - 'Société Générale': 'societegenerale', - 'Société marseillaise de crédit': 'cdngroup109' +var parse = __webpack_require__(731) + +/** + * @category Common Helpers + * @summary Is the first date before the second one? + * + * @description + * Is the first date before the second one? + * + * @param {Date|String|Number} date - the date that should be before the other one to return true + * @param {Date|String|Number} dateToCompare - the date to compare with + * @returns {Boolean} the first date is before the second date + * + * @example + * // Is 10 July 1989 before 11 February 1987? + * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11)) + * //=> false + */ +function isBefore (dirtyDate, dirtyDateToCompare) { + var date = parse(dirtyDate) + var dateToCompare = parse(dirtyDateToCompare) + return date.getTime() < dateToCompare.getTime() } +module.exports = isBefore + /***/ }), -/* 766 */ +/* 816 */ /***/ (function(module, exports, __webpack_require__) { -const fromPairs = __webpack_require__(181) -const log = __webpack_require__(739).namespace('BankingReconciliator') +var parse = __webpack_require__(731) -class BankingReconciliator { - constructor(options) { - this.options = options - } +/** + * @category Common Helpers + * @summary Are the given dates equal? + * + * @description + * Are the given dates equal? + * + * @param {Date|String|Number} dateLeft - the first date to compare + * @param {Date|String|Number} dateRight - the second date to compare + * @returns {Boolean} the dates are equal + * + * @example + * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal? + * var result = isEqual( + * new Date(2014, 6, 2, 6, 30, 45, 0) + * new Date(2014, 6, 2, 6, 30, 45, 500) + * ) + * //=> false + */ +function isEqual (dirtyLeftDate, dirtyRightDate) { + var dateLeft = parse(dirtyLeftDate) + var dateRight = parse(dirtyRightDate) + return dateLeft.getTime() === dateRight.getTime() +} - async saveAccounts(fetchedAccounts, options) { - const { BankAccount } = this.options +module.exports = isEqual - const stackAccounts = await BankAccount.fetchAll() - // Reconciliate - const reconciliatedAccounts = BankAccount.reconciliate( - fetchedAccounts, - stackAccounts - ) +/***/ }), +/* 817 */ +/***/ (function(module, exports, __webpack_require__) { - log('info', 'Saving accounts...') - const savedAccounts = await BankAccount.bulkSave(reconciliatedAccounts, { - handleDuplicates: 'remove' - }) - if (options.onAccountsSaved) { - options.onAccountsSaved(savedAccounts) - } +var parse = __webpack_require__(731) - return { savedAccounts, reconciliatedAccounts } - } +/** + * @category Month Helpers + * @summary Is the given date the first day of a month? + * + * @description + * Is the given date the first day of a month? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is the first day of a month + * + * @example + * // Is 1 September 2014 the first day of a month? + * var result = isFirstDayOfMonth(new Date(2014, 8, 1)) + * //=> true + */ +function isFirstDayOfMonth (dirtyDate) { + return parse(dirtyDate).getDate() === 1 +} - /** - * @typedef ReconciliatorResponse - * @attribute {Array<BankAccount>} accounts - * @attribute {Array<BankTransactions>} transactions - */ +module.exports = isFirstDayOfMonth - /** - * @typedef ReconciliatorSaveOptions - * @attribute {Function} logProgress - */ - /** - * Save new accounts and transactions - * - * @param {Array<BankAccount>} fetchedAccounts - * @param {Array<BankTransactions>} fetchedTransactions - * @param {ReconciliatorSaveOptions} options - * @returns {ReconciliatorResponse} - * - */ - async save(fetchedAccounts, fetchedTransactions, options = {}) { - const { BankAccount, BankTransaction } = this.options +/***/ }), +/* 818 */ +/***/ (function(module, exports, __webpack_require__) { - const { reconciliatedAccounts, savedAccounts } = await this.saveAccounts( - fetchedAccounts, - options - ) +var parse = __webpack_require__(731) - // Bank accounts saved in Cozy, we can now link transactions to accounts - // via their cozy id - const vendorIdToCozyId = fromPairs( - savedAccounts.map(acc => [acc[BankAccount.vendorIdAttr], acc._id]) - ) - log('info', 'Linking transactions to accounts...') - log('info', JSON.stringify(vendorIdToCozyId)) +/** + * @category Weekday Helpers + * @summary Is the given date Friday? + * + * @description + * Is the given date Friday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Friday + * + * @example + * // Is 26 September 2014 Friday? + * var result = isFriday(new Date(2014, 8, 26)) + * //=> true + */ +function isFriday (dirtyDate) { + return parse(dirtyDate).getDay() === 5 +} - fetchedTransactions.forEach(tr => { - tr.account = vendorIdToCozyId[tr[BankTransaction.vendorAccountIdAttr]] - if (tr.account === undefined) { - log( - 'warn', - `Transaction without account, vendorAccountIdAttr: ${BankTransaction.vendorAccountIdAttr}` - ) - log('warn', 'transaction: ' + JSON.stringify(tr)) - throw new Error('Transaction without account.') - } - }) +module.exports = isFriday - const reconciliatedAccountIds = new Set( - reconciliatedAccounts.filter(acc => acc._id).map(acc => acc._id) - ) - // Pass to transaction reconciliation only transactions that belong - // to one of the reconciliated accounts - const stackTransactions = (await BankTransaction.fetchAll()).filter( - transaction => reconciliatedAccountIds.has(transaction.account) - ) +/***/ }), +/* 819 */ +/***/ (function(module, exports, __webpack_require__) { - const transactions = BankTransaction.reconciliate( - fetchedTransactions, - stackTransactions, - options - ) +var parse = __webpack_require__(731) - log('info', 'Saving transactions...') - let i = 1 - const logProgressFn = doc => { - log('debug', `[bulkSave] ${i++} Saving ${doc.date} ${doc.label}`) - } - const savedTransactions = await BankTransaction.bulkSave(transactions, { - concurrency: 30, - logProgress: - options.logProgress !== undefined ? options.logProgress : logProgressFn, - handleDuplicates: 'remove' - }) - return { - accounts: savedAccounts, - transactions: savedTransactions - } - } +/** + * @category Common Helpers + * @summary Is the given date in the future? + * + * @description + * Is the given date in the future? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in the future + * + * @example + * // If today is 6 October 2014, is 31 December 2014 in the future? + * var result = isFuture(new Date(2014, 11, 31)) + * //=> true + */ +function isFuture (dirtyDate) { + return parse(dirtyDate).getTime() > new Date().getTime() } -module.exports = BankingReconciliator +module.exports = isFuture /***/ }), -/* 767 */ +/* 820 */ /***/ (function(module, exports, __webpack_require__) { -const keyBy = __webpack_require__(381) -const groupBy = __webpack_require__(386) -const maxBy = __webpack_require__(768) -const addDays = __webpack_require__(771) -const isAfter = __webpack_require__(775) -const Document = __webpack_require__(731) -const log = __webpack_require__(758) -const BankAccount = __webpack_require__(761) -const { matchTransactions } = __webpack_require__(776) -const cloneDeep = __webpack_require__(213) -const flag = __webpack_require__(256).default +var parse = __webpack_require__(731) +var endOfDay = __webpack_require__(782) +var endOfMonth = __webpack_require__(788) -const maxValue = (iterable, fn) => { - const res = maxBy(iterable, fn) - return res ? fn(res) : null +/** + * @category Month Helpers + * @summary Is the given date the last day of a month? + * + * @description + * Is the given date the last day of a month? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is the last day of a month + * + * @example + * // Is 28 February 2014 the last day of a month? + * var result = isLastDayOfMonth(new Date(2014, 1, 28)) + * //=> true + */ +function isLastDayOfMonth (dirtyDate) { + var date = parse(dirtyDate) + return endOfDay(date).getTime() === endOfMonth(date).getTime() } -const getDate = transaction => { - const date = transaction.realisationDate || transaction.date - return date.slice(0, 10) -} +module.exports = isLastDayOfMonth + + +/***/ }), +/* 821 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) /** - * Get the date of the latest transaction in an array. - * Transactions in the future are ignored. + * @category Weekday Helpers + * @summary Is the given date Monday? * - * @param {array} stackTransactions - * @returns {string} The date of the latest transaction (YYYY-MM-DD) + * @description + * Is the given date Monday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Monday + * + * @example + * // Is 22 September 2014 Monday? + * var result = isMonday(new Date(2014, 8, 22)) + * //=> true */ -const getSplitDate = stackTransactions => { - const now = new Date() - const notFutureTransactions = stackTransactions.filter(transaction => { - const date = getDate(transaction) - return !isAfter(date, now) - }) - - return maxValue(notFutureTransactions, getDate) +function isMonday (dirtyDate) { + return parse(dirtyDate).getDay() === 1 } -const ensureISOString = date => { - if (date instanceof Date) { - return date.toISOString() - } else { - return date - } -} +module.exports = isMonday -class Transaction extends Document { - static async deleteAll(docs) { - if (flag('banking.warn-on-delete')) { - log( - 'warn', - `OPERATION_DELETE: removing operations with _id : ${JSON.stringify( - docs.map(doc => doc._id) - )}` - ) - } - return super.deleteAll(docs) - } - static getDate(transaction) { - return transaction - } - isAfter(minDate) { - if (!minDate) { - return true - } else { - const day = ensureISOString(this.date).slice(0, 10) - if (day !== 'NaN') { - return day > minDate - } else { - log( - 'warn', - 'transaction date could not be parsed. transaction: ' + - JSON.stringify(this) - ) - return false - } - } - } +/***/ }), +/* 822 */ +/***/ (function(module, exports, __webpack_require__) { - isBeforeOrSame(maxDate) { - if (!maxDate) { - return true - } else { - const day = ensureISOString(this.date).slice(0, 10) - if (day !== 'NaN') { - return day <= maxDate - } else { - log( - 'warn', - 'transaction date could not be parsed. transaction: ' + - JSON.stringify(this) - ) - return false - } - } - } +var parse = __webpack_require__(731) + +/** + * @category Common Helpers + * @summary Is the given date in the past? + * + * @description + * Is the given date in the past? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in the past + * + * @example + * // If today is 6 October 2014, is 2 July 2014 in the past? + * var result = isPast(new Date(2014, 6, 2)) + * //=> true + */ +function isPast (dirtyDate) { + return parse(dirtyDate).getTime() < new Date().getTime() +} - /** - * Get the descriptive (and almost uniq) identifier of a transaction - * @param {object} transaction - The transaction (containing at least amount, originalBankLabel and date) - * @returns {object} - */ - getIdentifier() { - return `${this.amount}-${this.originalBankLabel}-${this.date}` - } +module.exports = isPast - /** - * Get transactions that should be present in the stack but are not. - * Transactions that are older that 1 week before the oldest existing - * transaction are ignored. - * - * @param {array} newTransactions - * @param {array} stackTransactions - * @returns {array} - */ - static getMissedTransactions( - newTransactions, - stackTransactions, - options = {} - ) { - const oldestDate = maxValue(stackTransactions, getDate) - const frontierDate = addDays(oldestDate, -7) - const recentNewTransactions = newTransactions.filter(tr => - isAfter(getDate(tr), frontierDate) - ) - const matchingResults = Array.from( - matchTransactions(recentNewTransactions, stackTransactions) - ) - const missedTransactions = matchingResults - .filter(result => !result.match) - .map(result => result.transaction) +/***/ }), +/* 823 */ +/***/ (function(module, exports, __webpack_require__) { - const trackEvent = options.trackEvent - if (typeof trackEvent === 'function') { - try { - const nbMissed = missedTransactions.length - const nbExisting = stackTransactions.length - trackEvent({ - e_a: 'ReconciliateMissing', - e_n: 'MissedTransactionPct', - e_v: parseFloat((nbMissed / nbExisting).toFixed(2), 10) - }) - trackEvent({ - e_a: 'ReconciliateMissing', - e_n: 'MissedTransactionAbs', - e_v: nbMissed - }) - } catch (e) { - log('warn', `Could not send MissedTransaction event: ${e.message}`) - } - } +var startOfDay = __webpack_require__(743) - return missedTransactions - } +/** + * @category Day Helpers + * @summary Are the given dates in the same day? + * + * @description + * Are the given dates in the same day? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same day + * + * @example + * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day? + * var result = isSameDay( + * new Date(2014, 8, 4, 6, 0), + * new Date(2014, 8, 4, 18, 0) + * ) + * //=> true + */ +function isSameDay (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfDay = startOfDay(dirtyDateLeft) + var dateRightStartOfDay = startOfDay(dirtyDateRight) - /** - * Reconcialiate remote transaction with local transaction - * - * @param {Array} remoteTransactions - * @param {Array} localTransactions - * @param {Function} options.trackEvent : this callback will be called in case of split date - * @param {Boolean} options.useSplitDate : should look for a split date or not (default true) - * @returns {Array} : reconciliated transactions - */ - static reconciliate(remoteTransactions, localTransactions, options = {}) { - const localOptions = cloneDeep(options) - if (localOptions.useSplitDate !== false) { - localOptions.useSplitDate = true - } - const findByVendorId = transaction => - localTransactions.find(t => t.vendorId === transaction.vendorId) + return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime() +} - const groups = groupBy(remoteTransactions, transaction => - findByVendorId(transaction) ? 'updatedTransactions' : 'newTransactions' - ) +module.exports = isSameDay - let newTransactions = groups.newTransactions || [] - const updatedTransactions = groups.updatedTransactions || [] - const splitDate = localOptions.useSplitDate - ? getSplitDate(localTransactions) - : false +/***/ }), +/* 824 */ +/***/ (function(module, exports, __webpack_require__) { - if (splitDate) { - if (typeof localOptions.trackEvent === 'function') { - localOptions.trackEvent({ - e_a: 'ReconciliateSplitDate' - }) - } +var startOfHour = __webpack_require__(825) - const isAfterSplit = x => Transaction.prototype.isAfter.call(x, splitDate) - const isBeforeSplit = x => - Transaction.prototype.isBeforeOrSame.call(x, splitDate) +/** + * @category Hour Helpers + * @summary Are the given dates in the same hour? + * + * @description + * Are the given dates in the same hour? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same hour + * + * @example + * // Are 4 September 2014 06:00:00 and 4 September 06:30:00 in the same hour? + * var result = isSameHour( + * new Date(2014, 8, 4, 6, 0), + * new Date(2014, 8, 4, 6, 30) + * ) + * //=> true + */ +function isSameHour (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfHour = startOfHour(dirtyDateLeft) + var dateRightStartOfHour = startOfHour(dirtyDateRight) - const transactionsAfterSplit = newTransactions.filter(isAfterSplit) + return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime() +} - if (transactionsAfterSplit.length > 0) { - log( - 'info', - `Found ${transactionsAfterSplit.length} transactions after ${splitDate}` - ) - } else { - log('info', `No transaction after ${splitDate}`) - } +module.exports = isSameHour - const transactionsBeforeSplit = newTransactions.filter(isBeforeSplit) - log( - 'info', - `Found ${transactionsBeforeSplit.length} transactions before ${splitDate}` - ) - const missedTransactions = Transaction.getMissedTransactions( - transactionsBeforeSplit, - localTransactions, - localOptions - ) +/***/ }), +/* 825 */ +/***/ (function(module, exports, __webpack_require__) { - if (missedTransactions.length > 0) { - log( - 'info', - `Found ${missedTransactions.length} missed transactions before ${splitDate}` - ) - } else { - log('info', `No missed transactions before ${splitDate}`) - } +var parse = __webpack_require__(731) - newTransactions = [...transactionsAfterSplit, ...missedTransactions] - } else { - log('info', "Can't find a split date, saving all new transactions") - } +/** + * @category Hour Helpers + * @summary Return the start of an hour for the given date. + * + * @description + * Return the start of an hour for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of an hour + * + * @example + * // The start of an hour for 2 September 2014 11:55:00: + * var result = startOfHour(new Date(2014, 8, 2, 11, 55)) + * //=> Tue Sep 02 2014 11:00:00 + */ +function startOfHour (dirtyDate) { + var date = parse(dirtyDate) + date.setMinutes(0, 0, 0) + return date +} - log( - 'info', - `Transaction reconciliation: new ${newTransactions.length}, updated ${updatedTransactions.length}, split date ${splitDate} ` - ) - return [].concat(newTransactions).concat(updatedTransactions) - } +module.exports = startOfHour - static async getMostRecentForAccounts(accountIds) { - try { - log('debug', 'Transaction.getLast') - const index = await Document.getIndex(this.doctype, ['date', 'account']) - const options = { - selector: { - date: { $gte: null }, - account: { - $in: accountIds - } - }, - sort: [{ date: 'desc' }] - } - const transactions = await Document.query(index, options) - log('info', 'last transactions length: ' + transactions.length) +/***/ }), +/* 826 */ +/***/ (function(module, exports, __webpack_require__) { + +var isSameWeek = __webpack_require__(827) + +/** + * @category ISO Week Helpers + * @summary Are the given dates in the same ISO week? + * + * @description + * Are the given dates in the same ISO week? + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same ISO week + * + * @example + * // Are 1 September 2014 and 7 September 2014 in the same ISO week? + * var result = isSameISOWeek( + * new Date(2014, 8, 1), + * new Date(2014, 8, 7) + * ) + * //=> true + */ +function isSameISOWeek (dirtyDateLeft, dirtyDateRight) { + return isSameWeek(dirtyDateLeft, dirtyDateRight, {weekStartsOn: 1}) +} - return transactions - } catch (e) { - log('error', e) +module.exports = isSameISOWeek - return [] - } - } - static async deleteOrphans() { - log('info', 'Deleting up orphan operations') - const accounts = keyBy(await BankAccount.fetchAll(), '_id') - const operations = await this.fetchAll() - const orphanOperations = operations.filter(x => !accounts[x.account]) - log('info', `Total number of operations: ${operations.length}`) - log('info', `Total number of orphan operations: ${orphanOperations.length}`) - log('info', `Deleting ${orphanOperations.length} orphan operations...`) - if (orphanOperations.length > 0) { - log( - flag('banking.warn-on-delete') ? 'warn' : 'info', - `OPERATION_DELETE: removing ${orphanOperations.length} orphan operations` - ) - return this.deleteAll(orphanOperations) - } - } +/***/ }), +/* 827 */ +/***/ (function(module, exports, __webpack_require__) { - getVendorAccountId() { - return this[this.constructor.vendorAccountIdAttr] - } +var startOfWeek = __webpack_require__(739) - static getCategoryId(transaction, options) { - const opts = { - localModelOverride: false, - localModelUsageThreshold: this.LOCAL_MODEL_USAGE_THRESHOLD, - globalModelUsageThreshold: this.GLOBAL_MODEL_USAGE_THRESHOLD, - // eslint-disable-next-line node/no-unsupported-features/es-syntax - ...options - } +/** + * @category Week Helpers + * @summary Are the given dates in the same week? + * + * @description + * Are the given dates in the same week? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Boolean} the dates are in the same week + * + * @example + * // Are 31 August 2014 and 4 September 2014 in the same week? + * var result = isSameWeek( + * new Date(2014, 7, 31), + * new Date(2014, 8, 4) + * ) + * //=> true + * + * @example + * // If week starts with Monday, + * // are 31 August 2014 and 4 September 2014 in the same week? + * var result = isSameWeek( + * new Date(2014, 7, 31), + * new Date(2014, 8, 4), + * {weekStartsOn: 1} + * ) + * //=> false + */ +function isSameWeek (dirtyDateLeft, dirtyDateRight, dirtyOptions) { + var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, dirtyOptions) + var dateRightStartOfWeek = startOfWeek(dirtyDateRight, dirtyOptions) - if (transaction.manualCategoryId) { - return transaction.manualCategoryId - } + return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime() +} - if ( - opts.localModelOverride && - transaction.localCategoryId && - transaction.localCategoryProba && - transaction.localCategoryProba > opts.localModelUsageThreshold - ) { - return transaction.localCategoryId - } +module.exports = isSameWeek - if ( - transaction.cozyCategoryId && - transaction.cozyCategoryProba && - transaction.cozyCategoryProba > opts.globalModelUsageThreshold - ) { - return transaction.cozyCategoryId - } - // If the cozy categorization models have not been applied, we return null - // so the transaction is considered as « categorization in progress ». - // Otherwize we just use the automatic categorization from the vendor - if (!transaction.localCategoryId && !transaction.cozyCategoryId) { - return null - } +/***/ }), +/* 828 */ +/***/ (function(module, exports, __webpack_require__) { - return transaction.automaticCategoryId - } +var startOfISOYear = __webpack_require__(741) + +/** + * @category ISO Week-Numbering Year Helpers + * @summary Are the given dates in the same ISO week-numbering year? + * + * @description + * Are the given dates in the same ISO week-numbering year? + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same ISO week-numbering year + * + * @example + * // Are 29 December 2003 and 2 January 2005 in the same ISO week-numbering year? + * var result = isSameISOYear( + * new Date(2003, 11, 29), + * new Date(2005, 0, 2) + * ) + * //=> true + */ +function isSameISOYear (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft) + var dateRightStartOfYear = startOfISOYear(dirtyDateRight) + + return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime() } -Transaction.doctype = 'io.cozy.bank.operations' -Transaction.version = 1 -Transaction.vendorAccountIdAttr = 'vendorAccountId' -Transaction.vendorIdAttr = 'vendorId' -Transaction.idAttributes = ['vendorId'] -Transaction.checkedAttributes = [ - 'label', - 'originalBankLabel', - 'automaticCategoryId', - 'account' -] -Transaction.LOCAL_MODEL_USAGE_THRESHOLD = 0.8 -Transaction.GLOBAL_MODEL_USAGE_THRESHOLD = 0.15 -Transaction.getSplitDate = getSplitDate -module.exports = Transaction +module.exports = isSameISOYear /***/ }), -/* 768 */ +/* 829 */ /***/ (function(module, exports, __webpack_require__) { -var baseExtremum = __webpack_require__(769), - baseGt = __webpack_require__(770), - baseIteratee = __webpack_require__(101); +var startOfMinute = __webpack_require__(830) /** - * This method is like `_.max` except that it accepts `iteratee` which is - * invoked for each element in `array` to generate the criterion by which - * the value is ranked. The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Math - * @param {Array} array The array to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {*} Returns the maximum value. - * @example + * @category Minute Helpers + * @summary Are the given dates in the same minute? * - * var objects = [{ 'n': 1 }, { 'n': 2 }]; + * @description + * Are the given dates in the same minute? * - * _.maxBy(objects, function(o) { return o.n; }); - * // => { 'n': 2 } + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same minute * - * // The `_.property` iteratee shorthand. - * _.maxBy(objects, 'n'); - * // => { 'n': 2 } + * @example + * // Are 4 September 2014 06:30:00 and 4 September 2014 06:30:15 + * // in the same minute? + * var result = isSameMinute( + * new Date(2014, 8, 4, 6, 30), + * new Date(2014, 8, 4, 6, 30, 15) + * ) + * //=> true */ -function maxBy(array, iteratee) { - return (array && array.length) - ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt) - : undefined; +function isSameMinute (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft) + var dateRightStartOfMinute = startOfMinute(dirtyDateRight) + + return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime() } -module.exports = maxBy; +module.exports = isSameMinute /***/ }), -/* 769 */ +/* 830 */ /***/ (function(module, exports, __webpack_require__) { -var isSymbol = __webpack_require__(166); +var parse = __webpack_require__(731) /** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. + * @category Minute Helpers + * @summary Return the start of a minute for the given date. * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. + * @description + * Return the start of a minute for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a minute + * + * @example + * // The start of a minute for 1 December 2014 22:15:45.400: + * var result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) + * //=> Mon Dec 01 2014 22:15:00 */ -function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; +function startOfMinute (dirtyDate) { + var date = parse(dirtyDate) + date.setSeconds(0, 0) + return date +} - while (++index < length) { - var value = array[index], - current = iteratee(value); +module.exports = startOfMinute - if (current != null && (computed === undefined - ? (current === current && !isSymbol(current)) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; + +/***/ }), +/* 831 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + +/** + * @category Month Helpers + * @summary Are the given dates in the same month? + * + * @description + * Are the given dates in the same month? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same month + * + * @example + * // Are 2 September 2014 and 25 September 2014 in the same month? + * var result = isSameMonth( + * new Date(2014, 8, 2), + * new Date(2014, 8, 25) + * ) + * //=> true + */ +function isSameMonth (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) + return dateLeft.getFullYear() === dateRight.getFullYear() && + dateLeft.getMonth() === dateRight.getMonth() } -module.exports = baseExtremum; +module.exports = isSameMonth /***/ }), -/* 770 */ -/***/ (function(module, exports) { +/* 832 */ +/***/ (function(module, exports, __webpack_require__) { + +var startOfQuarter = __webpack_require__(833) /** - * The base implementation of `_.gt` which doesn't coerce arguments. + * @category Quarter Helpers + * @summary Are the given dates in the same year quarter? * - * @private - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if `value` is greater than `other`, - * else `false`. + * @description + * Are the given dates in the same year quarter? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same quarter + * + * @example + * // Are 1 January 2014 and 8 March 2014 in the same quarter? + * var result = isSameQuarter( + * new Date(2014, 0, 1), + * new Date(2014, 2, 8) + * ) + * //=> true */ -function baseGt(value, other) { - return value > other; +function isSameQuarter (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft) + var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight) + + return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime() } -module.exports = baseGt; +module.exports = isSameQuarter /***/ }), -/* 771 */ +/* 833 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var parse = __webpack_require__(731) /** - * @category Day Helpers - * @summary Add the specified number of days to the given date. + * @category Quarter Helpers + * @summary Return the start of a year quarter for the given date. * * @description - * Add the specified number of days to the given date. + * Return the start of a year quarter for the given date. + * The result will be in the local timezone. * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of days to be added - * @returns {Date} the new date with the days added + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a quarter * * @example - * // Add 10 days to 1 September 2014: - * var result = addDays(new Date(2014, 8, 1), 10) - * //=> Thu Sep 11 2014 00:00:00 + * // The start of a quarter for 2 September 2014 11:55:00: + * var result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Jul 01 2014 00:00:00 */ -function addDays (dirtyDate, dirtyAmount) { +function startOfQuarter (dirtyDate) { var date = parse(dirtyDate) - var amount = Number(dirtyAmount) - date.setDate(date.getDate() + amount) + var currentMonth = date.getMonth() + var month = currentMonth - currentMonth % 3 + date.setMonth(month, 1) + date.setHours(0, 0, 0, 0) return date } -module.exports = addDays +module.exports = startOfQuarter /***/ }), -/* 772 */ +/* 834 */ /***/ (function(module, exports, __webpack_require__) { -var getTimezoneOffsetInMilliseconds = __webpack_require__(773) -var isDate = __webpack_require__(774) - -var MILLISECONDS_IN_HOUR = 3600000 -var MILLISECONDS_IN_MINUTE = 60000 -var DEFAULT_ADDITIONAL_DIGITS = 2 - -var parseTokenDateTimeDelimeter = /[T ]/ -var parseTokenPlainTime = /:/ - -// year tokens -var parseTokenYY = /^(\d{2})$/ -var parseTokensYYY = [ - /^([+-]\d{2})$/, // 0 additional digits - /^([+-]\d{3})$/, // 1 additional digit - /^([+-]\d{4})$/ // 2 additional digits -] - -var parseTokenYYYY = /^(\d{4})/ -var parseTokensYYYYY = [ - /^([+-]\d{4})/, // 0 additional digits - /^([+-]\d{5})/, // 1 additional digit - /^([+-]\d{6})/ // 2 additional digits -] - -// date tokens -var parseTokenMM = /^-(\d{2})$/ -var parseTokenDDD = /^-?(\d{3})$/ -var parseTokenMMDD = /^-?(\d{2})-?(\d{2})$/ -var parseTokenWww = /^-?W(\d{2})$/ -var parseTokenWwwD = /^-?W(\d{2})-?(\d{1})$/ - -// time tokens -var parseTokenHH = /^(\d{2}([.,]\d*)?)$/ -var parseTokenHHMM = /^(\d{2}):?(\d{2}([.,]\d*)?)$/ -var parseTokenHHMMSS = /^(\d{2}):?(\d{2}):?(\d{2}([.,]\d*)?)$/ - -// timezone tokens -var parseTokenTimezone = /([Z+-].*)$/ -var parseTokenTimezoneZ = /^(Z)$/ -var parseTokenTimezoneHH = /^([+-])(\d{2})$/ -var parseTokenTimezoneHHMM = /^([+-])(\d{2}):?(\d{2})$/ +var startOfSecond = __webpack_require__(835) /** - * @category Common Helpers - * @summary Convert the given argument to an instance of Date. + * @category Second Helpers + * @summary Are the given dates in the same second? * * @description - * Convert the given argument to an instance of Date. - * - * If the argument is an instance of Date, the function returns its clone. - * - * If the argument is a number, it is treated as a timestamp. - * - * If an argument is a string, the function tries to parse it. - * Function accepts complete ISO 8601 formats as well as partial implementations. - * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601 - * - * If all above fails, the function passes the given argument to Date constructor. - * - * @param {Date|String|Number} argument - the value to convert - * @param {Object} [options] - the object with options - * @param {0 | 1 | 2} [options.additionalDigits=2] - the additional number of digits in the extended year format - * @returns {Date} the parsed date in the local time zone + * Are the given dates in the same second? * - * @example - * // Convert string '2014-02-11T11:30:30' to date: - * var result = parse('2014-02-11T11:30:30') - * //=> Tue Feb 11 2014 11:30:30 + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same second * * @example - * // Parse string '+02014101', - * // if the additional number of digits in the extended year format is 1: - * var result = parse('+02014101', {additionalDigits: 1}) - * //=> Fri Apr 11 2014 00:00:00 + * // Are 4 September 2014 06:30:15.000 and 4 September 2014 06:30.15.500 + * // in the same second? + * var result = isSameSecond( + * new Date(2014, 8, 4, 6, 30, 15), + * new Date(2014, 8, 4, 6, 30, 15, 500) + * ) + * //=> true */ -function parse (argument, dirtyOptions) { - if (isDate(argument)) { - // Prevent the date to lose the milliseconds when passed to new Date() in IE10 - return new Date(argument.getTime()) - } else if (typeof argument !== 'string') { - return new Date(argument) - } - - var options = dirtyOptions || {} - var additionalDigits = options.additionalDigits - if (additionalDigits == null) { - additionalDigits = DEFAULT_ADDITIONAL_DIGITS - } else { - additionalDigits = Number(additionalDigits) - } - - var dateStrings = splitDateString(argument) - - var parseYearResult = parseYear(dateStrings.date, additionalDigits) - var year = parseYearResult.year - var restDateString = parseYearResult.restDateString - - var date = parseDate(restDateString, year) - - if (date) { - var timestamp = date.getTime() - var time = 0 - var offset - - if (dateStrings.time) { - time = parseTime(dateStrings.time) - } - - if (dateStrings.timezone) { - offset = parseTimezone(dateStrings.timezone) * MILLISECONDS_IN_MINUTE - } else { - var fullTime = timestamp + time - var fullTimeDate = new Date(fullTime) - - offset = getTimezoneOffsetInMilliseconds(fullTimeDate) - - // Adjust time when it's coming from DST - var fullTimeDateNextDay = new Date(fullTime) - fullTimeDateNextDay.setDate(fullTimeDate.getDate() + 1) - var offsetDiff = - getTimezoneOffsetInMilliseconds(fullTimeDateNextDay) - - getTimezoneOffsetInMilliseconds(fullTimeDate) - if (offsetDiff > 0) { - offset += offsetDiff - } - } +function isSameSecond (dirtyDateLeft, dirtyDateRight) { + var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft) + var dateRightStartOfSecond = startOfSecond(dirtyDateRight) - return new Date(timestamp + time + offset) - } else { - return new Date(argument) - } + return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime() } -function splitDateString (dateString) { - var dateStrings = {} - var array = dateString.split(parseTokenDateTimeDelimeter) - var timeString +module.exports = isSameSecond - if (parseTokenPlainTime.test(array[0])) { - dateStrings.date = null - timeString = array[0] - } else { - dateStrings.date = array[0] - timeString = array[1] - } - if (timeString) { - var token = parseTokenTimezone.exec(timeString) - if (token) { - dateStrings.time = timeString.replace(token[1], '') - dateStrings.timezone = token[1] - } else { - dateStrings.time = timeString - } - } +/***/ }), +/* 835 */ +/***/ (function(module, exports, __webpack_require__) { - return dateStrings +var parse = __webpack_require__(731) + +/** + * @category Second Helpers + * @summary Return the start of a second for the given date. + * + * @description + * Return the start of a second for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the start of a second + * + * @example + * // The start of a second for 1 December 2014 22:15:45.400: + * var result = startOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) + * //=> Mon Dec 01 2014 22:15:45.000 + */ +function startOfSecond (dirtyDate) { + var date = parse(dirtyDate) + date.setMilliseconds(0) + return date } -function parseYear (dateString, additionalDigits) { - var parseTokenYYY = parseTokensYYY[additionalDigits] - var parseTokenYYYYY = parseTokensYYYYY[additionalDigits] +module.exports = startOfSecond - var token - // YYYY or ±YYYYY - token = parseTokenYYYY.exec(dateString) || parseTokenYYYYY.exec(dateString) - if (token) { - var yearString = token[1] - return { - year: parseInt(yearString, 10), - restDateString: dateString.slice(yearString.length) - } - } +/***/ }), +/* 836 */ +/***/ (function(module, exports, __webpack_require__) { - // YY or ±YYY - token = parseTokenYY.exec(dateString) || parseTokenYYY.exec(dateString) - if (token) { - var centuryString = token[1] - return { - year: parseInt(centuryString, 10) * 100, - restDateString: dateString.slice(centuryString.length) - } - } +var parse = __webpack_require__(731) - // Invalid ISO-formatted year - return { - year: null - } +/** + * @category Year Helpers + * @summary Are the given dates in the same year? + * + * @description + * Are the given dates in the same year? + * + * @param {Date|String|Number} dateLeft - the first date to check + * @param {Date|String|Number} dateRight - the second date to check + * @returns {Boolean} the dates are in the same year + * + * @example + * // Are 2 September 2014 and 25 September 2014 in the same year? + * var result = isSameYear( + * new Date(2014, 8, 2), + * new Date(2014, 8, 25) + * ) + * //=> true + */ +function isSameYear (dirtyDateLeft, dirtyDateRight) { + var dateLeft = parse(dirtyDateLeft) + var dateRight = parse(dirtyDateRight) + return dateLeft.getFullYear() === dateRight.getFullYear() } -function parseDate (dateString, year) { - // Invalid ISO-formatted year - if (year === null) { - return null - } +module.exports = isSameYear - var token - var date - var month - var week - // YYYY - if (dateString.length === 0) { - date = new Date(0) - date.setUTCFullYear(year) - return date - } +/***/ }), +/* 837 */ +/***/ (function(module, exports, __webpack_require__) { - // YYYY-MM - token = parseTokenMM.exec(dateString) - if (token) { - date = new Date(0) - month = parseInt(token[1], 10) - 1 - date.setUTCFullYear(year, month) - return date - } +var parse = __webpack_require__(731) - // YYYY-DDD or YYYYDDD - token = parseTokenDDD.exec(dateString) - if (token) { - date = new Date(0) - var dayOfYear = parseInt(token[1], 10) - date.setUTCFullYear(year, 0, dayOfYear) - return date - } +/** + * @category Weekday Helpers + * @summary Is the given date Saturday? + * + * @description + * Is the given date Saturday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Saturday + * + * @example + * // Is 27 September 2014 Saturday? + * var result = isSaturday(new Date(2014, 8, 27)) + * //=> true + */ +function isSaturday (dirtyDate) { + return parse(dirtyDate).getDay() === 6 +} - // YYYY-MM-DD or YYYYMMDD - token = parseTokenMMDD.exec(dateString) - if (token) { - date = new Date(0) - month = parseInt(token[1], 10) - 1 - var day = parseInt(token[2], 10) - date.setUTCFullYear(year, month, day) - return date - } +module.exports = isSaturday - // YYYY-Www or YYYYWww - token = parseTokenWww.exec(dateString) - if (token) { - week = parseInt(token[1], 10) - 1 - return dayOfISOYear(year, week) - } - // YYYY-Www-D or YYYYWwwD - token = parseTokenWwwD.exec(dateString) - if (token) { - week = parseInt(token[1], 10) - 1 - var dayOfWeek = parseInt(token[2], 10) - 1 - return dayOfISOYear(year, week, dayOfWeek) - } +/***/ }), +/* 838 */ +/***/ (function(module, exports, __webpack_require__) { - // Invalid ISO-formatted date - return null +var parse = __webpack_require__(731) + +/** + * @category Weekday Helpers + * @summary Is the given date Sunday? + * + * @description + * Is the given date Sunday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Sunday + * + * @example + * // Is 21 September 2014 Sunday? + * var result = isSunday(new Date(2014, 8, 21)) + * //=> true + */ +function isSunday (dirtyDate) { + return parse(dirtyDate).getDay() === 0 } -function parseTime (timeString) { - var token - var hours - var minutes +module.exports = isSunday - // hh - token = parseTokenHH.exec(timeString) - if (token) { - hours = parseFloat(token[1].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR - } - // hh:mm or hhmm - token = parseTokenHHMM.exec(timeString) - if (token) { - hours = parseInt(token[1], 10) - minutes = parseFloat(token[2].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR + - minutes * MILLISECONDS_IN_MINUTE - } +/***/ }), +/* 839 */ +/***/ (function(module, exports, __webpack_require__) { - // hh:mm:ss or hhmmss - token = parseTokenHHMMSS.exec(timeString) - if (token) { - hours = parseInt(token[1], 10) - minutes = parseInt(token[2], 10) - var seconds = parseFloat(token[3].replace(',', '.')) - return (hours % 24) * MILLISECONDS_IN_HOUR + - minutes * MILLISECONDS_IN_MINUTE + - seconds * 1000 - } +var isSameHour = __webpack_require__(824) - // Invalid ISO-formatted time - return null +/** + * @category Hour Helpers + * @summary Is the given date in the same hour as the current date? + * + * @description + * Is the given date in the same hour as the current date? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this hour + * + * @example + * // If now is 25 September 2014 18:30:15.500, + * // is 25 September 2014 18:00:00 in this hour? + * var result = isThisHour(new Date(2014, 8, 25, 18)) + * //=> true + */ +function isThisHour (dirtyDate) { + return isSameHour(new Date(), dirtyDate) } -function parseTimezone (timezoneString) { - var token - var absoluteOffset - - // Z - token = parseTokenTimezoneZ.exec(timezoneString) - if (token) { - return 0 - } +module.exports = isThisHour - // ±hh - token = parseTokenTimezoneHH.exec(timezoneString) - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60 - return (token[1] === '+') ? -absoluteOffset : absoluteOffset - } - // ±hh:mm or ±hhmm - token = parseTokenTimezoneHHMM.exec(timezoneString) - if (token) { - absoluteOffset = parseInt(token[2], 10) * 60 + parseInt(token[3], 10) - return (token[1] === '+') ? -absoluteOffset : absoluteOffset - } +/***/ }), +/* 840 */ +/***/ (function(module, exports, __webpack_require__) { - return 0 -} +var isSameISOWeek = __webpack_require__(826) -function dayOfISOYear (isoYear, week, day) { - week = week || 0 - day = day || 0 - var date = new Date(0) - date.setUTCFullYear(isoYear, 0, 4) - var fourthOfJanuaryDay = date.getUTCDay() || 7 - var diff = week * 7 + day + 1 - fourthOfJanuaryDay - date.setUTCDate(date.getUTCDate() + diff) - return date +/** + * @category ISO Week Helpers + * @summary Is the given date in the same ISO week as the current date? + * + * @description + * Is the given date in the same ISO week as the current date? + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this ISO week + * + * @example + * // If today is 25 September 2014, is 22 September 2014 in this ISO week? + * var result = isThisISOWeek(new Date(2014, 8, 22)) + * //=> true + */ +function isThisISOWeek (dirtyDate) { + return isSameISOWeek(new Date(), dirtyDate) } -module.exports = parse +module.exports = isThisISOWeek /***/ }), -/* 773 */ -/***/ (function(module, exports) { +/* 841 */ +/***/ (function(module, exports, __webpack_require__) { -var MILLISECONDS_IN_MINUTE = 60000 +var isSameISOYear = __webpack_require__(828) /** - * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds. - * They usually appear for dates that denote time before the timezones were introduced - * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891 - * and GMT+01:00:00 after that date) + * @category ISO Week-Numbering Year Helpers + * @summary Is the given date in the same ISO week-numbering year as the current date? * - * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above, - * which would lead to incorrect calculations. + * @description + * Is the given date in the same ISO week-numbering year as the current date? * - * This function returns the timezone offset in milliseconds that takes seconds in account. + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this ISO week-numbering year + * + * @example + * // If today is 25 September 2014, + * // is 30 December 2013 in this ISO week-numbering year? + * var result = isThisISOYear(new Date(2013, 11, 30)) + * //=> true */ -module.exports = function getTimezoneOffsetInMilliseconds (dirtyDate) { - var date = new Date(dirtyDate.getTime()) - var baseTimezoneOffset = date.getTimezoneOffset() - date.setSeconds(0, 0) - var millisecondsPartOfTimezoneOffset = date.getTime() % MILLISECONDS_IN_MINUTE - - return baseTimezoneOffset * MILLISECONDS_IN_MINUTE + millisecondsPartOfTimezoneOffset +function isThisISOYear (dirtyDate) { + return isSameISOYear(new Date(), dirtyDate) } +module.exports = isThisISOYear + /***/ }), -/* 774 */ -/***/ (function(module, exports) { +/* 842 */ +/***/ (function(module, exports, __webpack_require__) { + +var isSameMinute = __webpack_require__(829) /** - * @category Common Helpers - * @summary Is the given argument an instance of Date? + * @category Minute Helpers + * @summary Is the given date in the same minute as the current date? * * @description - * Is the given argument an instance of Date? + * Is the given date in the same minute as the current date? * - * @param {*} argument - the argument to check - * @returns {Boolean} the given argument is an instance of Date + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this minute * * @example - * // Is 'mayonnaise' a Date? - * var result = isDate('mayonnaise') - * //=> false + * // If now is 25 September 2014 18:30:15.500, + * // is 25 September 2014 18:30:00 in this minute? + * var result = isThisMinute(new Date(2014, 8, 25, 18, 30)) + * //=> true */ -function isDate (argument) { - return argument instanceof Date +function isThisMinute (dirtyDate) { + return isSameMinute(new Date(), dirtyDate) } -module.exports = isDate +module.exports = isThisMinute /***/ }), -/* 775 */ +/* 843 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var isSameMonth = __webpack_require__(831) /** - * @category Common Helpers - * @summary Is the first date after the second one? + * @category Month Helpers + * @summary Is the given date in the same month as the current date? * * @description - * Is the first date after the second one? + * Is the given date in the same month as the current date? * - * @param {Date|String|Number} date - the date that should be after the other one to return true - * @param {Date|String|Number} dateToCompare - the date to compare with - * @returns {Boolean} the first date is after the second date + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this month * * @example - * // Is 10 July 1989 after 11 February 1987? - * var result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11)) + * // If today is 25 September 2014, is 15 September 2014 in this month? + * var result = isThisMonth(new Date(2014, 8, 15)) * //=> true */ -function isAfter (dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate) - var dateToCompare = parse(dirtyDateToCompare) - return date.getTime() > dateToCompare.getTime() +function isThisMonth (dirtyDate) { + return isSameMonth(new Date(), dirtyDate) } -module.exports = isAfter +module.exports = isThisMonth /***/ }), -/* 776 */ +/* 844 */ /***/ (function(module, exports, __webpack_require__) { -const groupBy = __webpack_require__(386) -const sortBy = __webpack_require__(485) -const { eitherIncludes } = __webpack_require__(763) - -const getDateTransaction = op => op.date.substr(0, 10) +var isSameQuarter = __webpack_require__(832) /** - * Groups `iterables` via `grouper` and returns an iterator - * that yields [groupKey, groups] + * @category Quarter Helpers + * @summary Is the given date in the same quarter as the current date? + * + * @description + * Is the given date in the same quarter as the current date? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this quarter + * + * @example + * // If today is 25 September 2014, is 2 July 2014 in this quarter? + * var result = isThisQuarter(new Date(2014, 6, 2)) + * //=> true */ -const zipGroup = function* (iterables, grouper) { - const grouped = iterables.map(items => groupBy(items, grouper)) - for (const key of Object.keys(grouped[0]).sort()) { - const groups = grouped.map(keyedGroups => keyedGroups[key] || []) - yield [key, groups] - } -} - -const squash = (str, char) => { - const rx = new RegExp(String.raw`${char}{2,}`, 'gi') - return str && str.replace(rx, char) +function isThisQuarter (dirtyDate) { + return isSameQuarter(new Date(), dirtyDate) } -const redactedNumber = /\b[0-9X]+\b/gi -const dateRx = /\b\d{2}\/\d{2}\/\d{4}\b/g +module.exports = isThisQuarter -const cleanLabel = label => label && label.replace(redactedNumber, '') -const withoutDate = str => str && str.replace(dateRx, '') -const compacted = str => str && str.replace(/\s/g, '').replace(/-/g, '') -const scoreLabel = (newTr, existingTr) => { - if ( - squash(existingTr.originalBankLabel, ' ') === - squash(newTr.originalBankLabel, ' ') - ) { - return [200, 'originalBankLabel'] - } else if ( - compacted(existingTr.originalBankLabel) === - compacted(newTr.originalBankLabel) - ) { - return [120, 'originalBankLabelCompacted'] - } else if ( - withoutDate(existingTr.originalBankLabel) === - withoutDate(newTr.originalBankLabel) - ) { - // For some transfers, the date in the originalBankLabel is different between - // BudgetInsight and Linxo - return [150, 'originalBankLabelWithoutDate'] - } else if (existingTr.label === newTr.label) { - return [100, 'label'] - } else if ( - eitherIncludes(existingTr.label.toLowerCase(), newTr.label.toLowerCase()) - ) { - return [70, 'eitherIncludes'] - } else if ( - eitherIncludes( - cleanLabel(existingTr.label.toLowerCase()), - cleanLabel(newTr.label.toLowerCase()) - ) - ) { - return [50, 'fuzzy-eitherIncludes'] - } else { - // Nothing matches, we penalize so that the score is below 0 - return [-1000, 'label-penalty'] - } -} +/***/ }), +/* 845 */ +/***/ (function(module, exports, __webpack_require__) { -const DAY = 1000 * 60 * 60 * 24 +var isSameSecond = __webpack_require__(834) -const getDeltaDate = (newTr, existingTr) => { - const nDate1 = new Date(newTr.date.substr(0, 10)) - const eDate1 = new Date(existingTr.date.substr(0, 10)) - const delta = Math.abs(eDate1 - nDate1) - if (newTr.realisationDate) { - const nDate2 = new Date(newTr.realisationDate.substr(0, 10)) - const delta2 = Math.abs(eDate1 - nDate2) - return Math.min(delta, delta2) - } else { - return delta - } +/** + * @category Second Helpers + * @summary Is the given date in the same second as the current date? + * + * @description + * Is the given date in the same second as the current date? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this second + * + * @example + * // If now is 25 September 2014 18:30:15.500, + * // is 25 September 2014 18:30:15.000 in this second? + * var result = isThisSecond(new Date(2014, 8, 25, 18, 30, 15)) + * //=> true + */ +function isThisSecond (dirtyDate) { + return isSameSecond(new Date(), dirtyDate) } -const scoreMatching = (newTr, existingTr, options = {}) => { - const methods = [] - const res = { - op: existingTr, - methods - } +module.exports = isThisSecond - if (options.maxDateDelta) { - const delta = getDeltaDate(newTr, existingTr) - if (delta > options.maxDateDelta) { - // Early exit, transactions are two far off time-wise - res.points = -1000 - return res - } else { - methods.push('approx-date') - } - } - const [labelPoints, labelMethod] = scoreLabel(newTr, existingTr) - methods.push(labelMethod) - const amountDiff = Math.abs(existingTr.amount - newTr.amount) - const amountPoints = amountDiff === 0 ? methods.push('amount') && 100 : -1000 +/***/ }), +/* 846 */ +/***/ (function(module, exports, __webpack_require__) { - const points = amountPoints + labelPoints - res.points = points - return res +var isSameWeek = __webpack_require__(827) + +/** + * @category Week Helpers + * @summary Is the given date in the same week as the current date? + * + * @description + * Is the given date in the same week as the current date? + * + * @param {Date|String|Number} date - the date to check + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Boolean} the date is in this week + * + * @example + * // If today is 25 September 2014, is 21 September 2014 in this week? + * var result = isThisWeek(new Date(2014, 8, 21)) + * //=> true + * + * @example + * // If today is 25 September 2014 and week starts with Monday + * // is 21 September 2014 in this week? + * var result = isThisWeek(new Date(2014, 8, 21), {weekStartsOn: 1}) + * //=> false + */ +function isThisWeek (dirtyDate, dirtyOptions) { + return isSameWeek(new Date(), dirtyDate, dirtyOptions) } -const matchTransaction = (newTr, existingTrs, options = {}) => { - const exactVendorId = existingTrs.find( - existingTr => - existingTr.vendorId && - newTr.vendorId && - existingTr.vendorId === newTr.vendorId - ) - if (exactVendorId) { - return { match: exactVendorId, method: 'vendorId' } - } +module.exports = isThisWeek - // Now we try to do it based on originalBankLabel, label and amount. - // We score candidates according to their degree of matching - // with the current transaction. - // Candidates with score below 0 will be discarded. - const withPoints = existingTrs.map(existingTr => - scoreMatching(newTr, existingTr, options) - ) - const candidates = sortBy(withPoints, x => -x.points).filter( - x => x.points > 0 - ) - return candidates.length > 0 - ? { - match: candidates[0].op, - method: candidates[0].methods.join('-') - } - : { - candidates - } -} +/***/ }), +/* 847 */ +/***/ (function(module, exports, __webpack_require__) { + +var isSameYear = __webpack_require__(836) /** - * Logic to match a transaction and removing it from the transactions to - * match. `matchingFn` is the function used for matching. + * @category Year Helpers + * @summary Is the given date in the same year as the current date? + * + * @description + * Is the given date in the same year as the current date? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is in this year + * + * @example + * // If today is 25 September 2014, is 2 July 2014 in this year? + * var result = isThisYear(new Date(2014, 6, 2)) + * //=> true */ -const matchTransactionToGroup = function* (newTrs, existingTrs, options = {}) { - const toMatch = Array.isArray(existingTrs) ? [...existingTrs] : [] - for (let newTr of newTrs) { - const res = { - transaction: newTr - } - - const result = - toMatch.length > 0 ? matchTransaction(newTr, toMatch, options) : null - if (result) { - Object.assign(res, result) - const matchIdx = toMatch.indexOf(result.match) - if (matchIdx > -1) { - toMatch.splice(matchIdx, 1) - } - } - yield res - } +function isThisYear (dirtyDate) { + return isSameYear(new Date(), dirtyDate) } +module.exports = isThisYear + + +/***/ }), +/* 848 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) + /** - * Several logics to match transactions. + * @category Weekday Helpers + * @summary Is the given date Thursday? * - * First group transactions per day and match transactions in - * intra-day mode. - * Then relax the date constraint 1 day per 1 day to reach - * a maximum of 5 days of differences + * @description + * Is the given date Thursday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Thursday + * + * @example + * // Is 25 September 2014 Thursday? + * var result = isThursday(new Date(2014, 8, 25)) + * //=> true */ -const matchTransactions = function* (newTrs, existingTrs) { - const unmatchedNew = new Set(newTrs) - const unmatchedExisting = new Set(existingTrs) - // eslint-disable-next-line no-unused-vars - for (let [date, [newGroup, existingGroup]] of zipGroup( - [newTrs, existingTrs], - getDateTransaction - )) { - for (let result of matchTransactionToGroup(newGroup, existingGroup)) { - if (result.match) { - unmatchedExisting.delete(result.match) - unmatchedNew.delete(result.transaction) - yield result - } - } - } - - const deltas = [3, 4, 5] - for (let delta of deltas) { - for (let result of matchTransactionToGroup( - Array.from(unmatchedNew), - Array.from(unmatchedExisting), - { - maxDateDelta: delta * DAY - } - )) { - if (result.method) { - result.method += `-delta${delta}` - } - if (result.match) { - unmatchedExisting.delete(result.match) - unmatchedNew.delete(result.transaction) - } - if (result.match || delta === deltas[deltas.length - 1]) { - yield result - } - } - } +function isThursday (dirtyDate) { + return parse(dirtyDate).getDay() === 4 } -module.exports = { - matchTransactions, - scoreMatching -} +module.exports = isThursday /***/ }), -/* 777 */ +/* 849 */ /***/ (function(module, exports, __webpack_require__) { -const Document = __webpack_require__(731) -const sumBy = __webpack_require__(778) +var startOfDay = __webpack_require__(743) -class BankAccountStats extends Document { - static checkCurrencies(accountsStats) { - const currency = accountsStats[0].currency +/** + * @category Day Helpers + * @summary Is the given date today? + * + * @description + * Is the given date today? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is today + * + * @example + * // If today is 6 October 2014, is 6 October 14:00:00 today? + * var result = isToday(new Date(2014, 9, 6, 14, 0)) + * //=> true + */ +function isToday (dirtyDate) { + return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime() +} - for (const accountStats of accountsStats) { - if (accountStats.currency !== currency) { - return false - } - } +module.exports = isToday - return true - } - static sum(accountsStats) { - if (accountsStats.length === 0) { - throw new Error('You must give at least one stats object') - } +/***/ }), +/* 850 */ +/***/ (function(module, exports, __webpack_require__) { - if (!this.checkCurrencies(accountsStats)) { - throw new Error('Currency of all stats object must be the same.') - } +var startOfDay = __webpack_require__(743) - const properties = [ - 'income', - 'additionalIncome', - 'mortgage', - 'loans', - 'fixedCharges' - ] +/** + * @category Day Helpers + * @summary Is the given date tomorrow? + * + * @description + * Is the given date tomorrow? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is tomorrow + * + * @example + * // If today is 6 October 2014, is 7 October 14:00:00 tomorrow? + * var result = isTomorrow(new Date(2014, 9, 7, 14, 0)) + * //=> true + */ +function isTomorrow (dirtyDate) { + var tomorrow = new Date() + tomorrow.setDate(tomorrow.getDate() + 1) + return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime() +} - const summedStats = properties.reduce((sums, property) => { - sums[property] = sumBy( - accountsStats, - accountStats => accountStats[property] || 0 - ) +module.exports = isTomorrow - return sums - }, {}) - summedStats.currency = accountsStats[0].currency +/***/ }), +/* 851 */ +/***/ (function(module, exports, __webpack_require__) { - return summedStats - } -} +var parse = __webpack_require__(731) -BankAccountStats.doctype = 'io.cozy.bank.accounts.stats' -BankAccountStats.idAttributes = ['_id'] -BankAccountStats.version = 1 -BankAccountStats.checkedAttributes = null +/** + * @category Weekday Helpers + * @summary Is the given date Tuesday? + * + * @description + * Is the given date Tuesday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Tuesday + * + * @example + * // Is 23 September 2014 Tuesday? + * var result = isTuesday(new Date(2014, 8, 23)) + * //=> true + */ +function isTuesday (dirtyDate) { + return parse(dirtyDate).getDay() === 2 +} -module.exports = BankAccountStats +module.exports = isTuesday /***/ }), -/* 778 */ +/* 852 */ /***/ (function(module, exports, __webpack_require__) { -var baseIteratee = __webpack_require__(101), - baseSum = __webpack_require__(779); +var parse = __webpack_require__(731) /** - * This method is like `_.sum` except that it accepts `iteratee` which is - * invoked for each element in `array` to generate the value to be summed. - * The iteratee is invoked with one argument: (value). - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Math - * @param {Array} array The array to iterate over. - * @param {Function} [iteratee=_.identity] The iteratee invoked per element. - * @returns {number} Returns the sum. - * @example + * @category Weekday Helpers + * @summary Is the given date Wednesday? * - * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; + * @description + * Is the given date Wednesday? * - * _.sumBy(objects, function(o) { return o.n; }); - * // => 20 + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is Wednesday * - * // The `_.property` iteratee shorthand. - * _.sumBy(objects, 'n'); - * // => 20 + * @example + * // Is 24 September 2014 Wednesday? + * var result = isWednesday(new Date(2014, 8, 24)) + * //=> true */ -function sumBy(array, iteratee) { - return (array && array.length) - ? baseSum(array, baseIteratee(iteratee, 2)) - : 0; +function isWednesday (dirtyDate) { + return parse(dirtyDate).getDay() === 3 } -module.exports = sumBy; +module.exports = isWednesday /***/ }), -/* 779 */ -/***/ (function(module, exports) { +/* 853 */ +/***/ (function(module, exports, __webpack_require__) { + +var parse = __webpack_require__(731) /** - * The base implementation of `_.sum` and `_.sumBy` without support for - * iteratee shorthands. + * @category Weekday Helpers + * @summary Does the given date fall on a weekend? * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @returns {number} Returns the sum. + * @description + * Does the given date fall on a weekend? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date falls on a weekend + * + * @example + * // Does 5 October 2014 fall on a weekend? + * var result = isWeekend(new Date(2014, 9, 5)) + * //=> true */ -function baseSum(array, iteratee) { - var result, - index = -1, - length = array.length; - - while (++index < length) { - var current = iteratee(array[index]); - if (current !== undefined) { - result = result === undefined ? current : (result + current); - } - } - return result; +function isWeekend (dirtyDate) { + var date = parse(dirtyDate) + var day = date.getDay() + return day === 0 || day === 6 } -module.exports = baseSum; +module.exports = isWeekend /***/ }), -/* 780 */ +/* 854 */ /***/ (function(module, exports, __webpack_require__) { -const trimEnd = __webpack_require__(479) -const Document = __webpack_require__(731) - -const FILENAME_WITH_EXTENSION_REGEX = /(.+)(\..*)$/ +var parse = __webpack_require__(731) /** - * Class representing the file model. - * @extends Document + * @category Range Helpers + * @summary Is the given date within the range? + * + * @description + * Is the given date within the range? + * + * @param {Date|String|Number} date - the date to check + * @param {Date|String|Number} startDate - the start of range + * @param {Date|String|Number} endDate - the end of range + * @returns {Boolean} the date is within the range + * @throws {Error} startDate cannot be after endDate + * + * @example + * // For the date within the range: + * isWithinRange( + * new Date(2014, 0, 3), new Date(2014, 0, 1), new Date(2014, 0, 7) + * ) + * //=> true + * + * @example + * // For the date outside of the range: + * isWithinRange( + * new Date(2014, 0, 10), new Date(2014, 0, 1), new Date(2014, 0, 7) + * ) + * //=> false */ -class CozyFile extends Document { - /** - * async getFullpath - Gets a file's path - * - * @param {string} dirID The id of the parent directory - * @param {string} name The file's name - * @return {string} The full path of the file in the cozy - **/ - static async getFullpath(dirId, name) { - if (!dirId) { - throw new Error('You must provide a dirId') - } - - const parentDir = await this.get(dirId) - const parentDirectoryPath = trimEnd(parentDir.path, '/') - return `${parentDirectoryPath}/${name}` - } - - /** - * Move file to destination. - * - * @param {string} fileId - The file's id (required) - * @param {object} destination - * @param {string} destination.folderId - The destination folder's id (required) - * @param {string} destination.path - The file's path after the move (optional, used to optimize performance in case of conflict) - * @param {string} force - Whether we should overwrite the destination in case of conflict (defaults to false) - * @returns {Promise} - A promise that returns the move action response and the deleted file id (if any) if resolved or an Error if rejected - * - */ - static async move(fileId, destination, force = false) { - const { folderId, path } = destination - const filesCollection = this.cozyClient.collection('io.cozy.files') - try { - const resp = await filesCollection.updateFileMetadata(fileId, { - dir_id: folderId - }) - - return { - moved: resp.data, - deleted: null - } - } catch (e) { - if (e.status === 409 && force) { - let destinationPath - if (path) { - destinationPath = path - } else { - const movedFile = await this.get(fileId) - const filename = movedFile.name - destinationPath = await this.getFullpath(folderId, filename) - } - const conflictResp = await filesCollection.statByPath(destinationPath) - await filesCollection.destroy(conflictResp.data) - const resp = await filesCollection.updateFileMetadata(fileId, { - dir_id: folderId - }) - - return { - moved: resp.data, - deleted: conflictResp.data.id - } - } else { - throw e - } - } - } - /** - * Method to split both the filename and the extension - * - * @param {Object} file An io.cozy.files - * @return {Object} return an object with {filename: , extension: } - */ - static splitFilename(file) { - if (!file.name) throw new Error('file should have a name property ') - - if (file.type === 'file') { - const match = file.name.match(FILENAME_WITH_EXTENSION_REGEX) - if (match) { - return { filename: match[1], extension: match[2] } - } - } - return { filename: file.name, extension: '' } - } - /** - * - * Method to upload a file even if a file with the same name already exists. - * - * @param {String} path Fullpath for the file ex: path/to/ - * @param {Object} file HTML Object file - * @param {Object} metadata An object containing the wanted metadata to attach - */ - static async overrideFileForPath(pathArg, file, metadata) { - let path = pathArg - if (!path.endsWith('/')) path = path + '/' - - const filesCollection = this.cozyClient.collection('io.cozy.files') - try { - const existingFile = await filesCollection.statByPath(path + file.name) - - const { id: fileId, dir_id: dirId } = existingFile.data - const resp = await filesCollection.updateFile(file, { - dirId, - fileId, - metadata - }) - return resp - } catch (error) { - if (/Not Found/.test(error)) { - const dirId = await filesCollection.ensureDirectoryExists(path) - const createdFile = await filesCollection.createFile(file, { - dirId, - metadata - }) - return createdFile - } - throw error - } - } - /** - * Method to generate a new filename if there is a conflict - * - * @param {String} filenameWithoutExtension A filename without the extension - * @return {String} A filename with the right suffix - */ - static generateNewFileNameOnConflict(filenameWithoutExtension) { - // Check if the string ends by _1 - const regex = new RegExp('(_)([0-9]+)$') - const matches = filenameWithoutExtension.match(regex) - if (matches) { - let versionNumber = parseInt(matches[2]) - // increment versionNumber - versionNumber++ - const newFilenameWithoutExtension = filenameWithoutExtension.replace( - new RegExp('(_)([0-9]+)$'), - `_${versionNumber}` - ) - return newFilenameWithoutExtension - } else { - return `${filenameWithoutExtension}_1` - } - } +function isWithinRange (dirtyDate, dirtyStartDate, dirtyEndDate) { + var time = parse(dirtyDate).getTime() + var startTime = parse(dirtyStartDate).getTime() + var endTime = parse(dirtyEndDate).getTime() - static generateFileNameForRevision(file, revision, f) { - const { filename, extension } = CozyFile.splitFilename({ - name: file.name, - type: 'file' - }) - return `${filename}_${f( - revision.updated_at, - 'DD MMMM - HH[h]mm' - )}${extension}` + if (startTime > endTime) { + throw new Error('The start of the range cannot be after the end of the range') } - /** - * The goal of this method is to upload a file based on a conflict strategy. - * Be careful: We need to check if the file exists by doing a statByPath query - * before trying to upload the file since if we post and the stack return a - * 409 conflict, we will get a SPDY_ERROR_PROTOCOL on Chrome. This is the only - * viable workaround - * If there is no conflict, then we upload the file. - * If there is a conflict, then we apply the conflict strategy : `erase` or `rename` - * @param {String} name File Name - * @param {ArrayBuffer} file data - * @param {String} dirId dir id where to upload - * @param {String} conflictStrategy Actually only 2 hardcoded strategies 'erase' or 'rename' - * @param {Object} metadata An object containing the metadata to attach - * @param {String} contentType content type of the file - */ - static async uploadFileWithConflictStrategy( - name, - file, - dirId, - conflictStrategy, - metadata, - contentType - ) { - const filesCollection = this.cozyClient.collection('io.cozy.files') - try { - const path = await CozyFile.getFullpath(dirId, name) + return time >= startTime && time <= endTime +} - const existingFile = await filesCollection.statByPath(path) - const { id: fileId } = existingFile.data - if (conflictStrategy === 'erase') { - // !TODO Bug Fix. Seems we have to pass a name attribute ?! - const resp = await filesCollection.updateFile(file, { - dirId, - fileId, - name, - metadata, - contentType - }) - return resp - } else { - const { filename, extension } = CozyFile.splitFilename({ - name, - type: 'file' - }) - const newFileName = - CozyFile.generateNewFileNameOnConflict(filename) + extension - // recall itself with the newFilename. - return CozyFile.uploadFileWithConflictStrategy( - newFileName, - file, - dirId, - conflictStrategy, - metadata, - contentType - ) - } - } catch (error) { - if (/Not Found/.test(error.message)) { - return await CozyFile.upload(name, file, dirId, metadata, contentType) - } - throw error - } - } - /** - * - * @param {String} name File's name - * @param {ArrayBuffer} file - * @param {String} dirId - * @param {Object} metadata - * @param {String} contentType - */ - static async upload(name, file, dirId, metadata, contentType = 'image/jpeg') { - return this.cozyClient.collection('io.cozy.files').createFile(file, { - name, - dirId, - contentType, - lastModifiedDate: new Date(), - metadata - }) - } +module.exports = isWithinRange + + +/***/ }), +/* 855 */ +/***/ (function(module, exports, __webpack_require__) { + +var startOfDay = __webpack_require__(743) + +/** + * @category Day Helpers + * @summary Is the given date yesterday? + * + * @description + * Is the given date yesterday? + * + * @param {Date|String|Number} date - the date to check + * @returns {Boolean} the date is yesterday + * + * @example + * // If today is 6 October 2014, is 5 October 14:00:00 yesterday? + * var result = isYesterday(new Date(2014, 9, 5, 14, 0)) + * //=> true + */ +function isYesterday (dirtyDate) { + var yesterday = new Date() + yesterday.setDate(yesterday.getDate() - 1) + return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime() } -CozyFile.doctype = 'io.cozy.files' +module.exports = isYesterday -module.exports = CozyFile + +/***/ }), +/* 856 */ +/***/ (function(module, exports, __webpack_require__) { + +var lastDayOfWeek = __webpack_require__(857) + +/** + * @category ISO Week Helpers + * @summary Return the last day of an ISO week for the given date. + * + * @description + * Return the last day of an ISO week for the given date. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the last day of an ISO week + * + * @example + * // The last day of an ISO week for 2 September 2014 11:55:00: + * var result = lastDayOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sun Sep 07 2014 00:00:00 + */ +function lastDayOfISOWeek (dirtyDate) { + return lastDayOfWeek(dirtyDate, {weekStartsOn: 1}) +} + +module.exports = lastDayOfISOWeek /***/ }), -/* 781 */ +/* 857 */ /***/ (function(module, exports, __webpack_require__) { -const Application = __webpack_require__(759) -const CozyFile = __webpack_require__(780) +var parse = __webpack_require__(731) /** - * Class representing the folder model. - * @extends CozyFile + * @category Week Helpers + * @summary Return the last day of a week for the given date. + * + * @description + * Return the last day of a week for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Date} the last day of a week + * + * @example + * // The last day of a week for 2 September 2014 11:55:00: + * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Sat Sep 06 2014 00:00:00 + * + * @example + * // If the week starts on Monday, the last day of the week for 2 September 2014 11:55:00: + * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) + * //=> Sun Sep 07 2014 00:00:00 */ -class CozyFolder extends CozyFile { - /** - * Create a folder with a reference to the given document - * @param {String} path Folder path - * @param {Object} document Document to make reference to. Any doctype. - * @return {Object} Folder document - */ - static async createFolderWithReference(path, document) { - const collection = this.cozyClient.collection(CozyFile.doctype) - const dirId = await collection.ensureDirectoryExists(path) - await collection.addReferencesTo(document, [ - { - _id: dirId - } - ]) +function lastDayOfWeek (dirtyDate, dirtyOptions) { + var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - const { data: dirInfos } = await collection.get(dirId) + var date = parse(dirtyDate) + var day = date.getDay() + var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) - return dirInfos - } + date.setHours(0, 0, 0, 0) + date.setDate(date.getDate() + diff) + return date +} - /** - * Returns a "Magic Folder", given its id - * @param {String} id Magic Folder id. `CozyFolder.magicFolders` contains the - * ids of folders that can be magic folders. - * @param {String} path Default path to use if magic folder does not exist - * @return {Object} Folder document - */ - static async ensureMagicFolder(id, path) { - const magicFolderDocument = { - _type: Application.doctype, - _id: id - } - const folders = await this.getReferencedFolders(magicFolderDocument) - const existingMagicFolder = folders.length ? folders[0] : null +module.exports = lastDayOfWeek - if (existingMagicFolder) return existingMagicFolder - const magicFoldersValues = Object.values(this.magicFolders) - if (!magicFoldersValues.includes(id)) { - throw new Error( - `Cannot create Magic folder with id ${id}. Allowed values are ${magicFoldersValues.join( - ', ' - )}.` - ) - } +/***/ }), +/* 858 */ +/***/ (function(module, exports, __webpack_require__) { + +var getISOYear = __webpack_require__(737) +var startOfISOWeek = __webpack_require__(738) + +/** + * @category ISO Week-Numbering Year Helpers + * @summary Return the last day of an ISO week-numbering year for the given date. + * + * @description + * Return the last day of an ISO week-numbering year, + * which always starts 3 days before the year's first Thursday. + * The result will be in the local timezone. + * + * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the end of an ISO week-numbering year + * + * @example + * // The last day of an ISO week-numbering year for 2 July 2005: + * var result = lastDayOfISOYear(new Date(2005, 6, 2)) + * //=> Sun Jan 01 2006 00:00:00 + */ +function lastDayOfISOYear (dirtyDate) { + var year = getISOYear(dirtyDate) + var fourthOfJanuary = new Date(0) + fourthOfJanuary.setFullYear(year + 1, 0, 4) + fourthOfJanuary.setHours(0, 0, 0, 0) + var date = startOfISOWeek(fourthOfJanuary) + date.setDate(date.getDate() - 1) + return date +} + +module.exports = lastDayOfISOYear - if (!path) { - throw new Error('Magic folder default path must be defined') - } - return this.createFolderWithReference(path, magicFolderDocument) - } +/***/ }), +/* 859 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Returns an array of folder referenced by the given document - * @param {Object} document Document to get references from - * @return {Array} Array of folders referenced with the given - * document - */ - static async getReferencedFolders(document) { - const { included } = await this.cozyClient - .collection(CozyFile.doctype) - .findReferencedBy(document) - return included.filter(folder => !this.isTrashed(folder)) - } +var parse = __webpack_require__(731) - /** - * Returns an unique folder referenced with the given reference. Creates it - * if it does not exist. - * @param {String} path Path used to create folder if the referenced - * folder does not exist. - * @param {Object} document Document to create references from - * @return {Objet} Folder referenced with the give reference - */ - static async ensureFolderWithReference(path, document) { - const existingFolders = await this.getReferencedFolders(document) - if (existingFolders.length) return existingFolders[0] +/** + * @category Month Helpers + * @summary Return the last day of a month for the given date. + * + * @description + * Return the last day of a month for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the last day of a month + * + * @example + * // The last day of a month for 2 September 2014 11:55:00: + * var result = lastDayOfMonth(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 30 2014 00:00:00 + */ +function lastDayOfMonth (dirtyDate) { + var date = parse(dirtyDate) + var month = date.getMonth() + date.setFullYear(date.getFullYear(), month + 1, 0) + date.setHours(0, 0, 0, 0) + return date +} - const collection = this.cozyClient.collection(CozyFile.doctype) - const dirId = await collection.ensureDirectoryExists(path) - await collection.addReferencesTo(document, [ - { - _id: dirId - } - ]) +module.exports = lastDayOfMonth - const { data: dirInfos } = await collection.get(dirId) - return dirInfos - } +/***/ }), +/* 860 */ +/***/ (function(module, exports, __webpack_require__) { - /** - * Indicates if a folder is in trash - * @param {Object} folder `io.cozy.files` document - * @return {Boolean} `true` if the folder is in trash, `false` - * otherwise. - */ - static isTrashed(folder) { - return /^\/\.cozy_trash/.test(folder.attributes.path) - } -} +var parse = __webpack_require__(731) /** - * References used by the Cozy platform and apps for specific folders. + * @category Quarter Helpers + * @summary Return the last day of a year quarter for the given date. + * + * @description + * Return the last day of a year quarter for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the last day of a quarter + * + * @example + * // The last day of a quarter for 2 September 2014 11:55:00: + * var result = lastDayOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Tue Sep 30 2014 00:00:00 */ -CozyFolder.magicFolders = { - ADMINISTRATIVE: `${Application.doctype}/administrative`, - PHOTOS: `${Application.doctype}/photos`, - PHOTOS_BACKUP: `${Application.doctype}/photos/mobile`, - PHOTOS_UPLOAD: `${Application.doctype}/photos/upload`, - NOTES_FOLDER: `${Application.doctype}/notes` +function lastDayOfQuarter (dirtyDate) { + var date = parse(dirtyDate) + var currentMonth = date.getMonth() + var month = currentMonth - currentMonth % 3 + 3 + date.setMonth(month, 0) + date.setHours(0, 0, 0, 0) + return date } -module.exports = CozyFolder +module.exports = lastDayOfQuarter /***/ }), -/* 782 */ +/* 861 */ /***/ (function(module, exports, __webpack_require__) { -const PropTypes = __webpack_require__(756) - -const Document = __webpack_require__(731) - -class Group extends Document {} - -const GroupShape = PropTypes.shape({ - _id: PropTypes.string.isRequired, - _type: PropTypes.string.isRequired, - name: PropTypes.string.isRequired, - trashed: PropTypes.bool -}) +var parse = __webpack_require__(731) -Group.doctype = 'io.cozy.contacts.groups' -Group.propType = GroupShape +/** + * @category Year Helpers + * @summary Return the last day of a year for the given date. + * + * @description + * Return the last day of a year for the given date. + * The result will be in the local timezone. + * + * @param {Date|String|Number} date - the original date + * @returns {Date} the last day of a year + * + * @example + * // The last day of a year for 2 September 2014 11:55:00: + * var result = lastDayOfYear(new Date(2014, 8, 2, 11, 55, 00)) + * //=> Wed Dec 31 2014 00:00:00 + */ +function lastDayOfYear (dirtyDate) { + var date = parse(dirtyDate) + var year = date.getFullYear() + date.setFullYear(year + 1, 0, 0) + date.setHours(0, 0, 0, 0) + return date +} -module.exports = Group +module.exports = lastDayOfYear /***/ }), -/* 783 */ +/* 862 */ /***/ (function(module, exports, __webpack_require__) { -const Document = __webpack_require__(731) - -class Permission extends Document {} +var parse = __webpack_require__(731) -Permission.schema = { - doctype: 'io.cozy.permissions', - attributes: {} +/** + * @category Common Helpers + * @summary Return the latest of the given dates. + * + * @description + * Return the latest of the given dates. + * + * @param {...(Date|String|Number)} dates - the dates to compare + * @returns {Date} the latest of the dates + * + * @example + * // Which of these dates is the latest? + * var result = max( + * new Date(1989, 6, 10), + * new Date(1987, 1, 11), + * new Date(1995, 6, 2), + * new Date(1990, 0, 1) + * ) + * //=> Sun Jul 02 1995 00:00:00 + */ +function max () { + var dirtyDates = Array.prototype.slice.call(arguments) + var dates = dirtyDates.map(function (dirtyDate) { + return parse(dirtyDate) + }) + var latestTimestamp = Math.max.apply(null, dates) + return new Date(latestTimestamp) } -module.exports = Permission +module.exports = max /***/ }), -/* 784 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 863 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildAttributes", function() { return buildAttributes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAccountId", function() { return getAccountId; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorJobError", function() { return getKonnectorJobError; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLastSuccessDate", function() { return getLastSuccessDate; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorSlug", function() { return getKonnectorSlug; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorStatus", function() { return getKonnectorStatus; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isKonnectorRunning", function() { return isKonnectorRunning; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFrequency", function() { return getFrequency; }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(785); -/* harmony import */ var date_fns__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(date_fns__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(162); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _konnectors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(940); -/* harmony import */ var _cron__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(952); +var parse = __webpack_require__(731) + +/** + * @category Common Helpers + * @summary Return the earliest of the given dates. + * + * @description + * Return the earliest of the given dates. + * + * @param {...(Date|String|Number)} dates - the dates to compare + * @returns {Date} the earliest of the dates + * + * @example + * // Which of these dates is the earliest? + * var result = min( + * new Date(1989, 6, 10), + * new Date(1987, 1, 11), + * new Date(1995, 6, 2), + * new Date(1990, 0, 1) + * ) + * //=> Wed Feb 11 1987 00:00:00 + */ +function min () { + var dirtyDates = Array.prototype.slice.call(arguments) + var dates = dirtyDates.map(function (dirtyDate) { + return parse(dirtyDate) + }) + var earliestTimestamp = Math.min.apply(null, dates) + return new Date(earliestTimestamp) +} +module.exports = min -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +/***/ }), +/* 864 */ +/***/ (function(module, exports, __webpack_require__) { +var parse = __webpack_require__(731) + +/** + * @category Day Helpers + * @summary Set the day of the month to the given date. + * + * @description + * Set the day of the month to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} dayOfMonth - the day of the month of the new date + * @returns {Date} the new date with the day of the month setted + * + * @example + * // Set the 30th day of the month to 1 September 2014: + * var result = setDate(new Date(2014, 8, 1), 30) + * //=> Tue Sep 30 2014 00:00:00 + */ +function setDate (dirtyDate, dirtyDayOfMonth) { + var date = parse(dirtyDate) + var dayOfMonth = Number(dirtyDayOfMonth) + date.setDate(dayOfMonth) + return date +} +module.exports = setDate +/***/ }), +/* 865 */ +/***/ (function(module, exports, __webpack_require__) { -var DEFAULT_CRON = '0 0 0 * * 0'; // Once a week, sunday at midnight +var parse = __webpack_require__(731) +var addDays = __webpack_require__(730) /** - * Build trigger attributes given konnector and account - * @param {object} konnector - * @param {object} account - * @return {object} created trigger + * @category Weekday Helpers + * @summary Set the day of the week to the given date. + * + * @description + * Set the day of the week to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} day - the day of the week of the new date + * @param {Object} [options] - the object with options + * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) + * @returns {Date} the new date with the day of the week setted + * + * @example + * // Set Sunday to 1 September 2014: + * var result = setDay(new Date(2014, 8, 1), 0) + * //=> Sun Aug 31 2014 00:00:00 + * + * @example + * // If week starts with Monday, set Sunday to 1 September 2014: + * var result = setDay(new Date(2014, 8, 1), 0, {weekStartsOn: 1}) + * //=> Sun Sep 07 2014 00:00:00 */ +function setDay (dirtyDate, dirtyDay, dirtyOptions) { + var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 + var date = parse(dirtyDate) + var day = Number(dirtyDay) + var currentDay = date.getDay() -var buildAttributes = function buildAttributes(_ref) { - var account = _ref.account, - _ref$cron = _ref.cron, - cron = _ref$cron === void 0 ? DEFAULT_CRON : _ref$cron, - folder = _ref.folder, - konnector = _ref.konnector; - var message = { - account: account._id, - konnector: konnector.slug - }; - - if (folder) { - message['folder_to_save'] = folder._id; - } - - var result = { - worker: 'konnector', - message: message - }; - var options = konnector.clientSide ? { - type: '@client' - } : { - type: '@cron', - arguments: cron - }; - return _objectSpread(_objectSpread({}, result), options); -}; -var getAccountId = function getAccountId(trigger) { - return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'message.account'); -}; -/** - * Get error for a given trigger document - * @param {Object} trigger io.cozy.trigger as returned by stack - * @return {KonnectorJobError} [description] - */ + var remainder = day % 7 + var dayIndex = (remainder + 7) % 7 -var getKonnectorJobError = function getKonnectorJobError(trigger) { - var status = lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.status'); - return status === 'errored' ? new _konnectors__WEBPACK_IMPORTED_MODULE_3__["KonnectorJobError"](lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.last_error')) : null; -}; -/** - * Get last success date - * @param {Object} trigger io.cozy.trigger as returned by stack - * @return {Date} Last success date or null if the trigger has never been - * launched. - */ + var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay + return addDays(date, diff) +} -var getLastSuccessDate = function getLastSuccessDate(trigger) { - var lastSuccessDate = !!trigger && !!trigger.current_state && trigger.current_state.last_success; - if (!lastSuccessDate) return null; - return date_fns__WEBPACK_IMPORTED_MODULE_1___default.a.parse(lastSuccessDate); -}; -var getKonnectorSlug = function getKonnectorSlug(trigger) { - return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'message.konnector'); -}; -var getKonnectorStatus = function getKonnectorStatus(trigger) { - return lodash_get__WEBPACK_IMPORTED_MODULE_2___default()(trigger, 'current_state.status'); -}; -var isKonnectorRunning = function isKonnectorRunning(trigger) { - return getKonnectorStatus(trigger) === 'running'; -}; -/** - * Get frenquency of a cron trigger, based on its arguments. - * @param {Object} trigger io.cozy.triggers as returned by stack - * @return {String} Frequency value, between 'monthly', 'weekly', - * 'daily', 'hourly' or null. - */ +module.exports = setDay -var getFrequency = function getFrequency(trigger) { - if (!trigger || !trigger.type === '@cron') return null; - return Object(_cron__WEBPACK_IMPORTED_MODULE_4__["toFrequency"])(trigger.arguments); -}; -var helpers = { - buildAttributes: buildAttributes, - isKonnectorRunning: isKonnectorRunning, - getAccountId: getAccountId, - getKonnectorJobError: getKonnectorJobError, - getFrequency: getFrequency, - getKonnectorSlug: getKonnectorSlug, - getKonnectorStatus: getKonnectorStatus, - getLastSuccessDate: getLastSuccessDate -}; -/* harmony default export */ __webpack_exports__["default"] = (helpers); /***/ }), -/* 785 */ +/* 866 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = { - addDays: __webpack_require__(771), - addHours: __webpack_require__(786), - addISOYears: __webpack_require__(788), - addMilliseconds: __webpack_require__(787), - addMinutes: __webpack_require__(796), - addMonths: __webpack_require__(797), - addQuarters: __webpack_require__(799), - addSeconds: __webpack_require__(800), - addWeeks: __webpack_require__(801), - addYears: __webpack_require__(802), - areRangesOverlapping: __webpack_require__(803), - closestIndexTo: __webpack_require__(804), - closestTo: __webpack_require__(805), - compareAsc: __webpack_require__(806), - compareDesc: __webpack_require__(807), - differenceInCalendarDays: __webpack_require__(794), - differenceInCalendarISOWeeks: __webpack_require__(808), - differenceInCalendarISOYears: __webpack_require__(809), - differenceInCalendarMonths: __webpack_require__(810), - differenceInCalendarQuarters: __webpack_require__(811), - differenceInCalendarWeeks: __webpack_require__(813), - differenceInCalendarYears: __webpack_require__(814), - differenceInDays: __webpack_require__(815), - differenceInHours: __webpack_require__(816), - differenceInISOYears: __webpack_require__(818), - differenceInMilliseconds: __webpack_require__(817), - differenceInMinutes: __webpack_require__(820), - differenceInMonths: __webpack_require__(821), - differenceInQuarters: __webpack_require__(822), - differenceInSeconds: __webpack_require__(823), - differenceInWeeks: __webpack_require__(824), - differenceInYears: __webpack_require__(825), - distanceInWords: __webpack_require__(826), - distanceInWordsStrict: __webpack_require__(831), - distanceInWordsToNow: __webpack_require__(832), - eachDay: __webpack_require__(833), - endOfDay: __webpack_require__(834), - endOfHour: __webpack_require__(835), - endOfISOWeek: __webpack_require__(836), - endOfISOYear: __webpack_require__(838), - endOfMinute: __webpack_require__(839), - endOfMonth: __webpack_require__(840), - endOfQuarter: __webpack_require__(841), - endOfSecond: __webpack_require__(842), - endOfToday: __webpack_require__(843), - endOfTomorrow: __webpack_require__(844), - endOfWeek: __webpack_require__(837), - endOfYear: __webpack_require__(845), - endOfYesterday: __webpack_require__(846), - format: __webpack_require__(847), - getDate: __webpack_require__(852), - getDay: __webpack_require__(853), - getDayOfYear: __webpack_require__(848), - getDaysInMonth: __webpack_require__(798), - getDaysInYear: __webpack_require__(854), - getHours: __webpack_require__(856), - getISODay: __webpack_require__(857), - getISOWeek: __webpack_require__(850), - getISOWeeksInYear: __webpack_require__(858), - getISOYear: __webpack_require__(789), - getMilliseconds: __webpack_require__(859), - getMinutes: __webpack_require__(860), - getMonth: __webpack_require__(861), - getOverlappingDaysInRanges: __webpack_require__(862), - getQuarter: __webpack_require__(812), - getSeconds: __webpack_require__(863), - getTime: __webpack_require__(864), - getYear: __webpack_require__(865), - isAfter: __webpack_require__(775), - isBefore: __webpack_require__(866), - isDate: __webpack_require__(774), - isEqual: __webpack_require__(867), - isFirstDayOfMonth: __webpack_require__(868), - isFriday: __webpack_require__(869), - isFuture: __webpack_require__(870), - isLastDayOfMonth: __webpack_require__(871), - isLeapYear: __webpack_require__(855), - isMonday: __webpack_require__(872), - isPast: __webpack_require__(873), - isSameDay: __webpack_require__(874), - isSameHour: __webpack_require__(875), - isSameISOWeek: __webpack_require__(877), - isSameISOYear: __webpack_require__(879), - isSameMinute: __webpack_require__(880), - isSameMonth: __webpack_require__(882), - isSameQuarter: __webpack_require__(883), - isSameSecond: __webpack_require__(885), - isSameWeek: __webpack_require__(878), - isSameYear: __webpack_require__(887), - isSaturday: __webpack_require__(888), - isSunday: __webpack_require__(889), - isThisHour: __webpack_require__(890), - isThisISOWeek: __webpack_require__(891), - isThisISOYear: __webpack_require__(892), - isThisMinute: __webpack_require__(893), - isThisMonth: __webpack_require__(894), - isThisQuarter: __webpack_require__(895), - isThisSecond: __webpack_require__(896), - isThisWeek: __webpack_require__(897), - isThisYear: __webpack_require__(898), - isThursday: __webpack_require__(899), - isToday: __webpack_require__(900), - isTomorrow: __webpack_require__(901), - isTuesday: __webpack_require__(902), - isValid: __webpack_require__(851), - isWednesday: __webpack_require__(903), - isWeekend: __webpack_require__(904), - isWithinRange: __webpack_require__(905), - isYesterday: __webpack_require__(906), - lastDayOfISOWeek: __webpack_require__(907), - lastDayOfISOYear: __webpack_require__(909), - lastDayOfMonth: __webpack_require__(910), - lastDayOfQuarter: __webpack_require__(911), - lastDayOfWeek: __webpack_require__(908), - lastDayOfYear: __webpack_require__(912), - max: __webpack_require__(913), - min: __webpack_require__(914), - parse: __webpack_require__(772), - setDate: __webpack_require__(915), - setDay: __webpack_require__(916), - setDayOfYear: __webpack_require__(917), - setHours: __webpack_require__(918), - setISODay: __webpack_require__(919), - setISOWeek: __webpack_require__(920), - setISOYear: __webpack_require__(792), - setMilliseconds: __webpack_require__(921), - setMinutes: __webpack_require__(922), - setMonth: __webpack_require__(923), - setQuarter: __webpack_require__(924), - setSeconds: __webpack_require__(925), - setYear: __webpack_require__(926), - startOfDay: __webpack_require__(795), - startOfHour: __webpack_require__(876), - startOfISOWeek: __webpack_require__(790), - startOfISOYear: __webpack_require__(793), - startOfMinute: __webpack_require__(881), - startOfMonth: __webpack_require__(927), - startOfQuarter: __webpack_require__(884), - startOfSecond: __webpack_require__(886), - startOfToday: __webpack_require__(928), - startOfTomorrow: __webpack_require__(929), - startOfWeek: __webpack_require__(791), - startOfYear: __webpack_require__(849), - startOfYesterday: __webpack_require__(930), - subDays: __webpack_require__(931), - subHours: __webpack_require__(932), - subISOYears: __webpack_require__(819), - subMilliseconds: __webpack_require__(933), - subMinutes: __webpack_require__(934), - subMonths: __webpack_require__(935), - subQuarters: __webpack_require__(936), - subSeconds: __webpack_require__(937), - subWeeks: __webpack_require__(938), - subYears: __webpack_require__(939) +var parse = __webpack_require__(731) + +/** + * @category Day Helpers + * @summary Set the day of the year to the given date. + * + * @description + * Set the day of the year to the given date. + * + * @param {Date|String|Number} date - the date to be changed + * @param {Number} dayOfYear - the day of the year of the new date + * @returns {Date} the new date with the day of the year setted + * + * @example + * // Set the 2nd day of the year to 2 July 2014: + * var result = setDayOfYear(new Date(2014, 6, 2), 2) + * //=> Thu Jan 02 2014 00:00:00 + */ +function setDayOfYear (dirtyDate, dirtyDayOfYear) { + var date = parse(dirtyDate) + var dayOfYear = Number(dirtyDayOfYear) + date.setMonth(0) + date.setDate(dayOfYear) + return date } +module.exports = setDayOfYear + /***/ }), -/* 786 */ +/* 867 */ /***/ (function(module, exports, __webpack_require__) { -var addMilliseconds = __webpack_require__(787) - -var MILLISECONDS_IN_HOUR = 3600000 +var parse = __webpack_require__(731) /** * @category Hour Helpers - * @summary Add the specified number of hours to the given date. + * @summary Set the hours to the given date. * * @description - * Add the specified number of hours to the given date. + * Set the hours to the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of hours to be added - * @returns {Date} the new date with the hours added + * @param {Number} hours - the hours of the new date + * @returns {Date} the new date with the hours setted * * @example - * // Add 2 hours to 10 July 2014 23:00:00: - * var result = addHours(new Date(2014, 6, 10, 23, 0), 2) - * //=> Fri Jul 11 2014 01:00:00 + * // Set 4 hours to 1 September 2014 11:30:00: + * var result = setHours(new Date(2014, 8, 1, 11, 30), 4) + * //=> Mon Sep 01 2014 04:30:00 */ -function addHours (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_HOUR) +function setHours (dirtyDate, dirtyHours) { + var date = parse(dirtyDate) + var hours = Number(dirtyHours) + date.setHours(hours) + return date } -module.exports = addHours +module.exports = setHours /***/ }), -/* 787 */ +/* 868 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var parse = __webpack_require__(731) +var addDays = __webpack_require__(730) +var getISODay = __webpack_require__(805) /** - * @category Millisecond Helpers - * @summary Add the specified number of milliseconds to the given date. + * @category Weekday Helpers + * @summary Set the day of the ISO week to the given date. * * @description - * Add the specified number of milliseconds to the given date. + * Set the day of the ISO week to the given date. + * ISO week starts with Monday. + * 7 is the index of Sunday, 1 is the index of Monday etc. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of milliseconds to be added - * @returns {Date} the new date with the milliseconds added + * @param {Number} day - the day of the ISO week of the new date + * @returns {Date} the new date with the day of the ISO week setted * * @example - * // Add 750 milliseconds to 10 July 2014 12:45:30.000: - * var result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) - * //=> Thu Jul 10 2014 12:45:30.750 + * // Set Sunday to 1 September 2014: + * var result = setISODay(new Date(2014, 8, 1), 7) + * //=> Sun Sep 07 2014 00:00:00 */ -function addMilliseconds (dirtyDate, dirtyAmount) { - var timestamp = parse(dirtyDate).getTime() - var amount = Number(dirtyAmount) - return new Date(timestamp + amount) +function setISODay (dirtyDate, dirtyDay) { + var date = parse(dirtyDate) + var day = Number(dirtyDay) + var currentDay = getISODay(date) + var diff = day - currentDay + return addDays(date, diff) } -module.exports = addMilliseconds +module.exports = setISODay /***/ }), -/* 788 */ +/* 869 */ /***/ (function(module, exports, __webpack_require__) { -var getISOYear = __webpack_require__(789) -var setISOYear = __webpack_require__(792) +var parse = __webpack_require__(731) +var getISOWeek = __webpack_require__(798) /** - * @category ISO Week-Numbering Year Helpers - * @summary Add the specified number of ISO week-numbering years to the given date. + * @category ISO Week Helpers + * @summary Set the ISO week to the given date. * * @description - * Add the specified number of ISO week-numbering years to the given date. + * Set the ISO week to the given date, saving the weekday number. * * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of ISO week-numbering years to be added - * @returns {Date} the new date with the ISO week-numbering years added + * @param {Number} isoWeek - the ISO week of the new date + * @returns {Date} the new date with the ISO week setted * * @example - * // Add 5 ISO week-numbering years to 2 July 2010: - * var result = addISOYears(new Date(2010, 6, 2), 5) - * //=> Fri Jun 26 2015 00:00:00 + * // Set the 53rd ISO week to 7 August 2004: + * var result = setISOWeek(new Date(2004, 7, 7), 53) + * //=> Sat Jan 01 2005 00:00:00 */ -function addISOYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return setISOYear(dirtyDate, getISOYear(dirtyDate) + amount) +function setISOWeek (dirtyDate, dirtyISOWeek) { + var date = parse(dirtyDate) + var isoWeek = Number(dirtyISOWeek) + var diff = getISOWeek(date) - isoWeek + date.setDate(date.getDate() - diff * 7) + return date } -module.exports = addISOYears +module.exports = setISOWeek /***/ }), -/* 789 */ +/* 870 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) -var startOfISOWeek = __webpack_require__(790) +var parse = __webpack_require__(731) -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the ISO week-numbering year of the given date. +/** + * @category Millisecond Helpers + * @summary Set the milliseconds to the given date. * * @description - * Get the ISO week-numbering year of the given date, - * which always starts 3 days before the year's first Thursday. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * Set the milliseconds to the given date. * - * @param {Date|String|Number} date - the given date - * @returns {Number} the ISO week-numbering year + * @param {Date|String|Number} date - the date to be changed + * @param {Number} milliseconds - the milliseconds of the new date + * @returns {Date} the new date with the milliseconds setted * * @example - * // Which ISO-week numbering year is 2 January 2005? - * var result = getISOYear(new Date(2005, 0, 2)) - * //=> 2004 + * // Set 300 milliseconds to 1 September 2014 11:30:40.500: + * var result = setMilliseconds(new Date(2014, 8, 1, 11, 30, 40, 500), 300) + * //=> Mon Sep 01 2014 11:30:40.300 */ -function getISOYear (dirtyDate) { +function setMilliseconds (dirtyDate, dirtyMilliseconds) { var date = parse(dirtyDate) - var year = date.getFullYear() - - var fourthOfJanuaryOfNextYear = new Date(0) - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) - var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear) - - var fourthOfJanuaryOfThisYear = new Date(0) - fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4) - fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0) - var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear) - - if (date.getTime() >= startOfNextYear.getTime()) { - return year + 1 - } else if (date.getTime() >= startOfThisYear.getTime()) { - return year - } else { - return year - 1 - } + var milliseconds = Number(dirtyMilliseconds) + date.setMilliseconds(milliseconds) + return date } -module.exports = getISOYear +module.exports = setMilliseconds /***/ }), -/* 790 */ +/* 871 */ /***/ (function(module, exports, __webpack_require__) { -var startOfWeek = __webpack_require__(791) +var parse = __webpack_require__(731) /** - * @category ISO Week Helpers - * @summary Return the start of an ISO week for the given date. + * @category Minute Helpers + * @summary Set the minutes to the given date. * * @description - * Return the start of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * Set the minutes to the given date. * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an ISO week + * @param {Date|String|Number} date - the date to be changed + * @param {Number} minutes - the minutes of the new date + * @returns {Date} the new date with the minutes setted * * @example - * // The start of an ISO week for 2 September 2014 11:55:00: - * var result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Mon Sep 01 2014 00:00:00 + * // Set 45 minutes to 1 September 2014 11:30:40: + * var result = setMinutes(new Date(2014, 8, 1, 11, 30, 40), 45) + * //=> Mon Sep 01 2014 11:45:40 */ -function startOfISOWeek (dirtyDate) { - return startOfWeek(dirtyDate, {weekStartsOn: 1}) +function setMinutes (dirtyDate, dirtyMinutes) { + var date = parse(dirtyDate) + var minutes = Number(dirtyMinutes) + date.setMinutes(minutes) + return date } -module.exports = startOfISOWeek +module.exports = setMinutes /***/ }), -/* 791 */ +/* 872 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var parse = __webpack_require__(731) +var getDaysInMonth = __webpack_require__(746) /** - * @category Week Helpers - * @summary Return the start of a week for the given date. + * @category Month Helpers + * @summary Set the month to the given date. * * @description - * Return the start of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the start of a week + * Set the month to the given date. * - * @example - * // The start of a week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Aug 31 2014 00:00:00 + * @param {Date|String|Number} date - the date to be changed + * @param {Number} month - the month of the new date + * @returns {Date} the new date with the month setted * * @example - * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00: - * var result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Mon Sep 01 2014 00:00:00 + * // Set February to 1 September 2014: + * var result = setMonth(new Date(2014, 8, 1), 1) + * //=> Sat Feb 01 2014 00:00:00 */ -function startOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - +function setMonth (dirtyDate, dirtyMonth) { var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn + var month = Number(dirtyMonth) + var year = date.getFullYear() + var day = date.getDate() - date.setDate(date.getDate() - diff) - date.setHours(0, 0, 0, 0) + var dateWithDesiredMonth = new Date(0) + dateWithDesiredMonth.setFullYear(year, month, 15) + dateWithDesiredMonth.setHours(0, 0, 0, 0) + var daysInMonth = getDaysInMonth(dateWithDesiredMonth) + // Set the last day of the new month + // if the original date was the last day of the longer month + date.setMonth(month, Math.min(day, daysInMonth)) return date } -module.exports = startOfWeek +module.exports = setMonth /***/ }), -/* 792 */ +/* 873 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) -var startOfISOYear = __webpack_require__(793) -var differenceInCalendarDays = __webpack_require__(794) +var parse = __webpack_require__(731) +var setMonth = __webpack_require__(872) /** - * @category ISO Week-Numbering Year Helpers - * @summary Set the ISO week-numbering year to the given date. + * @category Quarter Helpers + * @summary Set the year quarter to the given date. * * @description - * Set the ISO week-numbering year to the given date, - * saving the week number and the weekday number. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * Set the year quarter to the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} isoYear - the ISO week-numbering year of the new date - * @returns {Date} the new date with the ISO week-numbering year setted + * @param {Number} quarter - the quarter of the new date + * @returns {Date} the new date with the quarter setted * * @example - * // Set ISO week-numbering year 2007 to 29 December 2008: - * var result = setISOYear(new Date(2008, 11, 29), 2007) - * //=> Mon Jan 01 2007 00:00:00 + * // Set the 2nd quarter to 2 July 2014: + * var result = setQuarter(new Date(2014, 6, 2), 2) + * //=> Wed Apr 02 2014 00:00:00 */ -function setISOYear (dirtyDate, dirtyISOYear) { +function setQuarter (dirtyDate, dirtyQuarter) { var date = parse(dirtyDate) - var isoYear = Number(dirtyISOYear) - var diff = differenceInCalendarDays(date, startOfISOYear(date)) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(isoYear, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - date = startOfISOYear(fourthOfJanuary) - date.setDate(date.getDate() + diff) - return date + var quarter = Number(dirtyQuarter) + var oldQuarter = Math.floor(date.getMonth() / 3) + 1 + var diff = quarter - oldQuarter + return setMonth(date, date.getMonth() + diff * 3) } -module.exports = setISOYear +module.exports = setQuarter /***/ }), -/* 793 */ +/* 874 */ /***/ (function(module, exports, __webpack_require__) { -var getISOYear = __webpack_require__(789) -var startOfISOWeek = __webpack_require__(790) +var parse = __webpack_require__(731) /** - * @category ISO Week-Numbering Year Helpers - * @summary Return the start of an ISO week-numbering year for the given date. + * @category Second Helpers + * @summary Set the seconds to the given date. * * @description - * Return the start of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * Set the seconds to the given date. * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an ISO year + * @param {Date|String|Number} date - the date to be changed + * @param {Number} seconds - the seconds of the new date + * @returns {Date} the new date with the seconds setted * * @example - * // The start of an ISO week-numbering year for 2 July 2005: - * var result = startOfISOYear(new Date(2005, 6, 2)) - * //=> Mon Jan 03 2005 00:00:00 + * // Set 45 seconds to 1 September 2014 11:30:40: + * var result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45) + * //=> Mon Sep 01 2014 11:30:45 */ -function startOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(year, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuary) +function setSeconds (dirtyDate, dirtySeconds) { + var date = parse(dirtyDate) + var seconds = Number(dirtySeconds) + date.setSeconds(seconds) return date } -module.exports = startOfISOYear +module.exports = setSeconds /***/ }), -/* 794 */ +/* 875 */ /***/ (function(module, exports, __webpack_require__) { -var startOfDay = __webpack_require__(795) - -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_DAY = 86400000 +var parse = __webpack_require__(731) /** - * @category Day Helpers - * @summary Get the number of calendar days between the given dates. + * @category Year Helpers + * @summary Set the year to the given date. * * @description - * Get the number of calendar days between the given dates. + * Set the year to the given date. * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar days + * @param {Date|String|Number} date - the date to be changed + * @param {Number} year - the year of the new date + * @returns {Date} the new date with the year setted * * @example - * // How many calendar days are between - * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInCalendarDays( - * new Date(2012, 6, 2, 0, 0), - * new Date(2011, 6, 2, 23, 0) - * ) - * //=> 366 + * // Set year 2013 to 1 September 2014: + * var result = setYear(new Date(2014, 8, 1), 2013) + * //=> Sun Sep 01 2013 00:00:00 */ -function differenceInCalendarDays (dirtyDateLeft, dirtyDateRight) { - var startOfDayLeft = startOfDay(dirtyDateLeft) - var startOfDayRight = startOfDay(dirtyDateRight) - - var timestampLeft = startOfDayLeft.getTime() - - startOfDayLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfDayRight.getTime() - - startOfDayRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - - // Round the number of days to the nearest integer - // because the number of milliseconds in a day is not constant - // (e.g. it's different in the day of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY) +function setYear (dirtyDate, dirtyYear) { + var date = parse(dirtyDate) + var year = Number(dirtyYear) + date.setFullYear(year) + return date } -module.exports = differenceInCalendarDays +module.exports = setYear /***/ }), -/* 795 */ +/* 876 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var parse = __webpack_require__(731) /** - * @category Day Helpers - * @summary Return the start of a day for the given date. + * @category Month Helpers + * @summary Return the start of a month for the given date. * * @description - * Return the start of a day for the given date. + * Return the start of a month for the given date. * The result will be in the local timezone. * * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a day + * @returns {Date} the start of a month * * @example - * // The start of a day for 2 September 2014 11:55:00: - * var result = startOfDay(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 02 2014 00:00:00 + * // The start of a month for 2 September 2014 11:55:00: + * var result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0)) + * //=> Mon Sep 01 2014 00:00:00 */ -function startOfDay (dirtyDate) { +function startOfMonth (dirtyDate) { var date = parse(dirtyDate) + date.setDate(1) date.setHours(0, 0, 0, 0) return date } -module.exports = startOfDay +module.exports = startOfMonth /***/ }), -/* 796 */ +/* 877 */ /***/ (function(module, exports, __webpack_require__) { -var addMilliseconds = __webpack_require__(787) - -var MILLISECONDS_IN_MINUTE = 60000 +var startOfDay = __webpack_require__(743) /** - * @category Minute Helpers - * @summary Add the specified number of minutes to the given date. + * @category Day Helpers + * @summary Return the start of today. * * @description - * Add the specified number of minutes to the given date. + * Return the start of today. * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of minutes to be added - * @returns {Date} the new date with the minutes added + * @returns {Date} the start of today * * @example - * // Add 30 minutes to 10 July 2014 12:00:00: - * var result = addMinutes(new Date(2014, 6, 10, 12, 0), 30) - * //=> Thu Jul 10 2014 12:30:00 + * // If today is 6 October 2014: + * var result = startOfToday() + * //=> Mon Oct 6 2014 00:00:00 */ -function addMinutes (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * MILLISECONDS_IN_MINUTE) +function startOfToday () { + return startOfDay(new Date()) } -module.exports = addMinutes +module.exports = startOfToday /***/ }), -/* 797 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) -var getDaysInMonth = __webpack_require__(798) +/* 878 */ +/***/ (function(module, exports) { /** - * @category Month Helpers - * @summary Add the specified number of months to the given date. + * @category Day Helpers + * @summary Return the start of tomorrow. * * @description - * Add the specified number of months to the given date. + * Return the start of tomorrow. * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of months to be added - * @returns {Date} the new date with the months added + * @returns {Date} the start of tomorrow * * @example - * // Add 5 months to 1 September 2014: - * var result = addMonths(new Date(2014, 8, 1), 5) - * //=> Sun Feb 01 2015 00:00:00 + * // If today is 6 October 2014: + * var result = startOfTomorrow() + * //=> Tue Oct 7 2014 00:00:00 */ -function addMonths (dirtyDate, dirtyAmount) { - var date = parse(dirtyDate) - var amount = Number(dirtyAmount) - var desiredMonth = date.getMonth() + amount - var dateWithDesiredMonth = new Date(0) - dateWithDesiredMonth.setFullYear(date.getFullYear(), desiredMonth, 1) - dateWithDesiredMonth.setHours(0, 0, 0, 0) - var daysInMonth = getDaysInMonth(dateWithDesiredMonth) - // Set the last day of the new month - // if the original date was the last day of the longer month - date.setMonth(desiredMonth, Math.min(daysInMonth, date.getDate())) +function startOfTomorrow () { + var now = new Date() + var year = now.getFullYear() + var month = now.getMonth() + var day = now.getDate() + + var date = new Date(0) + date.setFullYear(year, month, day + 1) + date.setHours(0, 0, 0, 0) return date } -module.exports = addMonths +module.exports = startOfTomorrow /***/ }), -/* 798 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) +/* 879 */ +/***/ (function(module, exports) { /** - * @category Month Helpers - * @summary Get the number of days in a month of the given date. + * @category Day Helpers + * @summary Return the start of yesterday. * * @description - * Get the number of days in a month of the given date. + * Return the start of yesterday. * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of days in a month + * @returns {Date} the start of yesterday * * @example - * // How many days are in February 2000? - * var result = getDaysInMonth(new Date(2000, 1)) - * //=> 29 + * // If today is 6 October 2014: + * var result = startOfYesterday() + * //=> Sun Oct 5 2014 00:00:00 */ -function getDaysInMonth (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - var monthIndex = date.getMonth() - var lastDayOfMonth = new Date(0) - lastDayOfMonth.setFullYear(year, monthIndex + 1, 0) - lastDayOfMonth.setHours(0, 0, 0, 0) - return lastDayOfMonth.getDate() +function startOfYesterday () { + var now = new Date() + var year = now.getFullYear() + var month = now.getMonth() + var day = now.getDate() + + var date = new Date(0) + date.setFullYear(year, month, day - 1) + date.setHours(0, 0, 0, 0) + return date } -module.exports = getDaysInMonth +module.exports = startOfYesterday /***/ }), -/* 799 */ +/* 880 */ /***/ (function(module, exports, __webpack_require__) { -var addMonths = __webpack_require__(797) +var addDays = __webpack_require__(730) /** - * @category Quarter Helpers - * @summary Add the specified number of year quarters to the given date. + * @category Day Helpers + * @summary Subtract the specified number of days from the given date. * * @description - * Add the specified number of year quarters to the given date. + * Subtract the specified number of days from the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of quarters to be added - * @returns {Date} the new date with the quarters added + * @param {Number} amount - the amount of days to be subtracted + * @returns {Date} the new date with the days subtracted * * @example - * // Add 1 quarter to 1 September 2014: - * var result = addQuarters(new Date(2014, 8, 1), 1) - * //=> Mon Dec 01 2014 00:00:00 + * // Subtract 10 days from 1 September 2014: + * var result = subDays(new Date(2014, 8, 1), 10) + * //=> Fri Aug 22 2014 00:00:00 */ -function addQuarters (dirtyDate, dirtyAmount) { +function subDays (dirtyDate, dirtyAmount) { var amount = Number(dirtyAmount) - var months = amount * 3 - return addMonths(dirtyDate, months) + return addDays(dirtyDate, -amount) } -module.exports = addQuarters +module.exports = subDays /***/ }), -/* 800 */ +/* 881 */ /***/ (function(module, exports, __webpack_require__) { -var addMilliseconds = __webpack_require__(787) +var addHours = __webpack_require__(734) /** - * @category Second Helpers - * @summary Add the specified number of seconds to the given date. + * @category Hour Helpers + * @summary Subtract the specified number of hours from the given date. * * @description - * Add the specified number of seconds to the given date. + * Subtract the specified number of hours from the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of seconds to be added - * @returns {Date} the new date with the seconds added + * @param {Number} amount - the amount of hours to be subtracted + * @returns {Date} the new date with the hours subtracted * * @example - * // Add 30 seconds to 10 July 2014 12:45:00: - * var result = addSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) - * //=> Thu Jul 10 2014 12:45:30 + * // Subtract 2 hours from 11 July 2014 01:00:00: + * var result = subHours(new Date(2014, 6, 11, 1, 0), 2) + * //=> Thu Jul 10 2014 23:00:00 */ -function addSeconds (dirtyDate, dirtyAmount) { +function subHours (dirtyDate, dirtyAmount) { var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, amount * 1000) + return addHours(dirtyDate, -amount) } -module.exports = addSeconds +module.exports = subHours /***/ }), -/* 801 */ +/* 882 */ /***/ (function(module, exports, __webpack_require__) { -var addDays = __webpack_require__(771) +var addMilliseconds = __webpack_require__(735) /** - * @category Week Helpers - * @summary Add the specified number of weeks to the given date. + * @category Millisecond Helpers + * @summary Subtract the specified number of milliseconds from the given date. * * @description - * Add the specified number of week to the given date. + * Subtract the specified number of milliseconds from the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of weeks to be added - * @returns {Date} the new date with the weeks added + * @param {Number} amount - the amount of milliseconds to be subtracted + * @returns {Date} the new date with the milliseconds subtracted * * @example - * // Add 4 weeks to 1 September 2014: - * var result = addWeeks(new Date(2014, 8, 1), 4) - * //=> Mon Sep 29 2014 00:00:00 + * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000: + * var result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) + * //=> Thu Jul 10 2014 12:45:29.250 */ -function addWeeks (dirtyDate, dirtyAmount) { +function subMilliseconds (dirtyDate, dirtyAmount) { var amount = Number(dirtyAmount) - var days = amount * 7 - return addDays(dirtyDate, days) + return addMilliseconds(dirtyDate, -amount) } -module.exports = addWeeks +module.exports = subMilliseconds /***/ }), -/* 802 */ +/* 883 */ /***/ (function(module, exports, __webpack_require__) { -var addMonths = __webpack_require__(797) +var addMinutes = __webpack_require__(744) /** - * @category Year Helpers - * @summary Add the specified number of years to the given date. + * @category Minute Helpers + * @summary Subtract the specified number of minutes from the given date. * * @description - * Add the specified number of years to the given date. + * Subtract the specified number of minutes from the given date. * * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of years to be added - * @returns {Date} the new date with the years added + * @param {Number} amount - the amount of minutes to be subtracted + * @returns {Date} the new date with the mintues subtracted * * @example - * // Add 5 years to 1 September 2014: - * var result = addYears(new Date(2014, 8, 1), 5) - * //=> Sun Sep 01 2019 00:00:00 + * // Subtract 30 minutes from 10 July 2014 12:00:00: + * var result = subMinutes(new Date(2014, 6, 10, 12, 0), 30) + * //=> Thu Jul 10 2014 11:30:00 */ -function addYears (dirtyDate, dirtyAmount) { +function subMinutes (dirtyDate, dirtyAmount) { var amount = Number(dirtyAmount) - return addMonths(dirtyDate, amount * 12) + return addMinutes(dirtyDate, -amount) } -module.exports = addYears +module.exports = subMinutes /***/ }), -/* 803 */ +/* 884 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var addMonths = __webpack_require__(745) /** - * @category Range Helpers - * @summary Is the given date range overlapping with another date range? + * @category Month Helpers + * @summary Subtract the specified number of months from the given date. * * @description - * Is the given date range overlapping with another date range? - * - * @param {Date|String|Number} initialRangeStartDate - the start of the initial range - * @param {Date|String|Number} initialRangeEndDate - the end of the initial range - * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with - * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with - * @returns {Boolean} whether the date ranges are overlapping - * @throws {Error} startDate of a date range cannot be after its endDate - * - * @example - * // For overlapping date ranges: - * areRangesOverlapping( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) - * ) - * //=> true + * Subtract the specified number of months from the given date. * - * @example - * // For non-overlapping date ranges: - * areRangesOverlapping( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) - * ) - * //=> false - */ -function areRangesOverlapping (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() - - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range') - } - - return initialStartTime < comparedEndTime && comparedStartTime < initialEndTime + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of months to be subtracted + * @returns {Date} the new date with the months subtracted + * + * @example + * // Subtract 5 months from 1 February 2015: + * var result = subMonths(new Date(2015, 1, 1), 5) + * //=> Mon Sep 01 2014 00:00:00 + */ +function subMonths (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addMonths(dirtyDate, -amount) } -module.exports = areRangesOverlapping +module.exports = subMonths /***/ }), -/* 804 */ +/* 885 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var addQuarters = __webpack_require__(747) /** - * @category Common Helpers - * @summary Return an index of the closest date from the array comparing to the given date. + * @category Quarter Helpers + * @summary Subtract the specified number of year quarters from the given date. * * @description - * Return an index of the closest date from the array comparing to the given date. + * Subtract the specified number of year quarters from the given date. * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date[]|String[]|Number[]} datesArray - the array to search - * @returns {Number} an index of the date closest to the given date - * @throws {TypeError} the second argument must be an instance of Array + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of quarters to be subtracted + * @returns {Date} the new date with the quarters subtracted * * @example - * // Which date is closer to 6 September 2015? - * var dateToCompare = new Date(2015, 8, 6) - * var datesArray = [ - * new Date(2015, 0, 1), - * new Date(2016, 0, 1), - * new Date(2017, 0, 1) - * ] - * var result = closestIndexTo(dateToCompare, datesArray) - * //=> 1 + * // Subtract 3 quarters from 1 September 2014: + * var result = subQuarters(new Date(2014, 8, 1), 3) + * //=> Sun Dec 01 2013 00:00:00 */ -function closestIndexTo (dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') - } - - var dateToCompare = parse(dirtyDateToCompare) - var timeToCompare = dateToCompare.getTime() - - var result - var minDistance - - dirtyDatesArray.forEach(function (dirtyDate, index) { - var currentDate = parse(dirtyDate) - var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { - result = index - minDistance = distance - } - }) - - return result +function subQuarters (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addQuarters(dirtyDate, -amount) } -module.exports = closestIndexTo +module.exports = subQuarters /***/ }), -/* 805 */ +/* 886 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var addSeconds = __webpack_require__(748) /** - * @category Common Helpers - * @summary Return a date from the array closest to the given date. + * @category Second Helpers + * @summary Subtract the specified number of seconds from the given date. * * @description - * Return a date from the array closest to the given date. + * Subtract the specified number of seconds from the given date. * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date[]|String[]|Number[]} datesArray - the array to search - * @returns {Date} the date from the array closest to the given date - * @throws {TypeError} the second argument must be an instance of Array + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of seconds to be subtracted + * @returns {Date} the new date with the seconds subtracted * * @example - * // Which date is closer to 6 September 2015: 1 January 2000 or 1 January 2030? - * var dateToCompare = new Date(2015, 8, 6) - * var result = closestTo(dateToCompare, [ - * new Date(2000, 0, 1), - * new Date(2030, 0, 1) - * ]) - * //=> Tue Jan 01 2030 00:00:00 + * // Subtract 30 seconds from 10 July 2014 12:45:00: + * var result = subSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) + * //=> Thu Jul 10 2014 12:44:30 */ -function closestTo (dirtyDateToCompare, dirtyDatesArray) { - if (!(dirtyDatesArray instanceof Array)) { - throw new TypeError(toString.call(dirtyDatesArray) + ' is not an instance of Array') - } - - var dateToCompare = parse(dirtyDateToCompare) - var timeToCompare = dateToCompare.getTime() - - var result - var minDistance - - dirtyDatesArray.forEach(function (dirtyDate) { - var currentDate = parse(dirtyDate) - var distance = Math.abs(timeToCompare - currentDate.getTime()) - if (result === undefined || distance < minDistance) { - result = currentDate - minDistance = distance - } - }) - - return result +function subSeconds (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addSeconds(dirtyDate, -amount) } -module.exports = closestTo +module.exports = subSeconds /***/ }), -/* 806 */ +/* 887 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var addWeeks = __webpack_require__(749) /** - * @category Common Helpers - * @summary Compare the two dates and return -1, 0 or 1. + * @category Week Helpers + * @summary Subtract the specified number of weeks from the given date. * * @description - * Compare the two dates and return 1 if the first date is after the second, - * -1 if the first date is before the second or 0 if dates are equal. - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Number} the result of the comparison + * Subtract the specified number of weeks from the given date. * - * @example - * // Compare 11 February 1987 and 10 July 1989: - * var result = compareAsc( - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ) - * //=> -1 + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of weeks to be subtracted + * @returns {Date} the new date with the weeks subtracted * * @example - * // Sort the array of dates: - * var result = [ - * new Date(1995, 6, 2), - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ].sort(compareAsc) - * //=> [ - * // Wed Feb 11 1987 00:00:00, - * // Mon Jul 10 1989 00:00:00, - * // Sun Jul 02 1995 00:00:00 - * // ] + * // Subtract 4 weeks from 1 September 2014: + * var result = subWeeks(new Date(2014, 8, 1), 4) + * //=> Mon Aug 04 2014 00:00:00 */ -function compareAsc (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var timeLeft = dateLeft.getTime() - var dateRight = parse(dirtyDateRight) - var timeRight = dateRight.getTime() - - if (timeLeft < timeRight) { - return -1 - } else if (timeLeft > timeRight) { - return 1 - } else { - return 0 - } +function subWeeks (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addWeeks(dirtyDate, -amount) } -module.exports = compareAsc +module.exports = subWeeks /***/ }), -/* 807 */ +/* 888 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var addYears = __webpack_require__(750) /** - * @category Common Helpers - * @summary Compare the two dates reverse chronologically and return -1, 0 or 1. + * @category Year Helpers + * @summary Subtract the specified number of years from the given date. * * @description - * Compare the two dates and return -1 if the first date is after the second, - * 1 if the first date is before the second or 0 if dates are equal. - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Number} the result of the comparison + * Subtract the specified number of years from the given date. * - * @example - * // Compare 11 February 1987 and 10 July 1989 reverse chronologically: - * var result = compareDesc( - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ) - * //=> 1 + * @param {Date|String|Number} date - the date to be changed + * @param {Number} amount - the amount of years to be subtracted + * @returns {Date} the new date with the years subtracted * * @example - * // Sort the array of dates in reverse chronological order: - * var result = [ - * new Date(1995, 6, 2), - * new Date(1987, 1, 11), - * new Date(1989, 6, 10) - * ].sort(compareDesc) - * //=> [ - * // Sun Jul 02 1995 00:00:00, - * // Mon Jul 10 1989 00:00:00, - * // Wed Feb 11 1987 00:00:00 - * // ] + * // Subtract 5 years from 1 September 2014: + * var result = subYears(new Date(2014, 8, 1), 5) + * //=> Tue Sep 01 2009 00:00:00 */ -function compareDesc (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var timeLeft = dateLeft.getTime() - var dateRight = parse(dirtyDateRight) - var timeRight = dateRight.getTime() +function subYears (dirtyDate, dirtyAmount) { + var amount = Number(dirtyAmount) + return addYears(dirtyDate, -amount) +} + +module.exports = subYears + + +/***/ }), +/* 889 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KonnectorJobError", function() { return KonnectorJobError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getErrorLocale", function() { return getErrorLocale; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchSupportMail", function() { return fetchSupportMail; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getErrorLocaleBound", function() { return getErrorLocaleBound; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAccountType", function() { return getAccountType; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasNewVersionAvailable", function() { return hasNewVersionAvailable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "needsFolder", function() { return needsFolder; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFolderPath", function() { return buildFolderPath; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFolderPermission", function() { return buildFolderPermission; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLauncher", function() { return getLauncher; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRunnable", function() { return isRunnable; }); +/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(58); +/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59); +/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60); +/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(246); +/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); +/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(245); +/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(247); +/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var _babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(333); +/* harmony import */ var _babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8__); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(56); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(162); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_10__); +/* harmony import */ var lodash_has__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(344); +/* harmony import */ var lodash_has__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash_has__WEBPACK_IMPORTED_MODULE_11__); +/* harmony import */ var lodash_trim__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(890); +/* harmony import */ var lodash_trim__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(lodash_trim__WEBPACK_IMPORTED_MODULE_12__); +/* harmony import */ var _locales__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(892); +/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(39); +/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(cozy_client__WEBPACK_IMPORTED_MODULE_14__); +/* harmony import */ var _accounts__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(897); - if (timeLeft > timeRight) { - return -1 - } else if (timeLeft < timeRight) { - return 1 - } else { - return 0 - } -} -module.exports = compareDesc -/***/ }), -/* 808 */ -/***/ (function(module, exports, __webpack_require__) { -var startOfISOWeek = __webpack_require__(790) -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_WEEK = 604800000 -/** - * @category ISO Week Helpers - * @summary Get the number of calendar ISO weeks between the given dates. - * - * @description - * Get the number of calendar ISO weeks between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar ISO weeks - * - * @example - * // How many calendar ISO weeks are between 6 July 2014 and 21 July 2014? - * var result = differenceInCalendarISOWeeks( - * new Date(2014, 6, 21), - * new Date(2014, 6, 6) - * ) - * //=> 3 - */ -function differenceInCalendarISOWeeks (dirtyDateLeft, dirtyDateRight) { - var startOfISOWeekLeft = startOfISOWeek(dirtyDateLeft) - var startOfISOWeekRight = startOfISOWeek(dirtyDateRight) - var timestampLeft = startOfISOWeekLeft.getTime() - - startOfISOWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfISOWeekRight.getTime() - - startOfISOWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) -} -module.exports = differenceInCalendarISOWeeks +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + +function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, result); }; } + +function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } -/***/ }), -/* 809 */ -/***/ (function(module, exports, __webpack_require__) { -var getISOYear = __webpack_require__(789) -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of calendar ISO week-numbering years between the given dates. - * - * @description - * Get the number of calendar ISO week-numbering years between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar ISO week-numbering years - * - * @example - * // How many calendar ISO week-numbering years are 1 January 2010 and 1 January 2012? - * var result = differenceInCalendarISOYears( - * new Date(2012, 0, 1), - * new Date(2010, 0, 1) - * ) - * //=> 2 - */ -function differenceInCalendarISOYears (dirtyDateLeft, dirtyDateRight) { - return getISOYear(dirtyDateLeft) - getISOYear(dirtyDateRight) -} -module.exports = differenceInCalendarISOYears -/***/ }), -/* 810 */ -/***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var DEFAULT_SUPPORT_MAIL = 'claude@cozycloud.cc'; // Default name for base directory + +var DEFAULT_LOCALIZED_BASE_DIR = 'Administrative'; // Type of errors returned by konnector +var CHALLENGE_ASKED = 'CHALLENGE_ASKED'; +var DISK_QUOTA_EXCEEDED = 'DISK_QUOTA_EXCEEDED'; +var LOGIN_FAILED = 'LOGIN_FAILED'; +var MAINTENANCE = 'MAINTENANCE'; +var NOT_EXISTING_DIRECTORY = 'NOT_EXISTING_DIRECTORY'; +var TERMS_VERSION_MISMATCH = 'TERMS_VERSION_MISMATCH'; +var UNKNOWN_ERROR = 'UNKNOWN_ERROR'; +var USER_ACTION_NEEDED = 'USER_ACTION_NEEDED'; +var VENDOR_DOWN = 'VENDOR_DOWN'; +var ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED = 'ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED'; +var KNOWN_ERRORS = [CHALLENGE_ASKED, DISK_QUOTA_EXCEEDED, LOGIN_FAILED, MAINTENANCE, NOT_EXISTING_DIRECTORY, TERMS_VERSION_MISMATCH, USER_ACTION_NEEDED, VENDOR_DOWN, ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED]; +var USER_ERRORS = [CHALLENGE_ASKED, DISK_QUOTA_EXCEEDED, LOGIN_FAILED, NOT_EXISTING_DIRECTORY, USER_ACTION_NEEDED]; +var sanitizeAccountIdentifierRx = /\//g; /** - * @category Month Helpers - * @summary Get the number of calendar months between the given dates. - * - * @description - * Get the number of calendar months between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar months - * - * @example - * // How many calendar months are between 31 January 2014 and 1 September 2014? - * var result = differenceInCalendarMonths( - * new Date(2014, 8, 1), - * new Date(2014, 0, 31) - * ) - * //=> 8 + * Custom error to handle errors returnes by konnector. + * Konnectors are returning error codes in error messages. + * Those codes are known and we need to associate logic to them. + * For now, this logic only concerns login error. + * @extends Error */ -function differenceInCalendarMonths (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() - var monthDiff = dateLeft.getMonth() - dateRight.getMonth() +var KonnectorJobError = /*#__PURE__*/function (_Error) { + _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(KonnectorJobError, _Error); - return yearDiff * 12 + monthDiff -} + var _super = _createSuper(KonnectorJobError); -module.exports = differenceInCalendarMonths + function KonnectorJobError() { + var _this; + _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, KonnectorJobError); -/***/ }), -/* 811 */ -/***/ (function(module, exports, __webpack_require__) { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + _this = _super.call.apply(_super, [this].concat(args)); + + if (typeof Error.captureStackTrace === 'function') { + Error.captureStackTrace(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), KonnectorJobError); + } + /** + * Konnector job are throwing error with a message containing the error + * code. + * Example: LOGIN_FAILED, USER_ACTION_NEEDED, + * USER_ACTION_NEEDED.PERMISSIONS_CHANGED + */ + + + _this.code = _this.message; + /** + * Some error codes are composed with several segments, and can be parsed. + * Example : USER_ACTION_NEEDED.PERMISSIONS_CHANGED + * The error type correspond to the first segment of the error. + */ + + var type = _this.code.split('.')[0]; + + _this.type = KNOWN_ERRORS.includes(type) ? type : UNKNOWN_ERROR; + return _this; + } + /** + * Test if the konnector error is a login error + * @return {Boolean} + */ + + + _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(KonnectorJobError, [{ + key: "isLoginError", + value: function isLoginError() { + return this.type === LOGIN_FAILED; + } + /** + * Test if the konnector error is a user error + * @return {Boolean} + */ + + }, { + key: "isUserError", + value: function isUserError() { + return USER_ERRORS.includes(this.type); + } + /** + * Test if the konnector error is due to a term version mismatch. Term version + * mismatch errors indicates that the konnector must be updated manually + * @return {Boolean} + */ -var getQuarter = __webpack_require__(812) -var parse = __webpack_require__(772) + }, { + key: "isTermsVersionMismatchError", + value: function isTermsVersionMismatchError() { + return this.type === TERMS_VERSION_MISMATCH; + } + }, { + key: "isSolvableViaReconnect", + value: function isSolvableViaReconnect() { + return this.type === LOGIN_FAILED || this.type === CHALLENGE_ASKED || // We did not put the decoupled case (2fa code via app) + // since we do not currently *need* to display a 2fa modal + // for the flow to work. There will be no modal displayed + // but the user will be able to do the 2fa on its mobile phone. + this.code === 'USER_ACTION_NEEDED' || this.code === 'USER_ACTION_NEEDED.SCA_REQUIRED' || this.code === 'USER_ACTION_NEEDED.WEBAUTH_REQUIRED' || this.code === 'USER_ACTION_NEEDED.OAUTH_OUTDATED' || this.code === 'USER_ACTION_NEEDED.CHANGE_PASSWORD' || this.code === 'VENDOR_DOWN' || this.code === 'VENDOR_DOWN.BANK_DOWN' || this.code === 'VENDOR_DOWN.LINXO_DOWN'; + } + }]); + return KonnectorJobError; +}( /*#__PURE__*/_babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8___default()(Error)); /** - * @category Quarter Helpers - * @summary Get the number of calendar quarters between the given dates. - * - * @description - * Get the number of calendar quarters between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar quarters - * - * @example - * // How many calendar quarters are between 31 December 2013 and 2 July 2014? - * var result = differenceInCalendarQuarters( - * new Date(2014, 6, 2), - * new Date(2013, 11, 31) - * ) - * //=> 3 + * Returns the locale of an error key (description or title or else). + * This method first try to get the full error code + * (for example LOGIN_FAILED.LOGIN_FAILED.NEEDS_SECRET), then fallback on the + * error type, which is the error code first segment (in our example, it's + * LOGIN_FAILED). It none of these two tries returns anything, it means + * that the error is unknown or not yet handled by harvest, so we fallback + * to the default error messages. + * @param {Error} error The error + * @param {Object} konnector konnector related to this error + * @param {Func} t Translation function, expected to be Polyglot.t() + * @param {Func} suffixKey What part of the error message should be returned, title or description + * @return {String} The error locale */ -function differenceInCalendarQuarters (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear() - var quarterDiff = getQuarter(dateLeft) - getQuarter(dateRight) +var getErrorLocale = function getErrorLocale(error, konnector, t, suffixKey) { + var supportMail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : DEFAULT_SUPPORT_MAIL; + var defaultKey = 'error.job.UNKNOWN_ERROR'; + var translationVariables = { + name: konnector.name || '', + link: konnector.vendor_link || '', + supportMail: supportMail + }; // not handled errors + + if (!(error instanceof KonnectorJobError)) { + var locale = t("".concat(defaultKey, ".").concat(suffixKey), translationVariables); // since it's not handled errors, we add more details if available - return yearDiff * 4 + quarterDiff -} + if (suffixKey === 'description') { + return error.message ? "".concat(locale, " (").concat(error.message, ")") : locale; + } -module.exports = differenceInCalendarQuarters + return t("".concat(defaultKey, ".").concat(suffixKey), translationVariables); + } + return t("error.job.".concat(error.code, ".").concat(suffixKey), _objectSpread(_objectSpread({}, translationVariables), {}, { + _: t("error.job.".concat(error.type, ".").concat(suffixKey), _objectSpread(_objectSpread({}, translationVariables), {}, { + _: t("".concat(defaultKey, ".").concat(suffixKey), translationVariables) + })) + })); +}; +var fetchSupportMail = /*#__PURE__*/function () { + var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee(client) { + var result; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return client.fetchQueryAndGetFromState({ + definition: Object(cozy_client__WEBPACK_IMPORTED_MODULE_14__["Q"])('io.cozy.settings').getById('context'), + options: { + as: 'contextSupportMail', + fetchPolicy: cozy_client__WEBPACK_IMPORTED_MODULE_14__["fetchPolicies"].olderThan(60 * 60 * 1000) + } + }); -/***/ }), -/* 812 */ -/***/ (function(module, exports, __webpack_require__) { + case 2: + result = _context.sent; + return _context.abrupt("return", lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(result, 'data[0].attributes.support_address', DEFAULT_SUPPORT_MAIL)); -var parse = __webpack_require__(772) + case 4: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return function fetchSupportMail(_x) { + return _ref.apply(this, arguments); + }; +}(); +var getErrorLocaleBound = function getErrorLocaleBound(error, konnector, lang, suffixKey, supportMail) { + var t = Object(_locales__WEBPACK_IMPORTED_MODULE_13__["getBoundT"])(lang); + return getErrorLocale(error, konnector, t, suffixKey, supportMail); +}; /** - * @category Quarter Helpers - * @summary Get the year quarter of the given date. - * - * @description - * Get the year quarter of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the quarter - * - * @example - * // Which quarter is 2 July 2014? - * var result = getQuarter(new Date(2014, 6, 2)) - * //=> 3 + * Returns the account type. Based on the information from the oauth attribute, + * or the slug. + * @param {Object} konnector + * @return {string} Account type */ -function getQuarter (dirtyDate) { - var date = parse(dirtyDate) - var quarter = Math.floor(date.getMonth() / 3) + 1 - return quarter -} -module.exports = getQuarter +var getAccountType = function getAccountType(konnector) { + return lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(konnector, 'oauth.account_type', konnector.slug); +}; +/** + * Returns true if the konnector has a new version available and can be updated + * @param {Object} konnector + * @return {Boolean} + */ +var hasNewVersionAvailable = function hasNewVersionAvailable() { + var konnector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return !!konnector.available_version; +}; +/** + * Indicates if the given konnector requires a folder to work properly. + * This directly relies on the `fields.advancedFields.folderPath` from manifest for legacy Konnector. + * Relies on `folders` for new Konnector + * @param {Object} konnector + * @return {bool} `true` if the konnector needs a folder + */ -/***/ }), -/* 813 */ -/***/ (function(module, exports, __webpack_require__) { +var needsFolder = function needsFolder(konnector) { + return lodash_has__WEBPACK_IMPORTED_MODULE_11___default()(konnector, 'fields.advancedFields.folderPath') || lodash_has__WEBPACK_IMPORTED_MODULE_11___default()(konnector, 'folders'); +}; +/** + * Base directories are directory where konnector may copy their data. + * They are expressed as variables which then need to be localized. + * Default is `$administrative`. + */ -var startOfWeek = __webpack_require__(791) +var allowedBaseDirVariables = ['$administrative', '$photos']; +/** + * Render base directory, based on given folders object. + * For example, it will render `$administrative` with the given value passed in + * folders object. We expect to find in folders a localized value. + * @param {String} baseDir base directory variable, expects `$administrative` + * or `$photos` + * @param {Object} folders Object indexing base directory variable with + * corresponding localized name. + * @return {String} Localized directory + */ -var MILLISECONDS_IN_MINUTE = 60000 -var MILLISECONDS_IN_WEEK = 604800000 +var renderBaseDir = function renderBaseDir(baseDir) { + var folders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + // Look for variable name into folders but without $ prefix + var renderedBaseDir = folders[baseDir.slice(1)] || DEFAULT_LOCALIZED_BASE_DIR; // Trim `/` and avoid multiple `/` characters with regexp + return lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(renderedBaseDir.replace(/(\/+)/g, '/'), '/'); +}; /** - * @category Week Helpers - * @summary Get the number of calendar weeks between the given dates. - * - * @description - * Get the number of calendar weeks between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Number} the number of calendar weeks - * - * @example - * // How many calendar weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInCalendarWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5) - * ) - * //=> 3 - * - * @example - * // If the week starts on Monday, - * // how many calendar weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInCalendarWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5), - * {weekStartsOn: 1} - * ) - * //=> 2 + * Render the given folder path using the given `variables` object. + * Available variable are `$konnector` (konnector name) and `$account` + * (account label, i.e. id or name) + * @param {String} path Path to render + * @param {Object} variables Object mapping variable to actual values + * @return {String} Rendered path */ -function differenceInCalendarWeeks (dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var startOfWeekLeft = startOfWeek(dirtyDateLeft, dirtyOptions) - var startOfWeekRight = startOfWeek(dirtyDateRight, dirtyOptions) - var timestampLeft = startOfWeekLeft.getTime() - - startOfWeekLeft.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - var timestampRight = startOfWeekRight.getTime() - - startOfWeekRight.getTimezoneOffset() * MILLISECONDS_IN_MINUTE - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK) -} +var renderSubDir = function renderSubDir(path) { + var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + // Trim `/` and avoid multiple `/` characters with regexp + var sanitizedPath = lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(path.replace(/(\/+)/g, '/'), '/'); // Let's get only full variable name limited by '/'. We want to avoid false + // positive like parsing `$variableInString` to `valueInString` -module.exports = differenceInCalendarWeeks + var segments = sanitizedPath.split('/'); + return segments.map(function (segment) { + return variables[segment.slice(1)] || segment; + }).join('/'); +}; +/** + * Check if the provided Path start withs our allowedBaseDirPath to see + * @param {String} path + * @return {Boolean} + */ -/***/ }), -/* 814 */ -/***/ (function(module, exports, __webpack_require__) { +var hasBaseDir = function hasBaseDir(path) { + return allowedBaseDirVariables.some(function (baseDirVar) { + return path.startsWith(baseDirVar); + }); +}; +/** + * This method creates the subDir. We can't have an empty subDir, so we set + * it to our default '$konnector/$account' + * @param {String} fullPath String containing potentially the defaultDir + * @param {String} defaultDir String to remove from the fullPath + */ + -var parse = __webpack_require__(772) +var buildSubDir = function buildSubDir(fullPath, defaultDir) { + var buildedSubDir = fullPath.substring(defaultDir.length); + + if (buildedSubDir === '') { + buildedSubDir = '$konnector/$account'; + } + return buildedSubDir; +}; /** - * @category Year Helpers - * @summary Get the number of calendar years between the given dates. + * Build folder path for a given konnector and a given account. * - * @description - * Get the number of calendar years between the given dates. + * If konnector.folders[0].defaultDir exists, it is used as default directory. * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of calendar years + * Occurrences of following strings in base directory are replaced by: + * * `$administrative`: Administrative folder + * * `$photos`: Photos folder * - * @example - * // How many calendar years are between 31 December 2013 and 11 February 2015? - * var result = differenceInCalendarYears( - * new Date(2015, 1, 11), - * new Date(2013, 11, 31) - * ) - * //=> 2 - */ -function differenceInCalendarYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) + * Occurrences of following strings in path are replaced by: + * * `$account: Account label (id or name)` + * * `$konnector`: Konnector name + * + * If no konnectors.folders[0].defaultDir is set, the default dir used is + * * `$administrative/$konnector/$account` + * + * @param {Object} konnector Konnector document + * @param {Object} account Account document + * @param {Object} folders Object containing a mapping from folder + * identifiers (ex: $administrative) to their localized values (ex: + * Administratif). + * @return {String} The result path + */ - return dateLeft.getFullYear() - dateRight.getFullYear() -} -module.exports = differenceInCalendarYears +var buildFolderPath = function buildFolderPath(konnector, account) { + var folders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + var fullPath = lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(konnector, // For now konnectors are only defining one folder in their folders array + 'folders[0].defaultDir', '$administrative/$konnector/$account'); // Trim `/` and avoid multiple `/` characters with regexp + var sanitizedPath = lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(fullPath.replace(/(\/+)/g, '/'), '/'); // If the konnector doesn't have any of our base dir, we set it to $administrative -/***/ }), -/* 815 */ -/***/ (function(module, exports, __webpack_require__) { + if (!hasBaseDir(sanitizedPath)) { + sanitizedPath = '$administrative/' + sanitizedPath; + } + /** + * Now that we have our sanitizedPath, we can split it in two strings + * * `baseDir` containing the baseDir path + * * `buildedSubDir` containing the rest of the path (ie the path without baseDir) + */ -var parse = __webpack_require__(772) -var differenceInCalendarDays = __webpack_require__(794) -var compareAsc = __webpack_require__(806) + var baseDir = sanitizedPath.split('/', 1); + var buildedSubDir = buildSubDir(sanitizedPath, baseDir[0]); + var renderedBaseDir = renderBaseDir(baseDir[0], folders); + var renderedPath = renderSubDir(buildedSubDir, { + // When adding a new allowed variable here, please keep documentation + // of `renderSubDir` function up to date. + konnector: konnector.name, + account: _accounts__WEBPACK_IMPORTED_MODULE_15__["getLabel"](account).replace(sanitizeAccountIdentifierRx, '-') + }); + return "/".concat(renderedBaseDir, "/").concat(renderedPath); +}; /** - * @category Day Helpers - * @summary Get the number of full days between the given dates. - * - * @description - * Get the number of full days between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full days - * - * @example - * // How many full days are between - * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00? - * var result = differenceInDays( - * new Date(2012, 6, 2, 0, 0), - * new Date(2011, 6, 2, 23, 0) - * ) - * //=> 365 + * Returns a permission ready to be passed to + * client.collection('io.cozy.permissions').add(). + * @param {Object} konnector The konnector to add permission to + * @param {Object} folder The folder which the konnector should have access + * @return {Object} Permission object */ -function differenceInDays (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight)) - dateLeft.setDate(dateLeft.getDate() - sign * difference) - // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full - // If so, result must be decreased by 1 in absolute value - var isLastDayNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastDayNotFull) -} +var buildFolderPermission = function buildFolderPermission(folder) { + return { + // Legacy name + saveFolder: { + type: 'io.cozy.files', + values: [folder._id], + verbs: ['GET', 'PATCH', 'POST'] + } + }; +}; +/** + * Get's the launcher in the current environment if any + * + * @param {Object} win The window object in the current environment + * @returns {Object} + */ -module.exports = differenceInDays +var getLauncher = function getLauncher(_ref2) { + var win = _ref2.win; + return lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(win, 'cozy.ClientConnectorLauncher', null); +}; +/** + * Define if it is possible to run a konnector in the current environment + * + * @param {Object} win The window object in the current environment + * @param {Object} konnector The io.cozy.konnectors object for the current konnector + * @returns {Boolean} + */ +var isRunnable = function isRunnable(_ref3) { + var win = _ref3.win, + _ref3$konnector = _ref3.konnector, + konnector = _ref3$konnector === void 0 ? {} : _ref3$konnector; + return Boolean(!konnector.clientSide || getLauncher({ + win: win + })); +}; +/* harmony default export */ __webpack_exports__["default"] = ({ + KonnectorJobError: KonnectorJobError, + buildFolderPath: buildFolderPath, + buildFolderPermission: buildFolderPermission, + getAccountType: getAccountType, + getLauncher: getLauncher, + isRunnable: isRunnable, + hasNewVersionAvailable: hasNewVersionAvailable, + needsFolder: needsFolder, + fetchSupportMail: fetchSupportMail, + DEFAULT_SUPPORT_MAIL: DEFAULT_SUPPORT_MAIL +}); /***/ }), -/* 816 */ +/* 890 */ /***/ (function(module, exports, __webpack_require__) { -var differenceInMilliseconds = __webpack_require__(817) - -var MILLISECONDS_IN_HOUR = 3600000 +var baseToString = __webpack_require__(171), + baseTrim = __webpack_require__(308), + castSlice = __webpack_require__(420), + charsEndIndex = __webpack_require__(480), + charsStartIndex = __webpack_require__(891), + stringToArray = __webpack_require__(422), + toString = __webpack_require__(170); /** - * @category Hour Helpers - * @summary Get the number of hours between the given dates. + * Removes leading and trailing whitespace or specified characters from `string`. * - * @description - * Get the number of hours between the given dates. + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to trim. + * @param {string} [chars=whitespace] The characters to trim. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the trimmed string. + * @example * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of hours + * _.trim(' abc '); + * // => 'abc' * - * @example - * // How many hours are between 2 July 2014 06:50:00 and 2 July 2014 19:00:00? - * var result = differenceInHours( - * new Date(2014, 6, 2, 19, 0), - * new Date(2014, 6, 2, 6, 50) - * ) - * //=> 12 + * _.trim('-_-abc-_-', '_-'); + * // => 'abc' + * + * _.map([' foo ', ' bar '], _.trim); + * // => ['foo', 'bar'] */ -function differenceInHours (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_HOUR - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) +function trim(string, chars, guard) { + string = toString(string); + if (string && (guard || chars === undefined)) { + return baseTrim(string); + } + if (!string || !(chars = baseToString(chars))) { + return string; + } + var strSymbols = stringToArray(string), + chrSymbols = stringToArray(chars), + start = charsStartIndex(strSymbols, chrSymbols), + end = charsEndIndex(strSymbols, chrSymbols) + 1; + + return castSlice(strSymbols, start, end).join(''); } -module.exports = differenceInHours +module.exports = trim; /***/ }), -/* 817 */ +/* 891 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var baseIndexOf = __webpack_require__(188); /** - * @category Millisecond Helpers - * @summary Get the number of milliseconds between the given dates. - * - * @description - * Get the number of milliseconds between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of milliseconds + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. * - * @example - * // How many milliseconds are between - * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700? - * var result = differenceInMilliseconds( - * new Date(2014, 6, 2, 12, 30, 21, 700), - * new Date(2014, 6, 2, 12, 30, 20, 600) - * ) - * //=> 1100 + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. */ -function differenceInMilliseconds (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getTime() - dateRight.getTime() +function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; } -module.exports = differenceInMilliseconds +module.exports = charsStartIndex; /***/ }), -/* 818 */ -/***/ (function(module, exports, __webpack_require__) { +/* 892 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -var parse = __webpack_require__(772) -var differenceInCalendarISOYears = __webpack_require__(809) -var compareAsc = __webpack_require__(806) -var subISOYears = __webpack_require__(819) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBoundT", function() { return getBoundT; }); +/* harmony import */ var node_polyglot__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(493); +/* harmony import */ var node_polyglot__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_polyglot__WEBPACK_IMPORTED_MODULE_0__); -/** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of full ISO week-numbering years between the given dates. - * - * @description - * Get the number of full ISO week-numbering years between the given dates. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full ISO week-numbering years - * - * @example - * // How many full ISO week-numbering years are between 1 January 2010 and 1 January 2012? - * var result = differenceInISOYears( - * new Date(2012, 0, 1), - * new Date(2010, 0, 1) - * ) - * //=> 1 - */ -function differenceInISOYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) +var polyglots = {}; +var langs = ['fr', 'en']; - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarISOYears(dateLeft, dateRight)) - dateLeft = subISOYears(dateLeft, sign * difference) +for (var _i = 0, _langs = langs; _i < _langs.length; _i++) { + var lang = _langs[_i]; + var locales = {}; + + try { + locales = __webpack_require__(893)("./".concat(lang, ".json")); // eslint-disable-next-line no-empty + } catch (e) {} - // Math.abs(diff in full ISO years - diff in calendar ISO years) === 1 - // if last calendar ISO year is not full - // If so, result must be decreased by 1 in absolute value - var isLastISOYearNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastISOYearNotFull) + var polyglot = new node_polyglot__WEBPACK_IMPORTED_MODULE_0___default.a(); + polyglot.extend(locales); + polyglots[lang] = polyglot; } -module.exports = differenceInISOYears +var getBoundT = function getBoundT(lang) { + var polyglot = polyglots[lang] || polyglots['en']; + return polyglot.t.bind(polyglot); +}; + /***/ }), -/* 819 */ +/* 893 */ /***/ (function(module, exports, __webpack_require__) { -var addISOYears = __webpack_require__(788) - -/** - * @category ISO Week-Numbering Year Helpers - * @summary Subtract the specified number of ISO week-numbering years from the given date. - * - * @description - * Subtract the specified number of ISO week-numbering years from the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of ISO week-numbering years to be subtracted - * @returns {Date} the new date with the ISO week-numbering years subtracted - * - * @example - * // Subtract 5 ISO week-numbering years from 1 September 2014: - * var result = subISOYears(new Date(2014, 8, 1), 5) - * //=> Mon Aug 31 2009 00:00:00 - */ -function subISOYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addISOYears(dirtyDate, -amount) -} +var map = { + "./en.json": 894, + "./fr.json": 895, + "./nl_NL.json": 896 +}; -module.exports = subISOYears +function webpackContext(req) { + var id = webpackContextResolve(req); + return __webpack_require__(id); +} +function webpackContextResolve(req) { + if(!__webpack_require__.o(map, req)) { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + } + return map[req]; +} +webpackContext.keys = function webpackContextKeys() { + return Object.keys(map); +}; +webpackContext.resolve = webpackContextResolve; +module.exports = webpackContext; +webpackContext.id = 893; /***/ }), -/* 820 */ -/***/ (function(module, exports, __webpack_require__) { +/* 894 */ +/***/ (function(module) { -var differenceInMilliseconds = __webpack_require__(817) +module.exports = JSON.parse("{\"close\":\"Close\",\"back\":\"Go back\",\"badges\":{\"warning\":\"Warning\"},\"accountForm\":{\"submit\":{\"label\":\"Connect\"},\"fields\":{\"optional\":\"(optional)\"},\"password\":{\"show\":\"Show\",\"hide\":\"Hide\"},\"disconnect\":{\"button\":\"Disconnect this account\"},\"installFlagship\":{\"label\":\"Install Cozy on mobile\"},\"notClientSide\":\"The %{name} application uses a brand-new and efficient system for retrieving your data from your Cozy. This action is only accessible from the Cozy mobile app.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Bank accounts\",\"default\":\"Contracts\"},\"deleted\":\"Deleted\",\"no-contracts\":\"No contracts anymore\",\"handle-synchronization\":\"Handle my synchronizations\",\"desynchronized\":{\"message\":\"you have desynchronized this account on %{date}\",\"dateFormat\":\"MM/DD/YY\"}},\"contractForm\":{\"details\":\"Details\",\"sharing\":\"Sharing\",\"back-to-accounts\":\"Back to accounts\",\"update\":\"Update\",\"delete\":\"Reset\",\"deleting\":\"Resetting...\",\"confirm-deletion\":{\"description\":\"This will also delete your transactions along with bill links. If you do not wish to reimport your banking data at the next scheduled synchronization, you'll have to remove the connection.\",\"confirm\":\"Confirm account deletion\",\"title\":\"Are you definitive ?\"},\"deletion_error\":\"An error occurred while group deletion.\",\"label\":\"Label\",\"owner\":\"Owner\",\"addOwnerBtn\":\"Add an owner\",\"removeOwnerBtn\":\"Remove this owner\",\"ownerPlaceholder\":\"Select an owner\",\"bank\":\"Bank\",\"number\":\"Number\",\"type\":\"Type\",\"apply\":\"Apply\",\"success\":\"Account updated successfully\",\"failure\":\"Error while updating the account\",\"removeAccountBtn\":\"Remove the account\",\"listPlaceholder\":\"Search a contact\",\"listEmptyMessage\":\"No contact found\",\"addContactLabel\":\"Add a contact\",\"cancel\":\"Cancel\",\"imported\":\"Synchronized account\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Run again now\"},\"error\":\"An error occured.\",\"frequency\":{\"label\":\"Frequency:\",\"hourly\":\"Each hour\",\"daily\":\"Once a day\",\"weekly\":\"Once a week\",\"monthly\":\"Once a month\",\"undefined\":\"Manually\"},\"lastSync\":{\"label\":\"Update:\",\"syncing\":\"Running…\",\"unknown\":\"Unknown\",\"format\":\"MMMM D[,] YYYY [at] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Your documents\",\"description\":\"This service retrieves your latest documents and keeps a complete back-up for you.\",\"button\":\"Open the documents\",\"install\":\"Discover Cozy Drive\"},\"contacts\":{\"title\":\"Your contacts\",\"description\":\"This service synchronizes all your contacts for you.\",\"button\":\"Open contacts\",\"install\":\"Discover Cozy Contacts\"},\"banks\":{\"title\":\"Your banking data\",\"description\":\"This service retrieves and keeps a complete record of your latest banking operations for you.\",\"button\":\"Access bank accounts\",\"install\":\"Discover Cozy Banks\"},\"coachco2\":{\"title\":\"Apps to go further\",\"description\":\"The following apps are able to use privately this kind of data inside your Cozy.\",\"button\":\"Coach CO2\",\"install\":\"Discover CoachCO2\"}},\"websiteLink\":{\"title\":\"Useful information\",\"description\":\"Service website\"}},\"default\":{\"dateFormat\":\"MM/DD/YYYY\",\"baseDir\":\"/Administrative\"},\"error\":{\"application-not-found\":\"This app doesn't exist\",\"reconnect-via-form\":\"Reconnect\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Storage full\",\"description\":\"This service cannot fetch your documents now. Please remove some files or go to **Settings > Storage** to get more free space.\"},\"CHALLENGE_ASKED\":{\"title\":\"Challenge required\",\"description\":\"The website requires a second authentification factor. You may re-run the connector manually to provide the code and continue to retrieve your data.\"},\"OAUTH_CANCELED\":{\"title\":\"Canceled\",\"description\":\"We could not add your bank since you canceled the connection. Click \\\"Add your bank\\\" one more time to try again.\"},\"LOGIN_FAILED\":{\"title\":\"Incorrect or expired credentials\",\"description\":\"Sorry, your login or password are invalid or are expired. You may check your credentials on [%{name}](%{link}) website before updating.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Additional information needed\",\"description\":\"An additional field must be filled in to connect your service. You may re-run the connector manually to provide the information.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Temporarily blocked\",\"description\":\"Too many attempts occured. Please update your credentials on [%{name}](%{link}) website and update the konnector later on.\"},\"MAINTENANCE\":{\"title\":\"Unavailable website\",\"description\":\"It seems that the [%{name}](%{link}) website is unavailable or the konnector must be updated. Please rerun the connector later or visit our online help.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Missing destination folder\",\"description\":\"It seems that this account's destination folder has been deleted. Please restore it by disconnecting this account and then reconnect again.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Latest Terms of Service non accepted\",\"description\":\"%{name} seems to have updated its Terms Of Service. Please check that the service is up to date. It this error still occurs, please contact us at [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Connection error\",\"description\":\"An unknown error has occurred. You can try to update your data. If the problem persists, please contact us at [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Action needed on the provider's website\",\"description\":\"It seems that the [%{name}](%{link}) website requires you to log in and to complete a specific action. Please re-run the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Access renewal required\",\"description\":\"The [%{name}](%{link}) service requires you to renew your authentication. Please disconnect and reconnect your account %{name} to this application. No data will be lost.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Unavailable account\",\"description\":\"It seems that your account is no longer active. Please check your account on [%{name}](%{link}) before retry.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Password update required\",\"description\":\"It seems that the [%{name}](%{link}) website requires you to log in and update your password. Please rerun the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"New permissions needed\",\"description\":\"You connector was updated and the permissions changed. Please validate them before launching the connector again.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Renewal of authentication required\",\"description\":\"It seems that %{name} requires a login recheck for the synchronisation to work. Please re-run the connector to start the verification process. You will receive a one-time password or a validation process on your bank application or website.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Authentication renewal required\",\"description\":\"The last connexion to the service failed; please launch it again. You may have to provide a validation code.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Authentication on vendor website required\",\"description\":\"It seems that [%{name}](%{link}) requires you to log in on their website for the synchronisation to work. Please re-run the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Incorrect strong authentication code\",\"description\":\"The second-factor code provided is incorrect, please start again.\"},\"VENDOR_DOWN\":{\"title\":\"Unavailable service\",\"description\":\"It seems that the [%{name}](%{link}) service is unavailable at the moment. Please rerun the connector later.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Unavailable bank website\",\"description\":\"Access to the [%{name}](%{link}) customer area is currently unavailable. Please rerun the connector later\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Unavailable service\",\"description\":\"It seems that we are experiencing overload with our bank konnectors at the moment. Please rerun the connector later.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"This account already exists\",\"description\":\"Your possible modification of the list of synchronized accounts will be taken into account within a few minutes.\"}}},\"fields\":{\"answer\":{\"label\":\"Secret answer\"},\"birthdate\":{\"label\":\"Birth date\",\"placeholder\":\"mm/dd/yyyy\"},\"code\":{\"label\":\"Confidential code\"},\"date\":{\"label\":\"Date\",\"placeholder\":\"mm/dd/yyyy\"},\"email\":{\"label\":\"Email address\"},\"firstname\":{\"label\":\"First name\"},\"lastname\":{\"label\":\"Last name\"},\"login\":{\"label\":\"Login\"},\"password\":{\"label\":\"Password\"},\"phone\":{\"label\":\"Phone number\"},\"two_fa_code\":{\"label\":\"Strong authentication code\"}},\"folder\":{\"administrative\":\"Administrative\",\"photos\":\"Photos\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"An update is available for this service.\",\"body\":{\"regular\":\"Perform this update to keep fetching your data and to have the latest features:\",\"blocking\":\"Update it to keep fetching your data:\"},\"button\":{\"label\":\"See update\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Access token\"},\"accessTokenSecret\":{\"label\":\"Access token secret\"},\"accountName\":{\"label\":\"Account name\"},\"agreement\":{\"label\":\"I agree\"},\"apikey\":{\"label\":\"Api key\"},\"appKey\":{\"label\":\"Application Key\"},\"appSecret\":{\"label\":\"Application Secret\"},\"authCode\":{\"label\":\"Auth code\"},\"bank_identifier\":{\"label\":\"Bank identifier (optional)\"},\"branchName\":{\"label\":\"Branch\"},\"cardNumber\":{\"label\":\"Card Number\"},\"consumerKey\":{\"label\":\"Consumer Key\"},\"consumerSecret\":{\"label\":\"Consumer Secret\"},\"dob\":{\"label\":\"Date of birth\"},\"folderPath\":{\"label\":\"Folder path\"},\"identifier\":{\"label\":\"Identifier\"},\"loginUrl\":{\"label\":\"Login URL\"},\"namePath\":{\"label\":\"Folder name\"},\"new_identifier\":{\"label\":\"Identifier\"},\"phoneNumber\":{\"label\":\"Phone number\"},\"profileName\":{\"label\":\"Profile Name\"},\"refreshToken\":{\"label\":\"Refresh Token\"},\"secret\":{\"label\":\"Password\"},\"timeout\":{\"label\":\"Delay (ms)\"},\"token\":{\"label\":\"Token\"},\"tricountUrl\":{\"label\":\"Tricount URL\"}}},\"modal\":{\"aria-label\":\"Connector configuration\",\"konnector\":{\"error\":{\"title\":\"Unable to retrieve your account\",\"description\":\"The account cannot be retrieved (%{message}).\",\"button\":\"Close\"}},\"accounts\":{\"title\":\"Select a %{name} account\",\"error\":{\"title\":\"Error\",\"description\":\"Unable to retrieve your account(s)\",\"retry\":\"Retry\"}},\"tabs\":{\"data\":\"Data\",\"configuration\":\"Configuration\"},\"addAccount\":{\"title\":\"Connect to %{name}\",\"button\":\"Add an account\"},\"deleteAccount\":{\"title\":\"Disconnection\",\"description\":\"Your account will be disconnected, but already imported data will be kept.\",\"confirm\":\"Disconnect\",\"cancel\":\"Cancel\"},\"updateAccount\":{\"general-subheader\":\"General\",\"identifiers\":\"Identifiers\",\"delete-account-success\":\"Account has been disconnected\",\"delete-account-error\":\"Account could not be disconnected, please retry later or contact our support.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Add your bank\"},\"reconnect\":{\"label\":\"Reconnect\"}},\"reconnect\":{\"label\":\"Reconnect\"},\"connect\":{\"label\":\"Connect\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Close\"},\"description\":\"Your data will be available in a few minutes and the next ones will follow automatically.\",\"figure\":{\"alt\":\"connected\"},\"title\":\"Successful configuration!\"},\"twoFAForm\":{\"modal-label\":\"Two factor authentication form\",\"providers\":{\"default\":\"Enter the code sent to you by e-mail or SMS\",\"email\":\"Enter the code sent to you by e-mail\",\"sms\":\"Enter the code sent to you by SMS\",\"app_code\":\"Enter the one-time code to generate in ${name} mobile app\",\"app\":\"Use your provider's app to continue authentication\"},\"desc-2fa\":\"You need to open your provider's app to confirm your authentication. In some cases, you will have to validate two times.\",\"desc_1\":\"This code enables you to finish your connexion.\",\"desc_2\":\"The second code received on your mobile phone or by email enables you to finalize your connexion.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Second code\"},\"retry\":\"Invalid code, please re-enter.\",\"CTA\":\"Validate\"},\"account\":{\"success\":{\"title\":\"Successful configuration!\",\"connect\":\"Your data will be available in a few minutes and the next ones will follow automatically.\",\"banksLinkText\":\"See my accounts in %{appName}\",\"driveLinkText\":\"Open the folder in Cozy Drive\",\"button\":\"Close\"}},\"maintenance\":{\"noService\":\"Service interrupted\",\"explanationTitle\":\"What is going on?\"},\"suggestions\":{\"title\":\"Import your data from %{name}\",\"data\":\"Installing %{name} will automatically import the following data:\",\"why\":\"Why is %{name} suggested to me?\",\"reason_bank\":\"%{name} has been detected in one of your bank transactions. Don't worry, no one else can access this information\",\"install\":\"Install\",\"silence\":\"Don't suggest it again\"},\"dataType\":{\"none\":\"%{name} won't access any of your personal data\",\"activity\":\"Your activities\",\"appointment\":\"Your appointments\",\"bankTransactions\":\"Your bank transactions\",\"bankAccounts\":\"Your bank accounts\",\"bill\":\"Your bills\",\"bloodPressure\":\"Your blood pressure\",\"calendar\":\"Your calendars\",\"certificate\":\"Your certificates\",\"commit\":\"Your commits\",\"consumption\":\"Your consumption\",\"contact\":\"Your contacts\",\"contract\":\"Your contracts\",\"courseMaterial\":\"Your course materials\",\"document\":\"Your documents\",\"event\":\"Your events\",\"family\":\"Your family informations\",\"geopoint\":\"Your geolocations\",\"heartbeat\":\"Your heartbeats\",\"home\":\"Your home informations\",\"phonecommunicationlog\":\"Your phone communications log\",\"picture\":\"Your pictures\",\"podcast\":\"Your podcasts\",\"profile\":\"Your client profile\",\"refund\":\"Your refunds\",\"sinister\":\"Your sinisters\",\"sleepTime\":\"Your sleep time\",\"stepsNumber\":\"Your number of steps\",\"temperature\":\"Your temperature data\",\"travelDate\":\"Your travel dates\",\"tweet\":\"Your tweets\",\"videostream\":\"Your videos\",\"weight\":\"Your weights\"},\"vaultCiphersList\":{\"title\":\"From which account do you want to import your data?\",\"otherAccount\":\"From another account…\"},\"triggerManager\":{\"connecting\":\"Connecting your account...\",\"confirmationModal\":{\"title\":\"Update credentials?\",\"description\":\"Your previous credentials will be definitively lost. Add a new account to keep them.\",\"primaryText\":\"Update\",\"secondaryText\":\"Cancel\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"This account is disconnected. Your data has been kept. If you want to restart the synchronisation, please reconfigure your account with the \\\"Add a bank\\\" button.\"},\"konnectorBlock\":{\"account\":\"Customer account\",\"disconnected\":\"Disconnected\",\"inMaintenance\":\"In maintenance\",\"hasNewVersionAvailable\":\"New version available\",\"fatalError\":\"An error occurred while recovering the service. If this problem persists, do not hesitate to contact us at [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Last trips\",\"caption\":\"See your 5 most recent trips retrieved on %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Plane\",\"BICYCLING\":\"Bike\",\"CAR\":\"Car\",\"SUBWAY\":\"Subway\",\"TRAIN\":\"Train\",\"UNKNOWN\":\"\",\"WALKING\":\"Walking\"}},\"files\":{\"title\":\"Your documents\",\"imported\":\"Imported on %{date}\",\"caption\":\"This service retrieves your latest documents and keeps a complete back-up for you.\"}}}"); -var MILLISECONDS_IN_MINUTE = 60000 +/***/ }), +/* 895 */ +/***/ (function(module) { -/** - * @category Minute Helpers - * @summary Get the number of minutes between the given dates. - * - * @description - * Get the number of minutes between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of minutes - * - * @example - * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00? - * var result = differenceInMinutes( - * new Date(2014, 6, 2, 12, 20, 0), - * new Date(2014, 6, 2, 12, 7, 59) - * ) - * //=> 12 - */ -function differenceInMinutes (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / MILLISECONDS_IN_MINUTE - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} +module.exports = JSON.parse("{\"close\":\"Fermer\",\"back\":\"Revenir\",\"badges\":{\"warning\":\"Warning\"},\"accountForm\":{\"submit\":{\"label\":\"Connecter\"},\"fields\":{\"optional\":\"(Optionnel)\"},\"password\":{\"show\":\"Voir\",\"hide\":\"Cacher\"},\"disconnect\":{\"button\":\"Déconnecter le compte\"},\"installFlagship\":{\"label\":\"Install Cozy on mobile\"},\"notClientSide\":\"L'application %{name} utilise un nouveau système plus efficace pour la récupération de vos données dans votre Cozy. Cette action est uniquement accessible depuis l’application mobile Cozy.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Comptes et livrets d'épargne\",\"default\":\"Contrats\"},\"deleted\":\"Supprimé\",\"no-contracts\":\"Vous n'avez plus de contrats\",\"handle-synchronization\":\"Gérer mes synchronisations\",\"desynchronized\":{\"message\":\"vous avez désynchronisé ce compte le %{date}\",\"dateFormat\":\"DD/MM/YY\"}},\"contractForm\":{\"details\":\"Détails\",\"sharing\":\"Partage\",\"back-to-accounts\":\"Revenir aux comptes\",\"update\":\"Modifier\",\"delete\":\"Effacer\",\"deleting\":\"Effacement...\",\"confirm-deletion\":{\"description\":\"Cette action supprimera les mouvements déjà importés. Déconnectez également votre compte si vous ne souhaitez pas réimporter vos données à la prochaine connexion.\",\"confirm\":\"Confirmer la suppression\",\"title\":\"Êtes-vous sûr ?\"},\"deletion_error\":\"Une erreur est survenue lors de la suppression du compte.\",\"label\":\"Libellé\",\"owner\":\"Titulaire\",\"addOwnerBtn\":\"Ajouter un titulaire\",\"removeOwnerBtn\":\"Supprimer ce titulaire\",\"ownerPlaceholder\":\"Sélectionner un titulaire\",\"bank\":\"Banque\",\"number\":\"Numéro\",\"type\":\"Type\",\"apply\":\"Appliquer\",\"success\":\"Compte mis à jour avec succès\",\"failure\":\"Erreur lors de la mise à jour du compte\",\"removeAccountBtn\":\"Effacer le compte\",\"listPlaceholder\":\"Rechercher un contact\",\"listEmptyMessage\":\"Aucun contact trouvé\",\"addContactLabel\":\"Créer un contact\",\"cancel\":\"Annuler\",\"imported\":\"Compte synchronisé\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Mettre à jour\"},\"error\":\"Une erreur est survenue.\",\"frequency\":{\"label\":\"Fréquence :\",\"hourly\":\"Une fois par heure\",\"daily\":\"Journalier\",\"weekly\":\"Hebdomadaire\",\"monthly\":\"Mensuel\",\"undefined\":\"Manuellement\"},\"lastSync\":{\"label\":\"Mise à jour :\",\"syncing\":\"En cours...\",\"unknown\":\"Indéterminée\",\"format\":\"Le D MMMM YYYY [à] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Vos documents\",\"description\":\"Ce service récupère vos derniers documents et en sauvegarde l'historique complet à votre place.\",\"button\":\"Ouvrir les documents\",\"install\":\"Découvrir Cozy Drive\"},\"contacts\":{\"title\":\"Vos contacts\",\"description\":\"Ce service synchronise l'ensemble de vos contacts à votre place.\",\"button\":\"Accéder aux contacts\",\"install\":\"Découvrir Cozy Contacts\"},\"banks\":{\"title\":\"Vos données bancaires\",\"description\":\"Ce service récupère vos dernières lignes bancaires et en sauvegarde l'historique complet à votre place.\",\"button\":\"Accéder aux comptes bancaires\",\"install\":\"Découvrir Cozy Banks\"},\"coachco2\":{\"title\":\"Applications pour aller plus loin\",\"description\":\"Les applications suivantes proposent d'utiliser ces données en toute confidentialité au sein de votre Cozy\",\"button\":\"Coach CO2\",\"install\":\"Découvrir Coach CO2\"}},\"websiteLink\":{\"title\":\"Informations utiles\",\"description\":\"Site du service\"}},\"default\":{\"dateFormat\":\"DD/MM/YYYY\",\"baseDir\":\"/Administratif\"},\"error\":{\"application-not-found\":\"Cette application n'existe pas\",\"reconnect-via-form\":\"Se reconnecter\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Espace Disque plein\",\"description\":\"Actuellement, le service ne peut plus récupérer vos documents.\\nLibérez de l'espace en supprimant des fichiers ou rendez-vous dans **Paramètres > Stockage** pour augmenter votre espace de stockage.\"},\"CHALLENGE_ASKED\":{\"title\":\"Second facteur d’authentification demandé\",\"description\":\"Le site demande une authentification forte à deux facteurs. Vous devez relancer le connecteur manuellement pour vous authentifier et continuer à récupérer vos données.\"},\"OAUTH_CANCELED\":{\"title\":\"Annulé\",\"description\":\"Nous n'avons pas pu ajouter votre banque car vous avez annulé la connexion. Cliquez sur \\\"Ajouter votre banque\\\" encore une fois pour faire un nouvel essai.\"},\"LOGIN_FAILED\":{\"title\":\"Identifiants erronés ou expirés\",\"description\":\"Votre identifiant et/ou mot de passe ne semblent pas corrects. Merci de les vérifier sur le site [%{name}](%{link}) avant de réessayer.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Information additionnelle requise\",\"description\":\"Un champ additionnel doit être rempli pour vérifier vos identifiants.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Temporairement bloqué\",\"description\":\"Trop de tentatives erronées ont eu lieu. Merci de modifier votre mot de passe sur le site [%{name}](%{link}) et de mettre à jour le connecteur ensuite.\"},\"MAINTENANCE\":{\"title\":\"Site non disponible\",\"description\":\"Il semble que le site [%{name}](%{link}) soit indisponible. Merci de relancer ultérieurement ou de consulter notre aide en ligne.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Dossier de destination manquant\",\"description\":\"Il semble que le dossier de destination pour ce compte ait été supprimé. Merci de le restaurer en déconnectant ce compte puis en le reconnectant à nouveau.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Nouvelles CGUs à accepter\",\"description\":\"Il semblerait que %{name} ait mis à jour ses Conditions Générales d'Utilisation. Merci de vérifier que le service est à jour. Si l'erreur persiste, contacter nous via [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Erreur de Connexion\",\"description\":\"Une erreur inconnue est survenue. Vous pouvez essayer de mettre à jour vos données. Si le problème persiste, n'hésitez pas à nous contacter via [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Action nécessaire chez le fournisseur\",\"description\":\"Il semble que [%{name}](%{link}) ait besoin de revérifier votre connexion. Connectez-vous sur [%{name}](%{link}) puis cliquez sur \\\"Mettre à jour\\\" dans l'onglet données.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Renouvellement de l’authentification requis\",\"description\":\"Le service [%{name}](%{link}) demande d'autoriser à nouveau votre accès. Merci de déconnecter puis reconnecter votre compte %{name} sur cette application. Aucune donnée ne sera perdue.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Compte client non accessible\",\"description\":\"Il semble que votre compte ne soit plus actif. Merci de vérifier son statut sur le site [%{name}](%{link}) avant de réessayer.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Renouvellement de mot de passe demandé\",\"description\":\"Il semble que le site [%{name}](%{link}) ait besoin que vous vous y authentifiiez pour renouveler votre mot de passe. Merci de relancer le connecteur une fois cette action effectuée.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"Validation des nouvelles permissions nécessaire\",\"description\":\"Votre connecteur a été mis à jour et les permissions nécessaires ont changé. Merci de valider les nouvelles permissions avant de relancer le connecteur.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Renouvellement d'authentification demandé\",\"description\":\"Il semble que %{name} ait besoin de revérifier votre connexion afin d'autoriser une nouvelle synchronisation de vos comptes. Merci de relancer le connecteur, cela déclenchera la demande auprès de votre banque. Vous recevrez un code à usage unique ou une demande sur l'espace client ou l'application de votre banque.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Renouvellement de l’authentification demandé\",\"description\":\"La dernière connexion au service a échoué; merci de la relancer.\\nIl vous faudra peut-être renseigner un code de validation.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Authentification sur le site web demandée\",\"description\":\"Il semble que [%{name}](%{link}) ait besoin que vous vous authentifiiez à leur site web pour que la synchronisation refonctionne. Merci de relancer le connecteur une fois cette action effectuée.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Le code fourni ne semble pas correct\",\"description\":\"Le second facteur d’authentification fourni est incorrect, veuillez recommencer.\"},\"VENDOR_DOWN\":{\"title\":\"Service non disponible\",\"description\":\"Il semble que le service [%{name}](%{link}) ne nous ait pas répondu dans les temps. Vous pouvez tenter de le relancer manuellement maintenant ou ultérieurement.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Site non disponible\",\"description\":\"L'accès à l'espace client de [%{name}](%{link}) est actuellement indisponible, veuillez vous reconnecter plus tard\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Service non disponible\",\"description\":\"Il semble que le service [%{name}](%{link}) ne nous ait pas répondu dans les temps. Vous pouvez tenter de le relancer manuellement maintenant ou ultérieurement.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"Ce compte est déjà configuré\",\"description\":\"Votre éventuelle modification de la liste des comptes synchronisés sera prise en compte sous quelques minutes.\"}}},\"fields\":{\"answer\":{\"label\":\"Réponse secrète\"},\"birthdate\":{\"label\":\"Date de naissance\",\"placeholder\":\"jj/mm/aaaa\"},\"code\":{\"label\":\"Code confidentiel\"},\"date\":{\"label\":\"Date\",\"placeholder\":\"jj/mm/aaaa\"},\"email\":{\"label\":\"Adresse e-mail\"},\"firstname\":{\"label\":\"Prénom\"},\"lastname\":{\"label\":\"Nom de famille\"},\"login\":{\"label\":\"Identifiant\"},\"password\":{\"label\":\"Mot de passe\"},\"phone\":{\"label\":\"Numéro de téléphone\"},\"two_fa_code\":{\"label\":\"Second facteur d’authentification\"}},\"folder\":{\"administrative\":\"Administratif\",\"photos\":\"Photos\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"Une mise à jour est disponible pour ce service.\",\"body\":{\"regular\":\"Effectuez la mise à jour pour continuer à récupérer vos données et profiter des dernières fonctionnalités.\",\"blocking\":\"Mettez-le à jour pour continuer à récupérer vos données.\"},\"button\":{\"label\":\"Voir la mise à jour\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Jeton d'accès\"},\"accessTokenSecret\":{\"label\":\"Jeton d'accès secret\"},\"accountName\":{\"label\":\"Nom du compte\"},\"agreement\":{\"label\":\"J'accepte\"},\"apikey\":{\"label\":\"Clé d'API\"},\"appKey\":{\"label\":\"Clé d'application\"},\"appSecret\":{\"label\":\"Secret d'application\"},\"authCode\":{\"label\":\"Code Auth\"},\"bank_identifier\":{\"label\":\"Identifiant Banque (optionnel)\"},\"branchName\":{\"label\":\"Agence\"},\"cardNumber\":{\"label\":\"Numéro de carte\"},\"consumerKey\":{\"label\":\"Clé client\"},\"consumerSecret\":{\"label\":\"Secret client\"},\"dob\":{\"label\":\"Date de naissance\"},\"folderPath\":{\"label\":\"Chemin du dossier\"},\"identifier\":{\"label\":\"Identifiant\"},\"loginUrl\":{\"label\":\"URL du login\"},\"namePath\":{\"label\":\"Nom du dossier\"},\"new_identifier\":{\"label\":\"Identifiant\"},\"phoneNumber\":{\"label\":\"Numéro de téléphone\"},\"profileName\":{\"label\":\"Nom du profil\"},\"refreshToken\":{\"label\":\"Jeton de rafraîchissement\"},\"secret\":{\"label\":\"Mot de passe\"},\"timeout\":{\"label\":\"Délai (ms)\"},\"token\":{\"label\":\"Jeton\"},\"tricountUrl\":{\"label\":\"URL de Tricount\"}}},\"modal\":{\"aria-label\":\"Configuration du connecteur\",\"konnector\":{\"error\":{\"title\":\"Impossible de récupérer le compte\",\"description\":\"Le compte n'a pas pu être récupéré (%{message})\",\"button\":\"Fermer\"}},\"accounts\":{\"title\":\"Sélectionner un compte %{name} \",\"error\":{\"title\":\"Erreur\",\"description\":\"Impossible de charger vos comptes\",\"retry\":\"Réessayer\"}},\"tabs\":{\"data\":\"Données\",\"configuration\":\"Configuration\"},\"addAccount\":{\"title\":\"Connexion à %{name}\",\"button\":\"Ajouter un compte\"},\"deleteAccount\":{\"title\":\"Déconnexion\",\"description\":\"Vous serez déconnecté de ce compte, mais les données déjà importées seront conservées.\",\"confirm\":\"Déconnecter\",\"cancel\":\"Annuler\"},\"updateAccount\":{\"general-subheader\":\"Général\",\"identifiers\":\"Identifiants\",\"delete-account-success\":\"Le compte a été déconnecté\",\"delete-account-error\":\"Le compte n'a pas pu être déconnecté, merci de réessayer plus tard, ou contactez notre support.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Ajouter votre banque\"},\"reconnect\":{\"label\":\"Se reconnecter\"}},\"reconnect\":{\"label\":\"Se reconnecter\"},\"connect\":{\"label\":\"Ajouter un compte\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Fermer\"},\"description\":\"Vos données existantes seront disponibles dans quelques minutes et les prochaines suivront automatiquement.\",\"figure\":{\"alt\":\"Connecté\"},\"title\":\"Configuration réussie !\"},\"twoFAForm\":{\"modal-label\":\"Formulaire d'authentification à deux facteurs\",\"providers\":{\"default\":\"Saisissez le code qui vous a été envoyé par e-mail ou SMS.\",\"email\":\"Saisissez le code qui vous a été envoyé par e-mail.\",\"sms\":\"Saisissez le code qui vous a été envoyé par SMS.\",\"app_code\":\"Entrez un code à usage unique à générer depuis l'application mobile %{name}.\",\"app\":\"Utilisez l'application de votre service pour continuer à vous connecter\"},\"desc-2fa\":\" Vous devez ouvrir l'application de votre banque pour confirmer votre identité. Dans certains cas, vous devrez valider deux fois la demande.\",\"desc_1\":\"Ce code reçu sur votre mobile ou par email vous permet de valider votre connexion.\",\"desc_2\":\"Ce second code reçu sur votre mobile ou par email vous permet de finaliser votre connexion.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Second code\"},\"retry\":\"Code invalide, veuillez le ressaisir.\",\"CTA\":\"Valider\"},\"account\":{\"success\":{\"title\":\"Configuration réussie !\",\"connect\":\"Vos données existantes seront disponibles dans quelques minutes et les prochaines suivront automatiquement.\",\"banksLinkText\":\"Voir mes comptes dans %{appName}\",\"driveLinkText\":\"Ouvrir le dossier dans %{appName}\",\"button\":\"Fermer\"}},\"maintenance\":{\"noService\":\"Service interrompu\",\"explanationTitle\":\"Que se passe-t-il ?\"},\"suggestions\":{\"title\":\"Importer mes données %{name}\",\"data\":\"Installer %{name} importera automatiquement les données suivantes :\",\"why\":\"Pourquoi %{name} m’est proposé ?\",\"reason_bank\":\"%{name} a été détecté à partir de vos dépenses bancaires. Pas d’inquiétude, personne à part vous ne peut avoir accès à cette information.\",\"install\":\"Installer\",\"silence\":\"Ne plus me proposer\"},\"dataType\":{\"none\":\"%{name} n'accèdera à aucune de vos données personnelles.\",\"activity\":\"Vos activités\",\"appointment\":\"Vos rendez-vous\",\"bankTransactions\":\"Vos mouvements bancaires\",\"bankAccounts\":\"Vos comptes bancaires\",\"bill\":\"Vos factures\",\"bloodPressure\":\"Votre pression artérielle\",\"calendar\":\"Vos calendriers\",\"certificate\":\"Vos attestations\",\"commit\":\"Vos commits\",\"consumption\":\"Votre consommation\",\"contact\":\"Vos contacts\",\"contract\":\"Vos contrats\",\"courseMaterial\":\"Vos supports de cours\",\"document\":\"Vos documents\",\"event\":\"Vos évènements\",\"family\":\"Informations sur votre foyer\",\"geopoint\":\"Vos géolocalisations\",\"heartbeat\":\"Votre rythme cardiaque\",\"home\":\"Informations sur votre domicile\",\"phonecommunicationlog\":\"Votre journal d'appels\",\"picture\":\"Vos images\",\"podcast\":\"Vos podcasts\",\"profile\":\"Votre profil client\",\"refund\":\"Vos remboursements\",\"sinister\":\"Vos sinistres\",\"sleepTime\":\"Votre temps de sommeil\",\"stepsNumber\":\"Vos nombres de pas\",\"temperature\":\"Vos données de température\",\"travelDate\":\"Vos séjours et voyages\",\"tweet\":\"Vos tweets\",\"videostream\":\"Vos vidéos\",\"weight\":\"Votre poids\"},\"vaultCiphersList\":{\"title\":\"Depuis quel compte souhaitez vous importer vos données ?\",\"otherAccount\":\"Depuis un autre compte…\"},\"triggerManager\":{\"connecting\":\"Connexion du compte…\",\"confirmationModal\":{\"title\":\"Mettre à jour les identifiants ?\",\"description\":\"Vos identifiants précédents seront perdus. Ajoutez un nouveau compte pour les conserver.\",\"primaryText\":\"Mettre à jour\",\"secondaryText\":\"Annuler\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"Vous avez déconnecté votre compte. Vous conservez l'historique de vos données déjà importées. Si vous souhaitez reprendre la connexion, reconfigurez votre compte depuis le bouton \\\"Ajouter une banque\\\".\"},\"konnectorBlock\":{\"account\":\"Compte client\",\"disconnected\":\"Déconnecté\",\"inMaintenance\":\"En maintenance\",\"hasNewVersionAvailable\":\"Nouvelle version disponible\",\"fatalError\":\"Une erreur est survenue à la récupération du service. Si ce problème persiste, n'hésitez pas à nous contacter à [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Derniers trajets\",\"caption\":\"Visualisez vos 5 trajets les plus récents récupérés sur %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Avion\",\"BICYCLING\":\"Vélo\",\"CAR\":\"Voiture\",\"SUBWAY\":\"Métro\",\"TRAIN\":\"Train\",\"UNKNOWN\":\"\",\"WALKING\":\"Marche\"}},\"files\":{\"title\":\"Vos documents\",\"imported\":\"Importé le %{date}\",\"caption\":\"Ce service récupère vos derniers documents et garde une sauvegarde complète pour vous.\"}}}"); -module.exports = differenceInMinutes +/***/ }), +/* 896 */ +/***/ (function(module) { +module.exports = JSON.parse("{\"close\":\"Sluiten\",\"back\":\"Ga terug\",\"badges\":{\"warning\":\"Waarschuwing\"},\"accountForm\":{\"submit\":{\"label\":\"Koppelen\"},\"fields\":{\"optional\":\"(optioneel)\"},\"password\":{\"show\":\"Tonen\",\"hide\":\"Verbergen\"},\"disconnect\":{\"button\":\"Rekening loskoppelen\"},\"installFlagship\":{\"label\":\"Installeer Cozy op je telefoon\"},\"notClientSide\":\"%{name} maakt gebruik van een hagelnieuw efficiënt systeem om gegevens op te vragen op je Cozy. Deze action is alleen te gebruiken via de Cozy-smartphone-app.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Bankrekeningen\",\"default\":\"Contracten\"},\"deleted\":\"Verwijderd\",\"no-contracts\":\"Er zijn geen contracten meer\",\"handle-synchronization\":\"Synchronisaties beheren\",\"desynchronized\":{\"message\":\"je hebt de synchroniastie met dit account stopgezet op %{date}\",\"dateFormat\":\"DD-MM-YYYY\"}},\"contractForm\":{\"details\":\"Details\",\"sharing\":\"Delen\",\"back-to-accounts\":\"Terug naar rekeningen\",\"update\":\"Bijwerken\",\"delete\":\"Standaardwaarden\",\"deleting\":\"Bezig met herstellen…\",\"confirm-deletion\":{\"description\":\"Hiermee worden tevens je transacties en rekeningkoppelingen verwijderd. Als je je bankgegevens niet opnieuw wilt importeren tijdens de volgende geplande synchronisatie, verwijder dan de koppeling.\",\"confirm\":\"Rekeningverwijdering bevestigen\",\"title\":\"Weet je het zeker?\"},\"deletion_error\":\"Er is een fout opgetreden tijdens het verwijderen van de groep.\",\"label\":\"Label\",\"owner\":\"Eigenaar\",\"addOwnerBtn\":\"Eigenaar toevoegen\",\"removeOwnerBtn\":\"Eigenaar verwijderen\",\"ownerPlaceholder\":\"Kies een eigenaar\",\"bank\":\"Bank\",\"number\":\"Nummer\",\"type\":\"Soort\",\"apply\":\"Toepassen\",\"success\":\"De rekening is bijgewerkt\",\"failure\":\"Fout tijdens bijwerken van rekening\",\"removeAccountBtn\":\"Rekening verwijderen\",\"listPlaceholder\":\"Zoeken naar contactpersoon\",\"listEmptyMessage\":\"Geen contactpersoon gevonden\",\"addContactLabel\":\"Contactpersoon toevoegen\",\"cancel\":\"Annuleren\",\"imported\":\"Gesynchroniseerd account\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Opnieuw uitvoeren\"},\"error\":\"Er is een fout opgetreden.\",\"frequency\":{\"label\":\"Frequentie:\",\"hourly\":\"Elk uur\",\"daily\":\"Elke dag\",\"weekly\":\"Elke week\",\"monthly\":\"Elke maand\",\"undefined\":\"Handmatig\"},\"lastSync\":{\"label\":\"Bijwerken:\",\"syncing\":\"Bezig met uitvoeren…\",\"unknown\":\"Onbekend\",\"format\":\"D MMMM YYYY [om] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Mijn documenten\",\"description\":\"Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van.\",\"button\":\"Documenten openen\",\"install\":\"Ontdek Cozy Schijf\"},\"contacts\":{\"title\":\"Mijn contactpersonen\",\"description\":\"Deze dienst synchroniseert al je contactpersonen.\",\"button\":\"Contactpersonen tonen\",\"install\":\"Ontdek Cozy Contactpersonen\"},\"banks\":{\"title\":\"Mijn bankgegevens\",\"description\":\"Deze dienst haalt al je bankgegevens op en maakt er een handig overzicht van.\",\"button\":\"Bankrekeningen tonen\",\"install\":\"Ontdek Cozy Banken\"},\"coachco2\":{\"title\":\"Apps die verdergaan\",\"description\":\"De volgende apps maken gebruik van je anonieme Cozy-gegevens.\",\"button\":\"Coach CO2\",\"install\":\"Ontdek CoachCO2\"}},\"websiteLink\":{\"title\":\"Nuttige informatie\",\"description\":\"Website van dienst\"}},\"default\":{\"dateFormat\":\"DD-MM-YYYY\",\"baseDir\":\"/Administratief\"},\"error\":{\"reconnect-via-form\":\"Opnieuw koppelen\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Geen vrije ruimte meer\",\"description\":\"De dienst kan je documenten momenteel niet ophalen. Verwijder enkele bestanden of ga naar **Instellingen --> Opslag** om meer vrije ruimte te verkrijgen.\"},\"CHALLENGE_ASKED\":{\"title\":\"Tweede stap vereist\",\"description\":\"Deze website vereist een tweede authenticatiemethode. Doorloop het proces opnieuw om de code op te geven en je gegevens op te halen.\"},\"OAUTH_CANCELED\":{\"title\":\"Afgebroken\",\"description\":\"Je bank kan niet worden toegevoegd omdat je de koppeling hebt afgebroken. Klik op ‘Bank toevoegen’ op het opnieuw te proberen.\"},\"LOGIN_FAILED\":{\"title\":\"Onjuiste of verouderde inloggegevens\",\"description\":\"Je inloggegevens zijn onjuist of verlopen. Controleer je inloggegevens op [%{name}](%{link}) voordat je ze bijwerkt.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Aanvullende informatie benodigd\",\"description\":\"Er is een aanvullende stap gevraagd om de dienst te koppelen. Doorloop het proces opnieuw om de gevraagde gegevens in te voeren.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Tijdelijk geblokkeerd\",\"description\":\"Te veel pogingen. Werk je gegevens bij op [%{name}](%{link}) en werk de connector later bij.\"},\"MAINTENANCE\":{\"title\":\"Website is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is of de verbinding moet worden bijgewerkt. Doorloop het proces later opnieuw of bekijk onze online-hulp.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Bestemming ontbreekt\",\"description\":\"Het lijkt er op dat de map niet aanwezig is op de bestemming. Herstel deze door je account opnieuw te koppelen.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Recentste algemene voorwaarden niet geaccepteerd\",\"description\":\"Het lijkt er op dat %{name} haar algemene voorwaarden heeft bijgewerkt. Controleer of de dienst is bijgewerkt. Als de fout blijft optreden, neem dan contact met ons op via [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Verbindingsfout\",\"description\":\"Er is een onbekende fout opgetreden. Probeer of het helpt om je gegevens bij te werken. Als dat niet helpt, neem dan contact met ons op via [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Actie benodigd op website van dienst\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt en een specifieke actie uitvoert. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"[%{name}](%{link}) vereist dat je de toegang opnieuw goedkeurt. Koppel je account '%{name}' opnieuw - er gaan geen gegevens verloren.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Account is niet beschikbaar\",\"description\":\"Het lijkt er op dat je account niet meer beschikbaar is. Controleer je account op [%{name}](%{link}) voordat je het opnieuw probeert.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Wachtwoord moet worden bijgewerkt\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je wachtwoord moet worden bijgewerkt. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"Nieuwe machtigingen benodigd\",\"description\":\"De connector is bijgewerkt en heeft nieuwe machtigingen nodig. Keur deze goed en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt om te kunnen synchroniseren. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"De recentste verbindingspoging is mislukt. Probeer het opnieuw en geef desgewenst een goedkeuringscode op.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Goedkeuring op website van dienst vereist\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt om te kunnen synchroniseren. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Onjuiste authenticatiecode\",\"description\":\"De opgegeven authenticatiecode is onjuist. Probeer het opnieuw.\"},\"VENDOR_DOWN\":{\"title\":\"Dienst is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is. Doorloop het proces later opnieuw.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Banksite is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is. Doorloop het proces later opnieuw.\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Dienst is niet beschikbaar\",\"description\":\"Het lijkt er op dat de bankconnectors overbelast zijn. Doorloop het proces later opnieuw.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"Dit account is al toegevoegd\",\"description\":\"Je hebt al een account met deze identificaties ingesteld.\"}}},\"fields\":{\"answer\":{\"label\":\"Geheim antwoord\"},\"birthdate\":{\"label\":\"Geboortedatum\",\"placeholder\":\"dd-mm-yyyy\"},\"code\":{\"label\":\"Geheime code\"},\"date\":{\"label\":\"Datum\",\"placeholder\":\"dd-mm-yyyy\"},\"email\":{\"label\":\"E-mailadres\"},\"firstname\":{\"label\":\"Voornaam\"},\"lastname\":{\"label\":\"Achternaam\"},\"login\":{\"label\":\"Gebruikersnaam\"},\"password\":{\"label\":\"Wachtwoord\"},\"phone\":{\"label\":\"Telefoonnummer\"},\"two_fa_code\":{\"label\":\"Authenticatiecode\"}},\"folder\":{\"administrative\":\"Administratief\",\"photos\":\"Foto's\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"Er is een update beschikbaar voor deze dienst.\",\"body\":{\"regular\":\"Voer de update uit om je gegevens op te kunnen blijven halen en over de nieuwste functies te beschikken:\",\"blocking\":\"Voer de update uit om je gegevens op te kunnen blijven halen:\"},\"button\":{\"label\":\"Update bekijken\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Toegangssleutel\"},\"accessTokenSecret\":{\"label\":\"Toegangssleutelgeheim\"},\"accountName\":{\"label\":\"Accountnaam\"},\"agreement\":{\"label\":\"Ik ga akkoord\"},\"apikey\":{\"label\":\"API-sleutel\"},\"appKey\":{\"label\":\"Appsleutel\"},\"appSecret\":{\"label\":\"Appgeheim\"},\"authCode\":{\"label\":\"Auth.code\"},\"bank_identifier\":{\"label\":\"Bankidentificatie (optioneel)\"},\"branchName\":{\"label\":\"Filiaal\"},\"cardNumber\":{\"label\":\"Kaartnummer\"},\"consumerKey\":{\"label\":\"Klantsleutel\"},\"consumerSecret\":{\"label\":\"Klantgeheim\"},\"dob\":{\"label\":\"Geboortedatum\"},\"folderPath\":{\"label\":\"Mappad\"},\"identifier\":{\"label\":\"Identificatie\"},\"loginUrl\":{\"label\":\"Inlog-url\"},\"namePath\":{\"label\":\"Mapnaam\"},\"new_identifier\":{\"label\":\"Identificatie\"},\"phoneNumber\":{\"label\":\"Telefoonnummer\"},\"profileName\":{\"label\":\"Profielnaam\"},\"refreshToken\":{\"label\":\"Toegangssleutel vernieuwen\"},\"secret\":{\"label\":\"Wachtwoord\"},\"timeout\":{\"label\":\"Vertraging (in ms)\"},\"token\":{\"label\":\"Toegangssleutel\"},\"tricountUrl\":{\"label\":\"Tricount-url\"}}},\"modal\":{\"aria-label\":\"Connector instellen\",\"konnector\":{\"error\":{\"title\":\"Je account kan niet worden opgehaald\",\"description\":\"Je account kan niet worden opgehaald (%{message}).\",\"button\":\"Sluiten\"}},\"accounts\":{\"title\":\"Kies een %{name}-account\",\"error\":{\"title\":\"Fout\",\"description\":\"Je account(s) kan/kunnen niet worden opgehaald\",\"retry\":\"Opnieuw proberen\"}},\"tabs\":{\"data\":\"Gegevens\",\"configuration\":\"Instellen\"},\"addAccount\":{\"title\":\"%{name} koppelen\",\"button\":\"Account toevoegen\"},\"deleteAccount\":{\"title\":\"Loskoppelen\",\"description\":\"Je account wordt losgekoppeld, maar belangrijke gegevens worden bewaard\",\"confirm\":\"Loskoppelen\",\"cancel\":\"Annuleren\"},\"updateAccount\":{\"general-subheader\":\"Algemeen\",\"identifiers\":\"Identificaties\",\"delete-account-success\":\"Het account is losgekoppeld\",\"delete-account-error\":\"Het account kan niet worden losgekoppeld. Probeer het later opnieuw of neem contact op met ons ondersteuningsteam.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Bank toevoegen\"},\"reconnect\":{\"label\":\"Opnieuw koppelen\"}},\"reconnect\":{\"label\":\"Opnieuw koppelen\"},\"connect\":{\"label\":\"Koppelen\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Sluiten\"},\"description\":\"Je gegevens zijn over een paar minuten beschikbaar op je Cozy en worden voortaan automatisch bijgewerkt.\",\"figure\":{\"alt\":\"gekoppeld\"},\"title\":\"Instellen voltooid!\"},\"twoFAForm\":{\"modal-label\":\"Authenticatie in twee stappen\",\"providers\":{\"default\":\"Voer de code in die je per e-mail of sms hebt ontvangen\",\"email\":\"Voer de code in die je per e-mail hebt ontvangen\",\"sms\":\"Voer de code in die je per sms hebt ontvangen\",\"app_code\":\"Voer de eenmalige code in die je kunt aanmaken in ${name}\",\"app\":\"Open de app van de dienst om de koppeling goed te keuren.\"},\"desc-2fa\":\"Open de app van de dienst om de koppeling goed te keuren. In sommige gevallen moet je twee keer toestemming geven.\",\"desc_1\":\"Met deze code kun je de koppeling bevestigen.\",\"desc_2\":\"De tweede code, om de koppeling te bevestigen, ontvang je op je telefoon of per e-mail.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Tweede code\"},\"retry\":\"Ongeldige code - probeer het opnieuw.\",\"CTA\":\"Verifiëren\"},\"account\":{\"success\":{\"title\":\"Instellen voltooid!\",\"connect\":\"Je gegevens zijn over een paar minuten beschikbaar op je Cozy en worden voortaan automatisch bijgewerkt.\",\"banksLinkText\":\"Accounts bekijken in %{appName}\",\"driveLinkText\":\"Map openen in Cozy Schijf\",\"button\":\"Sluiten\"}},\"maintenance\":{\"noService\":\"Dienst is onderbroken\",\"explanationTitle\":\"Wat gebeurt er allemaal?\"},\"suggestions\":{\"title\":\"Gegevens importeren uit %{name}\",\"data\":\"Door %{name} te installeren worden de volgende gegevens automatisch geïmporteerd:\",\"why\":\"Waarom is %{name} aanbevolen?\",\"reason_bank\":\"%{name} is aangetroffen in één van je bankoverschrijvingen. Geen zorgen: niemand anders heeft toegang tot deze informatie.\",\"install\":\"Installeren\",\"silence\":\"Niet meer aanbevelen\"},\"dataType\":{\"none\":\"%{name} heeft geen toegang tot je persoonlijke gegevens\",\"activity\":\"Mijn activiteiten\",\"appointment\":\"Mijn afspraken\",\"bankTransactions\":\"Mijn bankoverschrijvingen\",\"bankAccounts\":\"Mijn bankrekeningen\",\"bill\":\"Mijn rekeningen\",\"bloodPressure\":\"Mijn bloeddruk\",\"calendar\":\"Mijn agenda's\",\"certificate\":\"Mijn certificaten\",\"commit\":\"Mijn commits\",\"consumption\":\"Mijn consumpties\",\"contact\":\"Mijn contactpersonen\",\"contract\":\"Mijn contracten\",\"courseMaterial\":\"Mijn cursusmateriaal\",\"document\":\"Mijn documenten\",\"event\":\"Mijn gebeurtenissen\",\"family\":\"Mijn gezinsinformatie\",\"geopoint\":\"Mijn geolocaties\",\"heartbeat\":\"Mijn hartslagen\",\"home\":\"Mijn woninginformatie\",\"phonecommunicationlog\":\"Mijn oproepgeschiedenis\",\"picture\":\"Mijn afbeeldingen\",\"podcast\":\"Mijn podcasts\",\"profile\":\"Mijn klantprofiel\",\"refund\":\"Mijn terugbetalingen\",\"sinister\":\"Mijn sinisters\",\"sleepTime\":\"Mijn slaaptijd\",\"stepsNumber\":\"Mijn wandelstappen\",\"temperature\":\"Mijn temperatuurgegevens\",\"travelDate\":\"Mijn reisdatums\",\"tweet\":\"Mijn tweets\",\"videostream\":\"Mijn video's\",\"weight\":\"Mijn gewicht\"},\"vaultCiphersList\":{\"title\":\"Vanuit welk account wil je je gegevens importeren?\",\"otherAccount\":\"Uit ander account…\"},\"triggerManager\":{\"connecting\":\"Bezig met koppelen…\",\"confirmationModal\":{\"title\":\"Inloggegevens bijwerken?\",\"description\":\"Je vorige inloggegevens worden gewist - voeg een nieuw account toe om ze te bewaren.\",\"primaryText\":\"Bijwerken\",\"secondaryText\":\"Annuleren\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"Dit account is losgekoppeld, maar je gegevens zijn bewaard. Als je opnieuw wilt synchroniseren, stel dan je account opnieuw in middels de knop 'Bank toevoegen'.\"},\"konnectorBlock\":{\"account\":\"Klantaccount\",\"disconnected\":\"Losgekoppeld\",\"inMaintenance\":\"Onderhoudswerkzaamheden\",\"hasNewVersionAvailable\":\"Nieuwe versie beschikbaar\",\"fatalError\":\"Er is een fout opgetreden bij het herstellen van de dienst. Als het probleem zich blijft voordoen, neem dan contact met ons op via [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Recente reizen\",\"caption\":\"Bekijk je 5 recentste reizen van %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Vliegtuig\",\"BICYCLING\":\"Fiets\",\"CAR\":\"Auto\",\"SUBWAY\":\"Metro\",\"TRAIN\":\"Trein\",\"UNKNOWN\":\"\",\"WALKING\":\"Wandelen\"}},\"files\":{\"title\":\"Mijn documenten\",\"imported\":\"Geïmporteerd op %{date}\",\"caption\":\"Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van.\"}}}"); /***/ }), -/* 821 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) -var differenceInCalendarMonths = __webpack_require__(810) -var compareAsc = __webpack_require__(806) +/* 897 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -/** - * @category Month Helpers - * @summary Get the number of full months between the given dates. - * - * @description - * Get the number of full months between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full months - * - * @example - * // How many full months are between 31 January 2014 and 1 September 2014? - * var result = differenceInMonths( - * new Date(2014, 8, 1), - * new Date(2014, 0, 31) - * ) - * //=> 7 - */ -function differenceInMonths (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TWOFA_PROVIDERS", function() { return TWOFA_PROVIDERS; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TWOFA_USER_INPUT", function() { return TWOFA_USER_INPUT; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTwoFANeeded", function() { return isTwoFANeeded; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTwoFARetry", function() { return isTwoFARetry; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLoginSuccessHandled", function() { return isLoginSuccessHandled; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLoginSuccess", function() { return isLoginSuccess; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTwoFACodeProvider", function() { return getTwoFACodeProvider; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateTwoFAState", function() { return updateTwoFAState; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabel", function() { return getLabel; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "build", function() { return build; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAuth", function() { return mergeAuth; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVaultCipherId", function() { return getVaultCipherId; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setVaultCipherRelationship", function() { return setVaultCipherRelationship; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateTwoFaCode", function() { return updateTwoFaCode; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetState", function() { return resetState; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSessionResetIfNecessary", function() { return setSessionResetIfNecessary; }); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(162); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(295); +/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_merge__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var lodash_clone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(898); +/* harmony import */ var lodash_clone__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_clone__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(899); +/* harmony import */ var _manifest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(900); - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight)) - dateLeft.setMonth(dateLeft.getMonth() - sign * difference) - // Math.abs(diff in full months - diff in calendar months) === 1 if last calendar month is not full - // If so, result must be decreased by 1 in absolute value - var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastMonthNotFull) -} +var _TWOFA_USER_INPUT; -module.exports = differenceInMonths +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } -/***/ }), -/* 822 */ -/***/ (function(module, exports, __webpack_require__) { -var differenceInMonths = __webpack_require__(821) -/** - * @category Quarter Helpers - * @summary Get the number of full quarters between the given dates. - * - * @description - * Get the number of full quarters between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full quarters - * - * @example - * // How many full quarters are between 31 December 2013 and 2 July 2014? - * var result = differenceInQuarters( - * new Date(2014, 6, 2), - * new Date(2013, 11, 31) - * ) - * //=> 2 - */ -function differenceInQuarters (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMonths(dirtyDateLeft, dirtyDateRight) / 3 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} -module.exports = differenceInQuarters -/***/ }), -/* 823 */ -/***/ (function(module, exports, __webpack_require__) { +var DEFAULT_TWOFA_CODE_PROVIDER_TYPE = 'default'; +var TWOFA_PROVIDERS = { + EMAIL: 'email', + SMS: 'sms', + APP_CODE: 'app_code', + APP: 'app' +}; // For some 2FA modes, we do not need user input, this is for example the +// case for the "app" two fa where the user will open the website/app of the +// provider and click on a notification or a button. For those modes, we +// does not need to show an input field with a submit button. We only have +// to wait, the konnector should tell us when everything is OK. -var differenceInMilliseconds = __webpack_require__(817) +var TWOFA_USER_INPUT = (_TWOFA_USER_INPUT = { + default: true +}, _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.EMAIL, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.SMS, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.APP_CODE, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.APP, false), _TWOFA_USER_INPUT); +var TWOFA_NEEDED_STATUS = 'TWOFA_NEEDED'; +var TWOFA_NEEDED_RETRY_STATUS = 'TWOFA_NEEDED_RETRY'; +var RESET_SESSION_STATE = 'RESET_SESSION'; +var HANDLE_LOGIN_SUCCESS_STATE = 'HANDLE_LOGIN_SUCCESS'; +var LOGIN_SUCCESS_STATE = 'LOGIN_SUCCESS'; +/** + * Return a boolean to know if the account is in a two fa code needed + * status + * @param {String} status Account two FA Status + * @return {Boolean} + */ +var isTwoFANeeded = function isTwoFANeeded(status) { + if (!status) return false; + return status.split('.')[0] === TWOFA_NEEDED_STATUS; +}; +var isTwoFARetry = function isTwoFARetry(status) { + if (!status) return false; + return status.split('.')[0] === TWOFA_NEEDED_RETRY_STATUS; +}; +var isLoginSuccessHandled = function isLoginSuccessHandled(status) { + return status === HANDLE_LOGIN_SUCCESS_STATE; +}; +var isLoginSuccess = function isLoginSuccess(status) { + return status === LOGIN_SUCCESS_STATE; +}; /** - * @category Second Helpers - * @summary Get the number of seconds between the given dates. - * - * @description - * Get the number of seconds between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of seconds - * - * @example - * // How many seconds are between - * // 2 July 2014 12:30:07.999 and 2 July 2014 12:30:20.000? - * var result = differenceInSeconds( - * new Date(2014, 6, 2, 12, 30, 20, 0), - * new Date(2014, 6, 2, 12, 30, 7, 999) - * ) - * //=> 12 + * Return the status object key matching the status value + * @param {String} status Account document + * @return {String} Two FA Code providing type or default one if not known */ -function differenceInSeconds (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInMilliseconds(dirtyDateLeft, dirtyDateRight) / 1000 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} -module.exports = differenceInSeconds +var getTwoFACodeProvider = function getTwoFACodeProvider(account) { + if (!account || !account.state) return DEFAULT_TWOFA_CODE_PROVIDER_TYPE; + var codeParts = account.state ? account.state.split('.') : []; + if (codeParts.length > 1) { + return TWOFA_PROVIDERS[codeParts[1]] || DEFAULT_TWOFA_CODE_PROVIDER_TYPE; + } else { + return DEFAULT_TWOFA_CODE_PROVIDER_TYPE; + } +}; +var updateTwoFAState = function updateTwoFAState(account_, _ref) { + var retry = _ref.retry, + type = _ref.type; + var account = lodash_clone__WEBPACK_IMPORTED_MODULE_3___default()(account_); + var state = retry ? 'TWOFA_NEEDED_RETRY' : 'TWOFA_NEEDED'; -/***/ }), -/* 824 */ -/***/ (function(module, exports, __webpack_require__) { + if (type === 'email') { + state += '.EMAIL'; + } else if (type === 'sms') { + state += '.SMS'; + } else if (type === 'app_code') { + state += '.APP_CODE'; + } else if (type === 'app') { + state += '.APP'; + } -var differenceInDays = __webpack_require__(815) + return lodash_merge__WEBPACK_IMPORTED_MODULE_2___default()(account, { + state: state, + twoFACode: null + }); +}; +/** + * Returns the label for the given account. + * This label is by default the value for the identifier field. + * If there is no value for this field, the label is the io.cozy.accounts + * document id. + * @param {Object} account io.cozy.accounts documents + * @return {string} The label associated to this account. + */ +var getLabel = function getLabel(account) { + return lodash_get__WEBPACK_IMPORTED_MODULE_1___default()(account, "auth.".concat(account.identifier)) || account._id; +}; /** - * @category Week Helpers - * @summary Get the number of full weeks between the given dates. - * - * @description - * Get the number of full weeks between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full weeks - * - * @example - * // How many full weeks are between 5 July 2014 and 20 July 2014? - * var result = differenceInWeeks( - * new Date(2014, 6, 20), - * new Date(2014, 6, 5) - * ) - * //=> 2 + * Transforms AccountForm data to io.cozy.accounts document + * @param {object} konnector Konnector related to account + * @param {object} data Data from AccountForm + * @return {object} io.cozy.accounts attributes */ -function differenceInWeeks (dirtyDateLeft, dirtyDateRight) { - var diff = differenceInDays(dirtyDateLeft, dirtyDateRight) / 7 - return diff > 0 ? Math.floor(diff) : Math.ceil(diff) -} -module.exports = differenceInWeeks +var build = function build(konnector, authData) { + Object(_assert__WEBPACK_IMPORTED_MODULE_4__["default"])(konnector.slug, 'Cannot build an account when the konnector has no slug'); // We are not at the final target for io.cozy.accounts. + // For now we are just ensuring legacy + return { + auth: authData, + account_type: konnector.slug, + identifier: _manifest__WEBPACK_IMPORTED_MODULE_5__["default"].getIdentifier(konnector.fields), + state: null + }; +}; +/** + * Merges existing io.cozy.accounts auth with Auth data from AccountForm + * @param {object} account io.cozy.accounts document + * @param {object} data Data from AccountForm + * @return {object} io.cozy.accounts attributes + */ -/***/ }), -/* 825 */ -/***/ (function(module, exports, __webpack_require__) { +var mergeAuth = function mergeAuth(account, authData) { + return _objectSpread(_objectSpread({}, account), {}, { + auth: lodash_merge__WEBPACK_IMPORTED_MODULE_2___default()({}, account.auth, authData) + }); +}; +/** + * Gets the vault cipher relationship to an account + * @param {object} account io.cozy.accounts document + * @return {string} cipher uuid + */ -var parse = __webpack_require__(772) -var differenceInCalendarYears = __webpack_require__(814) -var compareAsc = __webpack_require__(806) +var getVaultCipherId = function getVaultCipherId(account) { + var relationshipData = lodash_get__WEBPACK_IMPORTED_MODULE_1___default()(account, 'relationships.vaultCipher.data'); + if (!relationshipData) { + return; + } else if (Array.isArray(relationshipData)) { + // Support for bug from cipher migration. See link below for context. + // https://github.com/cozy/cozy-stack/pull/2535#discussion_r433986611 + return relationshipData[0]._id; + } else { + return relationshipData._id; + } +}; /** - * @category Year Helpers - * @summary Get the number of full years between the given dates. - * - * @description - * Get the number of full years between the given dates. - * - * @param {Date|String|Number} dateLeft - the later date - * @param {Date|String|Number} dateRight - the earlier date - * @returns {Number} the number of full years - * - * @example - * // How many full years are between 31 December 2013 and 11 February 2015? - * var result = differenceInYears( - * new Date(2015, 1, 11), - * new Date(2013, 11, 31) - * ) - * //=> 1 + * Adds or updates a vault cipher relationship to an account + * @param {object} account io.cozy.accounts document + * @param {string} vaultCipherId The id of the cipher mathcing this account in the vault + * @return {object} io.cozy.accounts attributes */ -function differenceInYears (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - var sign = compareAsc(dateLeft, dateRight) - var difference = Math.abs(differenceInCalendarYears(dateLeft, dateRight)) - dateLeft.setFullYear(dateLeft.getFullYear() - sign * difference) +var setVaultCipherRelationship = function setVaultCipherRelationship(account, vaultCipherId) { + return _objectSpread(_objectSpread({}, account), {}, { + relationships: _objectSpread(_objectSpread({}, account.relationships), {}, { + vaultCipher: { + data: { + _id: vaultCipherId, + _type: 'com.bitwarden.ciphers', + _protocol: 'bitwarden' + } + } + }) + }); +}; +/** + * Update Two FA code from TwoFAForm into io.cozy.accounts document + * @param {object} account io.cozy.accounts document + * @param {object} code Code from TwoFAForm + * @return {object} io.cozy.accounts attributes + */ - // Math.abs(diff in full years - diff in calendar years) === 1 if last calendar year is not full - // If so, result must be decreased by 1 in absolute value - var isLastYearNotFull = compareAsc(dateLeft, dateRight) === -sign - return sign * (difference - isLastYearNotFull) -} +var updateTwoFaCode = function updateTwoFaCode(account, code) { + return _objectSpread(_objectSpread({}, resetState(account)), {}, { + twoFACode: code + }); +}; +/** + * Reset the account state + * @param {Object} account Account document + * @return {object} Changed account document + */ -module.exports = differenceInYears +var resetState = function resetState(account) { + return _objectSpread(_objectSpread({}, account), {}, { + state: null + }); +}; +/** + * Set a state to reset the konnector session into io.cozy.accounts document + * only if necessary, if password/passphrase have changed + * @param {object} account io.cozy.accounts document + * @return {object} io.cozy.accounts updated document + */ +var setSessionResetIfNecessary = function setSessionResetIfNecessary(account) { + var changedFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var isPasswordChanged = !!account && !!(changedFields.password || changedFields.passphrase); + return isPasswordChanged ? _objectSpread(_objectSpread({}, account), {}, { + state: RESET_SESSION_STATE + }) : account; +}; +/* harmony default export */ __webpack_exports__["default"] = ({ + build: build, + getLabel: getLabel, + getTwoFACodeProvider: getTwoFACodeProvider, + isTwoFANeeded: isTwoFANeeded, + isTwoFARetry: isTwoFARetry, + isLoginSuccess: isLoginSuccess, + isLoginSuccessHandled: isLoginSuccessHandled, + mergeAuth: mergeAuth, + resetState: resetState, + setSessionResetIfNecessary: setSessionResetIfNecessary, + updateTwoFaCode: updateTwoFaCode, + setVaultCipherRelationship: setVaultCipherRelationship, + getVaultCipherId: getVaultCipherId +}); /***/ }), -/* 826 */ +/* 898 */ /***/ (function(module, exports, __webpack_require__) { -var compareDesc = __webpack_require__(807) -var parse = __webpack_require__(772) -var differenceInSeconds = __webpack_require__(823) -var differenceInMonths = __webpack_require__(821) -var enLocale = __webpack_require__(827) - -var MINUTES_IN_DAY = 1440 -var MINUTES_IN_ALMOST_TWO_DAYS = 2520 -var MINUTES_IN_MONTH = 43200 -var MINUTES_IN_TWO_MONTHS = 86400 +var baseClone = __webpack_require__(214); -/** - * @category Common Helpers - * @summary Return the distance between the given dates in words. - * - * @description - * Return the distance between the given dates in words. - * - * | Distance between dates | Result | - * |-------------------------------------------------------------------|---------------------| - * | 0 ... 30 secs | less than a minute | - * | 30 secs ... 1 min 30 secs | 1 minute | - * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | - * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | - * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | - * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | - * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | - * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | - * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | - * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | - * | 1 yr ... 1 yr 3 months | about 1 year | - * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | - * | 1 yr 9 months ... 2 yrs | almost 2 years | - * | N yrs ... N yrs 3 months | about N years | - * | N yrs 3 months ... N yrs 9 months | over N years | - * | N yrs 9 months ... N+1 yrs | almost N+1 years | - * - * With `options.includeSeconds == true`: - * | Distance between dates | Result | - * |------------------------|----------------------| - * | 0 secs ... 5 secs | less than 5 seconds | - * | 5 secs ... 10 secs | less than 10 seconds | - * | 10 secs ... 20 secs | less than 20 seconds | - * | 20 secs ... 40 secs | half a minute | - * | 40 secs ... 60 secs | less than a minute | - * | 60 secs ... 90 secs | 1 minute | - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date|String|Number} date - the other date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed - * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; + +/** + * Creates a shallow clone of `value`. * - * @example - * // What is the distance between 2 July 2014 and 1 January 2015? - * var result = distanceInWords( - * new Date(2014, 6, 2), - * new Date(2015, 0, 1) - * ) - * //=> '6 months' + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep * @example - * // What is the distance between 1 January 2015 00:00:15 - * // and 1 January 2015 00:00:00, including seconds? - * var result = distanceInWords( - * new Date(2015, 0, 1, 0, 0, 15), - * new Date(2015, 0, 1, 0, 0, 0), - * {includeSeconds: true} - * ) - * //=> 'less than 20 seconds' * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, with a suffix? - * var result = distanceInWords( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {addSuffix: true} - * ) - * //=> 'about 1 year ago' + * var objects = [{ 'a': 1 }, { 'b': 2 }]; * - * @example - * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWords( - * new Date(2016, 7, 1), - * new Date(2015, 0, 1), - * {locale: eoLocale} - * ) - * //=> 'pli ol 1 jaro' + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true */ -function distanceInWords (dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {} +function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); +} - var comparison = compareDesc(dirtyDateToCompare, dirtyDate) +module.exports = clone; - var locale = options.locale - var localize = enLocale.distanceInWords.localize - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize - } - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - } +/***/ }), +/* 899 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - var dateLeft, dateRight - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare) - dateRight = parse(dirtyDate) - } else { - dateLeft = parse(dirtyDate) - dateRight = parse(dirtyDateToCompare) +"use strict"; +__webpack_require__.r(__webpack_exports__); +var assert = function assert(condition, message) { + if (!condition) { + throw new Error(message); } +}; - var seconds = differenceInSeconds(dateRight, dateLeft) - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() - var minutes = Math.round(seconds / 60) - offset - var months +/* harmony default export */ __webpack_exports__["default"] = (assert); - // 0 up to 2 mins - if (minutes < 2) { - if (options.includeSeconds) { - if (seconds < 5) { - return localize('lessThanXSeconds', 5, localizeOptions) - } else if (seconds < 10) { - return localize('lessThanXSeconds', 10, localizeOptions) - } else if (seconds < 20) { - return localize('lessThanXSeconds', 20, localizeOptions) - } else if (seconds < 40) { - return localize('halfAMinute', null, localizeOptions) - } else if (seconds < 60) { - return localize('lessThanXMinutes', 1, localizeOptions) - } else { - return localize('xMinutes', 1, localizeOptions) - } - } else { - if (minutes === 0) { - return localize('lessThanXMinutes', 1, localizeOptions) - } else { - return localize('xMinutes', minutes, localizeOptions) - } - } +/***/ }), +/* 900 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // 2 mins up to 0.75 hrs - } else if (minutes < 45) { - return localize('xMinutes', minutes, localizeOptions) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ROLE_IDENTIFIER", function() { return ROLE_IDENTIFIER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "predefinedLabels", function() { return predefinedLabels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "legacyLabels", function() { return legacyLabels; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sanitize", function() { return sanitize; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDataTypes", function() { return getDataTypes; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorName", function() { return getKonnectorName; }); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var lodash_flow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(449); +/* harmony import */ var lodash_flow__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_flow__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(213); +/* harmony import */ var lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var lodash_findKey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(261); +/* harmony import */ var lodash_findKey__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_findKey__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(61); +/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_5__); +/* harmony import */ var lodash_pickBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(329); +/* harmony import */ var lodash_pickBy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash_pickBy__WEBPACK_IMPORTED_MODULE_6__); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(162); +/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_7__); +/* harmony import */ var lodash_intersection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(389); +/* harmony import */ var lodash_intersection__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash_intersection__WEBPACK_IMPORTED_MODULE_8__); - // 0.75 hrs up to 1.5 hrs - } else if (minutes < 90) { - return localize('aboutXHours', 1, localizeOptions) - // 1.5 hrs up to 24 hrs - } else if (minutes < MINUTES_IN_DAY) { - var hours = Math.round(minutes / 60) - return localize('aboutXHours', hours, localizeOptions) - // 1 day up to 1.75 days - } else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) { - return localize('xDays', 1, localizeOptions) +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - // 1.75 days up to 30 days - } else if (minutes < MINUTES_IN_MONTH) { - var days = Math.round(minutes / MINUTES_IN_DAY) - return localize('xDays', days, localizeOptions) +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - // 1 month up to 2 months - } else if (minutes < MINUTES_IN_TWO_MONTHS) { - months = Math.round(minutes / MINUTES_IN_MONTH) - return localize('aboutXMonths', months, localizeOptions) - } +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } - months = differenceInMonths(dateRight, dateLeft) +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - // 2 months up to 12 months - if (months < 12) { - var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH) - return localize('xMonths', nearestMonth, localizeOptions) +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } - // 1 year up to max Date - } else { - var monthsSinceStartOfYear = months % 12 - var years = Math.floor(months / 12) - // N years up to 1 years 3 months - if (monthsSinceStartOfYear < 3) { - return localize('aboutXYears', years, localizeOptions) - // N years 3 months up to N years 9 months - } else if (monthsSinceStartOfYear < 9) { - return localize('overXYears', years, localizeOptions) - // N years 9 months up to N year 12 months - } else { - return localize('almostXYears', years + 1, localizeOptions) - } - } -} -module.exports = distanceInWords -/***/ }), -/* 827 */ -/***/ (function(module, exports, __webpack_require__) { -var buildDistanceInWordsLocale = __webpack_require__(828) -var buildFormatLocale = __webpack_require__(829) +var ROLE_IDENTIFIER = 'identifier'; +/** + * We defined "predefined labels", as labels wich can be used in manifest, to + * refer to existing locales. + * @example + * This declaration expect that applications resolve automatically the label + * of the field "name", without relying on locales declared in konnector + * manifest. + * ``` + * "fields": { + * "name": { + * "label": "firsname", + * "type": "text" + * } + * } + * ``` + */ + +var predefinedLabels = ['answer', 'birthdate', 'code', 'date', 'email', 'firstname', 'lastname', 'login', 'password', 'phone']; +/** + * Out of scope labels already used, should be transferred directly in manifests + * in the future. + */ + +var legacyLabels = ['branchName' // Used in banking konnectors +]; +/** + * Legacy login fields declared by some konnectors + */ + +var legacyLoginFields = ['login', 'identifier', 'new_identifier', 'email']; +/** + * Returns a key/value object with field as key and default, if it exists in + * fields parameter. + * @example + * ``` + * const fields = { + * username: { + * type: "text" + * }, + * favoriteColor: { + * default: "green" + * type: "text" + * } + * } + * const result = defaultFieldsValues(fields) + * ``` + * `result` here is + * ``` + * { + * favoriteColor: "green" + * } + * ``` + * Def + * @param {object} fields Fields object from manifest + * @return {object} key/value pairs of default values + */ +var defaultFieldsValues = function defaultFieldsValues(fields) { + return lodash_mapValues__WEBPACK_IMPORTED_MODULE_5___default()(lodash_pickBy__WEBPACK_IMPORTED_MODULE_6___default()(fields, function (value) { + return !!value.default; + }), function (value) { + return value.default; + }); +}; /** - * @category Locales - * @summary English locale. + * Returns the key for the field having the role=identifier attribute + * @param {Object} fields Konnector fields + * @return {string} The key for the identifier field, example 'login' */ -module.exports = { - distanceInWords: buildDistanceInWordsLocale(), - format: buildFormatLocale() -} - - -/***/ }), -/* 828 */ -/***/ (function(module, exports) { - -function buildDistanceInWordsLocale () { - var distanceInWordsLocale = { - lessThanXSeconds: { - one: 'less than a second', - other: 'less than {{count}} seconds' - }, - - xSeconds: { - one: '1 second', - other: '{{count}} seconds' - }, - - halfAMinute: 'half a minute', - lessThanXMinutes: { - one: 'less than a minute', - other: 'less than {{count}} minutes' - }, - - xMinutes: { - one: '1 minute', - other: '{{count}} minutes' - }, - - aboutXHours: { - one: 'about 1 hour', - other: 'about {{count}} hours' - }, - xHours: { - one: '1 hour', - other: '{{count}} hours' - }, +var getIdentifier = function getIdentifier() { + var fields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return lodash_findKey__WEBPACK_IMPORTED_MODULE_4___default()(sanitizeIdentifier(fields), function (field) { + return field.role === ROLE_IDENTIFIER; + }); +}; +/** + * Ensures old fields are removed + * @param {Object} fields Manifest fields + * @return {Object} Sanitized manifest fields + */ - xDays: { - one: '1 day', - other: '{{count}} days' - }, - aboutXMonths: { - one: 'about 1 month', - other: 'about {{count}} months' - }, +var removeOldFields = function removeOldFields(fields) { + var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); - xMonths: { - one: '1 month', - other: '{{count}} months' - }, + delete sanitized.advancedFields; + return sanitized; +}; +/** + * Ensures that fields has at least one field with the role 'identifier' + * @param {Object} [fields={}] Manifest fields + * @return {Object} Sanitized manifest fields + */ - aboutXYears: { - one: 'about 1 year', - other: 'about {{count}} years' - }, - xYears: { - one: '1 year', - other: '{{count}} years' - }, +var sanitizeIdentifier = function sanitizeIdentifier(fields) { + var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); - overXYears: { - one: 'over 1 year', - other: 'over {{count}} years' - }, + var hasIdentifier = false; - almostXYears: { - one: 'almost 1 year', - other: 'almost {{count}} years' + for (var fieldName in sanitized) { + if (sanitized[fieldName].role === ROLE_IDENTIFIER) { + if (hasIdentifier) delete sanitized[fieldName].role;else hasIdentifier = true; } } - function localize (token, count, options) { - options = options || {} + if (hasIdentifier) return sanitized; - var result - if (typeof distanceInWordsLocale[token] === 'string') { - result = distanceInWordsLocale[token] - } else if (count === 1) { - result = distanceInWordsLocale[token].one - } else { - result = distanceInWordsLocale[token].other.replace('{{count}}', count) - } + var _iterator = _createForOfIteratorHelper(legacyLoginFields), + _step; - if (options.addSuffix) { - if (options.comparison > 0) { - return 'in ' + result - } else { - return result + ' ago' + try { + for (_iterator.s(); !(_step = _iterator.n()).done;) { + var name = _step.value; + + if (sanitized[name]) { + sanitized[name].role = ROLE_IDENTIFIER; + return sanitized; } } - - return result + } catch (err) { + _iterator.e(err); + } finally { + _iterator.f(); } - return { - localize: localize + for (var _fieldName in sanitized) { + if (sanitized[_fieldName].type !== 'password') { + sanitized[_fieldName].role = ROLE_IDENTIFIER; + return sanitized; + } } -} - -module.exports = buildDistanceInWordsLocale + return sanitized; +}; +/** + * Ensures every field not explicitely tagged as not required is required + * @param {Object} [fields={}] Manifest fields + * @return {Object} Sanitized manifest fields + */ -/***/ }), -/* 829 */ -/***/ (function(module, exports, __webpack_require__) { -var buildFormattingTokensRegExp = __webpack_require__(830) +var sanitizeRequired = function sanitizeRequired(fields) { + var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); -function buildFormatLocale () { - // Note: in English, the names of days of the week and months are capitalized. - // If you are making a new locale based on this one, check if the same is true for the language you're working on. - // Generally, formatted dates should look like they are in the middle of a sentence, - // e.g. in Spanish language the weekdays and months should be in the lowercase. - var months3char = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] - var monthsFull = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'] - var weekdays2char = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'] - var weekdays3char = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] - var weekdaysFull = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] - var meridiemUppercase = ['AM', 'PM'] - var meridiemLowercase = ['am', 'pm'] - var meridiemFull = ['a.m.', 'p.m.'] + for (var fieldName in sanitized) { + var field = sanitized[fieldName]; // Ensure legacy for field isRequired - var formatters = { - // Month: Jan, Feb, ..., Dec - 'MMM': function (date) { - return months3char[date.getMonth()] - }, + var required = typeof field.required === 'undefined' ? field.isRequired : field.required; + sanitized[fieldName].required = typeof required === 'boolean' ? required : true; + } - // Month: January, February, ..., December - 'MMMM': function (date) { - return monthsFull[date.getMonth()] - }, + return sanitized; +}; - // Day of week: Su, Mo, ..., Sa - 'dd': function (date) { - return weekdays2char[date.getDay()] - }, +var legacyEncryptedFields = ['secret', 'dob', 'code', 'answer', 'access_token', 'refresh_token', 'appSecret']; +/** + * Ensures: + * * any field flagged as encrypted keeps its flag + * * any legacy encrypted field is tagged as encrypted + * @param {Object} [fields={}] Manifest fields + * @return {Object} Sanitized Manifest fields + */ - // Day of week: Sun, Mon, ..., Sat - 'ddd': function (date) { - return weekdays3char[date.getDay()] - }, +var sanitizeEncrypted = function sanitizeEncrypted(fields) { + var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); - // Day of week: Sunday, Monday, ..., Saturday - 'dddd': function (date) { - return weekdaysFull[date.getDay()] - }, + for (var fieldName in sanitized) { + var field = sanitized[fieldName]; + if (typeof field.encrypted !== 'boolean') field.encrypted = field.type === 'password' || legacyEncryptedFields.includes(fieldName); + } - // AM, PM - 'A': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemUppercase[1] : meridiemUppercase[0] - }, + return sanitized; +}; +/* flow() is like compose() but not in reverse order */ - // am, pm - 'a': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemLowercase[1] : meridiemLowercase[0] - }, - // a.m., p.m. - 'aa': function (date) { - return (date.getHours() / 12) >= 1 ? meridiemFull[1] : meridiemFull[0] - } - } +var sanitizeFields = lodash_flow__WEBPACK_IMPORTED_MODULE_2___default()([removeOldFields, sanitizeIdentifier, sanitizeRequired, sanitizeEncrypted]); - // Generate ordinal version of formatters: M -> Mo, D -> Do, etc. - var ordinalFormatters = ['M', 'D', 'DDD', 'd', 'Q', 'W'] - ordinalFormatters.forEach(function (formatterToken) { - formatters[formatterToken + 'o'] = function (date, formatters) { - return ordinal(formatters[formatterToken](date)) - } - }) +var sanitize = function sanitize() { + var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return manifest.fields ? _objectSpread(_objectSpread({}, manifest), {}, { + fields: sanitizeFields(manifest.fields) + }) : manifest; +}; +var getDataTypes = function getDataTypes() { + var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(manifest, 'data_types'); +}; +var getKonnectorName = function getKonnectorName() { + var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + return lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(manifest, 'name'); +}; +/** + * Get fields value for a given konnector and account. + * Values present in the account are used and merged with default ones from the + * konnector's manifest + * + * @param {Object} konnector - an io.cozy.konnectors document + * @param {Object} account - an io.cozy.accounts document + * + * @returns {Object} An object with values for the fields + */ - return { - formatters: formatters, - formattingTokensRegExp: buildFormattingTokensRegExp(formatters) - } -} +var getFieldsValues = function getFieldsValues(konnector, account) { + var fields = konnector.fields; + var sanitizedFields = sanitizeFields(fields); + var defaultValues = defaultFieldsValues(sanitizedFields); + var initialValues = account && account.auth; -function ordinal (number) { - var rem100 = number % 100 - if (rem100 > 20 || rem100 < 10) { - switch (rem100 % 10) { - case 1: - return number + 'st' - case 2: - return number + 'nd' - case 3: - return number + 'rd' - } - } - return number + 'th' -} + var initialAndDefaultValues = _objectSpread(_objectSpread({}, defaultValues), initialValues); -module.exports = buildFormatLocale + return initialAndDefaultValues; +}; +/** + * Get required fields names for a given konnector + * + * @param {Object} konnector - an io.cozy.konnectors document + * + * @returns {string[]} An array of all required fields names + */ -/***/ }), -/* 830 */ -/***/ (function(module, exports) { +var getRequiredFields = function getRequiredFields(konnector) { + var fields = konnector.fields; + var sanitizedFields = sanitizeFields(fields); + var requiredFields = Object.entries(sanitizedFields).filter(function (_ref) { + var _ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_ref, 2), + value = _ref2[1]; -var commonFormatterKeys = [ - 'M', 'MM', 'Q', 'D', 'DD', 'DDD', 'DDDD', 'd', - 'E', 'W', 'WW', 'YY', 'YYYY', 'GG', 'GGGG', - 'H', 'HH', 'h', 'hh', 'm', 'mm', - 's', 'ss', 'S', 'SS', 'SSS', - 'Z', 'ZZ', 'X', 'x' -] + return value.required; + }).map(function (_ref3) { + var _ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_ref3, 1), + key = _ref4[0]; -function buildFormattingTokensRegExp (formatters) { - var formatterKeys = [] - for (var key in formatters) { - if (formatters.hasOwnProperty(key)) { - formatterKeys.push(key) - } - } + return key; + }); + return requiredFields; +}; - var formattingTokens = commonFormatterKeys - .concat(formatterKeys) - .sort() - .reverse() - var formattingTokensRegExp = new RegExp( - '(\\[[^\\[]*\\])|(\\\\)?' + '(' + formattingTokens.join('|') + '|.)', 'g' - ) +var hasValuesForRequiredFields = function hasValuesForRequiredFields(konnector, values) { + var requiredFields = getRequiredFields(konnector); + var hasValuesForRequiredFields = lodash_intersection__WEBPACK_IMPORTED_MODULE_8___default()(Object.keys(values), requiredFields).length === requiredFields.length; + return hasValuesForRequiredFields; +}; - return formattingTokensRegExp -} +/* harmony default export */ __webpack_exports__["default"] = ({ + defaultFieldsValues: defaultFieldsValues, + getIdentifier: getIdentifier, + sanitize: sanitize, + sanitizeFields: sanitizeFields, + getDataTypes: getDataTypes, + getKonnectorName: getKonnectorName, + getFieldsValues: getFieldsValues, + getRequiredFields: getRequiredFields, + hasValuesForRequiredFields: hasValuesForRequiredFields +}); -module.exports = buildFormattingTokensRegExp +/***/ }), +/* 901 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromFrequency", function() { return fromFrequency; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromKonnector", function() { return fromKonnector; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toFrequency", function() { return toFrequency; }); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); +/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _daytime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(902); -/***/ }), -/* 831 */ -/***/ (function(module, exports, __webpack_require__) { -var compareDesc = __webpack_require__(807) -var parse = __webpack_require__(772) -var differenceInSeconds = __webpack_require__(823) -var enLocale = __webpack_require__(827) -var MINUTES_IN_DAY = 1440 -var MINUTES_IN_MONTH = 43200 -var MINUTES_IN_YEAR = 525600 +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } -/** - * @category Common Helpers - * @summary Return the distance between the given dates in words. - * - * @description - * Return the distance between the given dates in words, using strict units. - * This is like `distanceInWords`, but does not use helpers like 'almost', 'over', - * 'less than' and the like. - * - * | Distance between dates | Result | - * |------------------------|---------------------| - * | 0 ... 59 secs | [0..59] seconds | - * | 1 ... 59 mins | [1..59] minutes | - * | 1 ... 23 hrs | [1..23] hours | - * | 1 ... 29 days | [1..29] days | - * | 1 ... 11 months | [1..11] months | - * | 1 ... N years | [1..N] years | - * - * @param {Date|String|Number} dateToCompare - the date to compare with - * @param {Date|String|Number} date - the other date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.addSuffix=false] - result indicates if the second date is earlier or later than the first - * @param {'s'|'m'|'h'|'d'|'M'|'Y'} [options.unit] - if specified, will force a unit - * @param {'floor'|'ceil'|'round'} [options.partialMethod='floor'] - which way to round partial units - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words - * - * @example - * // What is the distance between 2 July 2014 and 1 January 2015? - * var result = distanceInWordsStrict( - * new Date(2014, 6, 2), - * new Date(2015, 0, 2) - * ) - * //=> '6 months' - * - * @example - * // What is the distance between 1 January 2015 00:00:15 - * // and 1 January 2015 00:00:00? - * var result = distanceInWordsStrict( - * new Date(2015, 0, 1, 0, 0, 15), - * new Date(2015, 0, 1, 0, 0, 0), - * ) - * //=> '15 seconds' - * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, with a suffix? - * var result = distanceInWordsStrict( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {addSuffix: true} - * ) - * //=> '1 year ago' - * - * @example - * // What is the distance from 1 January 2016 - * // to 1 January 2015, in minutes? - * var result = distanceInWordsStrict( - * new Date(2016, 0, 1), - * new Date(2015, 0, 1), - * {unit: 'm'} - * ) - * //=> '525600 minutes' - * - * @example - * // What is the distance from 1 January 2016 - * // to 28 January 2015, in months, rounded up? - * var result = distanceInWordsStrict( - * new Date(2015, 0, 28), - * new Date(2015, 0, 1), - * {unit: 'M', partialMethod: 'ceil'} - * ) - * //=> '1 month' - * - * @example - * // What is the distance between 1 August 2016 and 1 January 2015 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWordsStrict( - * new Date(2016, 7, 1), - * new Date(2015, 0, 1), - * {locale: eoLocale} - * ) - * //=> '1 jaro' - */ -function distanceInWordsStrict (dirtyDateToCompare, dirtyDate, dirtyOptions) { - var options = dirtyOptions || {} +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - var comparison = compareDesc(dirtyDateToCompare, dirtyDate) - var locale = options.locale - var localize = enLocale.distanceInWords.localize - if (locale && locale.distanceInWords && locale.distanceInWords.localize) { - localize = locale.distanceInWords.localize - } +var DAILY = 'daily'; +var HOURLY = 'hourly'; +var MONTHLY = 'monthly'; +var WEEKLY = 'weekly'; +var VALID_FREQUENCIES = [DAILY, HOURLY, MONTHLY, WEEKLY]; +var DEFAULT_FREQUENCY = WEEKLY; // By default konnectors are run at random hour between 12:00PM and 05:00AM. - var localizeOptions = { - addSuffix: Boolean(options.addSuffix), - comparison: comparison - } +var DEFAULT_TIME_INTERVAL = [0, 5]; +/** + * Build a cron string for given konnector with given options + * See https://docs.cozy.io/en/cozy-stack/jobs/#cron-syntax + * @param {string} frequency Frequency from `hourly`, `daily`, `weekly` or + * `monthly`. + * @param {object} options Object which may contain `dayOfMonth`, + * `dayOfWeek`, hours`, `minutes`. + * @return {string} The cron definition for trigger + */ - var dateLeft, dateRight - if (comparison > 0) { - dateLeft = parse(dirtyDateToCompare) - dateRight = parse(dirtyDate) - } else { - dateLeft = parse(dirtyDate) - dateRight = parse(dirtyDateToCompare) - } +var fromFrequency = function fromFrequency(frequency) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var sanitizedFrequency = VALID_FREQUENCIES.includes(frequency) ? frequency : DEFAULT_FREQUENCY; + var _options$dayOfMonth = options.dayOfMonth, + dayOfMonth = _options$dayOfMonth === void 0 ? 1 : _options$dayOfMonth, + _options$dayOfWeek = options.dayOfWeek, + dayOfWeek = _options$dayOfWeek === void 0 ? 1 : _options$dayOfWeek, + _options$hours = options.hours, + hours = _options$hours === void 0 ? 0 : _options$hours, + _options$minutes = options.minutes, + minutes = _options$minutes === void 0 ? 0 : _options$minutes; - var unit - var mathPartial = Math[options.partialMethod ? String(options.partialMethod) : 'floor'] - var seconds = differenceInSeconds(dateRight, dateLeft) - var offset = dateRight.getTimezoneOffset() - dateLeft.getTimezoneOffset() - var minutes = mathPartial(seconds / 60) - offset - var hours, days, months, years + switch (sanitizedFrequency) { + case DAILY: + return "0 ".concat(minutes, " ").concat(hours, " * * *"); - if (options.unit) { - unit = String(options.unit) - } else { - if (minutes < 1) { - unit = 's' - } else if (minutes < 60) { - unit = 'm' - } else if (minutes < MINUTES_IN_DAY) { - unit = 'h' - } else if (minutes < MINUTES_IN_MONTH) { - unit = 'd' - } else if (minutes < MINUTES_IN_YEAR) { - unit = 'M' - } else { - unit = 'Y' - } - } + case HOURLY: + return "0 ".concat(minutes, " * * * *"); - // 0 up to 60 seconds - if (unit === 's') { - return localize('xSeconds', seconds, localizeOptions) + case MONTHLY: + return "0 ".concat(minutes, " ").concat(hours, " ").concat(dayOfMonth, " * *"); - // 1 up to 60 mins - } else if (unit === 'm') { - return localize('xMinutes', minutes, localizeOptions) + default: + // also WEEKLY + return "0 ".concat(minutes, " ").concat(hours, " * * ").concat(dayOfWeek); + } +}; +var fromKonnector = function fromKonnector(konnector) { + var startDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date(); + var randomDayTimeFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _daytime__WEBPACK_IMPORTED_MODULE_2__["randomDayTime"]; + return cron.fromFrequency(konnector.frequency, _objectSpread(_objectSpread({}, randomDayTimeFn.apply(null, konnector.time_interval || DEFAULT_TIME_INTERVAL)), {}, { + dayOfWeek: startDate.getDay(), + dayOfMonth: startDate.getDate() + })); +}; +/** + * Transform the given cron string into frequency value + * @param {String} cron cron value + * @return {String} Frequency, could be `daily`, + * `hourly`, `monthly`, `weekly`, or null if undetermined + */ - // 1 up to 24 hours - } else if (unit === 'h') { - hours = mathPartial(minutes / 60) - return localize('xHours', hours, localizeOptions) +var toFrequency = function toFrequency(cron) { + var isSet = function isSet(part) { + return part !== '*'; + }; - // 1 up to 30 days - } else if (unit === 'd') { - days = mathPartial(minutes / MINUTES_IN_DAY) - return localize('xDays', days, localizeOptions) + var _cron$split = cron.split(' '), + _cron$split2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_cron$split, 6), + minutes = _cron$split2[1], + hours = _cron$split2[2], + dayOfMonth = _cron$split2[3], + dayOfWeek = _cron$split2[5]; - // 1 up to 12 months - } else if (unit === 'M') { - months = mathPartial(minutes / MINUTES_IN_MONTH) - return localize('xMonths', months, localizeOptions) + if (isSet(dayOfWeek)) return WEEKLY; + if (isSet(dayOfMonth)) return MONTHLY; + if (isSet(hours)) return DAILY; + if (isSet(minutes)) return HOURLY; + return null; +}; +var cron = { + fromFrequency: fromFrequency, + fromKonnector: fromKonnector, + toFrequency: toFrequency +}; +/* harmony default export */ __webpack_exports__["default"] = (cron); - // 1 year up to max Date - } else if (unit === 'Y') { - years = mathPartial(minutes / MINUTES_IN_YEAR) - return localize('xYears', years, localizeOptions) - } +/***/ }), +/* 902 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - throw new Error('Unknown unit: ' + unit) -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "randomDayTime", function() { return randomDayTime; }); +/* harmony import */ var lodash_isNumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(903); +/* harmony import */ var lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_isNumber__WEBPACK_IMPORTED_MODULE_0__); -module.exports = distanceInWordsStrict +/** + * Returns an hour of the day between two hours given in parameters + * @type {number} min minimal start hour + * @type {number} max maximal end hour + * @type {function} randomize The function used to generate random values + * @return {object} Object containing two atributes : hours and minutes + */ +var randomDayTime = function randomDayTime() { + var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; + var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; + var randomize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (min, max) { + return Math.random() * (max - min) + min; + }; + if (!lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default()(start)) throw new Error('Parameter start must be a number'); + if (!lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default()(end)) throw new Error('Parameter end must be a number'); + if (typeof randomize !== 'function') throw new Error('Parameter randomize must be a function'); + if (start < 0 || end > 24) throw new Error('interval must be inside [0, 24]'); + var r = randomize(start, end); + var hours = Math.floor(r); + var minutes = Math.floor((r - hours) * 60); + if (hours < 0 || hours > 23) throw new Error('randomize function returns invalid hour value'); + return { + hours: hours, + minutes: minutes + }; +}; /***/ }), -/* 832 */ +/* 903 */ /***/ (function(module, exports, __webpack_require__) { -var distanceInWords = __webpack_require__(826) +var baseGetTag = __webpack_require__(67), + isObjectLike = __webpack_require__(86); + +/** `Object#toString` result references. */ +var numberTag = '[object Number]'; /** - * @category Common Helpers - * @summary Return the distance between the given date and now in words. - * - * @description - * Return the distance between the given date and now in words. - * - * | Distance to now | Result | - * |-------------------------------------------------------------------|---------------------| - * | 0 ... 30 secs | less than a minute | - * | 30 secs ... 1 min 30 secs | 1 minute | - * | 1 min 30 secs ... 44 mins 30 secs | [2..44] minutes | - * | 44 mins ... 30 secs ... 89 mins 30 secs | about 1 hour | - * | 89 mins 30 secs ... 23 hrs 59 mins 30 secs | about [2..24] hours | - * | 23 hrs 59 mins 30 secs ... 41 hrs 59 mins 30 secs | 1 day | - * | 41 hrs 59 mins 30 secs ... 29 days 23 hrs 59 mins 30 secs | [2..30] days | - * | 29 days 23 hrs 59 mins 30 secs ... 44 days 23 hrs 59 mins 30 secs | about 1 month | - * | 44 days 23 hrs 59 mins 30 secs ... 59 days 23 hrs 59 mins 30 secs | about 2 months | - * | 59 days 23 hrs 59 mins 30 secs ... 1 yr | [2..12] months | - * | 1 yr ... 1 yr 3 months | about 1 year | - * | 1 yr 3 months ... 1 yr 9 month s | over 1 year | - * | 1 yr 9 months ... 2 yrs | almost 2 years | - * | N yrs ... N yrs 3 months | about N years | - * | N yrs 3 months ... N yrs 9 months | over N years | - * | N yrs 9 months ... N+1 yrs | almost N+1 years | - * - * With `options.includeSeconds == true`: - * | Distance to now | Result | - * |---------------------|----------------------| - * | 0 secs ... 5 secs | less than 5 seconds | - * | 5 secs ... 10 secs | less than 10 seconds | - * | 10 secs ... 20 secs | less than 20 seconds | - * | 20 secs ... 40 secs | half a minute | - * | 40 secs ... 60 secs | less than a minute | - * | 60 secs ... 90 secs | 1 minute | + * Checks if `value` is classified as a `Number` primitive or object. * - * @param {Date|String|Number} date - the given date - * @param {Object} [options] - the object with options - * @param {Boolean} [options.includeSeconds=false] - distances less than a minute are more detailed - * @param {Boolean} [options.addSuffix=false] - result specifies if the second date is earlier or later than the first - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the distance in words + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. * @example - * // If today is 1 January 2015, what is the distance to 2 July 2014? - * var result = distanceInWordsToNow( - * new Date(2014, 6, 2) - * ) - * //=> '6 months' * - * @example - * // If now is 1 January 2015 00:00:00, - * // what is the distance to 1 January 2015 00:00:15, including seconds? - * var result = distanceInWordsToNow( - * new Date(2015, 0, 1, 0, 0, 15), - * {includeSeconds: true} - * ) - * //=> 'less than 20 seconds' + * _.isNumber(3); + * // => true * - * @example - * // If today is 1 January 2015, - * // what is the distance to 1 January 2016, with a suffix? - * var result = distanceInWordsToNow( - * new Date(2016, 0, 1), - * {addSuffix: true} - * ) - * //=> 'in about 1 year' + * _.isNumber(Number.MIN_VALUE); + * // => true * - * @example - * // If today is 1 January 2015, - * // what is the distance to 1 August 2016 in Esperanto? - * var eoLocale = require('date-fns/locale/eo') - * var result = distanceInWordsToNow( - * new Date(2016, 7, 1), - * {locale: eoLocale} - * ) - * //=> 'pli ol 1 jaro' + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false */ -function distanceInWordsToNow (dirtyDate, dirtyOptions) { - return distanceInWords(Date.now(), dirtyDate, dirtyOptions) +function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); } -module.exports = distanceInWordsToNow +module.exports = isNumber; + + +/***/ }), +/* 904 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _cozy_minilog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(265); +/* harmony import */ var _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_cozy_minilog__WEBPACK_IMPORTED_MODULE_0__); + +var inBrowser = typeof window !== 'undefined'; +var minilog = inBrowser && window.minilog || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a; +var logger = minilog('harvest'); +/* harmony default export */ __webpack_exports__["default"] = (logger); + +/***/ }), +/* 905 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var _interopRequireDefault = __webpack_require__(1); + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; + +var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); + +var Sentry = _interopRequireWildcard(__webpack_require__(590)); + +var _cozyClient = __webpack_require__(39); +var _triggers = _interopRequireDefault(__webpack_require__(906)); -/***/ }), -/* 833 */ -/***/ (function(module, exports, __webpack_require__) { +var _triggers2 = __webpack_require__(728); -var parse = __webpack_require__(772) +var _cozyLogger = _interopRequireDefault(__webpack_require__(3)); -/** - * @category Day Helpers - * @summary Return the array of dates within the specified range. - * - * @description - * Return the array of dates within the specified range. - * - * @param {Date|String|Number} startDate - the first date - * @param {Date|String|Number} endDate - the last date - * @param {Number} [step=1] - the step between each day - * @returns {Date[]} the array with starts of days from the day of startDate to the day of endDate - * @throws {Error} startDate cannot be after endDate - * - * @example - * // Each day between 6 October 2014 and 10 October 2014: - * var result = eachDay( - * new Date(2014, 9, 6), - * new Date(2014, 9, 10) - * ) - * //=> [ - * // Mon Oct 06 2014 00:00:00, - * // Tue Oct 07 2014 00:00:00, - * // Wed Oct 08 2014 00:00:00, - * // Thu Oct 09 2014 00:00:00, - * // Fri Oct 10 2014 00:00:00 - * // ] - */ -function eachDay (dirtyStartDate, dirtyEndDate, dirtyStep) { - var startDate = parse(dirtyStartDate) - var endDate = parse(dirtyEndDate) - var step = dirtyStep !== undefined ? dirtyStep : 1 +var _doctypes = __webpack_require__(559); - var endTime = endDate.getTime() +var _fluidConfig = _interopRequireDefault(__webpack_require__(719)); - if (startDate.getTime() > endTime) { - throw new Error('The first date cannot be after the second date') +var _logger = _interopRequireDefault(__webpack_require__(711)); + +function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } + +function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } + +const logStack = _cozyLogger.default.namespace('triggersService'); + +class TriggerService { + constructor(_client) { + (0, _defineProperty2.default)(this, "_client", void 0); + this._client = _client; } - var dates = [] + createTriggerAttributes(account, konnector) { + const configService = new _fluidConfig.default(); + const cronArgs = configService.getCronArgs(); + const triggerAttributes = (0, _triggers2.buildAttributes)({ + account: account, + cron: cronArgs, + folder: null, + konnector: konnector + }); + return triggerAttributes; + } - var currentDate = startDate - currentDate.setHours(0, 0, 0, 0) + async createTrigger(account, konnector) { + const triggerAttributes = this.createTriggerAttributes(account, konnector); + const trigger = await (0, _triggers.default)(this._client).createTrigger(triggerAttributes); + return trigger; + } - while (currentDate.getTime() <= endTime) { - dates.push(parse(currentDate)) - currentDate.setDate(currentDate.getDate() + step) + async getTrigger(account, konnector) { + const query = (0, _cozyClient.Q)(_doctypes.TRIGGERS_DOCTYPE).where({ + 'message.account': account._id, + 'message.konnector': konnector.slug + }).indexFields(['cozyMetadata.updatedAt']).sortBy([{ + 'cozyMetadata.updatedAt': 'desc' + }]).limitBy(1); + const { + data: triggers + } = await this._client.query(query); + return triggers[0] ? triggers[0] : null; } - return dates -} + async getTriggerForAccount(account) { + const query = (0, _cozyClient.Q)(_doctypes.TRIGGERS_DOCTYPE).where({ + 'message.account': account._id, + 'message.konnector': account.account_type + }).indexFields(['cozyMetadata.createdAt']).sortBy([{ + 'cozyMetadata.createdAt': 'desc' + }]).limitBy(1); + const { + data: triggers + } = await this._client.query(query); + return triggers[0] ? triggers[0] : null; + } -module.exports = eachDay + async fetchTriggerState(trigger) { + try { + const triggerState = await this._client.getStackClient().fetchJSON('GET', `/jobs/triggers/${trigger._id}`); // eslint-disable-next-line camelcase + return triggerState.data.attributes.current_state ? triggerState.data.attributes.current_state : null; + } catch (error) { + throw new Error('Fetch trigger state failed'); + } + } -/***/ }), -/* 834 */ -/***/ (function(module, exports, __webpack_require__) { + async deleteTrigger(trigger) { + try { + await this._client.destroy(trigger); + return true; + } catch (error) { + const errorMessage = `Delete trigger failed: ${JSON.stringify(error)}`; + logStack('error', errorMessage); -var parse = __webpack_require__(772) + _logger.default.error(errorMessage); -/** - * @category Day Helpers - * @summary Return the end of a day for the given date. - * - * @description - * Return the end of a day for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a day - * - * @example - * // The end of a day for 2 September 2014 11:55:00: - * var result = endOfDay(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 02 2014 23:59:59.999 - */ -function endOfDay (dirtyDate) { - var date = parse(dirtyDate) - date.setHours(23, 59, 59, 999) - return date -} + Sentry.captureException(errorMessage); + throw new Error('Delete trigger failed'); + } + } -module.exports = endOfDay +} +exports.default = TriggerService; /***/ }), -/* 835 */ -/***/ (function(module, exports, __webpack_require__) { +/* 906 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createTrigger", function() { return createTrigger; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchTrigger", function() { return fetchTrigger; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "launchTrigger", function() { return launchTrigger; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "prepareTriggerAccount", function() { return prepareTriggerAccount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "triggersMutations", function() { return triggersMutations; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ensureTrigger", function() { return ensureTrigger; }); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); +/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58); +/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); +/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(907); +/* harmony import */ var cozy_doctypes__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(728); +/* harmony import */ var _helpers_accounts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(897); +/* harmony import */ var _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(889); +/* harmony import */ var _helpers_cron__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(901); +/* harmony import */ var _accounts__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(727); +/* harmony import */ var _files__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(957); + + + + + + -var parse = __webpack_require__(772) + + +var FILES_DOCTYPE = 'io.cozy.files'; +var PERMISSIONS_DOCTYPE = 'io.cozy.permissions'; +var TRIGGERS_DOCTYPE = 'io.cozy.triggers'; /** - * @category Hour Helpers - * @summary Return the end of an hour for the given date. - * - * @description - * Return the end of an hour for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an hour - * - * @example - * // The end of an hour for 2 September 2014 11:55:00: - * var result = endOfHour(new Date(2014, 8, 2, 11, 55)) - * //=> Tue Sep 02 2014 11:59:59.999 + * Creates a trigger with given attributes + * @param {Object} client CozyClient + * @param {Object} attributes + * @return {Object} Created trigger */ -function endOfHour (dirtyDate) { - var date = parse(dirtyDate) - date.setMinutes(59, 59, 999) - return date -} -module.exports = endOfHour +var createTrigger = /*#__PURE__*/function () { + var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee(client, attributes) { + var _yield$client$collect, data; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee$(_context) { + while (1) { + switch (_context.prev = _context.next) { + case 0: + _context.next = 2; + return client.collection(TRIGGERS_DOCTYPE).create(attributes); -/***/ }), -/* 836 */ -/***/ (function(module, exports, __webpack_require__) { + case 2: + _yield$client$collect = _context.sent; + data = _yield$client$collect.data; + return _context.abrupt("return", data); -var endOfWeek = __webpack_require__(837) + case 5: + case "end": + return _context.stop(); + } + } + }, _callee); + })); + return function createTrigger(_x, _x2) { + return _ref.apply(this, arguments); + }; +}(); /** - * @category ISO Week Helpers - * @summary Return the end of an ISO week for the given date. - * - * @description - * Return the end of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week - * - * @example - * // The end of an ISO week for 2 September 2014 11:55:00: - * var result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Sep 07 2014 23:59:59.999 - */ -function endOfISOWeek (dirtyDate) { - return endOfWeek(dirtyDate, {weekStartsOn: 1}) -} + * Fetch the trigger based on its id + * @param {Object} client CozyClient + * @param {string} id + * @return {Object} Fetched trigger data + */ -module.exports = endOfISOWeek +var fetchTrigger = /*#__PURE__*/function () { + var _ref2 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee2(client, id) { + var _yield$client$collect2, data; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee2$(_context2) { + while (1) { + switch (_context2.prev = _context2.next) { + case 0: + _context2.next = 2; + return client.collection(TRIGGERS_DOCTYPE).get(id); -/***/ }), -/* 837 */ -/***/ (function(module, exports, __webpack_require__) { + case 2: + _yield$client$collect2 = _context2.sent; + data = _yield$client$collect2.data; + return _context2.abrupt("return", data); -var parse = __webpack_require__(772) + case 5: + case "end": + return _context2.stop(); + } + } + }, _callee2); + })); + return function fetchTrigger(_x3, _x4) { + return _ref2.apply(this, arguments); + }; +}(); /** - * @category Week Helpers - * @summary Return the end of a week for the given date. - * - * @description - * Return the end of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the end of a week - * - * @example - * // The end of a week for 2 September 2014 11:55:00: - * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sat Sep 06 2014 23:59:59.999 - * - * @example - * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00: - * var result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 23:59:59.999 + * Triggers job associated to given trigger + * @param {Object} client CozyClient + * @param {Object} Trigger to launch + * @return {Object} Job document */ -function endOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) +var launchTrigger = /*#__PURE__*/function () { + var _ref3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee3(client, trigger) { + var _yield$client$collect3, data; - date.setDate(date.getDate() + diff) - date.setHours(23, 59, 59, 999) - return date -} + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee3$(_context3) { + while (1) { + switch (_context3.prev = _context3.next) { + case 0: + _context3.next = 2; + return client.collection(TRIGGERS_DOCTYPE).launch(trigger); -module.exports = endOfWeek + case 2: + _yield$client$collect3 = _context3.sent; + data = _yield$client$collect3.data; + return _context3.abrupt("return", data); + case 5: + case "end": + return _context3.stop(); + } + } + }, _callee3); + })); -/***/ }), -/* 838 */ -/***/ (function(module, exports, __webpack_require__) { + return function launchTrigger(_x5, _x6) { + return _ref3.apply(this, arguments); + }; +}(); +var prepareTriggerAccount = /*#__PURE__*/function () { + var _ref4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee4(client, trigger) { + var accountId, account; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee4$(_context4) { + while (1) { + switch (_context4.prev = _context4.next) { + case 0: + accountId = _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"](trigger); -var getISOYear = __webpack_require__(789) -var startOfISOWeek = __webpack_require__(790) + if (accountId) { + _context4.next = 3; + break; + } -/** - * @category ISO Week-Numbering Year Helpers - * @summary Return the end of an ISO week-numbering year for the given date. - * - * @description - * Return the end of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week-numbering year - * - * @example - * // The end of an ISO week-numbering year for 2 July 2005: - * var result = endOfISOYear(new Date(2005, 6, 2)) - * //=> Sun Jan 01 2006 23:59:59.999 - */ -function endOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuaryOfNextYear = new Date(0) - fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4) - fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuaryOfNextYear) - date.setMilliseconds(date.getMilliseconds() - 1) - return date -} + throw new Error('No account id in the trigger'); -module.exports = endOfISOYear + case 3: + _context4.next = 5; + return Object(_accounts__WEBPACK_IMPORTED_MODULE_8__["fetchAccount"])(client, accountId); + case 5: + account = _context4.sent; -/***/ }), -/* 839 */ -/***/ (function(module, exports, __webpack_require__) { + if (account) { + _context4.next = 8; + break; + } + + throw new Error("Could not find account ".concat(accountId, " for trigger ").concat(trigger._id)); + + case 8: + return _context4.abrupt("return", Object(_accounts__WEBPACK_IMPORTED_MODULE_8__["updateAccount"])(client, _helpers_accounts__WEBPACK_IMPORTED_MODULE_5__["resetState"](account))); -var parse = __webpack_require__(772) + case 9: + case "end": + return _context4.stop(); + } + } + }, _callee4); + })); + return function prepareTriggerAccount(_x7, _x8) { + return _ref4.apply(this, arguments); + }; +}(); /** - * @category Minute Helpers - * @summary Return the end of a minute for the given date. - * - * @description - * Return the end of a minute for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a minute - * - * @example - * // The end of a minute for 1 December 2014 22:15:45.400: - * var result = endOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:59.999 + * Return triggers mutations + * @param {Object} client CozyClient + * @return {Object} Object containing mutations */ -function endOfMinute (dirtyDate) { - var date = parse(dirtyDate) - date.setSeconds(59, 999) - return date -} -module.exports = endOfMinute +var triggersMutations = function triggersMutations(client) { + return { + createTrigger: createTrigger.bind(null, client), + fetchTrigger: fetchTrigger.bind(null, client), + launchTrigger: launchTrigger.bind(null, client) + }; +}; + +var ensureKonnectorFolder = /*#__PURE__*/function () { + var _ref6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee5(client, _ref5) { + var konnector, account, t, permissions, files, CozyFolder, _yield$Promise$all, _yield$Promise$all2, adminFolder, photosFolder, path, folder; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee5$(_context5) { + while (1) { + switch (_context5.prev = _context5.next) { + case 0: + konnector = _ref5.konnector, account = _ref5.account, t = _ref5.t; + permissions = client.collection(PERMISSIONS_DOCTYPE); + files = client.collection(FILES_DOCTYPE); + CozyFolder = cozy_doctypes__WEBPACK_IMPORTED_MODULE_3__["CozyFolder"].copyWithClient(client); + _context5.next = 6; + return Promise.all([CozyFolder.ensureMagicFolder(CozyFolder.magicFolders.ADMINISTRATIVE, "/".concat(t('folder.administrative'))), CozyFolder.ensureMagicFolder(CozyFolder.magicFolders.PHOTOS, "/".concat(t('folder.photos')))]); -/***/ }), -/* 840 */ -/***/ (function(module, exports, __webpack_require__) { + case 6: + _yield$Promise$all = _context5.sent; + _yield$Promise$all2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_yield$Promise$all, 2); + adminFolder = _yield$Promise$all2[0]; + photosFolder = _yield$Promise$all2[1]; + path = _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["buildFolderPath"](konnector, account, { + administrative: adminFolder.path, + photos: photosFolder.path + }); + _context5.next = 13; + return Object(_files__WEBPACK_IMPORTED_MODULE_9__["statDirectoryByPath"])(client, path); -var parse = __webpack_require__(772) + case 13: + _context5.t0 = _context5.sent; -/** - * @category Month Helpers - * @summary Return the end of a month for the given date. - * - * @description - * Return the end of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a month - * - * @example - * // The end of a month for 2 September 2014 11:55:00: - * var result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 23:59:59.999 - */ -function endOfMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - date.setFullYear(date.getFullYear(), month + 1, 0) - date.setHours(23, 59, 59, 999) - return date -} + if (_context5.t0) { + _context5.next = 18; + break; + } + + _context5.next = 17; + return Object(_files__WEBPACK_IMPORTED_MODULE_9__["createDirectoryByPath"])(client, path); + + case 17: + _context5.t0 = _context5.sent; + + case 18: + folder = _context5.t0; + _context5.next = 21; + return permissions.add(konnector, _helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["buildFolderPermission"](folder)); -module.exports = endOfMonth + case 21: + _context5.next = 23; + return files.addReferencesTo(konnector, [folder]); + case 23: + return _context5.abrupt("return", folder); -/***/ }), -/* 841 */ -/***/ (function(module, exports, __webpack_require__) { + case 24: + case "end": + return _context5.stop(); + } + } + }, _callee5); + })); -var parse = __webpack_require__(772) + return function ensureKonnectorFolder(_x9, _x10) { + return _ref6.apply(this, arguments); + }; +}(); -/** - * @category Quarter Helpers - * @summary Return the end of a year quarter for the given date. - * - * @description - * Return the end of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a quarter - * - * @example - * // The end of a quarter for 2 September 2014 11:55:00: - * var result = endOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 23:59:59.999 - */ -function endOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 + 3 - date.setMonth(month, 0) - date.setHours(23, 59, 59, 999) - return date -} +var ensureTrigger = /*#__PURE__*/function () { + var _ref8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee6(client, _ref7) { + var trigger, account, konnector, t, folder; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee6$(_context6) { + while (1) { + switch (_context6.prev = _context6.next) { + case 0: + trigger = _ref7.trigger, account = _ref7.account, konnector = _ref7.konnector, t = _ref7.t; -module.exports = endOfQuarter + if (!trigger) { + _context6.next = 3; + break; + } + return _context6.abrupt("return", trigger); -/***/ }), -/* 842 */ -/***/ (function(module, exports, __webpack_require__) { + case 3: + if (!_helpers_konnectors__WEBPACK_IMPORTED_MODULE_6__["needsFolder"](konnector)) { + _context6.next = 7; + break; + } -var parse = __webpack_require__(772) + _context6.next = 6; + return ensureKonnectorFolder(client, { + konnector: konnector, + account: account, + t: t + }); -/** - * @category Second Helpers - * @summary Return the end of a second for the given date. - * - * @description - * Return the end of a second for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a second - * - * @example - * // The end of a second for 1 December 2014 22:15:45.400: - * var result = endOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:45.999 - */ -function endOfSecond (dirtyDate) { - var date = parse(dirtyDate) - date.setMilliseconds(999) - return date -} + case 6: + folder = _context6.sent; -module.exports = endOfSecond + case 7: + _context6.next = 9; + return createTrigger(client, _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["buildAttributes"]({ + account: account, + cron: _helpers_cron__WEBPACK_IMPORTED_MODULE_7__["default"].fromKonnector(konnector), + folder: folder, + konnector: konnector + })); + + case 9: + return _context6.abrupt("return", _context6.sent); + + case 10: + case "end": + return _context6.stop(); + } + } + }, _callee6); + })); + return function ensureTrigger(_x11, _x12) { + return _ref8.apply(this, arguments); + }; +}(); +/* harmony default export */ __webpack_exports__["default"] = (triggersMutations); /***/ }), -/* 843 */ +/* 907 */ /***/ (function(module, exports, __webpack_require__) { -var endOfDay = __webpack_require__(834) +const Account = __webpack_require__(908) +const AdministrativeProcedure = __webpack_require__(932) +const Application = __webpack_require__(937) +const Document = __webpack_require__(909) +const BalanceHistory = __webpack_require__(938) +const BankAccount = __webpack_require__(939) +const BankingReconciliator = __webpack_require__(944) +const BankTransaction = __webpack_require__(945) +const BankAccountStats = __webpack_require__(950) +const Contact = __webpack_require__(933) +const CozyFile = __webpack_require__(953) +const CozyFolder = __webpack_require__(954) +const Group = __webpack_require__(955) +const Permission = __webpack_require__(956) -/** - * @category Day Helpers - * @summary Return the end of today. - * - * @description - * Return the end of today. - * - * @returns {Date} the end of today - * - * @example - * // If today is 6 October 2014: - * var result = endOfToday() - * //=> Mon Oct 6 2014 23:59:59.999 - */ -function endOfToday () { - return endOfDay(new Date()) +module.exports = { + Account, + AdministrativeProcedure, + Application, + Document, + BalanceHistory, + BankAccount, + BankingReconciliator, + BankTransaction, + BankAccountStats, + Contact, + CozyFile, + CozyFolder, + Group, + registerClient: Document.registerClient, + Permission } -module.exports = endOfToday - /***/ }), -/* 844 */ -/***/ (function(module, exports) { - -/** - * @category Day Helpers - * @summary Return the end of tomorrow. - * - * @description - * Return the end of tomorrow. - * - * @returns {Date} the end of tomorrow - * - * @example - * // If today is 6 October 2014: - * var result = endOfTomorrow() - * //=> Tue Oct 7 2014 23:59:59.999 - */ -function endOfTomorrow () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() +/* 908 */ +/***/ (function(module, exports, __webpack_require__) { - var date = new Date(0) - date.setFullYear(year, month, day + 1) - date.setHours(23, 59, 59, 999) - return date -} +/* eslint-disable node/no-unsupported-features/es-syntax */ +const Document = __webpack_require__(909) +const pickBy = __webpack_require__(329) +const get = __webpack_require__(162) -module.exports = endOfTomorrow +const ACCOUNTS_DOCTYPE = 'io.cozy.accounts' +// Order matters +const probableLoginFieldNames = [ + 'login', + 'identifier', + 'new_identifier', + 'email' +] -/***/ }), -/* 845 */ -/***/ (function(module, exports, __webpack_require__) { +class Account extends Document { + static getAccountName(account) { + if (!account) return null + if (account.auth) { + return ( + account.auth.accountName || this.getAccountLogin(account) || account._id + ) + } else { + return account._id + } + } -var parse = __webpack_require__(772) + static getAccountLogin(account) { + if (account && account.auth) { + for (const fieldName of probableLoginFieldNames) { + if (account.auth[fieldName]) return account.auth[fieldName] + } + } + } -/** - * @category Year Helpers - * @summary Return the end of a year for the given date. - * - * @description - * Return the end of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of a year - * - * @example - * // The end of a year for 2 September 2014 11:55:00: - * var result = endOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Dec 31 2014 23:59:59.999 - */ -function endOfYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - date.setFullYear(year + 1, 0, 0) - date.setHours(23, 59, 59, 999) - return date -} + /** + * Create an account document from a vault cipher + * + * @param {Object} cipher + * @param {Object} [options={}] + * @param {string} [options.identifierProperty=login] - The name of the identifier property to use for this account + * + * @returns {Object} + */ + static fromCipher(cipher, options = {}) { + const opts = { + identifierProperty: 'login', + ...options + } -module.exports = endOfYear + const customFields = (get(cipher, 'fields') || []).reduce( + (fields, field) => { + fields[field.name] = field.value + return fields + }, + {} + ) -/***/ }), -/* 846 */ -/***/ (function(module, exports) { + const account = { + auth: pickBy( + { + [opts.identifierProperty]: get(cipher, 'login.username', ''), + password: get(cipher, 'login.password', ''), + ...customFields + }, + value => Boolean(value) + ) + } -/** - * @category Day Helpers - * @summary Return the end of yesterday. - * - * @description - * Return the end of yesterday. - * - * @returns {Date} the end of yesterday - * - * @example - * // If today is 6 October 2014: - * var result = endOfYesterday() - * //=> Sun Oct 5 2014 23:59:59.999 - */ -function endOfYesterday () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() + if (cipher) { + account.relationships = { + vaultCipher: { + _id: cipher.id, + _type: 'com.bitwarden.ciphers', + _protocol: 'bitwarden' + } + } + } - var date = new Date(0) - date.setFullYear(year, month, day - 1) - date.setHours(23, 59, 59, 999) - return date + return account + } } -module.exports = endOfYesterday +Account.schema = { + doctype: ACCOUNTS_DOCTYPE, + attributes: {}, + relationships: { + master: { + type: 'has-one', + doctype: ACCOUNTS_DOCTYPE + } + } +} + +Account.probableLoginFieldNames = probableLoginFieldNames + +module.exports = Account /***/ }), -/* 847 */ +/* 909 */ /***/ (function(module, exports, __webpack_require__) { -var getDayOfYear = __webpack_require__(848) -var getISOWeek = __webpack_require__(850) -var getISOYear = __webpack_require__(789) -var parse = __webpack_require__(772) -var isValid = __webpack_require__(851) -var enLocale = __webpack_require__(827) +/* eslint-disable node/no-unsupported-features/es-syntax */ +const omit = __webpack_require__(286) +const pick = __webpack_require__(346) +const size = __webpack_require__(434) +const omitBy = __webpack_require__(910) +const isUndefined = __webpack_require__(912) +const fromPairs = __webpack_require__(181) +const pickBy = __webpack_require__(329) +const flatMap = __webpack_require__(913) +const groupBy = __webpack_require__(386) +const sortBy = __webpack_require__(485) +const get = __webpack_require__(162) +const { parallelMap } = __webpack_require__(915) +const CozyClient = __webpack_require__(42).default +const Q = __webpack_require__(260).Q +const log = __webpack_require__(917).namespace('Document') +const querystring = __webpack_require__(931) + +const DATABASE_DOES_NOT_EXIST = 'Database does not exist.' /** - * @category Common Helpers - * @summary Format the date. - * - * @description - * Return the formatted date string in the given format. - * - * Accepted tokens: - * | Unit | Token | Result examples | - * |-------------------------|-------|----------------------------------| - * | Month | M | 1, 2, ..., 12 | - * | | Mo | 1st, 2nd, ..., 12th | - * | | MM | 01, 02, ..., 12 | - * | | MMM | Jan, Feb, ..., Dec | - * | | MMMM | January, February, ..., December | - * | Quarter | Q | 1, 2, 3, 4 | - * | | Qo | 1st, 2nd, 3rd, 4th | - * | Day of month | D | 1, 2, ..., 31 | - * | | Do | 1st, 2nd, ..., 31st | - * | | DD | 01, 02, ..., 31 | - * | Day of year | DDD | 1, 2, ..., 366 | - * | | DDDo | 1st, 2nd, ..., 366th | - * | | DDDD | 001, 002, ..., 366 | - * | Day of week | d | 0, 1, ..., 6 | - * | | do | 0th, 1st, ..., 6th | - * | | dd | Su, Mo, ..., Sa | - * | | ddd | Sun, Mon, ..., Sat | - * | | dddd | Sunday, Monday, ..., Saturday | - * | Day of ISO week | E | 1, 2, ..., 7 | - * | ISO week | W | 1, 2, ..., 53 | - * | | Wo | 1st, 2nd, ..., 53rd | - * | | WW | 01, 02, ..., 53 | - * | Year | YY | 00, 01, ..., 99 | - * | | YYYY | 1900, 1901, ..., 2099 | - * | ISO week-numbering year | GG | 00, 01, ..., 99 | - * | | GGGG | 1900, 1901, ..., 2099 | - * | AM/PM | A | AM, PM | - * | | a | am, pm | - * | | aa | a.m., p.m. | - * | Hour | H | 0, 1, ... 23 | - * | | HH | 00, 01, ... 23 | - * | | h | 1, 2, ..., 12 | - * | | hh | 01, 02, ..., 12 | - * | Minute | m | 0, 1, ..., 59 | - * | | mm | 00, 01, ..., 59 | - * | Second | s | 0, 1, ..., 59 | - * | | ss | 00, 01, ..., 59 | - * | 1/10 of second | S | 0, 1, ..., 9 | - * | 1/100 of second | SS | 00, 01, ..., 99 | - * | Millisecond | SSS | 000, 001, ..., 999 | - * | Timezone | Z | -01:00, +00:00, ... +12:00 | - * | | ZZ | -0100, +0000, ..., +1200 | - * | Seconds timestamp | X | 512969520 | - * | Milliseconds timestamp | x | 512969520900 | - * - * The characters wrapped in square brackets are escaped. - * - * The result may vary by locale. - * - * @param {Date|String|Number} date - the original date - * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens - * @param {Object} [options] - the object with options - * @param {Object} [options.locale=enLocale] - the locale object - * @returns {String} the formatted date string - * - * @example - * // Represent 11 February 2014 in middle-endian format: - * var result = format( - * new Date(2014, 1, 11), - * 'MM/DD/YYYY' - * ) - * //=> '02/11/2014' - * - * @example - * // Represent 2 July 2014 in Esperanto: - * var eoLocale = require('date-fns/locale/eo') - * var result = format( - * new Date(2014, 6, 2), - * 'Do [de] MMMM YYYY', - * {locale: eoLocale} - * ) - * //=> '2-a de julio 2014' + * Tell of two object attributes have any difference */ -function format (dirtyDate, dirtyFormatStr, dirtyOptions) { - var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ' - var options = dirtyOptions || {} - - var locale = options.locale - var localeFormatters = enLocale.format.formatters - var formattingTokensRegExp = enLocale.format.formattingTokensRegExp - if (locale && locale.format && locale.format.formatters) { - localeFormatters = locale.format.formatters +function isDifferent(o1, o2) { + // This is not supposed to happen + if (Object.keys(o1).length === 0) return true - if (locale.format.formattingTokensRegExp) { - formattingTokensRegExp = locale.format.formattingTokensRegExp + for (let key in o1) { + if (o1[key] !== o2[key]) { + return true } } - - var date = parse(dirtyDate) - - if (!isValid(date)) { - return 'Invalid Date' - } - - var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp) - - return formatFn(date) + return false } -var formatters = { - // Month: 1, 2, ..., 12 - 'M': function (date) { - return date.getMonth() + 1 - }, - - // Month: 01, 02, ..., 12 - 'MM': function (date) { - return addLeadingZeros(date.getMonth() + 1, 2) - }, +const indexes = {} - // Quarter: 1, 2, 3, 4 - 'Q': function (date) { - return Math.ceil((date.getMonth() + 1) / 3) - }, +// Attributes that will not be updated since the +// user can change them +const userAttributes = ['shortLabel'] - // Day of month: 1, 2, ..., 31 - 'D': function (date) { - return date.getDate() - }, +function sanitizeKey(key) { + if (key.startsWith('\\')) { + return key.slice(1) + } - // Day of month: 01, 02, ..., 31 - 'DD': function (date) { - return addLeadingZeros(date.getDate(), 2) - }, + return key +} - // Day of year: 1, 2, ..., 366 - 'DDD': function (date) { - return getDayOfYear(date) - }, +function updateCreatedByApp(cozyMetadata, appSlug) { + if (!cozyMetadata.updatedByApps) { + cozyMetadata.updatedByApps = [] + } + const now = new Date() + for (const appInfo of cozyMetadata.updatedByApps) { + if (appInfo.slug === appSlug) { + appInfo.date = now + return + } + } + cozyMetadata.updatedByApps.push({ slug: appSlug, date: now }) +} - // Day of year: 001, 002, ..., 366 - 'DDDD': function (date) { - return addLeadingZeros(getDayOfYear(date), 3) - }, +const withoutUndefined = x => omitBy(x, isUndefined) - // Day of week: 0, 1, ..., 6 - 'd': function (date) { - return date.getDay() - }, +const flagForDeletion = x => Object.assign({}, x, { _deleted: true }) - // Day of ISO week: 1, 2, ..., 7 - 'E': function (date) { - return date.getDay() || 7 - }, +const getDocumentUpdateDate = doc => { + const d = doc.cozyMetadata && doc.cozyMetadata.updatedAt + return d ? new Date(d) : null +} - // ISO week: 1, 2, ..., 53 - 'W': function (date) { - return getISOWeek(date) - }, +const newestDocumentComparisonFunc = doc => { + const d = getDocumentUpdateDate(doc) + return d ? -d : 0 +} - // ISO week: 01, 02, ..., 53 - 'WW': function (date) { - return addLeadingZeros(getISOWeek(date), 2) - }, +class Document { + /** + * Registers a client + * + * @param {Client} client - Cozy client from either cozy-client or cozy-client-js + */ + static registerClient(client) { + if (!this.cozyClient) { + this.cozyClient = client + } else { + // eslint-disable-next-line no-console + console.warn( + 'Document already has been registered, this is not possible to re-register as the client is shared globally between all classes. This is to prevent concurrency bugs.' + ) + throw new Error('Document cannot be re-registered to a client.') + } + } - // Year: 00, 01, ..., 99 - 'YY': function (date) { - return addLeadingZeros(date.getFullYear(), 4).substr(2) - }, + /** + * @static copyWithClient - Returns a new class bound to a client + * + * @param {type} client Client instance + * @returns {type} A new class, with the client registered + */ + static copyWithClient(client) { + const BaseClass = this + class ExtendedClass extends BaseClass {} + ExtendedClass.cozyClient = null + ExtendedClass.registerClient(client) + return ExtendedClass + } - // Year: 1900, 1901, ..., 2099 - 'YYYY': function (date) { - return addLeadingZeros(date.getFullYear(), 4) - }, + /** + * Returns true if Document uses a CozyClient (from cozy-client package) + * + * @returns {boolean} true if Document uses a CozyClient + **/ + static usesCozyClient() { + return this.cozyClient instanceof CozyClient + } - // ISO week-numbering year: 00, 01, ..., 99 - 'GG': function (date) { - return String(getISOYear(date)).substr(2) - }, + static getIndex(doctype, fields) { + if (this.usesCozyClient()) { + throw new Error('This method is not implemented yet with CozyClient') + } - // ISO week-numbering year: 1900, 1901, ..., 2099 - 'GGGG': function (date) { - return getISOYear(date) - }, + return this.getIndexViaOldClient(doctype, fields) + } - // Hour: 0, 1, ... 23 - 'H': function (date) { - return date.getHours() - }, + static getIndexViaOldClient(doctype, fields) { + const key = `${doctype}:${fields.slice().join(',')}` + const index = indexes[key] + if (!index) { + indexes[key] = this.cozyClient.data + .defineIndex(doctype, fields) + .then(index => { + indexes[key] = index + return index + }) + } + return Promise.resolve(indexes[key]) + } - // Hour: 00, 01, ..., 23 - 'HH': function (date) { - return addLeadingZeros(date.getHours(), 2) - }, + static addCozyMetadata(attributes) { + if (!attributes.cozyMetadata) { + attributes.cozyMetadata = {} + } - // Hour: 1, 2, ..., 12 - 'h': function (date) { - var hours = date.getHours() - if (hours === 0) { - return 12 - } else if (hours > 12) { - return hours % 12 - } else { - return hours + attributes.cozyMetadata.updatedAt = new Date() + + if (!attributes.cozyMetadata.createdByApp && this.createdByApp) { + attributes.cozyMetadata.createdByApp = this.createdByApp } - }, - // Hour: 01, 02, ..., 12 - 'hh': function (date) { - return addLeadingZeros(formatters['h'](date), 2) - }, + if (this.createdByApp) { + updateCreatedByApp(attributes.cozyMetadata, this.createdByApp) + } - // Minute: 0, 1, ..., 59 - 'm': function (date) { - return date.getMinutes() - }, + return attributes + } - // Minute: 00, 01, ..., 59 - 'mm': function (date) { - return addLeadingZeros(date.getMinutes(), 2) - }, + /** + * Returns the item that has this id + * + * @param {string} id - The id of an item in the collection + * @returns {object} - The collection's item that has this id + * + */ + static async get(id) { + if (!this.usesCozyClient()) { + throw new Error('This method is not implemented with cozy-client-js') + } - // Second: 0, 1, ..., 59 - 's': function (date) { - return date.getSeconds() - }, + if (!this.doctype) { + throw new Error('doctype is not defined') + } - // Second: 00, 01, ..., 59 - 'ss': function (date) { - return addLeadingZeros(date.getSeconds(), 2) - }, + const resp = await this.cozyClient.collection(this.doctype).get(id) + return resp.data + } - // 1/10 of second: 0, 1, ..., 9 - 'S': function (date) { - return Math.floor(date.getMilliseconds() / 100) - }, + /** + * Creates or updates a document. + * + * Before creating/updating, we try to find an existing document by + * building a selector with the idAttributes. + * + * - If not document is found, document is created + * - If a document is found, it is updated + * - If duplicates are found, it depends on options.handleDuplicates + * + * @param {String|Function} options.handleDuplicates - How duplicates are handled, see Document.duplicateHandlingStrategies + */ + static async createOrUpdate(attributes, options = {}) { + if (this.usesCozyClient()) { + return this.createOrUpdateViaNewClient(attributes, options) + } - // 1/100 of second: 00, 01, ..., 99 - 'SS': function (date) { - return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2) - }, + return this.createOrUpdateViaOldClient(attributes, options) + } - // Millisecond: 000, 001, ..., 999 - 'SSS': function (date) { - return addLeadingZeros(date.getMilliseconds(), 3) - }, + /** + * Update a document with `update` attributes. If the + * `update` does not concern "important" attributes, the original + * document is returned. Otherwise, the update document is + * returned with metadata updated. + * + * @private + */ + static applyUpdateIfDifferent(doc, update) { + // only update if some fields are different + if ( + !this.checkAttributes || + isDifferent( + pick(doc, this.checkAttributes), + pick(update, this.checkAttributes) + ) + ) { + // do not emit a mail for those attribute updates + delete update.dateImport - // Timezone: -01:00, +00:00, ... +12:00 - 'Z': function (date) { - return formatTimezone(date.getTimezoneOffset(), ':') - }, + const updatedDoc = this.addCozyMetadata({ + ...doc, + ...update + }) - // Timezone: -0100, +0000, ... +1200 - 'ZZ': function (date) { - return formatTimezone(date.getTimezoneOffset()) - }, + return updatedDoc + } else { + log( + 'debug', + `[updateIfDifferent] No need to update ${update._id} because its \`checkedAttributes\` (${this.checkAttributes}) didn't change.` + ) + return doc + } + } - // Seconds timestamp: 512969520 - 'X': function (date) { - return Math.floor(date.getTime() / 1000) - }, + static getHandleDuplicateStrategy(name) { + if (Document.duplicateHandlingStrategies[name]) { + return Document.duplicateHandlingStrategies[name] + } else { + throw new Error( + `${name} is not a know duplication handling strategy. Known strategies are ${Object.keys( + Document.duplicateHandlingStrategies + )}` + ) + } + } - // Milliseconds timestamp: 512969520900 - 'x': function (date) { - return date.getTime() + static async handleDuplicates(strategyNameOrFnArg, duplicates, selector) { + const strategyNameOrFn = + strategyNameOrFnArg || this.defaultDuplicateHandling + const strategyFn = + typeof strategyNameOrFn === 'string' + ? this.getHandleDuplicateStrategy(strategyNameOrFn) + : strategyNameOrFn + + return await strategyFn.call(this, duplicates, selector) } -} -function buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) { - var array = formatStr.match(formattingTokensRegExp) - var length = array.length + static async createOrUpdateViaNewClient(attributes, options) { + const selector = fromPairs( + this.idAttributes.map(idAttribute => [ + idAttribute, + get(attributes, sanitizeKey(idAttribute)) + ]) + ) + let results = [] + const compactedSelector = withoutUndefined(selector) + if (size(compactedSelector) === this.idAttributes.length) { + results = await this.queryAll(selector) + } - var i - var formatter - for (i = 0; i < length; i++) { - formatter = localeFormatters[array[i]] || formatters[array[i]] - if (formatter) { - array[i] = formatter + if (results.length === 0) { + return this.create(this.addCozyMetadata(attributes)) } else { - array[i] = removeFormattingTokens(array[i]) + results = sortBy(results, newestDocumentComparisonFunc) + if (results.length > 1) { + await this.handleDuplicates(options.handleDuplicates, results, selector) + } + const doc = results[0] + const update = omit(attributes, userAttributes) + const updatedDoc = this.applyUpdateIfDifferent(doc, update) + if (updatedDoc !== doc) { + return this.cozyClient.save(updatedDoc) + } else { + return updatedDoc + } } } - return function (date) { - var output = '' - for (var i = 0; i < length; i++) { - if (array[i] instanceof Function) { - output += array[i](date, formatters) + static async createOrUpdateViaOldClient(attributes, options) { + const selector = fromPairs( + this.idAttributes.map(idAttribute => [ + idAttribute, + get(attributes, sanitizeKey(idAttribute)) + ]) + ) + let results = [] + const compactedSelector = withoutUndefined(selector) + if (size(compactedSelector) === this.idAttributes.length) { + const index = await this.getIndex(this.doctype, this.idAttributes) + results = await this.cozyClient.data.query(index, { selector }) + } + + if (results.length === 0) { + return this.cozyClient.data.create( + this.doctype, + this.addCozyMetadata(attributes) + ) + } else { + results = sortBy(results, newestDocumentComparisonFunc) + if (results.length > 1) { + await this.handleDuplicates(options.handleDuplicates, results, selector) + } + + const doc = results[0] + const update = omit(attributes, userAttributes) + const updatedDoc = this.applyUpdateIfDifferent(doc, update) + if (updatedDoc !== doc) { + return this.cozyClient.data.updateAttributes( + this.doctype, + updatedDoc._id, + updatedDoc + ) } else { - output += array[i] + return doc } } - return output } -} -function removeFormattingTokens (input) { - if (input.match(/\[[\s\S]/)) { - return input.replace(/^\[|]$/g, '') + static create(attributes) { + if (this.usesCozyClient()) { + return this.createViaNewClient(attributes) + } + + return this.createViaOldClient(attributes) } - return input.replace(/\\/g, '') -} -function formatTimezone (offset, delimeter) { - delimeter = delimeter || '' - var sign = offset > 0 ? '-' : '+' - var absOffset = Math.abs(offset) - var hours = Math.floor(absOffset / 60) - var minutes = absOffset % 60 - return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2) -} + static createViaNewClient(attributes) { + return this.cozyClient.create(this.doctype, attributes) + } -function addLeadingZeros (number, targetLength) { - var output = Math.abs(number).toString() - while (output.length < targetLength) { - output = '0' + output + static createViaOldClient(attributes) { + return this.cozyClient.data.create(this.doctype, attributes) } - return output -} -module.exports = format + /** + * Save many documents concurrently + */ + static bulkSave(documents, optionsOrConcurrency, logProgressOrNothing) { + if (logProgressOrNothing || typeof optionsOrConcurrency !== 'object') { + log( + 'warn', + 'Second argument of bulkSave is now an object, please use bulkSave(documents, { logProgress, concurrency })' + ) + } + const options = {} -/***/ }), -/* 848 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof optionsOrConcurrency === 'number') { + options.concurrency = optionsOrConcurrency + } -var parse = __webpack_require__(772) -var startOfYear = __webpack_require__(849) -var differenceInCalendarDays = __webpack_require__(794) + if (typeof logProgressOrNothing === 'function') { + options.logProgress = logProgressOrNothing + } -/** - * @category Day Helpers - * @summary Get the day of the year of the given date. - * - * @description - * Get the day of the year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of year - * - * @example - * // Which day of the year is 2 July 2014? - * var result = getDayOfYear(new Date(2014, 6, 2)) - * //=> 183 - */ -function getDayOfYear (dirtyDate) { - var date = parse(dirtyDate) - var diff = differenceInCalendarDays(date, startOfYear(date)) - var dayOfYear = diff + 1 - return dayOfYear -} + if (typeof optionsOrConcurrency === 'object') { + Object.assign(options, optionsOrConcurrency) + } -module.exports = getDayOfYear + return this._bulkSave(documents, options) + } + /** + * @private + * + * Meat of the method bulkSave + */ + static _bulkSave(documents, options = {}) { + const { concurrency = 30, logProgress, ...createOrUpdateOptions } = options -/***/ }), -/* 849 */ -/***/ (function(module, exports, __webpack_require__) { + return parallelMap( + documents, + async doc => { + if (logProgress) { + logProgress(doc) + } + try { + const newDoc = await this.createOrUpdate(doc, createOrUpdateOptions) + return newDoc + } catch (e) { + if (options.onCreateOrUpdateError) { + return options.onCreateOrUpdateError(e, doc) + } else { + throw e + } + } + }, + concurrency + ) + } + + static query(index, options) { + if (this.usesCozyClient()) { + throw new Error('This method is not implemented yet with CozyClient') + } -var parse = __webpack_require__(772) + return this.queryViaOldClient(index, options) + } -/** - * @category Year Helpers - * @summary Return the start of a year for the given date. - * - * @description - * Return the start of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a year - * - * @example - * // The start of a year for 2 September 2014 11:55:00: - * var result = startOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Jan 01 2014 00:00:00 - */ -function startOfYear (dirtyDate) { - var cleanDate = parse(dirtyDate) - var date = new Date(0) - date.setFullYear(cleanDate.getFullYear(), 0, 1) - date.setHours(0, 0, 0, 0) - return date -} + static queryViaOldClient(index, options) { + return this.cozyClient.data.query(index, options) + } -module.exports = startOfYear + static async fetchAll() { + const stackClient = this.usesCozyClient() + ? this.cozyClient.stackClient + : this.cozyClient + + try { + const result = await stackClient.fetchJSON( + 'GET', + `/data/${this.doctype}/_all_docs?include_docs=true` + ) + return result.rows + .filter(x => x.id.indexOf('_design') !== 0 && x.doc) + .map(x => x.doc) + } catch (e) { + if (e && e.response && e.response.status && e.response.status === 404) { + return [] + } else { + return [] + } + } + } + static async updateAll(docs) { + const stackClient = this.usesCozyClient() + ? this.cozyClient.stackClient + : this.cozyClient -/***/ }), -/* 850 */ -/***/ (function(module, exports, __webpack_require__) { + if (!docs || !docs.length) { + return Promise.resolve([]) + } + try { + const update = await stackClient.fetchJSON( + 'POST', + `/data/${this.doctype}/_bulk_docs`, + { + docs + } + ) + return update + } catch (e) { + if ( + e.reason && + e.reason.reason && + e.reason.reason == DATABASE_DOES_NOT_EXIST + ) { + const firstDoc = await this.create(docs[0]) + const resp = await this.updateAll(docs.slice(1)) + resp.unshift({ ok: true, id: firstDoc._id, rev: firstDoc._rev }) + return resp + } else { + throw e + } + } + } -var parse = __webpack_require__(772) -var startOfISOWeek = __webpack_require__(790) -var startOfISOYear = __webpack_require__(793) + static async deleteAll(docs) { + return this.updateAll(docs.map(flagForDeletion)) + } -var MILLISECONDS_IN_WEEK = 604800000 + /** + * Find duplicates in a list of documents according to the + * idAttributes of the class. Priority is given to the document + * prior in the list. + * + * To introduce the notion of priority, you can sort your input docs + * according to this priorirty. + * + * @param {Array[object]} docs + * @return {Array[object]} Duplicates + */ + static findDuplicates(docs) { + const fieldSeparator = '#$$$$#' + const idAttributes = this.idAttributes + const key = doc => { + return idAttributes + .map(idAttrPath => get(doc, idAttrPath)) + .join(fieldSeparator) + } + const groups = pickBy(groupBy(docs, key), group => group.length > 1) + const duplicates = flatMap(groups, group => group.slice(1)) + return duplicates + } -/** - * @category ISO Week Helpers - * @summary Get the ISO week of the given date. - * - * @description - * Get the ISO week of the given date. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the ISO week - * - * @example - * // Which week of the ISO-week numbering year is 2 January 2005? - * var result = getISOWeek(new Date(2005, 0, 2)) - * //=> 53 - */ -function getISOWeek (dirtyDate) { - var date = parse(dirtyDate) - var diff = startOfISOWeek(date).getTime() - startOfISOYear(date).getTime() + /** + * Delete duplicates on the server. Find duplicates according to the + * idAttributes. + * + * @param {Function} Priority (optional). Among duplicates, which one should be prioritized) + * @return {Promise} + * @example + * ``` + * deleteDuplicates(doc => -doc.dateImport) // will duplicate documents so that the oldest document is conserved + * ``` + */ + static async deleteDuplicates(priorityFn) { + let allDocs = await this.fetchAll() + if (priorityFn) { + allDocs = sortBy(allDocs, priorityFn) + } + const duplicates = this.findDuplicates(allDocs) + return this.deleteAll(duplicates) + } - // Round the number of days to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round(diff / MILLISECONDS_IN_WEEK) + 1 -} + /** + * Use Couch _changes API + * + * @param {string} since Starting sequence for changes + * @param {[type]} options { includeDesign: false, includeDeleted: false } + */ + static async fetchChanges(since, options = {}) { + const stackClient = this.usesCozyClient() + ? this.cozyClient.stackClient + : this.cozyClient -module.exports = getISOWeek + const queryParams = { + since, + include_docs: 'true' + } + if (options.params) { + Object.assign(queryParams, options.params) + } + const result = await stackClient.fetchJSON( + 'GET', + `/data/${this.doctype}/_changes?${querystring.stringify(queryParams)}` + ) + const newLastSeq = result.last_seq + let docs = result.results.map(x => x.doc).filter(Boolean) -/***/ }), -/* 851 */ -/***/ (function(module, exports, __webpack_require__) { + if (!options.includeDesign) { + docs = docs.filter(doc => doc._id.indexOf('_design') !== 0) + } -var isDate = __webpack_require__(774) + if (!options.includeDeleted) { + docs = docs.filter(doc => !doc._deleted) + } -/** - * @category Common Helpers - * @summary Is the given date valid? - * - * @description - * Returns false if argument is Invalid Date and true otherwise. - * Invalid Date is a Date, whose time value is NaN. - * - * Time value of Date: http://es5.github.io/#x15.9.1.1 - * - * @param {Date} date - the date to check - * @returns {Boolean} the date is valid - * @throws {TypeError} argument must be an instance of Date - * - * @example - * // For the valid date: - * var result = isValid(new Date(2014, 1, 31)) - * //=> true - * - * @example - * // For the invalid date: - * var result = isValid(new Date('')) - * //=> false - */ -function isValid (dirtyDate) { - if (isDate(dirtyDate)) { - return !isNaN(dirtyDate) - } else { - throw new TypeError(toString.call(dirtyDate) + ' is not an instance of Date') + return { newLastSeq, documents: docs } } -} - -module.exports = isValid + /** + * Fetches all documents for a given doctype exceeding the 100 limit. + * It is slower that fetchAll because it fetches the data 100 by 100 but allows to filter the data + * with a selector and an index + * + * Parameters: + * + * * `selector` (object): the mango query selector + * * `index` (object): (optional) the query selector index. If not defined, the function will + * create it's own index with the keys specified in the selector + * + * + * ```javascript + * const documents = await Bills.queryAll({vendor: 'Direct Energie'}) + * ``` + * + */ + static async queryAll(selector, index) { + if (this.usesCozyClient()) { + return this.queryAllViaNewClient(selector) + } -/***/ }), -/* 852 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) - -/** - * @category Day Helpers - * @summary Get the day of the month of the given date. - * - * @description - * Get the day of the month of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of month - * - * @example - * // Which day of the month is 29 February 2012? - * var result = getDate(new Date(2012, 1, 29)) - * //=> 29 - */ -function getDate (dirtyDate) { - var date = parse(dirtyDate) - var dayOfMonth = date.getDate() - return dayOfMonth -} + return this.queryAllViaOldClient(selector, index) + } -module.exports = getDate + static async queryAllViaNewClient(selector) { + if (!selector) { + return this.fetchAll() + } + let query + // let's deal with very old cozy-client where Q doesn't exist. + if (Q !== undefined) { + query = Q(this.doctype).where(selector) + } else { + query = this.cozyClient.find(this.doctype).where(selector) + } -/***/ }), -/* 853 */ -/***/ (function(module, exports, __webpack_require__) { + let resp = await this.cozyClient.query(query) + let result = resp.data -var parse = __webpack_require__(772) + while (resp && resp.next) { + if (resp.bookmark && query.offsetBookmark) { + resp = await this.cozyClient.query(query.offsetBookmark(resp.bookmark)) + } else { + resp = await this.cozyClient.query(query.offset(result.length)) + } -/** - * @category Weekday Helpers - * @summary Get the day of the week of the given date. - * - * @description - * Get the day of the week of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of week - * - * @example - * // Which day of the week is 29 February 2012? - * var result = getDay(new Date(2012, 1, 29)) - * //=> 3 - */ -function getDay (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - return day -} + result.push(...resp.data) + } -module.exports = getDay + return result + } + static async queryAllViaOldClient(selector, indexArg) { + if (!selector) { + // fetchAll is faster in this case + return await this.fetchAll() + } -/***/ }), -/* 854 */ -/***/ (function(module, exports, __webpack_require__) { + let index = indexArg + if (!index) { + index = await this.cozyClient.data.defineIndex( + this.doctype, + Object.keys(selector) + ) + } -var isLeapYear = __webpack_require__(855) + const result = [] + let resp = { next: true } + while (resp && resp.next) { + resp = await this.cozyClient.data.query(index, { + selector, + wholeResponse: true, + skip: result.length + }) + result.push(...resp.docs) + } + return result + } -/** - * @category Year Helpers - * @summary Get the number of days in a year of the given date. - * - * @description - * Get the number of days in a year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of days in a year - * - * @example - * // How many days are in 2012? - * var result = getDaysInYear(new Date(2012, 0, 1)) - * //=> 366 - */ -function getDaysInYear (dirtyDate) { - return isLeapYear(dirtyDate) ? 366 : 365 + /** + * Fetch in one request a batch of documents by id. + * @param {String[]} ids - Ids of documents to fetch + * @return {Promise} - Promise resolving to an array of documents, unfound document are filtered + */ + static async getAll(ids) { + const stackClient = this.usesCozyClient() + ? this.cozyClient.stackClient + : this.cozyClient + let resp + try { + resp = await stackClient.fetchJSON( + 'POST', + `/data/${this.doctype}/_all_docs?include_docs=true`, + { + keys: ids + } + ) + } catch (error) { + if (error.message.match(/not_found/)) { + return [] + } + throw error + } + const rows = resp.rows.filter(row => row.doc) + return rows.map(row => row.doc) + } } -module.exports = getDaysInYear - - -/***/ }), -/* 855 */ -/***/ (function(module, exports, __webpack_require__) { +Document.defaultDuplicateHandling = 'throw' -var parse = __webpack_require__(772) +Document.duplicateHandlingStrategies = { + throw: function (duplicates, selector) { + throw new Error( + 'Create or update with selectors that returns more than 1 result\n' + + JSON.stringify(selector) + + '\n' + + JSON.stringify(duplicates) + ) + }, -/** - * @category Year Helpers - * @summary Is the given date in the leap year? - * - * @description - * Is the given date in the leap year? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the leap year - * - * @example - * // Is 1 September 2012 in the leap year? - * var result = isLeapYear(new Date(2012, 8, 1)) - * //=> true - */ -function isLeapYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - return year % 400 === 0 || year % 4 === 0 && year % 100 !== 0 + remove: async function (duplicates) { + const docsToRemove = duplicates.slice(1) + if (docsToRemove.length > 0) { + log( + 'warn', + `Cleaning duplicates for doctype ${this.doctype} (kept: ${ + duplicates[0]._id + }, removed: ${docsToRemove.map(x => x._id)})` + ) + await this.deleteAll(docsToRemove) + } + } } -module.exports = isLeapYear +module.exports = Document /***/ }), -/* 856 */ +/* 910 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var baseIteratee = __webpack_require__(101), + negate = __webpack_require__(911), + pickBy = __webpack_require__(329); /** - * @category Hour Helpers - * @summary Get the hours of the given date. + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). * - * @description - * Get the hours of the given date. + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example * - * @param {Date|String|Number} date - the given date - * @returns {Number} the hours + * var object = { 'a': 1, 'b': '2', 'c': 3 }; * - * @example - * // Get the hours of 29 February 2012 11:45:00: - * var result = getHours(new Date(2012, 1, 29, 11, 45)) - * //=> 11 + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } */ -function getHours (dirtyDate) { - var date = parse(dirtyDate) - var hours = date.getHours() - return hours +function omitBy(object, predicate) { + return pickBy(object, negate(baseIteratee(predicate))); } -module.exports = getHours +module.exports = omitBy; /***/ }), -/* 857 */ -/***/ (function(module, exports, __webpack_require__) { +/* 911 */ +/***/ (function(module, exports) { -var parse = __webpack_require__(772) +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; /** - * @category Weekday Helpers - * @summary Get the day of the ISO week of the given date. - * - * @description - * Get the day of the ISO week of the given date, - * which is 7 for Sunday, 1 for Monday etc. + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example * - * @param {Date|String|Number} date - the given date - * @returns {Number} the day of ISO week + * function isEven(n) { + * return n % 2 == 0; + * } * - * @example - * // Which day of the ISO week is 26 February 2012? - * var result = getISODay(new Date(2012, 1, 26)) - * //=> 7 + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] */ -function getISODay (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - - if (day === 0) { - day = 7 +function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); } - - return day + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; } -module.exports = getISODay +module.exports = negate; /***/ }), -/* 858 */ -/***/ (function(module, exports, __webpack_require__) { - -var startOfISOYear = __webpack_require__(793) -var addWeeks = __webpack_require__(801) - -var MILLISECONDS_IN_WEEK = 604800000 +/* 912 */ +/***/ (function(module, exports) { /** - * @category ISO Week-Numbering Year Helpers - * @summary Get the number of weeks in an ISO week-numbering year of the given date. - * - * @description - * Get the number of weeks in an ISO week-numbering year of the given date. + * Checks if `value` is `undefined`. * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example * - * @param {Date|String|Number} date - the given date - * @returns {Number} the number of ISO weeks in a year + * _.isUndefined(void 0); + * // => true * - * @example - * // How many weeks are in ISO week-numbering year 2015? - * var result = getISOWeeksInYear(new Date(2015, 1, 11)) - * //=> 53 + * _.isUndefined(null); + * // => false */ -function getISOWeeksInYear (dirtyDate) { - var thisYear = startOfISOYear(dirtyDate) - var nextYear = startOfISOYear(addWeeks(thisYear, 60)) - var diff = nextYear.valueOf() - thisYear.valueOf() - // Round the number of weeks to the nearest integer - // because the number of milliseconds in a week is not constant - // (e.g. it's different in the week of the daylight saving time clock shift) - return Math.round(diff / MILLISECONDS_IN_WEEK) +function isUndefined(value) { + return value === undefined; } -module.exports = getISOWeeksInYear +module.exports = isUndefined; /***/ }), -/* 859 */ +/* 913 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var baseFlatten = __webpack_require__(183), + map = __webpack_require__(914); /** - * @category Millisecond Helpers - * @summary Get the milliseconds of the given date. + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). * - * @description - * Get the milliseconds of the given date. + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example * - * @param {Date|String|Number} date - the given date - * @returns {Number} the milliseconds + * function duplicate(n) { + * return [n, n]; + * } * - * @example - * // Get the milliseconds of 29 February 2012 11:45:05.123: - * var result = getMilliseconds(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 123 + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] */ -function getMilliseconds (dirtyDate) { - var date = parse(dirtyDate) - var milliseconds = date.getMilliseconds() - return milliseconds +function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); } -module.exports = getMilliseconds +module.exports = flatMap; /***/ }), -/* 860 */ +/* 914 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +var arrayMap = __webpack_require__(172), + baseIteratee = __webpack_require__(101), + baseMap = __webpack_require__(395), + isArray = __webpack_require__(87); /** - * @category Minute Helpers - * @summary Get the minutes of the given date. + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). * - * @description - * Get the minutes of the given date. + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. * - * @param {Date|String|Number} date - the given date - * @returns {Number} the minutes + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. * @example - * // Get the minutes of 29 February 2012 11:45:05: - * var result = getMinutes(new Date(2012, 1, 29, 11, 45, 5)) - * //=> 45 + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] */ -function getMinutes (dirtyDate) { - var date = parse(dirtyDate) - var minutes = date.getMinutes() - return minutes +function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, baseIteratee(iteratee, 3)); } -module.exports = getMinutes +module.exports = map; /***/ }), -/* 861 */ +/* 915 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +const PromisePool = __webpack_require__(916) /** - * @category Month Helpers - * @summary Get the month of the given date. - * - * @description - * Get the month of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the month + * Like a map, executed in parallel via a promise pool * - * @example - * // Which month is 29 February 2012? - * var result = getMonth(new Date(2012, 1, 29)) - * //=> 1 + * @param {Array} arr Items to process + * @param {Function} fn Promise creator (will be passed each item) + * @param {Number} concurrency How many promise can be in flight at the same time + * @return {Promise} Resolved with the results of the promise, not necessary in order */ -function getMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - return month +const parallelMap = (iterable, fn, concurrencyArg) => { + const concurrency = concurrencyArg || 30 + const res = [] + const pool = new PromisePool(function* () { + for (let item of iterable) { + yield fn(item).then(x => res.push(x)) + } + }, concurrency) + return pool.start().then(() => res) } -module.exports = getMonth +module.exports = { + parallelMap +} + + +/***/ }), +/* 916 */ +/***/ (function(module, exports, __webpack_require__) { + +var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory) { + /* istanbul ignore next */ + if (true) { + !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), + __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? + (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), + __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) + } else {} +})(this, function () { + 'use strict' + + var EventTarget = function () { + this._listeners = {} + } + + EventTarget.prototype.addEventListener = function (type, listener) { + this._listeners[type] = this._listeners[type] || [] + if (this._listeners[type].indexOf(listener) < 0) { + this._listeners[type].push(listener) + } + } + + EventTarget.prototype.removeEventListener = function (type, listener) { + if (this._listeners[type]) { + var p = this._listeners[type].indexOf(listener) + if (p >= 0) { + this._listeners[type].splice(p, 1) + } + } + } + + EventTarget.prototype.dispatchEvent = function (evt) { + if (this._listeners[evt.type] && this._listeners[evt.type].length) { + var listeners = this._listeners[evt.type].slice() + for (var i = 0, l = listeners.length; i < l; ++i) { + listeners[i].call(this, evt) + } + } + } + + var isGenerator = function (func) { + return (typeof func.constructor === 'function' && + func.constructor.name === 'GeneratorFunction') + } + + var functionToIterator = function (func) { + return { + next: function () { + var promise = func() + return promise ? {value: promise} : {done: true} + } + } + } + + var promiseToIterator = function (promise) { + var called = false + return { + next: function () { + if (called) { + return {done: true} + } + called = true + return {value: promise} + } + } + } + + var toIterator = function (obj, Promise) { + var type = typeof obj + if (type === 'object') { + if (typeof obj.next === 'function') { + return obj + } + /* istanbul ignore else */ + if (typeof obj.then === 'function') { + return promiseToIterator(obj) + } + } + if (type === 'function') { + return isGenerator(obj) ? obj() : functionToIterator(obj) + } + return promiseToIterator(Promise.resolve(obj)) + } + + var PromisePoolEvent = function (target, type, data) { + this.target = target + this.type = type + this.data = data + } + + var PromisePool = function (source, concurrency, options) { + EventTarget.call(this) + if (typeof concurrency !== 'number' || + Math.floor(concurrency) !== concurrency || + concurrency < 1) { + throw new Error('Invalid concurrency') + } + this._concurrency = concurrency + this._options = options || {} + this._options.promise = this._options.promise || Promise + this._iterator = toIterator(source, this._options.promise) + this._done = false + this._size = 0 + this._promise = null + this._callbacks = null + } + PromisePool.prototype = new EventTarget() + PromisePool.prototype.constructor = PromisePool + PromisePool.prototype.concurrency = function (value) { + if (typeof value !== 'undefined') { + this._concurrency = value + if (this.active()) { + this._proceed() + } + } + return this._concurrency + } -/***/ }), -/* 862 */ -/***/ (function(module, exports, __webpack_require__) { + PromisePool.prototype.size = function () { + return this._size + } -var parse = __webpack_require__(772) + PromisePool.prototype.active = function () { + return !!this._promise + } -var MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000 + PromisePool.prototype.promise = function () { + return this._promise + } -/** - * @category Range Helpers - * @summary Get the number of days that overlap in two date ranges - * - * @description - * Get the number of days that overlap in two date ranges - * - * @param {Date|String|Number} initialRangeStartDate - the start of the initial range - * @param {Date|String|Number} initialRangeEndDate - the end of the initial range - * @param {Date|String|Number} comparedRangeStartDate - the start of the range to compare it with - * @param {Date|String|Number} comparedRangeEndDate - the end of the range to compare it with - * @returns {Number} the number of days that overlap in two date ranges - * @throws {Error} startDate of a date range cannot be after its endDate - * - * @example - * // For overlapping date ranges adds 1 for each started overlapping day: - * getOverlappingDaysInRanges( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 17), new Date(2014, 0, 21) - * ) - * //=> 3 - * - * @example - * // For non-overlapping date ranges returns 0: - * getOverlappingDaysInRanges( - * new Date(2014, 0, 10), new Date(2014, 0, 20), new Date(2014, 0, 21), new Date(2014, 0, 22) - * ) - * //=> 0 - */ -function getOverlappingDaysInRanges (dirtyInitialRangeStartDate, dirtyInitialRangeEndDate, dirtyComparedRangeStartDate, dirtyComparedRangeEndDate) { - var initialStartTime = parse(dirtyInitialRangeStartDate).getTime() - var initialEndTime = parse(dirtyInitialRangeEndDate).getTime() - var comparedStartTime = parse(dirtyComparedRangeStartDate).getTime() - var comparedEndTime = parse(dirtyComparedRangeEndDate).getTime() + PromisePool.prototype.start = function () { + var that = this + var Promise = this._options.promise + this._promise = new Promise(function (resolve, reject) { + that._callbacks = { + reject: reject, + resolve: resolve + } + that._proceed() + }) + return this._promise + } - if (initialStartTime > initialEndTime || comparedStartTime > comparedEndTime) { - throw new Error('The start of the range cannot be after the end of the range') + PromisePool.prototype._fireEvent = function (type, data) { + this.dispatchEvent(new PromisePoolEvent(this, type, data)) } - var isOverlapping = initialStartTime < comparedEndTime && comparedStartTime < initialEndTime + PromisePool.prototype._settle = function (error) { + if (error) { + this._callbacks.reject(error) + } else { + this._callbacks.resolve() + } + this._promise = null + this._callbacks = null + } - if (!isOverlapping) { - return 0 + PromisePool.prototype._onPooledPromiseFulfilled = function (promise, result) { + this._size-- + if (this.active()) { + this._fireEvent('fulfilled', { + promise: promise, + result: result + }) + this._proceed() + } } - var overlapStartDate = comparedStartTime < initialStartTime - ? initialStartTime - : comparedStartTime + PromisePool.prototype._onPooledPromiseRejected = function (promise, error) { + this._size-- + if (this.active()) { + this._fireEvent('rejected', { + promise: promise, + error: error + }) + this._settle(error || new Error('Unknown error')) + } + } - var overlapEndDate = comparedEndTime > initialEndTime - ? initialEndTime - : comparedEndTime + PromisePool.prototype._trackPromise = function (promise) { + var that = this + promise + .then(function (result) { + that._onPooledPromiseFulfilled(promise, result) + }, function (error) { + that._onPooledPromiseRejected(promise, error) + })['catch'](function (err) { + that._settle(new Error('Promise processing failed: ' + err)) + }) + } - var differenceInMs = overlapEndDate - overlapStartDate + PromisePool.prototype._proceed = function () { + if (!this._done) { + var result = { done: false } + while (this._size < this._concurrency && + !(result = this._iterator.next()).done) { + this._size++ + this._trackPromise(result.value) + } + this._done = (result === null || !!result.done) + } + if (this._done && this._size === 0) { + this._settle() + } + } - return Math.ceil(differenceInMs / MILLISECONDS_IN_DAY) -} + PromisePool.PromisePoolEvent = PromisePoolEvent + // Legacy API + PromisePool.PromisePool = PromisePool -module.exports = getOverlappingDaysInRanges + return PromisePool +}) /***/ }), -/* 863 */ +/* 917 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +const { filterLevel, filterSecrets } = __webpack_require__(918) +const Secret = __webpack_require__(919) +const { LOG_LEVEL } = process.env +let level = LOG_LEVEL || 'debug' +const format = __webpack_require__(920) +const filters = [filterLevel, filterSecrets] -/** - * @category Second Helpers - * @summary Get the seconds of the given date. - * - * @description - * Get the seconds of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the seconds - * - * @example - * // Get the seconds of 29 February 2012 11:45:05.123: - * var result = getSeconds(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 5 - */ -function getSeconds (dirtyDate) { - var date = parse(dirtyDate) - var seconds = date.getSeconds() - return seconds +const filterOut = function () { + for (const filter of filters) { + if (filter.apply(null, arguments) === false) { + return true + } + } + return false } -module.exports = getSeconds - - -/***/ }), -/* 864 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) - /** - * @category Timestamp Helpers - * @summary Get the milliseconds timestamp of the given date. + * Use it to log messages in your konnector. Typical types are * - * @description - * Get the milliseconds timestamp of the given date. + * - `debug` + * - `warning` + * - `info` + * - `error` + * - `ok` * - * @param {Date|String|Number} date - the given date - * @returns {Number} the timestamp * * @example - * // Get the timestamp of 29 February 2012 11:45:05.123: - * var result = getTime(new Date(2012, 1, 29, 11, 45, 5, 123)) - * //=> 1330515905123 + * + * They will be colored in development mode. In production mode, those logs are formatted in JSON to be interpreted by the stack and possibly sent to the client. `error` will stop the konnector. + * + * ```js + * logger = log('my-namespace') + * logger('debug', '365 bills') + * // my-namespace : debug : 365 bills + * logger('info', 'Page fetched') + * // my-namespace : info : Page fetched + * ``` + * @param {string} type + * @param {string} message + * @param {string} label + * @param {string} namespace */ -function getTime (dirtyDate) { - var date = parse(dirtyDate) - var timestamp = date.getTime() - return timestamp +function log(type, message, label, namespace) { + if (filterOut(level, type, message, label, namespace)) { + return + } + // eslint-disable-next-line no-console + console.log(format(type, message, label, namespace)) } -module.exports = getTime +log.addFilter = function (filter) { + return filters.push(filter) +} +log.setLevel = function (lvl) { + level = lvl +} -/***/ }), -/* 865 */ -/***/ (function(module, exports, __webpack_require__) { +// Short-hands +const methods = ['debug', 'info', 'warn', 'error', 'ok', 'critical'] +methods.forEach(level => { + log[level] = function (message, label, namespace) { + return log(level, message, label, namespace) + } +}) -var parse = __webpack_require__(772) +module.exports = log -/** - * @category Year Helpers - * @summary Get the year of the given date. - * - * @description - * Get the year of the given date. - * - * @param {Date|String|Number} date - the given date - * @returns {Number} the year - * - * @example - * // Which year is 2 July 2014? - * var result = getYear(new Date(2014, 6, 2)) - * //=> 2014 - */ -function getYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - return year +log.setNoRetry = obj => { + if (obj) obj.no_retry = true + else obj = { no_retry: true } + return obj.no_retry +} +log.Secret = Secret +log.namespace = function (namespace) { + return function (type, message, label, ns = namespace) { + log(type, message, label, ns) + } } -module.exports = getYear - /***/ }), -/* 866 */ +/* 918 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +const levels = { + secret: 0, + debug: 10, + info: 20, + warn: 30, + error: 40, + ok: 50, + critical: 50 +} -/** - * @category Common Helpers - * @summary Is the first date before the second one? - * - * @description - * Is the first date before the second one? - * - * @param {Date|String|Number} date - the date that should be before the other one to return true - * @param {Date|String|Number} dateToCompare - the date to compare with - * @returns {Boolean} the first date is before the second date - * - * @example - * // Is 10 July 1989 before 11 February 1987? - * var result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11)) - * //=> false - */ -function isBefore (dirtyDate, dirtyDateToCompare) { - var date = parse(dirtyDate) - var dateToCompare = parse(dirtyDateToCompare) - return date.getTime() < dateToCompare.getTime() +const Secret = __webpack_require__(919) + +const filterSecrets = function (level, type, message) { + if (type !== 'secret' && message instanceof Secret) { + throw new Error('You should log a secret with log.secret') + } } -module.exports = isBefore +const filterLevel = function (level, type) { + return levels[type] >= levels[level] +} + +module.exports = { + filterSecrets, + filterLevel +} /***/ }), -/* 867 */ -/***/ (function(module, exports, __webpack_require__) { +/* 919 */ +/***/ (function(module, exports) { -var parse = __webpack_require__(772) +const Secret = function (data) { + Object.assign(this, data) + return this +} -/** - * @category Common Helpers - * @summary Are the given dates equal? - * - * @description - * Are the given dates equal? - * - * @param {Date|String|Number} dateLeft - the first date to compare - * @param {Date|String|Number} dateRight - the second date to compare - * @returns {Boolean} the dates are equal - * - * @example - * // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal? - * var result = isEqual( - * new Date(2014, 6, 2, 6, 30, 45, 0) - * new Date(2014, 6, 2, 6, 30, 45, 500) - * ) - * //=> false - */ -function isEqual (dirtyLeftDate, dirtyRightDate) { - var dateLeft = parse(dirtyLeftDate) - var dateRight = parse(dirtyRightDate) - return dateLeft.getTime() === dateRight.getTime() +Secret.prototype.toString = function () { + throw new Error('Cannot convert Secret to string') } -module.exports = isEqual +module.exports = Secret /***/ }), -/* 868 */ +/* 920 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +const prodFormat = __webpack_require__(921) +const devFormat = __webpack_require__(922) -/** - * @category Month Helpers - * @summary Is the given date the first day of a month? - * - * @description - * Is the given date the first day of a month? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is the first day of a month - * - * @example - * // Is 1 September 2014 the first day of a month? - * var result = isFirstDayOfMonth(new Date(2014, 8, 1)) - * //=> true - */ -function isFirstDayOfMonth (dirtyDate) { - return parse(dirtyDate).getDate() === 1 +switch ("none") { + case 'production': + module.exports = prodFormat + break + case 'development': + module.exports = devFormat + break + case 'standalone': + module.exports = devFormat + break + case 'test': + module.exports = devFormat + break + default: + module.exports = prodFormat } -module.exports = isFirstDayOfMonth - /***/ }), -/* 869 */ +/* 921 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) - -/** - * @category Weekday Helpers - * @summary Is the given date Friday? - * - * @description - * Is the given date Friday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Friday - * - * @example - * // Is 26 September 2014 Friday? - * var result = isFriday(new Date(2014, 8, 26)) - * //=> true - */ -function isFriday (dirtyDate) { - return parse(dirtyDate).getDay() === 5 -} +const stringify = __webpack_require__(8) -module.exports = isFriday +const LOG_LENGTH_LIMIT = 64 * 1024 - 1 +function prodFormat(type, message, label, namespace) { + const log = { time: new Date(), type, label, namespace } -/***/ }), -/* 870 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof message === 'object') { + if (message && message.no_retry) { + log.no_retry = message.no_retry + } + if (message && message.message) { + log.message = message.message + } + } else { + log.message = message + } -var parse = __webpack_require__(772) + // properly display error messages + if (log.message && log.message.stack) { + log.message = log.message.stack + } -/** - * @category Common Helpers - * @summary Is the given date in the future? - * - * @description - * Is the given date in the future? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the future - * - * @example - * // If today is 6 October 2014, is 31 December 2014 in the future? - * var result = isFuture(new Date(2014, 11, 31)) - * //=> true - */ -function isFuture (dirtyDate) { - return parse(dirtyDate).getTime() > new Date().getTime() + // cut the string to avoid a fail in the stack + let result = log + try { + result = stringify(log).substr(0, LOG_LENGTH_LIMIT) + } catch (err) { + // eslint-disable-next-line no-console + console.log(err.message, 'cozy-logger: Failed to convert message to JSON') + } + return result } -module.exports = isFuture +module.exports = prodFormat /***/ }), -/* 871 */ +/* 922 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) -var endOfDay = __webpack_require__(834) -var endOfMonth = __webpack_require__(840) +const util = __webpack_require__(10) +const chalk = __webpack_require__(923) -/** - * @category Month Helpers - * @summary Is the given date the last day of a month? - * - * @description - * Is the given date the last day of a month? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is the last day of a month - * - * @example - * // Is 28 February 2014 the last day of a month? - * var result = isLastDayOfMonth(new Date(2014, 1, 28)) - * //=> true - */ -function isLastDayOfMonth (dirtyDate) { - var date = parse(dirtyDate) - return endOfDay(date).getTime() === endOfMonth(date).getTime() +if (util && util.inspect && util.inspect.defaultOptions) { + util.inspect.defaultOptions.maxArrayLength = null + util.inspect.defaultOptions.depth = 2 + util.inspect.defaultOptions.colors = true } -module.exports = isLastDayOfMonth +const type2color = { + debug: 'cyan', + warn: 'yellow', + info: 'blue', + error: 'red', + ok: 'green', + secret: 'red', + critical: 'red' +} +function devFormat(type, message, label, namespace) { + let formatmessage = message -/***/ }), -/* 872 */ -/***/ (function(module, exports, __webpack_require__) { + if (typeof formatmessage !== 'string') { + formatmessage = util.inspect(formatmessage) + } -var parse = __webpack_require__(772) + let formatlabel = label ? ` : "${label}" ` : '' + let formatnamespace = namespace ? chalk.magenta(`${namespace}: `) : '' -/** - * @category Weekday Helpers - * @summary Is the given date Monday? - * - * @description - * Is the given date Monday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Monday - * - * @example - * // Is 22 September 2014 Monday? - * var result = isMonday(new Date(2014, 8, 22)) - * //=> true - */ -function isMonday (dirtyDate) { - return parse(dirtyDate).getDay() === 1 + let color = type2color[type] + let formattype = color ? chalk[color](type) : type + + return `${formatnamespace}${formattype}${formatlabel} : ${formatmessage}` } -module.exports = isMonday +module.exports = devFormat /***/ }), -/* 873 */ +/* 923 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) +"use strict"; -/** - * @category Common Helpers - * @summary Is the given date in the past? - * - * @description - * Is the given date in the past? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in the past - * - * @example - * // If today is 6 October 2014, is 2 July 2014 in the past? - * var result = isPast(new Date(2014, 6, 2)) - * //=> true - */ -function isPast (dirtyDate) { - return parse(dirtyDate).getTime() < new Date().getTime() -} +const escapeStringRegexp = __webpack_require__(12); +const ansiStyles = __webpack_require__(924); +const stdoutColor = __webpack_require__(929).stdout; -module.exports = isPast +const template = __webpack_require__(930); +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); -/***/ }), -/* 874 */ -/***/ (function(module, exports, __webpack_require__) { +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; -var startOfDay = __webpack_require__(795) +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); -/** - * @category Day Helpers - * @summary Are the given dates in the same day? - * - * @description - * Are the given dates in the same day? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same day - * - * @example - * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day? - * var result = isSameDay( - * new Date(2014, 8, 4, 6, 0), - * new Date(2014, 8, 4, 18, 0) - * ) - * //=> true - */ -function isSameDay (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfDay = startOfDay(dirtyDateLeft) - var dateRightStartOfDay = startOfDay(dirtyDateRight) +const styles = Object.create(null); - return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime() +function applyOptions(obj, options) { + options = options || {}; + + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; } -module.exports = isSameDay +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; -/***/ }), -/* 875 */ -/***/ (function(module, exports, __webpack_require__) { + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); -var startOfHour = __webpack_require__(876) + chalk.template.constructor = Chalk; -/** - * @category Hour Helpers - * @summary Are the given dates in the same hour? - * - * @description - * Are the given dates in the same hour? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same hour - * - * @example - * // Are 4 September 2014 06:00:00 and 4 September 06:30:00 in the same hour? - * var result = isSameHour( - * new Date(2014, 8, 4, 6, 0), - * new Date(2014, 8, 4, 6, 30) - * ) - * //=> true - */ -function isSameHour (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfHour = startOfHour(dirtyDateLeft) - var dateRightStartOfHour = startOfHour(dirtyDateRight) + return chalk.template; + } - return dateLeftStartOfHour.getTime() === dateRightStartOfHour.getTime() + applyOptions(this, options); } -module.exports = isSameHour +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); -/***/ }), -/* 876 */ -/***/ (function(module, exports, __webpack_require__) { + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; -var parse = __webpack_require__(772) +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } -/** - * @category Hour Helpers - * @summary Return the start of an hour for the given date. - * - * @description - * Return the start of an hour for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of an hour - * - * @example - * // The start of an hour for 2 September 2014 11:55:00: - * var result = startOfHour(new Date(2014, 8, 2, 11, 55)) - * //=> Tue Sep 02 2014 11:00:00 - */ -function startOfHour (dirtyDate) { - var date = parse(dirtyDate) - date.setMinutes(0, 0, 0) - return date + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; } -module.exports = startOfHour +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} +const proto = Object.defineProperties(() => {}, styles); -/***/ }), -/* 877 */ -/***/ (function(module, exports, __webpack_require__) { +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; -var isSameWeek = __webpack_require__(878) + builder._styles = _styles; + builder._empty = _empty; -/** - * @category ISO Week Helpers - * @summary Are the given dates in the same ISO week? - * - * @description - * Are the given dates in the same ISO week? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same ISO week - * - * @example - * // Are 1 September 2014 and 7 September 2014 in the same ISO week? - * var result = isSameISOWeek( - * new Date(2014, 8, 1), - * new Date(2014, 8, 7) - * ) - * //=> true - */ -function isSameISOWeek (dirtyDateLeft, dirtyDateRight) { - return isSameWeek(dirtyDateLeft, dirtyDateRight, {weekStartsOn: 1}) + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; } -module.exports = isSameISOWeek +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + if (argsLen === 0) { + return ''; + } -/***/ }), -/* 878 */ -/***/ (function(module, exports, __webpack_require__) { + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } -var startOfWeek = __webpack_require__(791) + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } -/** - * @category Week Helpers - * @summary Are the given dates in the same week? - * - * @description - * Are the given dates in the same week? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Boolean} the dates are in the same week - * - * @example - * // Are 31 August 2014 and 4 September 2014 in the same week? - * var result = isSameWeek( - * new Date(2014, 7, 31), - * new Date(2014, 8, 4) - * ) - * //=> true - * - * @example - * // If week starts with Monday, - * // are 31 August 2014 and 4 September 2014 in the same week? - * var result = isSameWeek( - * new Date(2014, 7, 31), - * new Date(2014, 8, 4), - * {weekStartsOn: 1} - * ) - * //=> false - */ -function isSameWeek (dirtyDateLeft, dirtyDateRight, dirtyOptions) { - var dateLeftStartOfWeek = startOfWeek(dirtyDateLeft, dirtyOptions) - var dateRightStartOfWeek = startOfWeek(dirtyDateRight, dirtyOptions) + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } - return dateLeftStartOfWeek.getTime() === dateRightStartOfWeek.getTime() -} + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; -module.exports = isSameWeek + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; -/***/ }), -/* 879 */ -/***/ (function(module, exports, __webpack_require__) { + return str; +} -var startOfISOYear = __webpack_require__(793) +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } -/** - * @category ISO Week-Numbering Year Helpers - * @summary Are the given dates in the same ISO week-numbering year? - * - * @description - * Are the given dates in the same ISO week-numbering year? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same ISO week-numbering year - * - * @example - * // Are 29 December 2003 and 2 January 2005 in the same ISO week-numbering year? - * var result = isSameISOYear( - * new Date(2003, 11, 29), - * new Date(2005, 0, 2) - * ) - * //=> true - */ -function isSameISOYear (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfYear = startOfISOYear(dirtyDateLeft) - var dateRightStartOfYear = startOfISOYear(dirtyDateRight) + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; - return dateLeftStartOfYear.getTime() === dateRightStartOfYear.getTime() + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); } -module.exports = isSameISOYear +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript /***/ }), -/* 880 */ +/* 924 */ /***/ (function(module, exports, __webpack_require__) { -var startOfMinute = __webpack_require__(881) +"use strict"; +/* WEBPACK VAR INJECTION */(function(module) { +const colorConvert = __webpack_require__(925); -/** - * @category Minute Helpers - * @summary Are the given dates in the same minute? - * - * @description - * Are the given dates in the same minute? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same minute - * - * @example - * // Are 4 September 2014 06:30:00 and 4 September 2014 06:30:15 - * // in the same minute? - * var result = isSameMinute( - * new Date(2014, 8, 4, 6, 30), - * new Date(2014, 8, 4, 6, 30, 15) - * ) - * //=> true - */ -function isSameMinute (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfMinute = startOfMinute(dirtyDateLeft) - var dateRightStartOfMinute = startOfMinute(dirtyDateRight) +const wrapAnsi16 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${code + offset}m`; +}; - return dateLeftStartOfMinute.getTime() === dateRightStartOfMinute.getTime() -} +const wrapAnsi256 = (fn, offset) => function () { + const code = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};5;${code}m`; +}; -module.exports = isSameMinute +const wrapAnsi16m = (fn, offset) => function () { + const rgb = fn.apply(colorConvert, arguments); + return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`; +}; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29] + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + // Bright color + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39] + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], -/***/ }), -/* 881 */ -/***/ (function(module, exports, __webpack_require__) { + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49] + } + }; -var parse = __webpack_require__(772) + // Fix humans + styles.color.grey = styles.color.gray; -/** - * @category Minute Helpers - * @summary Return the start of a minute for the given date. - * - * @description - * Return the start of a minute for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a minute - * - * @example - * // The start of a minute for 1 December 2014 22:15:45.400: - * var result = startOfMinute(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:00 - */ -function startOfMinute (dirtyDate) { - var date = parse(dirtyDate) - date.setSeconds(0, 0) - return date -} + for (const groupName of Object.keys(styles)) { + const group = styles[groupName]; -module.exports = startOfMinute + for (const styleName of Object.keys(group)) { + const style = group[styleName]; + + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m` + }; + group[styleName] = styles[styleName]; -/***/ }), -/* 882 */ -/***/ (function(module, exports, __webpack_require__) { + codes.set(style[0], style[1]); + } -var parse = __webpack_require__(772) + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false + }); -/** - * @category Month Helpers - * @summary Are the given dates in the same month? - * - * @description - * Are the given dates in the same month? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same month - * - * @example - * // Are 2 September 2014 and 25 September 2014 in the same month? - * var result = isSameMonth( - * new Date(2014, 8, 2), - * new Date(2014, 8, 25) - * ) - * //=> true - */ -function isSameMonth (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getFullYear() === dateRight.getFullYear() && - dateLeft.getMonth() === dateRight.getMonth() -} + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false + }); + } -module.exports = isSameMonth + const ansi2ansi = n => n; + const rgb2rgb = (r, g, b) => [r, g, b]; + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; -/***/ }), -/* 883 */ -/***/ (function(module, exports, __webpack_require__) { + styles.color.ansi = { + ansi: wrapAnsi16(ansi2ansi, 0) + }; + styles.color.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 0) + }; + styles.color.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 0) + }; -var startOfQuarter = __webpack_require__(884) + styles.bgColor.ansi = { + ansi: wrapAnsi16(ansi2ansi, 10) + }; + styles.bgColor.ansi256 = { + ansi256: wrapAnsi256(ansi2ansi, 10) + }; + styles.bgColor.ansi16m = { + rgb: wrapAnsi16m(rgb2rgb, 10) + }; -/** - * @category Quarter Helpers - * @summary Are the given dates in the same year quarter? - * - * @description - * Are the given dates in the same year quarter? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same quarter - * - * @example - * // Are 1 January 2014 and 8 March 2014 in the same quarter? - * var result = isSameQuarter( - * new Date(2014, 0, 1), - * new Date(2014, 2, 8) - * ) - * //=> true - */ -function isSameQuarter (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfQuarter = startOfQuarter(dirtyDateLeft) - var dateRightStartOfQuarter = startOfQuarter(dirtyDateRight) + for (let key of Object.keys(colorConvert)) { + if (typeof colorConvert[key] !== 'object') { + continue; + } - return dateLeftStartOfQuarter.getTime() === dateRightStartOfQuarter.getTime() -} + const suite = colorConvert[key]; -module.exports = isSameQuarter + if (key === 'ansi16') { + key = 'ansi'; + } + if ('ansi16' in suite) { + styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0); + styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10); + } -/***/ }), -/* 884 */ -/***/ (function(module, exports, __webpack_require__) { + if ('ansi256' in suite) { + styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0); + styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10); + } -var parse = __webpack_require__(772) + if ('rgb' in suite) { + styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0); + styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10); + } + } -/** - * @category Quarter Helpers - * @summary Return the start of a year quarter for the given date. - * - * @description - * Return the start of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a quarter - * - * @example - * // The start of a quarter for 2 September 2014 11:55:00: - * var result = startOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Jul 01 2014 00:00:00 - */ -function startOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 - date.setMonth(month, 1) - date.setHours(0, 0, 0, 0) - return date + return styles; } -module.exports = startOfQuarter +// Make the export immutable +Object.defineProperty(module, 'exports', { + enumerable: true, + get: assembleStyles +}); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(14)(module))) /***/ }), -/* 885 */ +/* 925 */ /***/ (function(module, exports, __webpack_require__) { -var startOfSecond = __webpack_require__(886) +var conversions = __webpack_require__(926); +var route = __webpack_require__(928); -/** - * @category Second Helpers - * @summary Are the given dates in the same second? - * - * @description - * Are the given dates in the same second? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same second - * - * @example - * // Are 4 September 2014 06:30:15.000 and 4 September 2014 06:30.15.500 - * // in the same second? - * var result = isSameSecond( - * new Date(2014, 8, 4, 6, 30, 15), - * new Date(2014, 8, 4, 6, 30, 15, 500) - * ) - * //=> true - */ -function isSameSecond (dirtyDateLeft, dirtyDateRight) { - var dateLeftStartOfSecond = startOfSecond(dirtyDateLeft) - var dateRightStartOfSecond = startOfSecond(dirtyDateRight) +var convert = {}; - return dateLeftStartOfSecond.getTime() === dateRightStartOfSecond.getTime() -} +var models = Object.keys(conversions); -module.exports = isSameSecond +function wrapRaw(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -/***/ }), -/* 886 */ -/***/ (function(module, exports, __webpack_require__) { + return fn(args); + }; -var parse = __webpack_require__(772) + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -/** - * @category Second Helpers - * @summary Return the start of a second for the given date. - * - * @description - * Return the start of a second for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a second - * - * @example - * // The start of a second for 1 December 2014 22:15:45.400: - * var result = startOfSecond(new Date(2014, 11, 1, 22, 15, 45, 400)) - * //=> Mon Dec 01 2014 22:15:45.000 - */ -function startOfSecond (dirtyDate) { - var date = parse(dirtyDate) - date.setMilliseconds(0) - return date + return wrappedFn; } -module.exports = startOfSecond - - -/***/ }), -/* 887 */ -/***/ (function(module, exports, __webpack_require__) { - -var parse = __webpack_require__(772) +function wrapRounded(fn) { + var wrappedFn = function (args) { + if (args === undefined || args === null) { + return args; + } -/** - * @category Year Helpers - * @summary Are the given dates in the same year? - * - * @description - * Are the given dates in the same year? - * - * @param {Date|String|Number} dateLeft - the first date to check - * @param {Date|String|Number} dateRight - the second date to check - * @returns {Boolean} the dates are in the same year - * - * @example - * // Are 2 September 2014 and 25 September 2014 in the same year? - * var result = isSameYear( - * new Date(2014, 8, 2), - * new Date(2014, 8, 25) - * ) - * //=> true - */ -function isSameYear (dirtyDateLeft, dirtyDateRight) { - var dateLeft = parse(dirtyDateLeft) - var dateRight = parse(dirtyDateRight) - return dateLeft.getFullYear() === dateRight.getFullYear() -} + if (arguments.length > 1) { + args = Array.prototype.slice.call(arguments); + } -module.exports = isSameYear + var result = fn(args); + // we're assuming the result is an array here. + // see notice in conversions.js; don't use box types + // in conversion functions. + if (typeof result === 'object') { + for (var len = result.length, i = 0; i < len; i++) { + result[i] = Math.round(result[i]); + } + } -/***/ }), -/* 888 */ -/***/ (function(module, exports, __webpack_require__) { + return result; + }; -var parse = __webpack_require__(772) + // preserve .conversion property if there is one + if ('conversion' in fn) { + wrappedFn.conversion = fn.conversion; + } -/** - * @category Weekday Helpers - * @summary Is the given date Saturday? - * - * @description - * Is the given date Saturday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Saturday - * - * @example - * // Is 27 September 2014 Saturday? - * var result = isSaturday(new Date(2014, 8, 27)) - * //=> true - */ -function isSaturday (dirtyDate) { - return parse(dirtyDate).getDay() === 6 + return wrappedFn; } -module.exports = isSaturday +models.forEach(function (fromModel) { + convert[fromModel] = {}; + Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels}); + Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels}); -/***/ }), -/* 889 */ -/***/ (function(module, exports, __webpack_require__) { + var routes = route(fromModel); + var routeModels = Object.keys(routes); -var parse = __webpack_require__(772) + routeModels.forEach(function (toModel) { + var fn = routes[toModel]; -/** - * @category Weekday Helpers - * @summary Is the given date Sunday? - * - * @description - * Is the given date Sunday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Sunday - * - * @example - * // Is 21 September 2014 Sunday? - * var result = isSunday(new Date(2014, 8, 21)) - * //=> true - */ -function isSunday (dirtyDate) { - return parse(dirtyDate).getDay() === 0 -} + convert[fromModel][toModel] = wrapRounded(fn); + convert[fromModel][toModel].raw = wrapRaw(fn); + }); +}); -module.exports = isSunday +module.exports = convert; /***/ }), -/* 890 */ +/* 926 */ /***/ (function(module, exports, __webpack_require__) { -var isSameHour = __webpack_require__(875) +/* MIT license */ +var cssKeywords = __webpack_require__(927); -/** - * @category Hour Helpers - * @summary Is the given date in the same hour as the current date? - * - * @description - * Is the given date in the same hour as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this hour - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:00:00 in this hour? - * var result = isThisHour(new Date(2014, 8, 25, 18)) - * //=> true - */ -function isThisHour (dirtyDate) { - return isSameHour(new Date(), dirtyDate) +// NOTE: conversions should only return primitive values (i.e. arrays, or +// values that give correct `typeof` results). +// do not use box values types (i.e. Number(), String(), etc.) + +var reverseKeywords = {}; +for (var key in cssKeywords) { + if (cssKeywords.hasOwnProperty(key)) { + reverseKeywords[cssKeywords[key]] = key; + } } -module.exports = isThisHour +var convert = module.exports = { + rgb: {channels: 3, labels: 'rgb'}, + hsl: {channels: 3, labels: 'hsl'}, + hsv: {channels: 3, labels: 'hsv'}, + hwb: {channels: 3, labels: 'hwb'}, + cmyk: {channels: 4, labels: 'cmyk'}, + xyz: {channels: 3, labels: 'xyz'}, + lab: {channels: 3, labels: 'lab'}, + lch: {channels: 3, labels: 'lch'}, + hex: {channels: 1, labels: ['hex']}, + keyword: {channels: 1, labels: ['keyword']}, + ansi16: {channels: 1, labels: ['ansi16']}, + ansi256: {channels: 1, labels: ['ansi256']}, + hcg: {channels: 3, labels: ['h', 'c', 'g']}, + apple: {channels: 3, labels: ['r16', 'g16', 'b16']}, + gray: {channels: 1, labels: ['gray']} +}; +// hide .channels and .labels properties +for (var model in convert) { + if (convert.hasOwnProperty(model)) { + if (!('channels' in convert[model])) { + throw new Error('missing channels property: ' + model); + } -/***/ }), -/* 891 */ -/***/ (function(module, exports, __webpack_require__) { + if (!('labels' in convert[model])) { + throw new Error('missing channel labels property: ' + model); + } -var isSameISOWeek = __webpack_require__(877) + if (convert[model].labels.length !== convert[model].channels) { + throw new Error('channel and label counts mismatch: ' + model); + } -/** - * @category ISO Week Helpers - * @summary Is the given date in the same ISO week as the current date? - * - * @description - * Is the given date in the same ISO week as the current date? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this ISO week - * - * @example - * // If today is 25 September 2014, is 22 September 2014 in this ISO week? - * var result = isThisISOWeek(new Date(2014, 8, 22)) - * //=> true - */ -function isThisISOWeek (dirtyDate) { - return isSameISOWeek(new Date(), dirtyDate) + var channels = convert[model].channels; + var labels = convert[model].labels; + delete convert[model].channels; + delete convert[model].labels; + Object.defineProperty(convert[model], 'channels', {value: channels}); + Object.defineProperty(convert[model], 'labels', {value: labels}); + } } -module.exports = isThisISOWeek +convert.rgb.hsl = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var min = Math.min(r, g, b); + var max = Math.max(r, g, b); + var delta = max - min; + var h; + var s; + var l; + if (max === min) { + h = 0; + } else if (r === max) { + h = (g - b) / delta; + } else if (g === max) { + h = 2 + (b - r) / delta; + } else if (b === max) { + h = 4 + (r - g) / delta; + } -/***/ }), -/* 892 */ -/***/ (function(module, exports, __webpack_require__) { + h = Math.min(h * 60, 360); -var isSameISOYear = __webpack_require__(879) + if (h < 0) { + h += 360; + } -/** - * @category ISO Week-Numbering Year Helpers - * @summary Is the given date in the same ISO week-numbering year as the current date? - * - * @description - * Is the given date in the same ISO week-numbering year as the current date? - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this ISO week-numbering year - * - * @example - * // If today is 25 September 2014, - * // is 30 December 2013 in this ISO week-numbering year? - * var result = isThisISOYear(new Date(2013, 11, 30)) - * //=> true - */ -function isThisISOYear (dirtyDate) { - return isSameISOYear(new Date(), dirtyDate) -} + l = (min + max) / 2; -module.exports = isThisISOYear + if (max === min) { + s = 0; + } else if (l <= 0.5) { + s = delta / (max + min); + } else { + s = delta / (2 - max - min); + } + + return [h, s * 100, l * 100]; +}; + +convert.rgb.hsv = function (rgb) { + var rdif; + var gdif; + var bdif; + var h; + var s; + + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var v = Math.max(r, g, b); + var diff = v - Math.min(r, g, b); + var diffc = function (c) { + return (v - c) / 6 / diff + 1 / 2; + }; + + if (diff === 0) { + h = s = 0; + } else { + s = diff / v; + rdif = diffc(r); + gdif = diffc(g); + bdif = diffc(b); + if (r === v) { + h = bdif - gdif; + } else if (g === v) { + h = (1 / 3) + rdif - bdif; + } else if (b === v) { + h = (2 / 3) + gdif - rdif; + } + if (h < 0) { + h += 1; + } else if (h > 1) { + h -= 1; + } + } -/***/ }), -/* 893 */ -/***/ (function(module, exports, __webpack_require__) { + return [ + h * 360, + s * 100, + v * 100 + ]; +}; -var isSameMinute = __webpack_require__(880) +convert.rgb.hwb = function (rgb) { + var r = rgb[0]; + var g = rgb[1]; + var b = rgb[2]; + var h = convert.rgb.hsl(rgb)[0]; + var w = 1 / 255 * Math.min(r, Math.min(g, b)); -/** - * @category Minute Helpers - * @summary Is the given date in the same minute as the current date? - * - * @description - * Is the given date in the same minute as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this minute - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:30:00 in this minute? - * var result = isThisMinute(new Date(2014, 8, 25, 18, 30)) - * //=> true - */ -function isThisMinute (dirtyDate) { - return isSameMinute(new Date(), dirtyDate) -} + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); -module.exports = isThisMinute + return [h, w * 100, b * 100]; +}; +convert.rgb.cmyk = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var c; + var m; + var y; + var k; -/***/ }), -/* 894 */ -/***/ (function(module, exports, __webpack_require__) { + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; -var isSameMonth = __webpack_require__(882) + return [c * 100, m * 100, y * 100, k * 100]; +}; /** - * @category Month Helpers - * @summary Is the given date in the same month as the current date? - * - * @description - * Is the given date in the same month as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this month - * - * @example - * // If today is 25 September 2014, is 15 September 2014 in this month? - * var result = isThisMonth(new Date(2014, 8, 15)) - * //=> true - */ -function isThisMonth (dirtyDate) { - return isSameMonth(new Date(), dirtyDate) + * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance + * */ +function comparativeDistance(x, y) { + return ( + Math.pow(x[0] - y[0], 2) + + Math.pow(x[1] - y[1], 2) + + Math.pow(x[2] - y[2], 2) + ); } -module.exports = isThisMonth +convert.rgb.keyword = function (rgb) { + var reversed = reverseKeywords[rgb]; + if (reversed) { + return reversed; + } + var currentClosestDistance = Infinity; + var currentClosestKeyword; -/***/ }), -/* 895 */ -/***/ (function(module, exports, __webpack_require__) { + for (var keyword in cssKeywords) { + if (cssKeywords.hasOwnProperty(keyword)) { + var value = cssKeywords[keyword]; -var isSameQuarter = __webpack_require__(883) + // Compute comparative distance + var distance = comparativeDistance(rgb, value); -/** - * @category Quarter Helpers - * @summary Is the given date in the same quarter as the current date? - * - * @description - * Is the given date in the same quarter as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this quarter - * - * @example - * // If today is 25 September 2014, is 2 July 2014 in this quarter? - * var result = isThisQuarter(new Date(2014, 6, 2)) - * //=> true - */ -function isThisQuarter (dirtyDate) { - return isSameQuarter(new Date(), dirtyDate) -} + // Check if its less, if so set as closest + if (distance < currentClosestDistance) { + currentClosestDistance = distance; + currentClosestKeyword = keyword; + } + } + } -module.exports = isThisQuarter + return currentClosestKeyword; +}; + +convert.keyword.rgb = function (keyword) { + return cssKeywords[keyword]; +}; +convert.rgb.xyz = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; -/***/ }), -/* 896 */ -/***/ (function(module, exports, __webpack_require__) { + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); -var isSameSecond = __webpack_require__(885) + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); -/** - * @category Second Helpers - * @summary Is the given date in the same second as the current date? - * - * @description - * Is the given date in the same second as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this second - * - * @example - * // If now is 25 September 2014 18:30:15.500, - * // is 25 September 2014 18:30:15.000 in this second? - * var result = isThisSecond(new Date(2014, 8, 25, 18, 30, 15)) - * //=> true - */ -function isThisSecond (dirtyDate) { - return isSameSecond(new Date(), dirtyDate) -} + return [x * 100, y * 100, z * 100]; +}; -module.exports = isThisSecond +convert.rgb.lab = function (rgb) { + var xyz = convert.rgb.xyz(rgb); + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; + x /= 95.047; + y /= 100; + z /= 108.883; -/***/ }), -/* 897 */ -/***/ (function(module, exports, __webpack_require__) { + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); -var isSameWeek = __webpack_require__(878) + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -/** - * @category Week Helpers - * @summary Is the given date in the same week as the current date? - * - * @description - * Is the given date in the same week as the current date? - * - * @param {Date|String|Number} date - the date to check - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Boolean} the date is in this week - * - * @example - * // If today is 25 September 2014, is 21 September 2014 in this week? - * var result = isThisWeek(new Date(2014, 8, 21)) - * //=> true - * - * @example - * // If today is 25 September 2014 and week starts with Monday - * // is 21 September 2014 in this week? - * var result = isThisWeek(new Date(2014, 8, 21), {weekStartsOn: 1}) - * //=> false - */ -function isThisWeek (dirtyDate, dirtyOptions) { - return isSameWeek(new Date(), dirtyDate, dirtyOptions) -} + return [l, a, b]; +}; -module.exports = isThisWeek +convert.hsl.rgb = function (hsl) { + var h = hsl[0] / 360; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var t1; + var t2; + var t3; + var rgb; + var val; + if (s === 0) { + val = l * 255; + return [val, val, val]; + } -/***/ }), -/* 898 */ -/***/ (function(module, exports, __webpack_require__) { + if (l < 0.5) { + t2 = l * (1 + s); + } else { + t2 = l + s - l * s; + } -var isSameYear = __webpack_require__(887) + t1 = 2 * l - t2; -/** - * @category Year Helpers - * @summary Is the given date in the same year as the current date? - * - * @description - * Is the given date in the same year as the current date? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is in this year - * - * @example - * // If today is 25 September 2014, is 2 July 2014 in this year? - * var result = isThisYear(new Date(2014, 6, 2)) - * //=> true - */ -function isThisYear (dirtyDate) { - return isSameYear(new Date(), dirtyDate) -} + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + if (t3 < 0) { + t3++; + } + if (t3 > 1) { + t3--; + } -module.exports = isThisYear + if (6 * t3 < 1) { + val = t1 + (t2 - t1) * 6 * t3; + } else if (2 * t3 < 1) { + val = t2; + } else if (3 * t3 < 2) { + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + } else { + val = t1; + } + rgb[i] = val * 255; + } -/***/ }), -/* 899 */ -/***/ (function(module, exports, __webpack_require__) { + return rgb; +}; -var parse = __webpack_require__(772) +convert.hsl.hsv = function (hsl) { + var h = hsl[0]; + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var smin = s; + var lmin = Math.max(l, 0.01); + var sv; + var v; -/** - * @category Weekday Helpers - * @summary Is the given date Thursday? - * - * @description - * Is the given date Thursday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Thursday - * - * @example - * // Is 25 September 2014 Thursday? - * var result = isThursday(new Date(2014, 8, 25)) - * //=> true - */ -function isThursday (dirtyDate) { - return parse(dirtyDate).getDay() === 4 -} + l *= 2; + s *= (l <= 1) ? l : 2 - l; + smin *= lmin <= 1 ? lmin : 2 - lmin; + v = (l + s) / 2; + sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s); -module.exports = isThursday + return [h, sv * 100, v * 100]; +}; +convert.hsv.rgb = function (hsv) { + var h = hsv[0] / 60; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var hi = Math.floor(h) % 6; -/***/ }), -/* 900 */ -/***/ (function(module, exports, __webpack_require__) { + var f = h - Math.floor(h); + var p = 255 * v * (1 - s); + var q = 255 * v * (1 - (s * f)); + var t = 255 * v * (1 - (s * (1 - f))); + v *= 255; -var startOfDay = __webpack_require__(795) + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +}; -/** - * @category Day Helpers - * @summary Is the given date today? - * - * @description - * Is the given date today? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is today - * - * @example - * // If today is 6 October 2014, is 6 October 14:00:00 today? - * var result = isToday(new Date(2014, 9, 6, 14, 0)) - * //=> true - */ -function isToday (dirtyDate) { - return startOfDay(dirtyDate).getTime() === startOfDay(new Date()).getTime() -} +convert.hsv.hsl = function (hsv) { + var h = hsv[0]; + var s = hsv[1] / 100; + var v = hsv[2] / 100; + var vmin = Math.max(v, 0.01); + var lmin; + var sl; + var l; -module.exports = isToday + l = (2 - s) * v; + lmin = (2 - s) * vmin; + sl = s * vmin; + sl /= (lmin <= 1) ? lmin : 2 - lmin; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +}; -/***/ }), -/* 901 */ -/***/ (function(module, exports, __webpack_require__) { +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +convert.hwb.rgb = function (hwb) { + var h = hwb[0] / 360; + var wh = hwb[1] / 100; + var bl = hwb[2] / 100; + var ratio = wh + bl; + var i; + var v; + var f; + var n; -var startOfDay = __webpack_require__(795) + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } -/** - * @category Day Helpers - * @summary Is the given date tomorrow? - * - * @description - * Is the given date tomorrow? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is tomorrow - * - * @example - * // If today is 6 October 2014, is 7 October 14:00:00 tomorrow? - * var result = isTomorrow(new Date(2014, 9, 7, 14, 0)) - * //=> true - */ -function isTomorrow (dirtyDate) { - var tomorrow = new Date() - tomorrow.setDate(tomorrow.getDate() + 1) - return startOfDay(dirtyDate).getTime() === startOfDay(tomorrow).getTime() -} + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; -module.exports = isTomorrow + if ((i & 0x01) !== 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation -/***/ }), -/* 902 */ -/***/ (function(module, exports, __webpack_require__) { + var r; + var g; + var b; + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } -var parse = __webpack_require__(772) + return [r * 255, g * 255, b * 255]; +}; -/** - * @category Weekday Helpers - * @summary Is the given date Tuesday? - * - * @description - * Is the given date Tuesday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Tuesday - * - * @example - * // Is 23 September 2014 Tuesday? - * var result = isTuesday(new Date(2014, 8, 23)) - * //=> true - */ -function isTuesday (dirtyDate) { - return parse(dirtyDate).getDay() === 2 -} +convert.cmyk.rgb = function (cmyk) { + var c = cmyk[0] / 100; + var m = cmyk[1] / 100; + var y = cmyk[2] / 100; + var k = cmyk[3] / 100; + var r; + var g; + var b; -module.exports = isTuesday + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +}; -/***/ }), -/* 903 */ -/***/ (function(module, exports, __webpack_require__) { +convert.xyz.rgb = function (xyz) { + var x = xyz[0] / 100; + var y = xyz[1] / 100; + var z = xyz[2] / 100; + var r; + var g; + var b; -var parse = __webpack_require__(772) + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); -/** - * @category Weekday Helpers - * @summary Is the given date Wednesday? - * - * @description - * Is the given date Wednesday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is Wednesday - * - * @example - * // Is 24 September 2014 Wednesday? - * var result = isWednesday(new Date(2014, 8, 24)) - * //=> true - */ -function isWednesday (dirtyDate) { - return parse(dirtyDate).getDay() === 3 -} + // assume sRGB + r = r > 0.0031308 + ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r * 12.92; + + g = g > 0.0031308 + ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g * 12.92; -module.exports = isWednesday + b = b > 0.0031308 + ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b * 12.92; + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); -/***/ }), -/* 904 */ -/***/ (function(module, exports, __webpack_require__) { + return [r * 255, g * 255, b * 255]; +}; -var parse = __webpack_require__(772) +convert.xyz.lab = function (xyz) { + var x = xyz[0]; + var y = xyz[1]; + var z = xyz[2]; + var l; + var a; + var b; -/** - * @category Weekday Helpers - * @summary Does the given date fall on a weekend? - * - * @description - * Does the given date fall on a weekend? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date falls on a weekend - * - * @example - * // Does 5 October 2014 fall on a weekend? - * var result = isWeekend(new Date(2014, 9, 5)) - * //=> true - */ -function isWeekend (dirtyDate) { - var date = parse(dirtyDate) - var day = date.getDay() - return day === 0 || day === 6 -} + x /= 95.047; + y /= 100; + z /= 108.883; -module.exports = isWeekend + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); -/***/ }), -/* 905 */ -/***/ (function(module, exports, __webpack_require__) { + return [l, a, b]; +}; -var parse = __webpack_require__(772) +convert.lab.xyz = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var x; + var y; + var z; -/** - * @category Range Helpers - * @summary Is the given date within the range? - * - * @description - * Is the given date within the range? - * - * @param {Date|String|Number} date - the date to check - * @param {Date|String|Number} startDate - the start of range - * @param {Date|String|Number} endDate - the end of range - * @returns {Boolean} the date is within the range - * @throws {Error} startDate cannot be after endDate - * - * @example - * // For the date within the range: - * isWithinRange( - * new Date(2014, 0, 3), new Date(2014, 0, 1), new Date(2014, 0, 7) - * ) - * //=> true - * - * @example - * // For the date outside of the range: - * isWithinRange( - * new Date(2014, 0, 10), new Date(2014, 0, 1), new Date(2014, 0, 7) - * ) - * //=> false - */ -function isWithinRange (dirtyDate, dirtyStartDate, dirtyEndDate) { - var time = parse(dirtyDate).getTime() - var startTime = parse(dirtyStartDate).getTime() - var endTime = parse(dirtyEndDate).getTime() + y = (l + 16) / 116; + x = a / 500 + y; + z = y - b / 200; - if (startTime > endTime) { - throw new Error('The start of the range cannot be after the end of the range') - } + var y2 = Math.pow(y, 3); + var x2 = Math.pow(x, 3); + var z2 = Math.pow(z, 3); + y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787; + x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787; + z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787; - return time >= startTime && time <= endTime -} + x *= 95.047; + y *= 100; + z *= 108.883; -module.exports = isWithinRange + return [x, y, z]; +}; + +convert.lab.lch = function (lab) { + var l = lab[0]; + var a = lab[1]; + var b = lab[2]; + var hr; + var h; + var c; + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; -/***/ }), -/* 906 */ -/***/ (function(module, exports, __webpack_require__) { + if (h < 0) { + h += 360; + } -var startOfDay = __webpack_require__(795) + c = Math.sqrt(a * a + b * b); -/** - * @category Day Helpers - * @summary Is the given date yesterday? - * - * @description - * Is the given date yesterday? - * - * @param {Date|String|Number} date - the date to check - * @returns {Boolean} the date is yesterday - * - * @example - * // If today is 6 October 2014, is 5 October 14:00:00 yesterday? - * var result = isYesterday(new Date(2014, 9, 5, 14, 0)) - * //=> true - */ -function isYesterday (dirtyDate) { - var yesterday = new Date() - yesterday.setDate(yesterday.getDate() - 1) - return startOfDay(dirtyDate).getTime() === startOfDay(yesterday).getTime() -} + return [l, c, h]; +}; -module.exports = isYesterday +convert.lch.lab = function (lch) { + var l = lch[0]; + var c = lch[1]; + var h = lch[2]; + var a; + var b; + var hr; + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); -/***/ }), -/* 907 */ -/***/ (function(module, exports, __webpack_require__) { + return [l, a, b]; +}; -var lastDayOfWeek = __webpack_require__(908) +convert.rgb.ansi16 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + var value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization -/** - * @category ISO Week Helpers - * @summary Return the last day of an ISO week for the given date. - * - * @description - * Return the last day of an ISO week for the given date. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of an ISO week - * - * @example - * // The last day of an ISO week for 2 September 2014 11:55:00: - * var result = lastDayOfISOWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sun Sep 07 2014 00:00:00 - */ -function lastDayOfISOWeek (dirtyDate) { - return lastDayOfWeek(dirtyDate, {weekStartsOn: 1}) -} + value = Math.round(value / 50); -module.exports = lastDayOfISOWeek + if (value === 0) { + return 30; + } + var ansi = 30 + + ((Math.round(b / 255) << 2) + | (Math.round(g / 255) << 1) + | Math.round(r / 255)); -/***/ }), -/* 908 */ -/***/ (function(module, exports, __webpack_require__) { + if (value === 2) { + ansi += 60; + } -var parse = __webpack_require__(772) + return ansi; +}; -/** - * @category Week Helpers - * @summary Return the last day of a week for the given date. - * - * @description - * Return the last day of a week for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the last day of a week - * - * @example - * // The last day of a week for 2 September 2014 11:55:00: - * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Sat Sep 06 2014 00:00:00 - * - * @example - * // If the week starts on Monday, the last day of the week for 2 September 2014 11:55:00: - * var result = lastDayOfWeek(new Date(2014, 8, 2, 11, 55, 0), {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 00:00:00 - */ -function lastDayOfWeek (dirtyDate, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 +convert.hsv.ansi16 = function (args) { + // optimization here; we already know the value and don't need to get + // it converted for us. + return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]); +}; + +convert.rgb.ansi256 = function (args) { + var r = args[0]; + var g = args[1]; + var b = args[2]; + + // we use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (r === g && g === b) { + if (r < 8) { + return 16; + } + + if (r > 248) { + return 231; + } - var date = parse(dirtyDate) - var day = date.getDay() - var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn) + return Math.round(((r - 8) / 247) * 24) + 232; + } - date.setHours(0, 0, 0, 0) - date.setDate(date.getDate() + diff) - return date -} + var ansi = 16 + + (36 * Math.round(r / 255 * 5)) + + (6 * Math.round(g / 255 * 5)) + + Math.round(b / 255 * 5); -module.exports = lastDayOfWeek + return ansi; +}; +convert.ansi16.rgb = function (args) { + var color = args % 10; -/***/ }), -/* 909 */ -/***/ (function(module, exports, __webpack_require__) { + // handle greyscale + if (color === 0 || color === 7) { + if (args > 50) { + color += 3.5; + } -var getISOYear = __webpack_require__(789) -var startOfISOWeek = __webpack_require__(790) + color = color / 10.5 * 255; -/** - * @category ISO Week-Numbering Year Helpers - * @summary Return the last day of an ISO week-numbering year for the given date. - * - * @description - * Return the last day of an ISO week-numbering year, - * which always starts 3 days before the year's first Thursday. - * The result will be in the local timezone. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the end of an ISO week-numbering year - * - * @example - * // The last day of an ISO week-numbering year for 2 July 2005: - * var result = lastDayOfISOYear(new Date(2005, 6, 2)) - * //=> Sun Jan 01 2006 00:00:00 - */ -function lastDayOfISOYear (dirtyDate) { - var year = getISOYear(dirtyDate) - var fourthOfJanuary = new Date(0) - fourthOfJanuary.setFullYear(year + 1, 0, 4) - fourthOfJanuary.setHours(0, 0, 0, 0) - var date = startOfISOWeek(fourthOfJanuary) - date.setDate(date.getDate() - 1) - return date -} + return [color, color, color]; + } -module.exports = lastDayOfISOYear + var mult = (~~(args > 50) + 1) * 0.5; + var r = ((color & 1) * mult) * 255; + var g = (((color >> 1) & 1) * mult) * 255; + var b = (((color >> 2) & 1) * mult) * 255; + return [r, g, b]; +}; -/***/ }), -/* 910 */ -/***/ (function(module, exports, __webpack_require__) { +convert.ansi256.rgb = function (args) { + // handle greyscale + if (args >= 232) { + var c = (args - 232) * 10 + 8; + return [c, c, c]; + } -var parse = __webpack_require__(772) + args -= 16; -/** - * @category Month Helpers - * @summary Return the last day of a month for the given date. - * - * @description - * Return the last day of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a month - * - * @example - * // The last day of a month for 2 September 2014 11:55:00: - * var result = lastDayOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 00:00:00 - */ -function lastDayOfMonth (dirtyDate) { - var date = parse(dirtyDate) - var month = date.getMonth() - date.setFullYear(date.getFullYear(), month + 1, 0) - date.setHours(0, 0, 0, 0) - return date -} + var rem; + var r = Math.floor(args / 36) / 5 * 255; + var g = Math.floor((rem = args % 36) / 6) / 5 * 255; + var b = (rem % 6) / 5 * 255; -module.exports = lastDayOfMonth + return [r, g, b]; +}; +convert.rgb.hex = function (args) { + var integer = ((Math.round(args[0]) & 0xFF) << 16) + + ((Math.round(args[1]) & 0xFF) << 8) + + (Math.round(args[2]) & 0xFF); -/***/ }), -/* 911 */ -/***/ (function(module, exports, __webpack_require__) { + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -var parse = __webpack_require__(772) +convert.hex.rgb = function (args) { + var match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i); + if (!match) { + return [0, 0, 0]; + } -/** - * @category Quarter Helpers - * @summary Return the last day of a year quarter for the given date. - * - * @description - * Return the last day of a year quarter for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a quarter - * - * @example - * // The last day of a quarter for 2 September 2014 11:55:00: - * var result = lastDayOfQuarter(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Tue Sep 30 2014 00:00:00 - */ -function lastDayOfQuarter (dirtyDate) { - var date = parse(dirtyDate) - var currentMonth = date.getMonth() - var month = currentMonth - currentMonth % 3 + 3 - date.setMonth(month, 0) - date.setHours(0, 0, 0, 0) - return date -} + var colorString = match[0]; -module.exports = lastDayOfQuarter + if (match[0].length === 3) { + colorString = colorString.split('').map(function (char) { + return char + char; + }).join(''); + } + var integer = parseInt(colorString, 16); + var r = (integer >> 16) & 0xFF; + var g = (integer >> 8) & 0xFF; + var b = integer & 0xFF; -/***/ }), -/* 912 */ -/***/ (function(module, exports, __webpack_require__) { + return [r, g, b]; +}; -var parse = __webpack_require__(772) +convert.rgb.hcg = function (rgb) { + var r = rgb[0] / 255; + var g = rgb[1] / 255; + var b = rgb[2] / 255; + var max = Math.max(Math.max(r, g), b); + var min = Math.min(Math.min(r, g), b); + var chroma = (max - min); + var grayscale; + var hue; -/** - * @category Year Helpers - * @summary Return the last day of a year for the given date. - * - * @description - * Return the last day of a year for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the last day of a year - * - * @example - * // The last day of a year for 2 September 2014 11:55:00: - * var result = lastDayOfYear(new Date(2014, 8, 2, 11, 55, 00)) - * //=> Wed Dec 31 2014 00:00:00 - */ -function lastDayOfYear (dirtyDate) { - var date = parse(dirtyDate) - var year = date.getFullYear() - date.setFullYear(year + 1, 0, 0) - date.setHours(0, 0, 0, 0) - return date -} + if (chroma < 1) { + grayscale = min / (1 - chroma); + } else { + grayscale = 0; + } -module.exports = lastDayOfYear + if (chroma <= 0) { + hue = 0; + } else + if (max === r) { + hue = ((g - b) / chroma) % 6; + } else + if (max === g) { + hue = 2 + (b - r) / chroma; + } else { + hue = 4 + (r - g) / chroma + 4; + } + hue /= 6; + hue %= 1; -/***/ }), -/* 913 */ -/***/ (function(module, exports, __webpack_require__) { + return [hue * 360, chroma * 100, grayscale * 100]; +}; -var parse = __webpack_require__(772) +convert.hsl.hcg = function (hsl) { + var s = hsl[1] / 100; + var l = hsl[2] / 100; + var c = 1; + var f = 0; -/** - * @category Common Helpers - * @summary Return the latest of the given dates. - * - * @description - * Return the latest of the given dates. - * - * @param {...(Date|String|Number)} dates - the dates to compare - * @returns {Date} the latest of the dates - * - * @example - * // Which of these dates is the latest? - * var result = max( - * new Date(1989, 6, 10), - * new Date(1987, 1, 11), - * new Date(1995, 6, 2), - * new Date(1990, 0, 1) - * ) - * //=> Sun Jul 02 1995 00:00:00 - */ -function max () { - var dirtyDates = Array.prototype.slice.call(arguments) - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate) - }) - var latestTimestamp = Math.max.apply(null, dates) - return new Date(latestTimestamp) -} + if (l < 0.5) { + c = 2.0 * s * l; + } else { + c = 2.0 * s * (1.0 - l); + } + + if (c < 1.0) { + f = (l - 0.5 * c) / (1.0 - c); + } -module.exports = max + return [hsl[0], c * 100, f * 100]; +}; +convert.hsv.hcg = function (hsv) { + var s = hsv[1] / 100; + var v = hsv[2] / 100; -/***/ }), -/* 914 */ -/***/ (function(module, exports, __webpack_require__) { + var c = s * v; + var f = 0; -var parse = __webpack_require__(772) + if (c < 1.0) { + f = (v - c) / (1 - c); + } -/** - * @category Common Helpers - * @summary Return the earliest of the given dates. - * - * @description - * Return the earliest of the given dates. - * - * @param {...(Date|String|Number)} dates - the dates to compare - * @returns {Date} the earliest of the dates - * - * @example - * // Which of these dates is the earliest? - * var result = min( - * new Date(1989, 6, 10), - * new Date(1987, 1, 11), - * new Date(1995, 6, 2), - * new Date(1990, 0, 1) - * ) - * //=> Wed Feb 11 1987 00:00:00 - */ -function min () { - var dirtyDates = Array.prototype.slice.call(arguments) - var dates = dirtyDates.map(function (dirtyDate) { - return parse(dirtyDate) - }) - var earliestTimestamp = Math.min.apply(null, dates) - return new Date(earliestTimestamp) -} + return [hsv[0], c * 100, f * 100]; +}; -module.exports = min +convert.hcg.rgb = function (hcg) { + var h = hcg[0] / 360; + var c = hcg[1] / 100; + var g = hcg[2] / 100; + if (c === 0.0) { + return [g * 255, g * 255, g * 255]; + } -/***/ }), -/* 915 */ -/***/ (function(module, exports, __webpack_require__) { + var pure = [0, 0, 0]; + var hi = (h % 1) * 6; + var v = hi % 1; + var w = 1 - v; + var mg = 0; -var parse = __webpack_require__(772) + switch (Math.floor(hi)) { + case 0: + pure[0] = 1; pure[1] = v; pure[2] = 0; break; + case 1: + pure[0] = w; pure[1] = 1; pure[2] = 0; break; + case 2: + pure[0] = 0; pure[1] = 1; pure[2] = v; break; + case 3: + pure[0] = 0; pure[1] = w; pure[2] = 1; break; + case 4: + pure[0] = v; pure[1] = 0; pure[2] = 1; break; + default: + pure[0] = 1; pure[1] = 0; pure[2] = w; + } -/** - * @category Day Helpers - * @summary Set the day of the month to the given date. - * - * @description - * Set the day of the month to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} dayOfMonth - the day of the month of the new date - * @returns {Date} the new date with the day of the month setted - * - * @example - * // Set the 30th day of the month to 1 September 2014: - * var result = setDate(new Date(2014, 8, 1), 30) - * //=> Tue Sep 30 2014 00:00:00 - */ -function setDate (dirtyDate, dirtyDayOfMonth) { - var date = parse(dirtyDate) - var dayOfMonth = Number(dirtyDayOfMonth) - date.setDate(dayOfMonth) - return date -} + mg = (1.0 - c) * g; -module.exports = setDate + return [ + (c * pure[0] + mg) * 255, + (c * pure[1] + mg) * 255, + (c * pure[2] + mg) * 255 + ]; +}; +convert.hcg.hsv = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; -/***/ }), -/* 916 */ -/***/ (function(module, exports, __webpack_require__) { + var v = c + g * (1.0 - c); + var f = 0; -var parse = __webpack_require__(772) -var addDays = __webpack_require__(771) + if (v > 0.0) { + f = c / v; + } -/** - * @category Weekday Helpers - * @summary Set the day of the week to the given date. - * - * @description - * Set the day of the week to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} day - the day of the week of the new date - * @param {Object} [options] - the object with options - * @param {Number} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday) - * @returns {Date} the new date with the day of the week setted - * - * @example - * // Set Sunday to 1 September 2014: - * var result = setDay(new Date(2014, 8, 1), 0) - * //=> Sun Aug 31 2014 00:00:00 - * - * @example - * // If week starts with Monday, set Sunday to 1 September 2014: - * var result = setDay(new Date(2014, 8, 1), 0, {weekStartsOn: 1}) - * //=> Sun Sep 07 2014 00:00:00 - */ -function setDay (dirtyDate, dirtyDay, dirtyOptions) { - var weekStartsOn = dirtyOptions ? (Number(dirtyOptions.weekStartsOn) || 0) : 0 - var date = parse(dirtyDate) - var day = Number(dirtyDay) - var currentDay = date.getDay() + return [hcg[0], f * 100, v * 100]; +}; - var remainder = day % 7 - var dayIndex = (remainder + 7) % 7 +convert.hcg.hsl = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; - var diff = (dayIndex < weekStartsOn ? 7 : 0) + day - currentDay - return addDays(date, diff) -} + var l = g * (1.0 - c) + 0.5 * c; + var s = 0; -module.exports = setDay + if (l > 0.0 && l < 0.5) { + s = c / (2 * l); + } else + if (l >= 0.5 && l < 1.0) { + s = c / (2 * (1 - l)); + } + return [hcg[0], s * 100, l * 100]; +}; -/***/ }), -/* 917 */ -/***/ (function(module, exports, __webpack_require__) { +convert.hcg.hwb = function (hcg) { + var c = hcg[1] / 100; + var g = hcg[2] / 100; + var v = c + g * (1.0 - c); + return [hcg[0], (v - c) * 100, (1 - v) * 100]; +}; -var parse = __webpack_require__(772) +convert.hwb.hcg = function (hwb) { + var w = hwb[1] / 100; + var b = hwb[2] / 100; + var v = 1 - b; + var c = v - w; + var g = 0; -/** - * @category Day Helpers - * @summary Set the day of the year to the given date. - * - * @description - * Set the day of the year to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} dayOfYear - the day of the year of the new date - * @returns {Date} the new date with the day of the year setted - * - * @example - * // Set the 2nd day of the year to 2 July 2014: - * var result = setDayOfYear(new Date(2014, 6, 2), 2) - * //=> Thu Jan 02 2014 00:00:00 - */ -function setDayOfYear (dirtyDate, dirtyDayOfYear) { - var date = parse(dirtyDate) - var dayOfYear = Number(dirtyDayOfYear) - date.setMonth(0) - date.setDate(dayOfYear) - return date -} + if (c < 1) { + g = (v - c) / (1 - c); + } -module.exports = setDayOfYear + return [hwb[0], c * 100, g * 100]; +}; +convert.apple.rgb = function (apple) { + return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255]; +}; -/***/ }), -/* 918 */ -/***/ (function(module, exports, __webpack_require__) { +convert.rgb.apple = function (rgb) { + return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535]; +}; -var parse = __webpack_require__(772) +convert.gray.rgb = function (args) { + return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255]; +}; -/** - * @category Hour Helpers - * @summary Set the hours to the given date. - * - * @description - * Set the hours to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} hours - the hours of the new date - * @returns {Date} the new date with the hours setted - * - * @example - * // Set 4 hours to 1 September 2014 11:30:00: - * var result = setHours(new Date(2014, 8, 1, 11, 30), 4) - * //=> Mon Sep 01 2014 04:30:00 - */ -function setHours (dirtyDate, dirtyHours) { - var date = parse(dirtyDate) - var hours = Number(dirtyHours) - date.setHours(hours) - return date -} +convert.gray.hsl = convert.gray.hsv = function (args) { + return [0, 0, args[0]]; +}; + +convert.gray.hwb = function (gray) { + return [0, 100, gray[0]]; +}; + +convert.gray.cmyk = function (gray) { + return [0, 0, 0, gray[0]]; +}; -module.exports = setHours +convert.gray.lab = function (gray) { + return [gray[0], 0, 0]; +}; +convert.gray.hex = function (gray) { + var val = Math.round(gray[0] / 100 * 255) & 0xFF; + var integer = (val << 16) + (val << 8) + val; -/***/ }), -/* 919 */ -/***/ (function(module, exports, __webpack_require__) { + var string = integer.toString(16).toUpperCase(); + return '000000'.substring(string.length) + string; +}; -var parse = __webpack_require__(772) -var addDays = __webpack_require__(771) -var getISODay = __webpack_require__(857) +convert.rgb.gray = function (rgb) { + var val = (rgb[0] + rgb[1] + rgb[2]) / 3; + return [val / 255 * 100]; +}; -/** - * @category Weekday Helpers - * @summary Set the day of the ISO week to the given date. - * - * @description - * Set the day of the ISO week to the given date. - * ISO week starts with Monday. - * 7 is the index of Sunday, 1 is the index of Monday etc. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} day - the day of the ISO week of the new date - * @returns {Date} the new date with the day of the ISO week setted - * - * @example - * // Set Sunday to 1 September 2014: - * var result = setISODay(new Date(2014, 8, 1), 7) - * //=> Sun Sep 07 2014 00:00:00 - */ -function setISODay (dirtyDate, dirtyDay) { - var date = parse(dirtyDate) - var day = Number(dirtyDay) - var currentDay = getISODay(date) - var diff = day - currentDay - return addDays(date, diff) -} -module.exports = setISODay +/***/ }), +/* 927 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; /***/ }), -/* 920 */ +/* 928 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) -var getISOWeek = __webpack_require__(850) +var conversions = __webpack_require__(926); -/** - * @category ISO Week Helpers - * @summary Set the ISO week to the given date. - * - * @description - * Set the ISO week to the given date, saving the weekday number. - * - * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} isoWeek - the ISO week of the new date - * @returns {Date} the new date with the ISO week setted - * - * @example - * // Set the 53rd ISO week to 7 August 2004: - * var result = setISOWeek(new Date(2004, 7, 7), 53) - * //=> Sat Jan 01 2005 00:00:00 - */ -function setISOWeek (dirtyDate, dirtyISOWeek) { - var date = parse(dirtyDate) - var isoWeek = Number(dirtyISOWeek) - var diff = getISOWeek(date) - isoWeek - date.setDate(date.getDate() - diff * 7) - return date +/* + this function routes a model to all other models. + + all functions that are routed have a property `.conversion` attached + to the returned synthetic function. This property is an array + of strings, each with the steps in between the 'from' and 'to' + color models (inclusive). + + conversions that are not possible simply are not included. +*/ + +function buildGraph() { + var graph = {}; + // https://jsperf.com/object-keys-vs-for-in-with-closure/3 + var models = Object.keys(conversions); + + for (var len = models.length, i = 0; i < len; i++) { + graph[models[i]] = { + // http://jsperf.com/1-vs-infinity + // micro-opt, but this is simple. + distance: -1, + parent: null + }; + } + + return graph; } -module.exports = setISOWeek +// https://en.wikipedia.org/wiki/Breadth-first_search +function deriveBFS(fromModel) { + var graph = buildGraph(); + var queue = [fromModel]; // unshift -> queue -> pop + + graph[fromModel].distance = 0; + while (queue.length) { + var current = queue.pop(); + var adjacents = Object.keys(conversions[current]); -/***/ }), -/* 921 */ -/***/ (function(module, exports, __webpack_require__) { + for (var len = adjacents.length, i = 0; i < len; i++) { + var adjacent = adjacents[i]; + var node = graph[adjacent]; -var parse = __webpack_require__(772) + if (node.distance === -1) { + node.distance = graph[current].distance + 1; + node.parent = current; + queue.unshift(adjacent); + } + } + } -/** - * @category Millisecond Helpers - * @summary Set the milliseconds to the given date. - * - * @description - * Set the milliseconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} milliseconds - the milliseconds of the new date - * @returns {Date} the new date with the milliseconds setted - * - * @example - * // Set 300 milliseconds to 1 September 2014 11:30:40.500: - * var result = setMilliseconds(new Date(2014, 8, 1, 11, 30, 40, 500), 300) - * //=> Mon Sep 01 2014 11:30:40.300 - */ -function setMilliseconds (dirtyDate, dirtyMilliseconds) { - var date = parse(dirtyDate) - var milliseconds = Number(dirtyMilliseconds) - date.setMilliseconds(milliseconds) - return date + return graph; } -module.exports = setMilliseconds - +function link(from, to) { + return function (args) { + return to(from(args)); + }; +} -/***/ }), -/* 922 */ -/***/ (function(module, exports, __webpack_require__) { +function wrapConversion(toModel, graph) { + var path = [graph[toModel].parent, toModel]; + var fn = conversions[graph[toModel].parent][toModel]; -var parse = __webpack_require__(772) + var cur = graph[toModel].parent; + while (graph[cur].parent) { + path.unshift(graph[cur].parent); + fn = link(conversions[graph[cur].parent][cur], fn); + cur = graph[cur].parent; + } -/** - * @category Minute Helpers - * @summary Set the minutes to the given date. - * - * @description - * Set the minutes to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} minutes - the minutes of the new date - * @returns {Date} the new date with the minutes setted - * - * @example - * // Set 45 minutes to 1 September 2014 11:30:40: - * var result = setMinutes(new Date(2014, 8, 1, 11, 30, 40), 45) - * //=> Mon Sep 01 2014 11:45:40 - */ -function setMinutes (dirtyDate, dirtyMinutes) { - var date = parse(dirtyDate) - var minutes = Number(dirtyMinutes) - date.setMinutes(minutes) - return date + fn.conversion = path; + return fn; } -module.exports = setMinutes +module.exports = function (fromModel) { + var graph = deriveBFS(fromModel); + var conversion = {}; + + var models = Object.keys(graph); + for (var len = models.length, i = 0; i < len; i++) { + var toModel = models[i]; + var node = graph[toModel]; + + if (node.parent === null) { + // no possible conversion, or this node is the source model. + continue; + } + + conversion[toModel] = wrapConversion(toModel, graph); + } + + return conversion; +}; + /***/ }), -/* 923 */ +/* 929 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(772) -var getDaysInMonth = __webpack_require__(798) +"use strict"; -/** - * @category Month Helpers - * @summary Set the month to the given date. - * - * @description - * Set the month to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} month - the month of the new date - * @returns {Date} the new date with the month setted - * - * @example - * // Set February to 1 September 2014: - * var result = setMonth(new Date(2014, 8, 1), 1) - * //=> Sat Feb 01 2014 00:00:00 - */ -function setMonth (dirtyDate, dirtyMonth) { - var date = parse(dirtyDate) - var month = Number(dirtyMonth) - var year = date.getFullYear() - var day = date.getDate() +const os = __webpack_require__(20); +const hasFlag = __webpack_require__(21); - var dateWithDesiredMonth = new Date(0) - dateWithDesiredMonth.setFullYear(year, month, 15) - dateWithDesiredMonth.setHours(0, 0, 0, 0) - var daysInMonth = getDaysInMonth(dateWithDesiredMonth) - // Set the last day of the new month - // if the original date was the last day of the longer month - date.setMonth(month, Math.min(day, daysInMonth)) - return date +const env = process.env; + +let forceColor; +if (hasFlag('no-color') || + hasFlag('no-colors') || + hasFlag('color=false')) { + forceColor = false; +} else if (hasFlag('color') || + hasFlag('colors') || + hasFlag('color=true') || + hasFlag('color=always')) { + forceColor = true; +} +if ('FORCE_COLOR' in env) { + forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0; } -module.exports = setMonth +function translateLevel(level) { + if (level === 0) { + return false; + } + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3 + }; +} -/***/ }), -/* 924 */ -/***/ (function(module, exports, __webpack_require__) { +function supportsColor(stream) { + if (forceColor === false) { + return 0; + } -var parse = __webpack_require__(772) -var setMonth = __webpack_require__(923) + if (hasFlag('color=16m') || + hasFlag('color=full') || + hasFlag('color=truecolor')) { + return 3; + } -/** - * @category Quarter Helpers - * @summary Set the year quarter to the given date. - * - * @description - * Set the year quarter to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} quarter - the quarter of the new date - * @returns {Date} the new date with the quarter setted - * - * @example - * // Set the 2nd quarter to 2 July 2014: - * var result = setQuarter(new Date(2014, 6, 2), 2) - * //=> Wed Apr 02 2014 00:00:00 - */ -function setQuarter (dirtyDate, dirtyQuarter) { - var date = parse(dirtyDate) - var quarter = Number(dirtyQuarter) - var oldQuarter = Math.floor(date.getMonth() / 3) + 1 - var diff = quarter - oldQuarter - return setMonth(date, date.getMonth() + diff * 3) -} + if (hasFlag('color=256')) { + return 2; + } -module.exports = setQuarter + if (stream && !stream.isTTY && forceColor !== true) { + return 0; + } + const min = forceColor ? 1 : 0; -/***/ }), -/* 925 */ -/***/ (function(module, exports, __webpack_require__) { + if (process.platform === 'win32') { + // Node.js 7.5.0 is the first version of Node.js to include a patch to + // libuv that enables 256 color output on Windows. Anything earlier and it + // won't work. However, here we target Node.js 8 at minimum as it is an LTS + // release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows + // release that supports 256 colors. Windows 10 build 14931 is the first release + // that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(process.versions.node.split('.')[0]) >= 8 && + Number(osRelease[0]) >= 10 && + Number(osRelease[2]) >= 10586 + ) { + return Number(osRelease[2]) >= 14931 ? 3 : 2; + } -var parse = __webpack_require__(772) + return 1; + } -/** - * @category Second Helpers - * @summary Set the seconds to the given date. - * - * @description - * Set the seconds to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} seconds - the seconds of the new date - * @returns {Date} the new date with the seconds setted - * - * @example - * // Set 45 seconds to 1 September 2014 11:30:40: - * var result = setSeconds(new Date(2014, 8, 1, 11, 30, 40), 45) - * //=> Mon Sep 01 2014 11:30:45 - */ -function setSeconds (dirtyDate, dirtySeconds) { - var date = parse(dirtyDate) - var seconds = Number(dirtySeconds) - date.setSeconds(seconds) - return date -} + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } -module.exports = setSeconds + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + if (env.COLORTERM === 'truecolor') { + return 3; + } -/***/ }), -/* 926 */ -/***/ (function(module, exports, __webpack_require__) { + if ('TERM_PROGRAM' in env) { + const version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); -var parse = __webpack_require__(772) + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } -/** - * @category Year Helpers - * @summary Set the year to the given date. - * - * @description - * Set the year to the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} year - the year of the new date - * @returns {Date} the new date with the year setted - * - * @example - * // Set year 2013 to 1 September 2014: - * var result = setYear(new Date(2014, 8, 1), 2013) - * //=> Sun Sep 01 2013 00:00:00 - */ -function setYear (dirtyDate, dirtyYear) { - var date = parse(dirtyDate) - var year = Number(dirtyYear) - date.setFullYear(year) - return date -} + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } -module.exports = setYear + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + if ('COLORTERM' in env) { + return 1; + } -/***/ }), -/* 927 */ -/***/ (function(module, exports, __webpack_require__) { + if (env.TERM === 'dumb') { + return min; + } -var parse = __webpack_require__(772) + return min; +} -/** - * @category Month Helpers - * @summary Return the start of a month for the given date. - * - * @description - * Return the start of a month for the given date. - * The result will be in the local timezone. - * - * @param {Date|String|Number} date - the original date - * @returns {Date} the start of a month - * - * @example - * // The start of a month for 2 September 2014 11:55:00: - * var result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0)) - * //=> Mon Sep 01 2014 00:00:00 - */ -function startOfMonth (dirtyDate) { - var date = parse(dirtyDate) - date.setDate(1) - date.setHours(0, 0, 0, 0) - return date +function getSupportLevel(stream) { + const level = supportsColor(stream); + return translateLevel(level); } -module.exports = startOfMonth +module.exports = { + supportsColor: getSupportLevel, + stdout: getSupportLevel(process.stdout), + stderr: getSupportLevel(process.stderr) +}; /***/ }), -/* 928 */ +/* 930 */ /***/ (function(module, exports, __webpack_require__) { -var startOfDay = __webpack_require__(795) +"use strict"; -/** - * @category Day Helpers - * @summary Return the start of today. - * - * @description - * Return the start of today. - * - * @returns {Date} the start of today - * - * @example - * // If today is 6 October 2014: - * var result = startOfToday() - * //=> Mon Oct 6 2014 00:00:00 - */ -function startOfToday () { - return startOfDay(new Date()) -} +const TEMPLATE_REGEX = /(?:\\(u[a-f\d]{4}|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; +const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; +const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; +const ESCAPE_REGEX = /\\(u[a-f\d]{4}|x[a-f\d]{2}|.)|([^\\])/gi; -module.exports = startOfToday +const ESCAPES = new Map([ + ['n', '\n'], + ['r', '\r'], + ['t', '\t'], + ['b', '\b'], + ['f', '\f'], + ['v', '\v'], + ['0', '\0'], + ['\\', '\\'], + ['e', '\u001B'], + ['a', '\u0007'] +]); +function unescape(c) { + if ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) { + return String.fromCharCode(parseInt(c.slice(1), 16)); + } -/***/ }), -/* 929 */ -/***/ (function(module, exports) { + return ESCAPES.get(c) || c; +} -/** - * @category Day Helpers - * @summary Return the start of tomorrow. - * - * @description - * Return the start of tomorrow. - * - * @returns {Date} the start of tomorrow - * - * @example - * // If today is 6 October 2014: - * var result = startOfTomorrow() - * //=> Tue Oct 7 2014 00:00:00 - */ -function startOfTomorrow () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() +function parseArguments(name, args) { + const results = []; + const chunks = args.trim().split(/\s*,\s*/g); + let matches; - var date = new Date(0) - date.setFullYear(year, month, day + 1) - date.setHours(0, 0, 0, 0) - return date + for (const chunk of chunks) { + if (!isNaN(chunk)) { + results.push(Number(chunk)); + } else if ((matches = chunk.match(STRING_REGEX))) { + results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr)); + } else { + throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); + } + } + + return results; } -module.exports = startOfTomorrow +function parseStyle(style) { + STYLE_REGEX.lastIndex = 0; + const results = []; + let matches; -/***/ }), -/* 930 */ -/***/ (function(module, exports) { + while ((matches = STYLE_REGEX.exec(style)) !== null) { + const name = matches[1]; -/** - * @category Day Helpers - * @summary Return the start of yesterday. - * - * @description - * Return the start of yesterday. - * - * @returns {Date} the start of yesterday - * - * @example - * // If today is 6 October 2014: - * var result = startOfYesterday() - * //=> Sun Oct 5 2014 00:00:00 - */ -function startOfYesterday () { - var now = new Date() - var year = now.getFullYear() - var month = now.getMonth() - var day = now.getDate() + if (matches[2]) { + const args = parseArguments(name, matches[2]); + results.push([name].concat(args)); + } else { + results.push([name]); + } + } - var date = new Date(0) - date.setFullYear(year, month, day - 1) - date.setHours(0, 0, 0, 0) - return date + return results; } -module.exports = startOfYesterday - +function buildStyle(chalk, styles) { + const enabled = {}; -/***/ }), -/* 931 */ -/***/ (function(module, exports, __webpack_require__) { + for (const layer of styles) { + for (const style of layer.styles) { + enabled[style[0]] = layer.inverse ? null : style.slice(1); + } + } -var addDays = __webpack_require__(771) + let current = chalk; + for (const styleName of Object.keys(enabled)) { + if (Array.isArray(enabled[styleName])) { + if (!(styleName in current)) { + throw new Error(`Unknown Chalk style: ${styleName}`); + } -/** - * @category Day Helpers - * @summary Subtract the specified number of days from the given date. - * - * @description - * Subtract the specified number of days from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of days to be subtracted - * @returns {Date} the new date with the days subtracted - * - * @example - * // Subtract 10 days from 1 September 2014: - * var result = subDays(new Date(2014, 8, 1), 10) - * //=> Fri Aug 22 2014 00:00:00 - */ -function subDays (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addDays(dirtyDate, -amount) + if (enabled[styleName].length > 0) { + current = current[styleName].apply(current, enabled[styleName]); + } else { + current = current[styleName]; + } + } + } + + return current; } -module.exports = subDays +module.exports = (chalk, tmp) => { + const styles = []; + const chunks = []; + let chunk = []; + // eslint-disable-next-line max-params + tmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => { + if (escapeChar) { + chunk.push(unescape(escapeChar)); + } else if (style) { + const str = chunk.join(''); + chunk = []; + chunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str)); + styles.push({inverse, styles: parseStyle(style)}); + } else if (close) { + if (styles.length === 0) { + throw new Error('Found extraneous } in Chalk template literal'); + } -/***/ }), -/* 932 */ -/***/ (function(module, exports, __webpack_require__) { + chunks.push(buildStyle(chalk, styles)(chunk.join(''))); + chunk = []; + styles.pop(); + } else { + chunk.push(chr); + } + }); -var addHours = __webpack_require__(786) + chunks.push(chunk.join('')); -/** - * @category Hour Helpers - * @summary Subtract the specified number of hours from the given date. - * - * @description - * Subtract the specified number of hours from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of hours to be subtracted - * @returns {Date} the new date with the hours subtracted - * - * @example - * // Subtract 2 hours from 11 July 2014 01:00:00: - * var result = subHours(new Date(2014, 6, 11, 1, 0), 2) - * //=> Thu Jul 10 2014 23:00:00 - */ -function subHours (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addHours(dirtyDate, -amount) -} + if (styles.length > 0) { + const errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errMsg); + } -module.exports = subHours + return chunks.join(''); +}; /***/ }), -/* 933 */ -/***/ (function(module, exports, __webpack_require__) { - -var addMilliseconds = __webpack_require__(787) - -/** - * @category Millisecond Helpers - * @summary Subtract the specified number of milliseconds from the given date. - * - * @description - * Subtract the specified number of milliseconds from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of milliseconds to be subtracted - * @returns {Date} the new date with the milliseconds subtracted - * - * @example - * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000: - * var result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750) - * //=> Thu Jul 10 2014 12:45:29.250 - */ -function subMilliseconds (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMilliseconds(dirtyDate, -amount) -} - -module.exports = subMilliseconds +/* 931 */ +/***/ (function(module, exports) { +module.exports = require("querystring"); /***/ }), -/* 934 */ +/* 932 */ /***/ (function(module, exports, __webpack_require__) { -var addMinutes = __webpack_require__(796) +const get = __webpack_require__(162) +const flatten = __webpack_require__(182) -/** - * @category Minute Helpers - * @summary Subtract the specified number of minutes from the given date. - * - * @description - * Subtract the specified number of minutes from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of minutes to be subtracted - * @returns {Date} the new date with the mintues subtracted - * - * @example - * // Subtract 30 minutes from 10 July 2014 12:00:00: - * var result = subMinutes(new Date(2014, 6, 10, 12, 0), 30) - * //=> Thu Jul 10 2014 11:30:00 - */ -function subMinutes (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMinutes(dirtyDate, -amount) -} +const Contact = __webpack_require__(933) +const Document = __webpack_require__(909) -module.exports = subMinutes +class AdministrativeProcedure extends Document { + /** + * Returns personal data for the contact + * + * @param {Contact} contact - A contact + * @param {Array} fields - The list of fields to retrieve + * @return {Object} - the personal data + **/ + static getPersonalData(contact, fields) { + const mapping = { + firstname: { + path: 'name.givenName' + }, + lastname: { + path: 'name.familyName' + }, + address: { + getter: Contact.getPrimaryAddress + }, + email: { + getter: Contact.getPrimaryEmail + }, + phone: { + getter: Contact.getPrimaryPhone + } + } + let personalData = {} + fields.forEach(field => { + const contactField = get(mapping, field, field) + let value + if (contactField.getter) { + value = contactField.getter(contact) + } else { + const path = get(contactField, 'path', field) + value = get(contact, path) + } + if (value !== undefined) { + personalData[field] = value + } + }) -/***/ }), -/* 935 */ -/***/ (function(module, exports, __webpack_require__) { + return personalData + } + /** + * Method to generate a query based on a few rules given by the template + * @param {Object} docRules + * @param {Object} docRules.rules + * @param {int} docRules.count + */ + static async getFilesByRules(docRules) { + const { rules, count } = docRules + const cozyRules = { + trashed: false, + type: 'file', + // eslint-disable-next-line node/no-unsupported-features/es-syntax + ...rules + } + // Create an index in order to query and sort + await this.cozyClient + .collection('io.cozy.files') + .createIndex(['metadata.datetime', 'metadata.qualification']) + // Use the index + const files = await this.cozyClient + .collection('io.cozy.files') + .find(cozyRules, { + indexedFields: ['metadata.datetime', 'metadata.qualification'], + sort: [ + { + 'metadata.datetime': 'desc' + }, + { + 'metadata.qualification': 'desc' + } + ], + limit: count ? count : 1 + }) -var addMonths = __webpack_require__(797) + return files + } -/** - * @category Month Helpers - * @summary Subtract the specified number of months from the given date. - * - * @description - * Subtract the specified number of months from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of months to be subtracted - * @returns {Date} the new date with the months subtracted - * - * @example - * // Subtract 5 months from 1 February 2015: - * var result = subMonths(new Date(2015, 1, 1), 5) - * //=> Mon Sep 01 2014 00:00:00 - */ -function subMonths (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addMonths(dirtyDate, -amount) + /** + * Returns a io.cozy.procedures.administratives object + * + * @param {object} data - The data we need for this type of procedure + * @param {ProcedureTemplate} template - The procedure's template + * @return {AdministrativeProcedure} the administrative procedure + */ + static create(data, template) { + const { documentsData, personalData, procedureData } = data + const files = Object.keys(documentsData).map(identifier => { + return documentsData[identifier].files.map(file => { + // TODO Remove this check. it has to be done before + if (file) + return { + _id: file.id, + _type: 'io.cozy.files', + templateDocumentId: identifier + } + }) + }) + return { + personalData, + procedureData, + submissionDate: new Date(), + templateId: template.type, + templateVersion: template.version, + relationships: { + files: { + data: flatten(files) + } + } + } + } + + /** + * Returns json that represents the administative procedure + * + * @param {AdministrativeProcedure} + * @return {string} - the json that represents this procedure + * + */ + static createJson(administrativeProcedure) { + return JSON.stringify(administrativeProcedure) + } } -module.exports = subMonths +AdministrativeProcedure.doctype = 'io.cozy.procedures.administratives' + +module.exports = AdministrativeProcedure /***/ }), -/* 936 */ +/* 933 */ /***/ (function(module, exports, __webpack_require__) { -var addQuarters = __webpack_require__(799) +const PropTypes = __webpack_require__(934) +const get = __webpack_require__(162) + +const log = __webpack_require__(936) +const Document = __webpack_require__(909) + +const getPrimaryOrFirst = property => obj => { + if (!obj[property] || obj[property].length === 0) return '' + return obj[property].find(property => property.primary) || obj[property][0] +} + +const logDeprecated = methodName => + log( + 'warn', + `${methodName} from cozy-doctypes contact is deprecated, use cozy-client/models/contacts/${methodName} instead` + ) /** - * @category Quarter Helpers - * @summary Subtract the specified number of year quarters from the given date. - * - * @description - * Subtract the specified number of year quarters from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of quarters to be subtracted - * @returns {Date} the new date with the quarters subtracted - * - * @example - * // Subtract 3 quarters from 1 September 2014: - * var result = subQuarters(new Date(2014, 8, 1), 3) - * //=> Sun Dec 01 2013 00:00:00 + * Class representing the contact model. + * @extends Document */ -function subQuarters (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addQuarters(dirtyDate, -amount) -} +class Contact extends Document { + /** + * Returns true if candidate is a contact + * + * @param {Object} candidate + * @return {boolean} - whether the candidate is a contact + */ + static isContact(candidate) { + return candidate._type === Contact.doctype + } -module.exports = subQuarters + /** + * Returns the initials of the contact. + * + * @param {Contact|string} contact - A contact or a string + * @return {string} - the contact's initials + */ + static getInitials(contact) { + logDeprecated('getInitials') + if (typeof contact === 'string') { + log( + 'warn', + 'Passing a string to Contact.getInitials will be deprecated soon.' + ) + return contact[0].toUpperCase() + } + if (contact.name) { + return ['givenName', 'familyName'] + .map(part => get(contact, ['name', part, 0], '')) + .join('') + .toUpperCase() + } -/***/ }), -/* 937 */ -/***/ (function(module, exports, __webpack_require__) { + const email = Contact.getPrimaryEmail(contact) + if (email) { + return email[0].toUpperCase() + } -var addSeconds = __webpack_require__(800) + log('warn', 'Contact has no name and no email.') + return '' + } -/** - * @category Second Helpers - * @summary Subtract the specified number of seconds from the given date. - * - * @description - * Subtract the specified number of seconds from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of seconds to be subtracted - * @returns {Date} the new date with the seconds subtracted - * - * @example - * // Subtract 30 seconds from 10 July 2014 12:45:00: - * var result = subSeconds(new Date(2014, 6, 10, 12, 45, 0), 30) - * //=> Thu Jul 10 2014 12:44:30 - */ -function subSeconds (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addSeconds(dirtyDate, -amount) -} + /** + * Returns the contact's main email + * + * @param {Contact} contact - A contact + * @return {string} - The contact's main email + */ + // TODO: sadly we have different versions of contacts' doctype to handle... + // A migration tool on the stack side is needed here + static getPrimaryEmail(contact) { + logDeprecated('getPrimaryEmail') + return Array.isArray(contact.email) + ? getPrimaryOrFirst('email')(contact).address + : contact.email + } -module.exports = subSeconds + /** + * Returns the contact's main cozy + * + * @param {Contact} contact - A contact + * @return {string} - The contact's main cozy + */ + static getPrimaryCozy(contact) { + logDeprecated('getPrimaryCozy') + return Array.isArray(contact.cozy) + ? getPrimaryOrFirst('cozy')(contact).url + : contact.url + } + /** + * Returns the contact's main phone number + * + * @param {Contact} contact - A contact + * @return {string} - The contact's main phone number + */ + static getPrimaryPhone(contact) { + logDeprecated('getPrimaryPhone') + return getPrimaryOrFirst('phone')(contact).number + } -/***/ }), -/* 938 */ -/***/ (function(module, exports, __webpack_require__) { + /** + * Returns the contact's main address + * + * @param {Contact} contact - A contact + * @return {string} - The contact's main address + */ + static getPrimaryAddress(contact) { + logDeprecated('getPrimaryAddress') + return getPrimaryOrFirst('address')(contact).formattedAddress + } + + /** + * Returns the contact's fullname + * + * @param {Contact} contact - A contact + * @return {string} - The contact's fullname + */ + static getFullname(contact) { + logDeprecated('getFullname') + if (contact.fullname) { + return contact.fullname + } else if (contact.name) { + return [ + 'namePrefix', + 'givenName', + 'additionalName', + 'familyName', + 'nameSuffix' + ] + .map(part => contact.name[part]) + .filter(part => part !== undefined) + .join(' ') + .trim() + } + + return undefined + } + + /** + * Returns a display name for the contact + * + * @param {Contact} contact - A contact + * @return {string} - the contact's display name + **/ + static getDisplayName(contact) { + logDeprecated('getDisplayName') + return Contact.getFullname(contact) || Contact.getPrimaryEmail(contact) + } +} -var addWeeks = __webpack_require__(801) +const ContactShape = PropTypes.shape({ + _id: PropTypes.string.isRequired, + _type: PropTypes.string.isRequired, + fullname: PropTypes.string, + name: PropTypes.shape({ + givenName: PropTypes.string, + familyName: PropTypes.string, + additionalName: PropTypes.string, + namePrefix: PropTypes.string, + nameSuffix: PropTypes.string + }), + birthday: PropTypes.string, + note: PropTypes.string, + email: PropTypes.arrayOf( + PropTypes.shape({ + address: PropTypes.string.isRequired, + label: PropTypes.string, + type: PropTypes.string, + primary: PropTypes.bool + }) + ), + address: PropTypes.arrayOf( + PropTypes.shape({ + street: PropTypes.string, + pobox: PropTypes.string, + city: PropTypes.string, + region: PropTypes.string, + postcode: PropTypes.string, + country: PropTypes.string, + type: PropTypes.string, + primary: PropTypes.bool, + label: PropTypes.string, + formattedAddress: PropTypes.string + }) + ), + phone: PropTypes.arrayOf( + PropTypes.shape({ + number: PropTypes.string.isRequired, + type: PropTypes.string, + label: PropTypes.string, + primary: PropTypes.bool + }) + ), + cozy: PropTypes.arrayOf( + PropTypes.shape({ + url: PropTypes.string.isRequired, + label: PropTypes.string, + primary: PropTypes.bool + }) + ), + company: PropTypes.string, + jobTitle: PropTypes.string, + trashed: PropTypes.bool, + me: PropTypes.bool, + relationships: PropTypes.shape({ + accounts: PropTypes.shape({ + data: PropTypes.arrayOf( + PropTypes.shape({ + _id: PropTypes.string.isRequired, + _type: PropTypes.string.isRequired + }) + ) + }), + groups: PropTypes.shape({ + data: PropTypes.arrayOf( + PropTypes.shape({ + _id: PropTypes.string.isRequired, + _type: PropTypes.string.isRequired + }) + ) + }) + }) +}) -/** - * @category Week Helpers - * @summary Subtract the specified number of weeks from the given date. - * - * @description - * Subtract the specified number of weeks from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of weeks to be subtracted - * @returns {Date} the new date with the weeks subtracted - * - * @example - * // Subtract 4 weeks from 1 September 2014: - * var result = subWeeks(new Date(2014, 8, 1), 4) - * //=> Mon Aug 04 2014 00:00:00 - */ -function subWeeks (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addWeeks(dirtyDate, -amount) -} +Contact.doctype = 'io.cozy.contacts' +Contact.propType = ContactShape -module.exports = subWeeks +module.exports = Contact /***/ }), -/* 939 */ +/* 934 */ /***/ (function(module, exports, __webpack_require__) { -var addYears = __webpack_require__(802) - /** - * @category Year Helpers - * @summary Subtract the specified number of years from the given date. - * - * @description - * Subtract the specified number of years from the given date. - * - * @param {Date|String|Number} date - the date to be changed - * @param {Number} amount - the amount of years to be subtracted - * @returns {Date} the new date with the years subtracted + * Copyright (c) 2013-present, Facebook, Inc. * - * @example - * // Subtract 5 years from 1 September 2014: - * var result = subYears(new Date(2014, 8, 1), 5) - * //=> Tue Sep 01 2009 00:00:00 + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -function subYears (dirtyDate, dirtyAmount) { - var amount = Number(dirtyAmount) - return addYears(dirtyDate, -amount) -} -module.exports = subYears +if (true) { + var ReactIs = __webpack_require__(672); + + // By explicitly using `prop-types` you are opting into new development behavior. + // http://fb.me/prop-types-in-prod + var throwOnDirectAccess = true; + module.exports = __webpack_require__(935)(ReactIs.isElement, throwOnDirectAccess); +} else {} /***/ }), -/* 940 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 935 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "KonnectorJobError", function() { return KonnectorJobError; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getErrorLocale", function() { return getErrorLocale; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchSupportMail", function() { return fetchSupportMail; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getErrorLocaleBound", function() { return getErrorLocaleBound; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getAccountType", function() { return getAccountType; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hasNewVersionAvailable", function() { return hasNewVersionAvailable; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "needsFolder", function() { return needsFolder; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFolderPath", function() { return buildFolderPath; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildFolderPermission", function() { return buildFolderPermission; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLauncher", function() { return getLauncher; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isRunnable", function() { return isRunnable; }); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(58); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(59); -/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(60); -/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(246); -/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); -/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(245); -/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(247); -/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var _babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(333); -/* harmony import */ var _babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8__); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(56); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9__); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(162); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_10__); -/* harmony import */ var lodash_has__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(344); -/* harmony import */ var lodash_has__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(lodash_has__WEBPACK_IMPORTED_MODULE_11__); -/* harmony import */ var lodash_trim__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(941); -/* harmony import */ var lodash_trim__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(lodash_trim__WEBPACK_IMPORTED_MODULE_12__); -/* harmony import */ var _locales__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(943); -/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(39); -/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(cozy_client__WEBPACK_IMPORTED_MODULE_14__); -/* harmony import */ var _accounts__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(948); - - - - - - - - - - - -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } - -function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_7___default()(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_6___default()(this, result); }; } - -function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } - - - - - - - -var DEFAULT_SUPPORT_MAIL = 'claude@cozycloud.cc'; // Default name for base directory - -var DEFAULT_LOCALIZED_BASE_DIR = 'Administrative'; // Type of errors returned by konnector - -var CHALLENGE_ASKED = 'CHALLENGE_ASKED'; -var DISK_QUOTA_EXCEEDED = 'DISK_QUOTA_EXCEEDED'; -var LOGIN_FAILED = 'LOGIN_FAILED'; -var MAINTENANCE = 'MAINTENANCE'; -var NOT_EXISTING_DIRECTORY = 'NOT_EXISTING_DIRECTORY'; -var TERMS_VERSION_MISMATCH = 'TERMS_VERSION_MISMATCH'; -var UNKNOWN_ERROR = 'UNKNOWN_ERROR'; -var USER_ACTION_NEEDED = 'USER_ACTION_NEEDED'; -var VENDOR_DOWN = 'VENDOR_DOWN'; -var ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED = 'ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED'; -var KNOWN_ERRORS = [CHALLENGE_ASKED, DISK_QUOTA_EXCEEDED, LOGIN_FAILED, MAINTENANCE, NOT_EXISTING_DIRECTORY, TERMS_VERSION_MISMATCH, USER_ACTION_NEEDED, VENDOR_DOWN, ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED]; -var USER_ERRORS = [CHALLENGE_ASKED, DISK_QUOTA_EXCEEDED, LOGIN_FAILED, NOT_EXISTING_DIRECTORY, USER_ACTION_NEEDED]; -var sanitizeAccountIdentifierRx = /\//g; /** - * Custom error to handle errors returnes by konnector. - * Konnectors are returning error codes in error messages. - * Those codes are known and we need to associate logic to them. - * For now, this logic only concerns login error. - * @extends Error + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. */ -var KonnectorJobError = /*#__PURE__*/function (_Error) { - _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(KonnectorJobError, _Error); - - var _super = _createSuper(KonnectorJobError); - - function KonnectorJobError() { - var _this; - - _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, KonnectorJobError); - - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - _this = _super.call.apply(_super, [this].concat(args)); - - if (typeof Error.captureStackTrace === 'function') { - Error.captureStackTrace(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this), KonnectorJobError); - } - /** - * Konnector job are throwing error with a message containing the error - * code. - * Example: LOGIN_FAILED, USER_ACTION_NEEDED, - * USER_ACTION_NEEDED.PERMISSIONS_CHANGED - */ - - - _this.code = _this.message; - /** - * Some error codes are composed with several segments, and can be parsed. - * Example : USER_ACTION_NEEDED.PERMISSIONS_CHANGED - * The error type correspond to the first segment of the error. - */ - - var type = _this.code.split('.')[0]; - - _this.type = KNOWN_ERRORS.includes(type) ? type : UNKNOWN_ERROR; - return _this; - } - /** - * Test if the konnector error is a login error - * @return {Boolean} - */ - - - _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(KonnectorJobError, [{ - key: "isLoginError", - value: function isLoginError() { - return this.type === LOGIN_FAILED; - } - /** - * Test if the konnector error is a user error - * @return {Boolean} - */ - - }, { - key: "isUserError", - value: function isUserError() { - return USER_ERRORS.includes(this.type); - } - /** - * Test if the konnector error is due to a term version mismatch. Term version - * mismatch errors indicates that the konnector must be updated manually - * @return {Boolean} - */ - - }, { - key: "isTermsVersionMismatchError", - value: function isTermsVersionMismatchError() { - return this.type === TERMS_VERSION_MISMATCH; - } - }, { - key: "isSolvableViaReconnect", - value: function isSolvableViaReconnect() { - return this.type === LOGIN_FAILED || this.type === CHALLENGE_ASKED || // We did not put the decoupled case (2fa code via app) - // since we do not currently *need* to display a 2fa modal - // for the flow to work. There will be no modal displayed - // but the user will be able to do the 2fa on its mobile phone. - this.code === 'USER_ACTION_NEEDED' || this.code === 'USER_ACTION_NEEDED.SCA_REQUIRED' || this.code === 'USER_ACTION_NEEDED.WEBAUTH_REQUIRED' || this.code === 'USER_ACTION_NEEDED.OAUTH_OUTDATED' || this.code === 'USER_ACTION_NEEDED.CHANGE_PASSWORD' || this.code === 'VENDOR_DOWN' || this.code === 'VENDOR_DOWN.BANK_DOWN' || this.code === 'VENDOR_DOWN.LINXO_DOWN'; - } - }]); - return KonnectorJobError; -}( /*#__PURE__*/_babel_runtime_helpers_wrapNativeSuper__WEBPACK_IMPORTED_MODULE_8___default()(Error)); -/** - * Returns the locale of an error key (description or title or else). - * This method first try to get the full error code - * (for example LOGIN_FAILED.LOGIN_FAILED.NEEDS_SECRET), then fallback on the - * error type, which is the error code first segment (in our example, it's - * LOGIN_FAILED). It none of these two tries returns anything, it means - * that the error is unknown or not yet handled by harvest, so we fallback - * to the default error messages. - * @param {Error} error The error - * @param {Object} konnector konnector related to this error - * @param {Func} t Translation function, expected to be Polyglot.t() - * @param {Func} suffixKey What part of the error message should be returned, title or description - * @return {String} The error locale - */ -var getErrorLocale = function getErrorLocale(error, konnector, t, suffixKey) { - var supportMail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : DEFAULT_SUPPORT_MAIL; - var defaultKey = 'error.job.UNKNOWN_ERROR'; - var translationVariables = { - name: konnector.name || '', - link: konnector.vendor_link || '', - supportMail: supportMail - }; // not handled errors +var ReactIs = __webpack_require__(672); +var assign = __webpack_require__(676); - if (!(error instanceof KonnectorJobError)) { - var locale = t("".concat(defaultKey, ".").concat(suffixKey), translationVariables); // since it's not handled errors, we add more details if available +var ReactPropTypesSecret = __webpack_require__(678); +var has = __webpack_require__(679); +var checkPropTypes = __webpack_require__(677); - if (suffixKey === 'description') { - return error.message ? "".concat(locale, " (").concat(error.message, ")") : locale; +var printWarning = function() {}; + +if (true) { + printWarning = function(text) { + var message = 'Warning: ' + text; + if (typeof console !== 'undefined') { + console.error(message); } + try { + // --- Welcome to debugging React --- + // This error was thrown as a convenience so that you can use this stack + // to find the callsite that caused this warning to fire. + throw new Error(message); + } catch (x) {} + }; +} - return t("".concat(defaultKey, ".").concat(suffixKey), translationVariables); +function emptyFunctionThatReturnsNull() { + return null; +} + +module.exports = function(isValidElement, throwOnDirectAccess) { + /* global Symbol */ + var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; + var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec. + + /** + * Returns the iterator method function contained on the iterable object. + * + * Be sure to invoke the function with the iterable as context: + * + * var iteratorFn = getIteratorFn(myIterable); + * if (iteratorFn) { + * var iterator = iteratorFn.call(myIterable); + * ... + * } + * + * @param {?object} maybeIterable + * @return {?function} + */ + function getIteratorFn(maybeIterable) { + var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]); + if (typeof iteratorFn === 'function') { + return iteratorFn; + } } - return t("error.job.".concat(error.code, ".").concat(suffixKey), _objectSpread(_objectSpread({}, translationVariables), {}, { - _: t("error.job.".concat(error.type, ".").concat(suffixKey), _objectSpread(_objectSpread({}, translationVariables), {}, { - _: t("".concat(defaultKey, ".").concat(suffixKey), translationVariables) - })) - })); -}; -var fetchSupportMail = /*#__PURE__*/function () { - var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.mark(function _callee(client) { - var result; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_9___default.a.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return client.fetchQueryAndGetFromState({ - definition: Object(cozy_client__WEBPACK_IMPORTED_MODULE_14__["Q"])('io.cozy.settings').getById('context'), - options: { - as: 'contextSupportMail', - fetchPolicy: cozy_client__WEBPACK_IMPORTED_MODULE_14__["fetchPolicies"].olderThan(60 * 60 * 1000) - } - }); + /** + * Collection of methods that allow declaration and validation of props that are + * supplied to React components. Example usage: + * + * var Props = require('ReactPropTypes'); + * var MyArticle = React.createClass({ + * propTypes: { + * // An optional string prop named "description". + * description: Props.string, + * + * // A required enum prop named "category". + * category: Props.oneOf(['News','Photos']).isRequired, + * + * // A prop named "dialog" that requires an instance of Dialog. + * dialog: Props.instanceOf(Dialog).isRequired + * }, + * render: function() { ... } + * }); + * + * A more formal specification of how these methods are used: + * + * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...) + * decl := ReactPropTypes.{type}(.isRequired)? + * + * Each and every declaration produces a function with the same signature. This + * allows the creation of custom validation functions. For example: + * + * var MyLink = React.createClass({ + * propTypes: { + * // An optional string or URI prop named "href". + * href: function(props, propName, componentName) { + * var propValue = props[propName]; + * if (propValue != null && typeof propValue !== 'string' && + * !(propValue instanceof URI)) { + * return new Error( + * 'Expected a string or an URI for ' + propName + ' in ' + + * componentName + * ); + * } + * } + * }, + * render: function() {...} + * }); + * + * @internal + */ - case 2: - result = _context.sent; - return _context.abrupt("return", lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(result, 'data[0].attributes.support_address', DEFAULT_SUPPORT_MAIL)); + var ANONYMOUS = '<<anonymous>>'; - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })); + // Important! + // Keep this list in sync with production version in `./factoryWithThrowingShims.js`. + var ReactPropTypes = { + array: createPrimitiveTypeChecker('array'), + bigint: createPrimitiveTypeChecker('bigint'), + bool: createPrimitiveTypeChecker('boolean'), + func: createPrimitiveTypeChecker('function'), + number: createPrimitiveTypeChecker('number'), + object: createPrimitiveTypeChecker('object'), + string: createPrimitiveTypeChecker('string'), + symbol: createPrimitiveTypeChecker('symbol'), - return function fetchSupportMail(_x) { - return _ref.apply(this, arguments); + any: createAnyTypeChecker(), + arrayOf: createArrayOfTypeChecker, + element: createElementTypeChecker(), + elementType: createElementTypeTypeChecker(), + instanceOf: createInstanceTypeChecker, + node: createNodeChecker(), + objectOf: createObjectOfTypeChecker, + oneOf: createEnumTypeChecker, + oneOfType: createUnionTypeChecker, + shape: createShapeTypeChecker, + exact: createStrictShapeTypeChecker, }; -}(); -var getErrorLocaleBound = function getErrorLocaleBound(error, konnector, lang, suffixKey, supportMail) { - var t = Object(_locales__WEBPACK_IMPORTED_MODULE_13__["getBoundT"])(lang); - return getErrorLocale(error, konnector, t, suffixKey, supportMail); -}; -/** - * Returns the account type. Based on the information from the oauth attribute, - * or the slug. - * @param {Object} konnector - * @return {string} Account type - */ -var getAccountType = function getAccountType(konnector) { - return lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(konnector, 'oauth.account_type', konnector.slug); -}; -/** - * Returns true if the konnector has a new version available and can be updated - * @param {Object} konnector - * @return {Boolean} - */ + /** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ + /*eslint-disable no-self-compare*/ + function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return x !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } + } + /*eslint-enable no-self-compare*/ -var hasNewVersionAvailable = function hasNewVersionAvailable() { - var konnector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return !!konnector.available_version; -}; -/** - * Indicates if the given konnector requires a folder to work properly. - * This directly relies on the `fields.advancedFields.folderPath` from manifest for legacy Konnector. - * Relies on `folders` for new Konnector - * @param {Object} konnector - * @return {bool} `true` if the konnector needs a folder - */ + /** + * We use an Error-like object for backward compatibility as people may call + * PropTypes directly and inspect their output. However, we don't use real + * Errors anymore. We don't inspect their stack anyway, and creating them + * is prohibitively expensive if they are created too often, such as what + * happens in oneOfType() for any type before the one that matched. + */ + function PropTypeError(message, data) { + this.message = message; + this.data = data && typeof data === 'object' ? data: {}; + this.stack = ''; + } + // Make `instanceof Error` still work for returned errors. + PropTypeError.prototype = Error.prototype; + + function createChainableTypeChecker(validate) { + if (true) { + var manualPropTypeCallCache = {}; + var manualPropTypeWarningCount = 0; + } + function checkType(isRequired, props, propName, componentName, location, propFullName, secret) { + componentName = componentName || ANONYMOUS; + propFullName = propFullName || propName; + + if (secret !== ReactPropTypesSecret) { + if (throwOnDirectAccess) { + // New behavior only for users of `prop-types` package + var err = new Error( + 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' + + 'Use `PropTypes.checkPropTypes()` to call them. ' + + 'Read more at http://fb.me/use-check-prop-types' + ); + err.name = 'Invariant Violation'; + throw err; + } else if ( true && typeof console !== 'undefined') { + // Old behavior for people using React.PropTypes + var cacheKey = componentName + ':' + propName; + if ( + !manualPropTypeCallCache[cacheKey] && + // Avoid spamming the console because they are often not actionable except for lib authors + manualPropTypeWarningCount < 3 + ) { + printWarning( + 'You are manually calling a React.PropTypes validation ' + + 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' + + 'and will throw in the standalone `prop-types` package. ' + + 'You may be seeing this warning due to a third-party PropTypes ' + + 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.' + ); + manualPropTypeCallCache[cacheKey] = true; + manualPropTypeWarningCount++; + } + } + } + if (props[propName] == null) { + if (isRequired) { + if (props[propName] === null) { + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.')); + } + return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.')); + } + return null; + } else { + return validate(props, propName, componentName, location, propFullName); + } + } -var needsFolder = function needsFolder(konnector) { - return lodash_has__WEBPACK_IMPORTED_MODULE_11___default()(konnector, 'fields.advancedFields.folderPath') || lodash_has__WEBPACK_IMPORTED_MODULE_11___default()(konnector, 'folders'); -}; -/** - * Base directories are directory where konnector may copy their data. - * They are expressed as variables which then need to be localized. - * Default is `$administrative`. - */ + var chainedCheckType = checkType.bind(null, false); + chainedCheckType.isRequired = checkType.bind(null, true); -var allowedBaseDirVariables = ['$administrative', '$photos']; -/** - * Render base directory, based on given folders object. - * For example, it will render `$administrative` with the given value passed in - * folders object. We expect to find in folders a localized value. - * @param {String} baseDir base directory variable, expects `$administrative` - * or `$photos` - * @param {Object} folders Object indexing base directory variable with - * corresponding localized name. - * @return {String} Localized directory - */ + return chainedCheckType; + } -var renderBaseDir = function renderBaseDir(baseDir) { - var folders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Look for variable name into folders but without $ prefix - var renderedBaseDir = folders[baseDir.slice(1)] || DEFAULT_LOCALIZED_BASE_DIR; // Trim `/` and avoid multiple `/` characters with regexp + function createPrimitiveTypeChecker(expectedType) { + function validate(props, propName, componentName, location, propFullName, secret) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== expectedType) { + // `propValue` being instance of, say, date/regexp, pass the 'object' + // check, but we can offer a more precise error message here rather than + // 'of type `object`'. + var preciseType = getPreciseType(propValue); - return lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(renderedBaseDir.replace(/(\/+)/g, '/'), '/'); -}; -/** - * Render the given folder path using the given `variables` object. - * Available variable are `$konnector` (konnector name) and `$account` - * (account label, i.e. id or name) - * @param {String} path Path to render - * @param {Object} variables Object mapping variable to actual values - * @return {String} Rendered path - */ + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'), + {expectedType: expectedType} + ); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createAnyTypeChecker() { + return createChainableTypeChecker(emptyFunctionThatReturnsNull); + } -var renderSubDir = function renderSubDir(path) { - var variables = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - // Trim `/` and avoid multiple `/` characters with regexp - var sanitizedPath = lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(path.replace(/(\/+)/g, '/'), '/'); // Let's get only full variable name limited by '/'. We want to avoid false - // positive like parsing `$variableInString` to `valueInString` + function createArrayOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.'); + } + var propValue = props[propName]; + if (!Array.isArray(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.')); + } + for (var i = 0; i < propValue.length; i++) { + var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + return null; + } + return createChainableTypeChecker(validate); + } - var segments = sanitizedPath.split('/'); - return segments.map(function (segment) { - return variables[segment.slice(1)] || segment; - }).join('/'); -}; -/** - * Check if the provided Path start withs our allowedBaseDirPath to see - * @param {String} path - * @return {Boolean} - */ + function createElementTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!isValidElement(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createElementTypeTypeChecker() { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + if (!ReactIs.isValidElementType(propValue)) { + var propType = getPropType(propValue); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.')); + } + return null; + } + return createChainableTypeChecker(validate); + } -var hasBaseDir = function hasBaseDir(path) { - return allowedBaseDirVariables.some(function (baseDirVar) { - return path.startsWith(baseDirVar); - }); -}; -/** - * This method creates the subDir. We can't have an empty subDir, so we set - * it to our default '$konnector/$account' - * @param {String} fullPath String containing potentially the defaultDir - * @param {String} defaultDir String to remove from the fullPath - */ + function createInstanceTypeChecker(expectedClass) { + function validate(props, propName, componentName, location, propFullName) { + if (!(props[propName] instanceof expectedClass)) { + var expectedClassName = expectedClass.name || ANONYMOUS; + var actualClassName = getClassName(props[propName]); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.')); + } + return null; + } + return createChainableTypeChecker(validate); + } + function createEnumTypeChecker(expectedValues) { + if (!Array.isArray(expectedValues)) { + if (true) { + if (arguments.length > 1) { + printWarning( + 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' + + 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).' + ); + } else { + printWarning('Invalid argument supplied to oneOf, expected an array.'); + } + } + return emptyFunctionThatReturnsNull; + } -var buildSubDir = function buildSubDir(fullPath, defaultDir) { - var buildedSubDir = fullPath.substring(defaultDir.length); + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + for (var i = 0; i < expectedValues.length; i++) { + if (is(propValue, expectedValues[i])) { + return null; + } + } - if (buildedSubDir === '') { - buildedSubDir = '$konnector/$account'; + var valuesString = JSON.stringify(expectedValues, function replacer(key, value) { + var type = getPreciseType(value); + if (type === 'symbol') { + return String(value); + } + return value; + }); + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.')); + } + return createChainableTypeChecker(validate); } - return buildedSubDir; -}; -/** - * Build folder path for a given konnector and a given account. - * - * If konnector.folders[0].defaultDir exists, it is used as default directory. - * - * Occurrences of following strings in base directory are replaced by: - * * `$administrative`: Administrative folder - * * `$photos`: Photos folder - * - * Occurrences of following strings in path are replaced by: - * * `$account: Account label (id or name)` - * * `$konnector`: Konnector name - * - * If no konnectors.folders[0].defaultDir is set, the default dir used is - * * `$administrative/$konnector/$account` - * - * @param {Object} konnector Konnector document - * @param {Object} account Account document - * @param {Object} folders Object containing a mapping from folder - * identifiers (ex: $administrative) to their localized values (ex: - * Administratif). - * @return {String} The result path - */ - + function createObjectOfTypeChecker(typeChecker) { + function validate(props, propName, componentName, location, propFullName) { + if (typeof typeChecker !== 'function') { + return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.'); + } + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.')); + } + for (var key in propValue) { + if (has(propValue, key)) { + var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error instanceof Error) { + return error; + } + } + } + return null; + } + return createChainableTypeChecker(validate); + } -var buildFolderPath = function buildFolderPath(konnector, account) { - var folders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; - var fullPath = lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(konnector, // For now konnectors are only defining one folder in their folders array - 'folders[0].defaultDir', '$administrative/$konnector/$account'); // Trim `/` and avoid multiple `/` characters with regexp + function createUnionTypeChecker(arrayOfTypeCheckers) { + if (!Array.isArray(arrayOfTypeCheckers)) { + true ? printWarning('Invalid argument supplied to oneOfType, expected an instance of array.') : undefined; + return emptyFunctionThatReturnsNull; + } - var sanitizedPath = lodash_trim__WEBPACK_IMPORTED_MODULE_12___default()(fullPath.replace(/(\/+)/g, '/'), '/'); // If the konnector doesn't have any of our base dir, we set it to $administrative + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + if (typeof checker !== 'function') { + printWarning( + 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' + + 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.' + ); + return emptyFunctionThatReturnsNull; + } + } - if (!hasBaseDir(sanitizedPath)) { - sanitizedPath = '$administrative/' + sanitizedPath; + function validate(props, propName, componentName, location, propFullName) { + var expectedTypes = []; + for (var i = 0; i < arrayOfTypeCheckers.length; i++) { + var checker = arrayOfTypeCheckers[i]; + var checkerResult = checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret); + if (checkerResult == null) { + return null; + } + if (checkerResult.data && has(checkerResult.data, 'expectedType')) { + expectedTypes.push(checkerResult.data.expectedType); + } + } + var expectedTypesMessage = (expectedTypes.length > 0) ? ', expected one of type [' + expectedTypes.join(', ') + ']': ''; + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`' + expectedTypesMessage + '.')); + } + return createChainableTypeChecker(validate); } - /** - * Now that we have our sanitizedPath, we can split it in two strings - * * `baseDir` containing the baseDir path - * * `buildedSubDir` containing the rest of the path (ie the path without baseDir) - */ + function createNodeChecker() { + function validate(props, propName, componentName, location, propFullName) { + if (!isNode(props[propName])) { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.')); + } + return null; + } + return createChainableTypeChecker(validate); + } - var baseDir = sanitizedPath.split('/', 1); - var buildedSubDir = buildSubDir(sanitizedPath, baseDir[0]); - var renderedBaseDir = renderBaseDir(baseDir[0], folders); - var renderedPath = renderSubDir(buildedSubDir, { - // When adding a new allowed variable here, please keep documentation - // of `renderSubDir` function up to date. - konnector: konnector.name, - account: _accounts__WEBPACK_IMPORTED_MODULE_15__["getLabel"](account).replace(sanitizeAccountIdentifierRx, '-') - }); - return "/".concat(renderedBaseDir, "/").concat(renderedPath); -}; -/** - * Returns a permission ready to be passed to - * client.collection('io.cozy.permissions').add(). - * @param {Object} konnector The konnector to add permission to - * @param {Object} folder The folder which the konnector should have access - * @return {Object} Permission object - */ + function invalidValidatorError(componentName, location, propFullName, key, type) { + return new PropTypeError( + (componentName || 'React class') + ': ' + location + ' type `' + propFullName + '.' + key + '` is invalid; ' + + 'it must be a function, usually from the `prop-types` package, but received `' + type + '`.' + ); + } -var buildFolderPermission = function buildFolderPermission(folder) { - return { - // Legacy name - saveFolder: { - type: 'io.cozy.files', - values: [folder._id], - verbs: ['GET', 'PATCH', 'POST'] + function createShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + for (var key in shapeTypes) { + var checker = shapeTypes[key]; + if (typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; } - }; -}; -/** - * Get's the launcher in the current environment if any - * - * @param {Object} win The window object in the current environment - * @returns {Object} - */ + return createChainableTypeChecker(validate); + } -var getLauncher = function getLauncher(_ref2) { - var win = _ref2.win; - return lodash_get__WEBPACK_IMPORTED_MODULE_10___default()(win, 'cozy.ClientConnectorLauncher', null); -}; -/** - * Define if it is possible to run a konnector in the current environment - * - * @param {Object} win The window object in the current environment - * @param {Object} konnector The io.cozy.konnectors object for the current konnector - * @returns {Boolean} - */ + function createStrictShapeTypeChecker(shapeTypes) { + function validate(props, propName, componentName, location, propFullName) { + var propValue = props[propName]; + var propType = getPropType(propValue); + if (propType !== 'object') { + return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.')); + } + // We need to check all keys in case some are required but missing from props. + var allKeys = assign({}, props[propName], shapeTypes); + for (var key in allKeys) { + var checker = shapeTypes[key]; + if (has(shapeTypes, key) && typeof checker !== 'function') { + return invalidValidatorError(componentName, location, propFullName, key, getPreciseType(checker)); + } + if (!checker) { + return new PropTypeError( + 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' + + '\nBad object: ' + JSON.stringify(props[propName], null, ' ') + + '\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ') + ); + } + var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret); + if (error) { + return error; + } + } + return null; + } -var isRunnable = function isRunnable(_ref3) { - var win = _ref3.win, - _ref3$konnector = _ref3.konnector, - konnector = _ref3$konnector === void 0 ? {} : _ref3$konnector; - return Boolean(!konnector.clientSide || getLauncher({ - win: win - })); -}; -/* harmony default export */ __webpack_exports__["default"] = ({ - KonnectorJobError: KonnectorJobError, - buildFolderPath: buildFolderPath, - buildFolderPermission: buildFolderPermission, - getAccountType: getAccountType, - getLauncher: getLauncher, - isRunnable: isRunnable, - hasNewVersionAvailable: hasNewVersionAvailable, - needsFolder: needsFolder, - fetchSupportMail: fetchSupportMail, - DEFAULT_SUPPORT_MAIL: DEFAULT_SUPPORT_MAIL -}); + return createChainableTypeChecker(validate); + } -/***/ }), -/* 941 */ -/***/ (function(module, exports, __webpack_require__) { + function isNode(propValue) { + switch (typeof propValue) { + case 'number': + case 'string': + case 'undefined': + return true; + case 'boolean': + return !propValue; + case 'object': + if (Array.isArray(propValue)) { + return propValue.every(isNode); + } + if (propValue === null || isValidElement(propValue)) { + return true; + } -var baseToString = __webpack_require__(171), - baseTrim = __webpack_require__(308), - castSlice = __webpack_require__(420), - charsEndIndex = __webpack_require__(480), - charsStartIndex = __webpack_require__(942), - stringToArray = __webpack_require__(422), - toString = __webpack_require__(170); + var iteratorFn = getIteratorFn(propValue); + if (iteratorFn) { + var iterator = iteratorFn.call(propValue); + var step; + if (iteratorFn !== propValue.entries) { + while (!(step = iterator.next()).done) { + if (!isNode(step.value)) { + return false; + } + } + } else { + // Iterator will provide entry [k,v] tuples rather than values. + while (!(step = iterator.next()).done) { + var entry = step.value; + if (entry) { + if (!isNode(entry[1])) { + return false; + } + } + } + } + } else { + return false; + } -/** - * Removes leading and trailing whitespace or specified characters from `string`. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category String - * @param {string} [string=''] The string to trim. - * @param {string} [chars=whitespace] The characters to trim. - * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. - * @returns {string} Returns the trimmed string. - * @example - * - * _.trim(' abc '); - * // => 'abc' - * - * _.trim('-_-abc-_-', '_-'); - * // => 'abc' - * - * _.map([' foo ', ' bar '], _.trim); - * // => ['foo', 'bar'] - */ -function trim(string, chars, guard) { - string = toString(string); - if (string && (guard || chars === undefined)) { - return baseTrim(string); - } - if (!string || !(chars = baseToString(chars))) { - return string; + return true; + default: + return false; + } } - var strSymbols = stringToArray(string), - chrSymbols = stringToArray(chars), - start = charsStartIndex(strSymbols, chrSymbols), - end = charsEndIndex(strSymbols, chrSymbols) + 1; - return castSlice(strSymbols, start, end).join(''); -} + function isSymbol(propType, propValue) { + // Native Symbol. + if (propType === 'symbol') { + return true; + } + + // falsy value can't be a Symbol + if (!propValue) { + return false; + } + + // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol' + if (propValue['@@toStringTag'] === 'Symbol') { + return true; + } + + // Fallback for non-spec compliant Symbols which are polyfilled. + if (typeof Symbol === 'function' && propValue instanceof Symbol) { + return true; + } -module.exports = trim; + return false; + } + // Equivalent of `typeof` but with special handling for array and regexp. + function getPropType(propValue) { + var propType = typeof propValue; + if (Array.isArray(propValue)) { + return 'array'; + } + if (propValue instanceof RegExp) { + // Old webkits (at least until Android 4.0) return 'function' rather than + // 'object' for typeof a RegExp. We'll normalize this here so that /bla/ + // passes PropTypes.object. + return 'object'; + } + if (isSymbol(propType, propValue)) { + return 'symbol'; + } + return propType; + } -/***/ }), -/* 942 */ -/***/ (function(module, exports, __webpack_require__) { + // This handles more types than `getPropType`. Only used for error messages. + // See `createPrimitiveTypeChecker`. + function getPreciseType(propValue) { + if (typeof propValue === 'undefined' || propValue === null) { + return '' + propValue; + } + var propType = getPropType(propValue); + if (propType === 'object') { + if (propValue instanceof Date) { + return 'date'; + } else if (propValue instanceof RegExp) { + return 'regexp'; + } + } + return propType; + } -var baseIndexOf = __webpack_require__(188); + // Returns a string that is postfixed to a warning about an invalid type. + // For example, "undefined" or "of type array" + function getPostfixForTypeWarning(value) { + var type = getPreciseType(value); + switch (type) { + case 'array': + case 'object': + return 'an ' + type; + case 'boolean': + case 'date': + case 'regexp': + return 'a ' + type; + default: + return type; + } + } -/** - * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol - * that is not found in the character symbols. - * - * @private - * @param {Array} strSymbols The string symbols to inspect. - * @param {Array} chrSymbols The character symbols to find. - * @returns {number} Returns the index of the first unmatched string symbol. - */ -function charsStartIndex(strSymbols, chrSymbols) { - var index = -1, - length = strSymbols.length; + // Returns class name of the object, if any. + function getClassName(propValue) { + if (!propValue.constructor || !propValue.constructor.name) { + return ANONYMOUS; + } + return propValue.constructor.name; + } - while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} - return index; -} + ReactPropTypes.checkPropTypes = checkPropTypes; + ReactPropTypes.resetWarningCache = checkPropTypes.resetWarningCache; + ReactPropTypes.PropTypes = ReactPropTypes; -module.exports = charsStartIndex; + return ReactPropTypes; +}; /***/ }), -/* 943 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 936 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBoundT", function() { return getBoundT; }); -/* harmony import */ var node_polyglot__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(493); -/* harmony import */ var node_polyglot__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_polyglot__WEBPACK_IMPORTED_MODULE_0__); +const log = __webpack_require__(917).namespace('doctypes') -var polyglots = {}; -var langs = ['fr', 'en']; +module.exports = log -for (var _i = 0, _langs = langs; _i < _langs.length; _i++) { - var lang = _langs[_i]; - var locales = {}; - try { - locales = __webpack_require__(944)("./".concat(lang, ".json")); // eslint-disable-next-line no-empty - } catch (e) {} +/***/ }), +/* 937 */ +/***/ (function(module, exports, __webpack_require__) { - var polyglot = new node_polyglot__WEBPACK_IMPORTED_MODULE_0___default.a(); - polyglot.extend(locales); - polyglots[lang] = polyglot; -} +const Document = __webpack_require__(909) -var getBoundT = function getBoundT(lang) { - var polyglot = polyglots[lang] || polyglots['en']; - return polyglot.t.bind(polyglot); -}; +const APP_DOCTYPE = 'io.cozy.apps' +const STORE_SLUG = 'store' +class Application extends Document { + /** + * Return Store URL where an app/konnector can be installed / updated + * @param {Array} [appData=[]] Apps data, as returned by endpoint /apps/ or + * /konnectors/ + * @param {Object} [app={}] AppObject + * @return {String} URL as string + */ + static getStoreInstallationURL(appData = [], app = {}) { + if (!app.slug) { + throw new Error('Expected app / konnector with the defined slug') + } + const storeApp = this.isInstalled(appData, { slug: STORE_SLUG }) + if (!storeApp) return null -/***/ }), -/* 944 */ -/***/ (function(module, exports, __webpack_require__) { + const storeUrl = storeApp.links && storeApp.links.related -var map = { - "./en.json": 945, - "./fr.json": 946, - "./nl_NL.json": 947 -}; + if (!storeUrl) return null + return `${storeUrl}#/discover/${app.slug}/install` + } -function webpackContext(req) { - var id = webpackContextResolve(req); - return __webpack_require__(id); -} -function webpackContextResolve(req) { - if(!__webpack_require__.o(map, req)) { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - } - return map[req]; + /** + * + * @param {Array} apps Array of apps returned by /apps /konnectors + * @param {Object} wantedApp io.cozy.app with at least a slug + * @return {Object} The io.cozy.app is installed or undefined if not + */ + static isInstalled(apps = [], wantedApp = {}) { + return apps.find( + app => app.attributes && app.attributes.slug === wantedApp.slug + ) + } + /** + * + * @param {Object} app io.cozy.app object + * @return {String} url to the app + */ + static getUrl(app) { + return app.links && app.links.related + } } -webpackContext.keys = function webpackContextKeys() { - return Object.keys(map); -}; -webpackContext.resolve = webpackContextResolve; -module.exports = webpackContext; -webpackContext.id = 944; - -/***/ }), -/* 945 */ -/***/ (function(module) { - -module.exports = JSON.parse("{\"close\":\"Close\",\"back\":\"Go back\",\"badges\":{\"warning\":\"Warning\"},\"accountForm\":{\"submit\":{\"label\":\"Connect\"},\"fields\":{\"optional\":\"(optional)\"},\"password\":{\"show\":\"Show\",\"hide\":\"Hide\"},\"disconnect\":{\"button\":\"Disconnect this account\"},\"installFlagship\":{\"label\":\"Install Cozy on mobile\"},\"notClientSide\":\"The %{name} application uses a brand-new and efficient system for retrieving your data from your Cozy. This action is only accessible from the Cozy mobile app.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Bank accounts\",\"default\":\"Contracts\"},\"deleted\":\"Deleted\",\"no-contracts\":\"No contracts anymore\",\"handle-synchronization\":\"Handle my synchronizations\",\"desynchronized\":{\"message\":\"you have desynchronized this account on %{date}\",\"dateFormat\":\"MM/DD/YY\"}},\"contractForm\":{\"details\":\"Details\",\"sharing\":\"Sharing\",\"back-to-accounts\":\"Back to accounts\",\"update\":\"Update\",\"delete\":\"Reset\",\"deleting\":\"Resetting...\",\"confirm-deletion\":{\"description\":\"This will also delete your transactions along with bill links. If you do not wish to reimport your banking data at the next scheduled synchronization, you'll have to remove the connection.\",\"confirm\":\"Confirm account deletion\",\"title\":\"Are you definitive ?\"},\"deletion_error\":\"An error occurred while group deletion.\",\"label\":\"Label\",\"owner\":\"Owner\",\"addOwnerBtn\":\"Add an owner\",\"removeOwnerBtn\":\"Remove this owner\",\"ownerPlaceholder\":\"Select an owner\",\"bank\":\"Bank\",\"number\":\"Number\",\"type\":\"Type\",\"apply\":\"Apply\",\"success\":\"Account updated successfully\",\"failure\":\"Error while updating the account\",\"removeAccountBtn\":\"Remove the account\",\"listPlaceholder\":\"Search a contact\",\"listEmptyMessage\":\"No contact found\",\"addContactLabel\":\"Add a contact\",\"cancel\":\"Cancel\",\"imported\":\"Synchronized account\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Run again now\"},\"error\":\"An error occured.\",\"frequency\":{\"label\":\"Frequency:\",\"hourly\":\"Each hour\",\"daily\":\"Once a day\",\"weekly\":\"Once a week\",\"monthly\":\"Once a month\",\"undefined\":\"Manually\"},\"lastSync\":{\"label\":\"Update:\",\"syncing\":\"Running…\",\"unknown\":\"Unknown\",\"format\":\"MMMM D[,] YYYY [at] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Your documents\",\"description\":\"This service retrieves your latest documents and keeps a complete back-up for you.\",\"button\":\"Open the documents\",\"install\":\"Discover Cozy Drive\"},\"contacts\":{\"title\":\"Your contacts\",\"description\":\"This service synchronizes all your contacts for you.\",\"button\":\"Open contacts\",\"install\":\"Discover Cozy Contacts\"},\"banks\":{\"title\":\"Your banking data\",\"description\":\"This service retrieves and keeps a complete record of your latest banking operations for you.\",\"button\":\"Access bank accounts\",\"install\":\"Discover Cozy Banks\"},\"coachco2\":{\"title\":\"Apps to go further\",\"description\":\"The following apps are able to use privately this kind of data inside your Cozy.\",\"button\":\"Coach CO2\",\"install\":\"Discover CoachCO2\"}},\"websiteLink\":{\"title\":\"Useful information\",\"description\":\"Service website\"}},\"default\":{\"dateFormat\":\"MM/DD/YYYY\",\"baseDir\":\"/Administrative\"},\"error\":{\"application-not-found\":\"This app doesn't exist\",\"reconnect-via-form\":\"Reconnect\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Storage full\",\"description\":\"This service cannot fetch your documents now. Please remove some files or go to **Settings > Storage** to get more free space.\"},\"CHALLENGE_ASKED\":{\"title\":\"Challenge required\",\"description\":\"The website requires a second authentification factor. You may re-run the connector manually to provide the code and continue to retrieve your data.\"},\"OAUTH_CANCELED\":{\"title\":\"Canceled\",\"description\":\"We could not add your bank since you canceled the connection. Click \\\"Add your bank\\\" one more time to try again.\"},\"LOGIN_FAILED\":{\"title\":\"Incorrect or expired credentials\",\"description\":\"Sorry, your login or password are invalid or are expired. You may check your credentials on [%{name}](%{link}) website before updating.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Additional information needed\",\"description\":\"An additional field must be filled in to connect your service. You may re-run the connector manually to provide the information.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Temporarily blocked\",\"description\":\"Too many attempts occured. Please update your credentials on [%{name}](%{link}) website and update the konnector later on.\"},\"MAINTENANCE\":{\"title\":\"Unavailable website\",\"description\":\"It seems that the [%{name}](%{link}) website is unavailable or the konnector must be updated. Please rerun the connector later or visit our online help.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Missing destination folder\",\"description\":\"It seems that this account's destination folder has been deleted. Please restore it by disconnecting this account and then reconnect again.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Latest Terms of Service non accepted\",\"description\":\"%{name} seems to have updated its Terms Of Service. Please check that the service is up to date. It this error still occurs, please contact us at [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Connection error\",\"description\":\"An unknown error has occurred. You can try to update your data. If the problem persists, please contact us at [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Action needed on the provider's website\",\"description\":\"It seems that the [%{name}](%{link}) website requires you to log in and to complete a specific action. Please re-run the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Access renewal required\",\"description\":\"The [%{name}](%{link}) service requires you to renew your authentication. Please disconnect and reconnect your account %{name} to this application. No data will be lost.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Unavailable account\",\"description\":\"It seems that your account is no longer active. Please check your account on [%{name}](%{link}) before retry.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Password update required\",\"description\":\"It seems that the [%{name}](%{link}) website requires you to log in and update your password. Please rerun the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"New permissions needed\",\"description\":\"You connector was updated and the permissions changed. Please validate them before launching the connector again.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Renewal of authentication required\",\"description\":\"It seems that %{name} requires a login recheck for the synchronisation to work. Please re-run the connector to start the verification process. You will receive a one-time password or a validation process on your bank application or website.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Authentication renewal required\",\"description\":\"The last connexion to the service failed; please launch it again. You may have to provide a validation code.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Authentication on vendor website required\",\"description\":\"It seems that [%{name}](%{link}) requires you to log in on their website for the synchronisation to work. Please re-run the connector once you have settled the issue on the website.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Incorrect strong authentication code\",\"description\":\"The second-factor code provided is incorrect, please start again.\"},\"VENDOR_DOWN\":{\"title\":\"Unavailable service\",\"description\":\"It seems that the [%{name}](%{link}) service is unavailable at the moment. Please rerun the connector later.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Unavailable bank website\",\"description\":\"Access to the [%{name}](%{link}) customer area is currently unavailable. Please rerun the connector later\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Unavailable service\",\"description\":\"It seems that we are experiencing overload with our bank konnectors at the moment. Please rerun the connector later.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"This account already exists\",\"description\":\"Your possible modification of the list of synchronized accounts will be taken into account within a few minutes.\"}}},\"fields\":{\"answer\":{\"label\":\"Secret answer\"},\"birthdate\":{\"label\":\"Birth date\",\"placeholder\":\"mm/dd/yyyy\"},\"code\":{\"label\":\"Confidential code\"},\"date\":{\"label\":\"Date\",\"placeholder\":\"mm/dd/yyyy\"},\"email\":{\"label\":\"Email address\"},\"firstname\":{\"label\":\"First name\"},\"lastname\":{\"label\":\"Last name\"},\"login\":{\"label\":\"Login\"},\"password\":{\"label\":\"Password\"},\"phone\":{\"label\":\"Phone number\"},\"two_fa_code\":{\"label\":\"Strong authentication code\"}},\"folder\":{\"administrative\":\"Administrative\",\"photos\":\"Photos\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"An update is available for this service.\",\"body\":{\"regular\":\"Perform this update to keep fetching your data and to have the latest features:\",\"blocking\":\"Update it to keep fetching your data:\"},\"button\":{\"label\":\"See update\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Access token\"},\"accessTokenSecret\":{\"label\":\"Access token secret\"},\"accountName\":{\"label\":\"Account name\"},\"agreement\":{\"label\":\"I agree\"},\"apikey\":{\"label\":\"Api key\"},\"appKey\":{\"label\":\"Application Key\"},\"appSecret\":{\"label\":\"Application Secret\"},\"authCode\":{\"label\":\"Auth code\"},\"bank_identifier\":{\"label\":\"Bank identifier (optional)\"},\"branchName\":{\"label\":\"Branch\"},\"cardNumber\":{\"label\":\"Card Number\"},\"consumerKey\":{\"label\":\"Consumer Key\"},\"consumerSecret\":{\"label\":\"Consumer Secret\"},\"dob\":{\"label\":\"Date of birth\"},\"folderPath\":{\"label\":\"Folder path\"},\"identifier\":{\"label\":\"Identifier\"},\"loginUrl\":{\"label\":\"Login URL\"},\"namePath\":{\"label\":\"Folder name\"},\"new_identifier\":{\"label\":\"Identifier\"},\"phoneNumber\":{\"label\":\"Phone number\"},\"profileName\":{\"label\":\"Profile Name\"},\"refreshToken\":{\"label\":\"Refresh Token\"},\"secret\":{\"label\":\"Password\"},\"timeout\":{\"label\":\"Delay (ms)\"},\"token\":{\"label\":\"Token\"},\"tricountUrl\":{\"label\":\"Tricount URL\"}}},\"modal\":{\"aria-label\":\"Connector configuration\",\"konnector\":{\"error\":{\"title\":\"Unable to retrieve your account\",\"description\":\"The account cannot be retrieved (%{message}).\",\"button\":\"Close\"}},\"accounts\":{\"title\":\"Select a %{name} account\",\"error\":{\"title\":\"Error\",\"description\":\"Unable to retrieve your account(s)\",\"retry\":\"Retry\"}},\"tabs\":{\"data\":\"Data\",\"configuration\":\"Configuration\"},\"addAccount\":{\"title\":\"Connect to %{name}\",\"button\":\"Add an account\"},\"deleteAccount\":{\"title\":\"Disconnection\",\"description\":\"Your account will be disconnected, but already imported data will be kept.\",\"confirm\":\"Disconnect\",\"cancel\":\"Cancel\"},\"updateAccount\":{\"general-subheader\":\"General\",\"identifiers\":\"Identifiers\",\"delete-account-success\":\"Account has been disconnected\",\"delete-account-error\":\"Account could not be disconnected, please retry later or contact our support.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Add your bank\"},\"reconnect\":{\"label\":\"Reconnect\"}},\"reconnect\":{\"label\":\"Reconnect\"},\"connect\":{\"label\":\"Connect\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Close\"},\"description\":\"Your data will be available in a few minutes and the next ones will follow automatically.\",\"figure\":{\"alt\":\"connected\"},\"title\":\"Successful configuration!\"},\"twoFAForm\":{\"modal-label\":\"Two factor authentication form\",\"providers\":{\"default\":\"Enter the code sent to you by e-mail or SMS\",\"email\":\"Enter the code sent to you by e-mail\",\"sms\":\"Enter the code sent to you by SMS\",\"app_code\":\"Enter the one-time code to generate in ${name} mobile app\",\"app\":\"Use your provider's app to continue authentication\"},\"desc-2fa\":\"You need to open your provider's app to confirm your authentication. In some cases, you will have to validate two times.\",\"desc_1\":\"This code enables you to finish your connexion.\",\"desc_2\":\"The second code received on your mobile phone or by email enables you to finalize your connexion.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Second code\"},\"retry\":\"Invalid code, please re-enter.\",\"CTA\":\"Validate\"},\"account\":{\"success\":{\"title\":\"Successful configuration!\",\"connect\":\"Your data will be available in a few minutes and the next ones will follow automatically.\",\"banksLinkText\":\"See my accounts in %{appName}\",\"driveLinkText\":\"Open the folder in Cozy Drive\",\"button\":\"Close\"}},\"maintenance\":{\"noService\":\"Service interrupted\",\"explanationTitle\":\"What is going on?\"},\"suggestions\":{\"title\":\"Import your data from %{name}\",\"data\":\"Installing %{name} will automatically import the following data:\",\"why\":\"Why is %{name} suggested to me?\",\"reason_bank\":\"%{name} has been detected in one of your bank transactions. Don't worry, no one else can access this information\",\"install\":\"Install\",\"silence\":\"Don't suggest it again\"},\"dataType\":{\"none\":\"%{name} won't access any of your personal data\",\"activity\":\"Your activities\",\"appointment\":\"Your appointments\",\"bankTransactions\":\"Your bank transactions\",\"bankAccounts\":\"Your bank accounts\",\"bill\":\"Your bills\",\"bloodPressure\":\"Your blood pressure\",\"calendar\":\"Your calendars\",\"certificate\":\"Your certificates\",\"commit\":\"Your commits\",\"consumption\":\"Your consumption\",\"contact\":\"Your contacts\",\"contract\":\"Your contracts\",\"courseMaterial\":\"Your course materials\",\"document\":\"Your documents\",\"event\":\"Your events\",\"family\":\"Your family informations\",\"geopoint\":\"Your geolocations\",\"heartbeat\":\"Your heartbeats\",\"home\":\"Your home informations\",\"phonecommunicationlog\":\"Your phone communications log\",\"picture\":\"Your pictures\",\"podcast\":\"Your podcasts\",\"profile\":\"Your client profile\",\"refund\":\"Your refunds\",\"sinister\":\"Your sinisters\",\"sleepTime\":\"Your sleep time\",\"stepsNumber\":\"Your number of steps\",\"temperature\":\"Your temperature data\",\"travelDate\":\"Your travel dates\",\"tweet\":\"Your tweets\",\"videostream\":\"Your videos\",\"weight\":\"Your weights\"},\"vaultCiphersList\":{\"title\":\"From which account do you want to import your data?\",\"otherAccount\":\"From another account…\"},\"triggerManager\":{\"connecting\":\"Connecting your account...\",\"confirmationModal\":{\"title\":\"Update credentials?\",\"description\":\"Your previous credentials will be definitively lost. Add a new account to keep them.\",\"primaryText\":\"Update\",\"secondaryText\":\"Cancel\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"This account is disconnected. Your data has been kept. If you want to restart the synchronisation, please reconfigure your account with the \\\"Add a bank\\\" button.\"},\"konnectorBlock\":{\"account\":\"Customer account\",\"disconnected\":\"Disconnected\",\"inMaintenance\":\"In maintenance\",\"hasNewVersionAvailable\":\"New version available\",\"fatalError\":\"An error occurred while recovering the service. If this problem persists, do not hesitate to contact us at [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Last trips\",\"caption\":\"See your 5 most recent trips retrieved on %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Plane\",\"BICYCLING\":\"Bike\",\"CAR\":\"Car\",\"SUBWAY\":\"Subway\",\"TRAIN\":\"Train\",\"UNKNOWN\":\"\",\"WALKING\":\"Walking\"}},\"files\":{\"title\":\"Your documents\",\"imported\":\"Imported on %{date}\",\"caption\":\"This service retrieves your latest documents and keeps a complete back-up for you.\"}}}"); -/***/ }), -/* 946 */ -/***/ (function(module) { +Application.schema = { + doctype: APP_DOCTYPE, + attributes: {} +} -module.exports = JSON.parse("{\"close\":\"Fermer\",\"back\":\"Revenir\",\"badges\":{\"warning\":\"Warning\"},\"accountForm\":{\"submit\":{\"label\":\"Connecter\"},\"fields\":{\"optional\":\"(Optionnel)\"},\"password\":{\"show\":\"Voir\",\"hide\":\"Cacher\"},\"disconnect\":{\"button\":\"Déconnecter le compte\"},\"installFlagship\":{\"label\":\"Install Cozy on mobile\"},\"notClientSide\":\"L'application %{name} utilise un nouveau système plus efficace pour la récupération de vos données dans votre Cozy. Cette action est uniquement accessible depuis l’application mobile Cozy.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Comptes et livrets d'épargne\",\"default\":\"Contrats\"},\"deleted\":\"Supprimé\",\"no-contracts\":\"Vous n'avez plus de contrats\",\"handle-synchronization\":\"Gérer mes synchronisations\",\"desynchronized\":{\"message\":\"vous avez désynchronisé ce compte le %{date}\",\"dateFormat\":\"DD/MM/YY\"}},\"contractForm\":{\"details\":\"Détails\",\"sharing\":\"Partage\",\"back-to-accounts\":\"Revenir aux comptes\",\"update\":\"Modifier\",\"delete\":\"Effacer\",\"deleting\":\"Effacement...\",\"confirm-deletion\":{\"description\":\"Cette action supprimera les mouvements déjà importés. Déconnectez également votre compte si vous ne souhaitez pas réimporter vos données à la prochaine connexion.\",\"confirm\":\"Confirmer la suppression\",\"title\":\"Êtes-vous sûr ?\"},\"deletion_error\":\"Une erreur est survenue lors de la suppression du compte.\",\"label\":\"Libellé\",\"owner\":\"Titulaire\",\"addOwnerBtn\":\"Ajouter un titulaire\",\"removeOwnerBtn\":\"Supprimer ce titulaire\",\"ownerPlaceholder\":\"Sélectionner un titulaire\",\"bank\":\"Banque\",\"number\":\"Numéro\",\"type\":\"Type\",\"apply\":\"Appliquer\",\"success\":\"Compte mis à jour avec succès\",\"failure\":\"Erreur lors de la mise à jour du compte\",\"removeAccountBtn\":\"Effacer le compte\",\"listPlaceholder\":\"Rechercher un contact\",\"listEmptyMessage\":\"Aucun contact trouvé\",\"addContactLabel\":\"Créer un contact\",\"cancel\":\"Annuler\",\"imported\":\"Compte synchronisé\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Mettre à jour\"},\"error\":\"Une erreur est survenue.\",\"frequency\":{\"label\":\"Fréquence :\",\"hourly\":\"Une fois par heure\",\"daily\":\"Journalier\",\"weekly\":\"Hebdomadaire\",\"monthly\":\"Mensuel\",\"undefined\":\"Manuellement\"},\"lastSync\":{\"label\":\"Mise à jour :\",\"syncing\":\"En cours...\",\"unknown\":\"Indéterminée\",\"format\":\"Le D MMMM YYYY [à] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Vos documents\",\"description\":\"Ce service récupère vos derniers documents et en sauvegarde l'historique complet à votre place.\",\"button\":\"Ouvrir les documents\",\"install\":\"Découvrir Cozy Drive\"},\"contacts\":{\"title\":\"Vos contacts\",\"description\":\"Ce service synchronise l'ensemble de vos contacts à votre place.\",\"button\":\"Accéder aux contacts\",\"install\":\"Découvrir Cozy Contacts\"},\"banks\":{\"title\":\"Vos données bancaires\",\"description\":\"Ce service récupère vos dernières lignes bancaires et en sauvegarde l'historique complet à votre place.\",\"button\":\"Accéder aux comptes bancaires\",\"install\":\"Découvrir Cozy Banks\"},\"coachco2\":{\"title\":\"Applications pour aller plus loin\",\"description\":\"Les applications suivantes proposent d'utiliser ces données en toute confidentialité au sein de votre Cozy\",\"button\":\"Coach CO2\",\"install\":\"Découvrir Coach CO2\"}},\"websiteLink\":{\"title\":\"Informations utiles\",\"description\":\"Site du service\"}},\"default\":{\"dateFormat\":\"DD/MM/YYYY\",\"baseDir\":\"/Administratif\"},\"error\":{\"application-not-found\":\"Cette application n'existe pas\",\"reconnect-via-form\":\"Se reconnecter\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Espace Disque plein\",\"description\":\"Actuellement, le service ne peut plus récupérer vos documents.\\nLibérez de l'espace en supprimant des fichiers ou rendez-vous dans **Paramètres > Stockage** pour augmenter votre espace de stockage.\"},\"CHALLENGE_ASKED\":{\"title\":\"Second facteur d’authentification demandé\",\"description\":\"Le site demande une authentification forte à deux facteurs. Vous devez relancer le connecteur manuellement pour vous authentifier et continuer à récupérer vos données.\"},\"OAUTH_CANCELED\":{\"title\":\"Annulé\",\"description\":\"Nous n'avons pas pu ajouter votre banque car vous avez annulé la connexion. Cliquez sur \\\"Ajouter votre banque\\\" encore une fois pour faire un nouvel essai.\"},\"LOGIN_FAILED\":{\"title\":\"Identifiants erronés ou expirés\",\"description\":\"Votre identifiant et/ou mot de passe ne semblent pas corrects. Merci de les vérifier sur le site [%{name}](%{link}) avant de réessayer.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Information additionnelle requise\",\"description\":\"Un champ additionnel doit être rempli pour vérifier vos identifiants.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Temporairement bloqué\",\"description\":\"Trop de tentatives erronées ont eu lieu. Merci de modifier votre mot de passe sur le site [%{name}](%{link}) et de mettre à jour le connecteur ensuite.\"},\"MAINTENANCE\":{\"title\":\"Site non disponible\",\"description\":\"Il semble que le site [%{name}](%{link}) soit indisponible. Merci de relancer ultérieurement ou de consulter notre aide en ligne.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Dossier de destination manquant\",\"description\":\"Il semble que le dossier de destination pour ce compte ait été supprimé. Merci de le restaurer en déconnectant ce compte puis en le reconnectant à nouveau.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Nouvelles CGUs à accepter\",\"description\":\"Il semblerait que %{name} ait mis à jour ses Conditions Générales d'Utilisation. Merci de vérifier que le service est à jour. Si l'erreur persiste, contacter nous via [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Erreur de Connexion\",\"description\":\"Une erreur inconnue est survenue. Vous pouvez essayer de mettre à jour vos données. Si le problème persiste, n'hésitez pas à nous contacter via [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Action nécessaire chez le fournisseur\",\"description\":\"Il semble que [%{name}](%{link}) ait besoin de revérifier votre connexion. Connectez-vous sur [%{name}](%{link}) puis cliquez sur \\\"Mettre à jour\\\" dans l'onglet données.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Renouvellement de l’authentification requis\",\"description\":\"Le service [%{name}](%{link}) demande d'autoriser à nouveau votre accès. Merci de déconnecter puis reconnecter votre compte %{name} sur cette application. Aucune donnée ne sera perdue.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Compte client non accessible\",\"description\":\"Il semble que votre compte ne soit plus actif. Merci de vérifier son statut sur le site [%{name}](%{link}) avant de réessayer.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Renouvellement de mot de passe demandé\",\"description\":\"Il semble que le site [%{name}](%{link}) ait besoin que vous vous y authentifiiez pour renouveler votre mot de passe. Merci de relancer le connecteur une fois cette action effectuée.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"Validation des nouvelles permissions nécessaire\",\"description\":\"Votre connecteur a été mis à jour et les permissions nécessaires ont changé. Merci de valider les nouvelles permissions avant de relancer le connecteur.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Renouvellement d'authentification demandé\",\"description\":\"Il semble que %{name} ait besoin de revérifier votre connexion afin d'autoriser une nouvelle synchronisation de vos comptes. Merci de relancer le connecteur, cela déclenchera la demande auprès de votre banque. Vous recevrez un code à usage unique ou une demande sur l'espace client ou l'application de votre banque.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Renouvellement de l’authentification demandé\",\"description\":\"La dernière connexion au service a échoué; merci de la relancer.\\nIl vous faudra peut-être renseigner un code de validation.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Authentification sur le site web demandée\",\"description\":\"Il semble que [%{name}](%{link}) ait besoin que vous vous authentifiiez à leur site web pour que la synchronisation refonctionne. Merci de relancer le connecteur une fois cette action effectuée.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Le code fourni ne semble pas correct\",\"description\":\"Le second facteur d’authentification fourni est incorrect, veuillez recommencer.\"},\"VENDOR_DOWN\":{\"title\":\"Service non disponible\",\"description\":\"Il semble que le service [%{name}](%{link}) ne nous ait pas répondu dans les temps. Vous pouvez tenter de le relancer manuellement maintenant ou ultérieurement.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Site non disponible\",\"description\":\"L'accès à l'espace client de [%{name}](%{link}) est actuellement indisponible, veuillez vous reconnecter plus tard\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Service non disponible\",\"description\":\"Il semble que le service [%{name}](%{link}) ne nous ait pas répondu dans les temps. Vous pouvez tenter de le relancer manuellement maintenant ou ultérieurement.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"Ce compte est déjà configuré\",\"description\":\"Votre éventuelle modification de la liste des comptes synchronisés sera prise en compte sous quelques minutes.\"}}},\"fields\":{\"answer\":{\"label\":\"Réponse secrète\"},\"birthdate\":{\"label\":\"Date de naissance\",\"placeholder\":\"jj/mm/aaaa\"},\"code\":{\"label\":\"Code confidentiel\"},\"date\":{\"label\":\"Date\",\"placeholder\":\"jj/mm/aaaa\"},\"email\":{\"label\":\"Adresse e-mail\"},\"firstname\":{\"label\":\"Prénom\"},\"lastname\":{\"label\":\"Nom de famille\"},\"login\":{\"label\":\"Identifiant\"},\"password\":{\"label\":\"Mot de passe\"},\"phone\":{\"label\":\"Numéro de téléphone\"},\"two_fa_code\":{\"label\":\"Second facteur d’authentification\"}},\"folder\":{\"administrative\":\"Administratif\",\"photos\":\"Photos\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"Une mise à jour est disponible pour ce service.\",\"body\":{\"regular\":\"Effectuez la mise à jour pour continuer à récupérer vos données et profiter des dernières fonctionnalités.\",\"blocking\":\"Mettez-le à jour pour continuer à récupérer vos données.\"},\"button\":{\"label\":\"Voir la mise à jour\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Jeton d'accès\"},\"accessTokenSecret\":{\"label\":\"Jeton d'accès secret\"},\"accountName\":{\"label\":\"Nom du compte\"},\"agreement\":{\"label\":\"J'accepte\"},\"apikey\":{\"label\":\"Clé d'API\"},\"appKey\":{\"label\":\"Clé d'application\"},\"appSecret\":{\"label\":\"Secret d'application\"},\"authCode\":{\"label\":\"Code Auth\"},\"bank_identifier\":{\"label\":\"Identifiant Banque (optionnel)\"},\"branchName\":{\"label\":\"Agence\"},\"cardNumber\":{\"label\":\"Numéro de carte\"},\"consumerKey\":{\"label\":\"Clé client\"},\"consumerSecret\":{\"label\":\"Secret client\"},\"dob\":{\"label\":\"Date de naissance\"},\"folderPath\":{\"label\":\"Chemin du dossier\"},\"identifier\":{\"label\":\"Identifiant\"},\"loginUrl\":{\"label\":\"URL du login\"},\"namePath\":{\"label\":\"Nom du dossier\"},\"new_identifier\":{\"label\":\"Identifiant\"},\"phoneNumber\":{\"label\":\"Numéro de téléphone\"},\"profileName\":{\"label\":\"Nom du profil\"},\"refreshToken\":{\"label\":\"Jeton de rafraîchissement\"},\"secret\":{\"label\":\"Mot de passe\"},\"timeout\":{\"label\":\"Délai (ms)\"},\"token\":{\"label\":\"Jeton\"},\"tricountUrl\":{\"label\":\"URL de Tricount\"}}},\"modal\":{\"aria-label\":\"Configuration du connecteur\",\"konnector\":{\"error\":{\"title\":\"Impossible de récupérer le compte\",\"description\":\"Le compte n'a pas pu être récupéré (%{message})\",\"button\":\"Fermer\"}},\"accounts\":{\"title\":\"Sélectionner un compte %{name} \",\"error\":{\"title\":\"Erreur\",\"description\":\"Impossible de charger vos comptes\",\"retry\":\"Réessayer\"}},\"tabs\":{\"data\":\"Données\",\"configuration\":\"Configuration\"},\"addAccount\":{\"title\":\"Connexion à %{name}\",\"button\":\"Ajouter un compte\"},\"deleteAccount\":{\"title\":\"Déconnexion\",\"description\":\"Vous serez déconnecté de ce compte, mais les données déjà importées seront conservées.\",\"confirm\":\"Déconnecter\",\"cancel\":\"Annuler\"},\"updateAccount\":{\"general-subheader\":\"Général\",\"identifiers\":\"Identifiants\",\"delete-account-success\":\"Le compte a été déconnecté\",\"delete-account-error\":\"Le compte n'a pas pu être déconnecté, merci de réessayer plus tard, ou contactez notre support.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Ajouter votre banque\"},\"reconnect\":{\"label\":\"Se reconnecter\"}},\"reconnect\":{\"label\":\"Se reconnecter\"},\"connect\":{\"label\":\"Ajouter un compte\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Fermer\"},\"description\":\"Vos données existantes seront disponibles dans quelques minutes et les prochaines suivront automatiquement.\",\"figure\":{\"alt\":\"Connecté\"},\"title\":\"Configuration réussie !\"},\"twoFAForm\":{\"modal-label\":\"Formulaire d'authentification à deux facteurs\",\"providers\":{\"default\":\"Saisissez le code qui vous a été envoyé par e-mail ou SMS.\",\"email\":\"Saisissez le code qui vous a été envoyé par e-mail.\",\"sms\":\"Saisissez le code qui vous a été envoyé par SMS.\",\"app_code\":\"Entrez un code à usage unique à générer depuis l'application mobile %{name}.\",\"app\":\"Utilisez l'application de votre service pour continuer à vous connecter\"},\"desc-2fa\":\" Vous devez ouvrir l'application de votre banque pour confirmer votre identité. Dans certains cas, vous devrez valider deux fois la demande.\",\"desc_1\":\"Ce code reçu sur votre mobile ou par email vous permet de valider votre connexion.\",\"desc_2\":\"Ce second code reçu sur votre mobile ou par email vous permet de finaliser votre connexion.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Second code\"},\"retry\":\"Code invalide, veuillez le ressaisir.\",\"CTA\":\"Valider\"},\"account\":{\"success\":{\"title\":\"Configuration réussie !\",\"connect\":\"Vos données existantes seront disponibles dans quelques minutes et les prochaines suivront automatiquement.\",\"banksLinkText\":\"Voir mes comptes dans %{appName}\",\"driveLinkText\":\"Ouvrir le dossier dans %{appName}\",\"button\":\"Fermer\"}},\"maintenance\":{\"noService\":\"Service interrompu\",\"explanationTitle\":\"Que se passe-t-il ?\"},\"suggestions\":{\"title\":\"Importer mes données %{name}\",\"data\":\"Installer %{name} importera automatiquement les données suivantes :\",\"why\":\"Pourquoi %{name} m’est proposé ?\",\"reason_bank\":\"%{name} a été détecté à partir de vos dépenses bancaires. Pas d’inquiétude, personne à part vous ne peut avoir accès à cette information.\",\"install\":\"Installer\",\"silence\":\"Ne plus me proposer\"},\"dataType\":{\"none\":\"%{name} n'accèdera à aucune de vos données personnelles.\",\"activity\":\"Vos activités\",\"appointment\":\"Vos rendez-vous\",\"bankTransactions\":\"Vos mouvements bancaires\",\"bankAccounts\":\"Vos comptes bancaires\",\"bill\":\"Vos factures\",\"bloodPressure\":\"Votre pression artérielle\",\"calendar\":\"Vos calendriers\",\"certificate\":\"Vos attestations\",\"commit\":\"Vos commits\",\"consumption\":\"Votre consommation\",\"contact\":\"Vos contacts\",\"contract\":\"Vos contrats\",\"courseMaterial\":\"Vos supports de cours\",\"document\":\"Vos documents\",\"event\":\"Vos évènements\",\"family\":\"Informations sur votre foyer\",\"geopoint\":\"Vos géolocalisations\",\"heartbeat\":\"Votre rythme cardiaque\",\"home\":\"Informations sur votre domicile\",\"phonecommunicationlog\":\"Votre journal d'appels\",\"picture\":\"Vos images\",\"podcast\":\"Vos podcasts\",\"profile\":\"Votre profil client\",\"refund\":\"Vos remboursements\",\"sinister\":\"Vos sinistres\",\"sleepTime\":\"Votre temps de sommeil\",\"stepsNumber\":\"Vos nombres de pas\",\"temperature\":\"Vos données de température\",\"travelDate\":\"Vos séjours et voyages\",\"tweet\":\"Vos tweets\",\"videostream\":\"Vos vidéos\",\"weight\":\"Votre poids\"},\"vaultCiphersList\":{\"title\":\"Depuis quel compte souhaitez vous importer vos données ?\",\"otherAccount\":\"Depuis un autre compte…\"},\"triggerManager\":{\"connecting\":\"Connexion du compte…\",\"confirmationModal\":{\"title\":\"Mettre à jour les identifiants ?\",\"description\":\"Vos identifiants précédents seront perdus. Ajoutez un nouveau compte pour les conserver.\",\"primaryText\":\"Mettre à jour\",\"secondaryText\":\"Annuler\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"Vous avez déconnecté votre compte. Vous conservez l'historique de vos données déjà importées. Si vous souhaitez reprendre la connexion, reconfigurez votre compte depuis le bouton \\\"Ajouter une banque\\\".\"},\"konnectorBlock\":{\"account\":\"Compte client\",\"disconnected\":\"Déconnecté\",\"inMaintenance\":\"En maintenance\",\"hasNewVersionAvailable\":\"Nouvelle version disponible\",\"fatalError\":\"Une erreur est survenue à la récupération du service. Si ce problème persiste, n'hésitez pas à nous contacter à [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Derniers trajets\",\"caption\":\"Visualisez vos 5 trajets les plus récents récupérés sur %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Avion\",\"BICYCLING\":\"Vélo\",\"CAR\":\"Voiture\",\"SUBWAY\":\"Métro\",\"TRAIN\":\"Train\",\"UNKNOWN\":\"\",\"WALKING\":\"Marche\"}},\"files\":{\"title\":\"Vos documents\",\"imported\":\"Importé le %{date}\",\"caption\":\"Ce service récupère vos derniers documents et garde une sauvegarde complète pour vous.\"}}}"); +Application.doctype = APP_DOCTYPE -/***/ }), -/* 947 */ -/***/ (function(module) { +module.exports = Application -module.exports = JSON.parse("{\"close\":\"Sluiten\",\"back\":\"Ga terug\",\"badges\":{\"warning\":\"Waarschuwing\"},\"accountForm\":{\"submit\":{\"label\":\"Koppelen\"},\"fields\":{\"optional\":\"(optioneel)\"},\"password\":{\"show\":\"Tonen\",\"hide\":\"Verbergen\"},\"disconnect\":{\"button\":\"Rekening loskoppelen\"},\"installFlagship\":{\"label\":\"Installeer Cozy op je telefoon\"},\"notClientSide\":\"%{name} maakt gebruik van een hagelnieuw efficiënt systeem om gegevens op te vragen op je Cozy. Deze action is alleen te gebruiken via de Cozy-smartphone-app.\"},\"contracts\":{\"headers\":{\"bankAccounts\":\"Bankrekeningen\",\"default\":\"Contracten\"},\"deleted\":\"Verwijderd\",\"no-contracts\":\"Er zijn geen contracten meer\",\"handle-synchronization\":\"Synchronisaties beheren\",\"desynchronized\":{\"message\":\"je hebt de synchroniastie met dit account stopgezet op %{date}\",\"dateFormat\":\"DD-MM-YYYY\"}},\"contractForm\":{\"details\":\"Details\",\"sharing\":\"Delen\",\"back-to-accounts\":\"Terug naar rekeningen\",\"update\":\"Bijwerken\",\"delete\":\"Standaardwaarden\",\"deleting\":\"Bezig met herstellen…\",\"confirm-deletion\":{\"description\":\"Hiermee worden tevens je transacties en rekeningkoppelingen verwijderd. Als je je bankgegevens niet opnieuw wilt importeren tijdens de volgende geplande synchronisatie, verwijder dan de koppeling.\",\"confirm\":\"Rekeningverwijdering bevestigen\",\"title\":\"Weet je het zeker?\"},\"deletion_error\":\"Er is een fout opgetreden tijdens het verwijderen van de groep.\",\"label\":\"Label\",\"owner\":\"Eigenaar\",\"addOwnerBtn\":\"Eigenaar toevoegen\",\"removeOwnerBtn\":\"Eigenaar verwijderen\",\"ownerPlaceholder\":\"Kies een eigenaar\",\"bank\":\"Bank\",\"number\":\"Nummer\",\"type\":\"Soort\",\"apply\":\"Toepassen\",\"success\":\"De rekening is bijgewerkt\",\"failure\":\"Fout tijdens bijwerken van rekening\",\"removeAccountBtn\":\"Rekening verwijderen\",\"listPlaceholder\":\"Zoeken naar contactpersoon\",\"listEmptyMessage\":\"Geen contactpersoon gevonden\",\"addContactLabel\":\"Contactpersoon toevoegen\",\"cancel\":\"Annuleren\",\"imported\":\"Gesynchroniseerd account\"},\"card\":{\"launchTrigger\":{\"button\":{\"label\":\"Opnieuw uitvoeren\"},\"error\":\"Er is een fout opgetreden.\",\"frequency\":{\"label\":\"Frequentie:\",\"hourly\":\"Elk uur\",\"daily\":\"Elke dag\",\"weekly\":\"Elke week\",\"monthly\":\"Elke maand\",\"undefined\":\"Handmatig\"},\"lastSync\":{\"label\":\"Bijwerken:\",\"syncing\":\"Bezig met uitvoeren…\",\"unknown\":\"Onbekend\",\"format\":\"D MMMM YYYY [om] HH[:]mm\"}},\"appLink\":{\"drive\":{\"title\":\"Mijn documenten\",\"description\":\"Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van.\",\"button\":\"Documenten openen\",\"install\":\"Ontdek Cozy Schijf\"},\"contacts\":{\"title\":\"Mijn contactpersonen\",\"description\":\"Deze dienst synchroniseert al je contactpersonen.\",\"button\":\"Contactpersonen tonen\",\"install\":\"Ontdek Cozy Contactpersonen\"},\"banks\":{\"title\":\"Mijn bankgegevens\",\"description\":\"Deze dienst haalt al je bankgegevens op en maakt er een handig overzicht van.\",\"button\":\"Bankrekeningen tonen\",\"install\":\"Ontdek Cozy Banken\"},\"coachco2\":{\"title\":\"Apps die verdergaan\",\"description\":\"De volgende apps maken gebruik van je anonieme Cozy-gegevens.\",\"button\":\"Coach CO2\",\"install\":\"Ontdek CoachCO2\"}},\"websiteLink\":{\"title\":\"Nuttige informatie\",\"description\":\"Website van dienst\"}},\"default\":{\"dateFormat\":\"DD-MM-YYYY\",\"baseDir\":\"/Administratief\"},\"error\":{\"reconnect-via-form\":\"Opnieuw koppelen\",\"job\":{\"DISK_QUOTA_EXCEEDED\":{\"title\":\"Geen vrije ruimte meer\",\"description\":\"De dienst kan je documenten momenteel niet ophalen. Verwijder enkele bestanden of ga naar **Instellingen --> Opslag** om meer vrije ruimte te verkrijgen.\"},\"CHALLENGE_ASKED\":{\"title\":\"Tweede stap vereist\",\"description\":\"Deze website vereist een tweede authenticatiemethode. Doorloop het proces opnieuw om de code op te geven en je gegevens op te halen.\"},\"OAUTH_CANCELED\":{\"title\":\"Afgebroken\",\"description\":\"Je bank kan niet worden toegevoegd omdat je de koppeling hebt afgebroken. Klik op ‘Bank toevoegen’ op het opnieuw te proberen.\"},\"LOGIN_FAILED\":{\"title\":\"Onjuiste of verouderde inloggegevens\",\"description\":\"Je inloggegevens zijn onjuist of verlopen. Controleer je inloggegevens op [%{name}](%{link}) voordat je ze bijwerkt.\"},\"LOGIN_FAILED.NEEDS_SECRET\":{\"title\":\"Aanvullende informatie benodigd\",\"description\":\"Er is een aanvullende stap gevraagd om de dienst te koppelen. Doorloop het proces opnieuw om de gevraagde gegevens in te voeren.\"},\"LOGIN_FAILED.TOO_MANY_ATTEMPTS\":{\"title\":\"Tijdelijk geblokkeerd\",\"description\":\"Te veel pogingen. Werk je gegevens bij op [%{name}](%{link}) en werk de connector later bij.\"},\"MAINTENANCE\":{\"title\":\"Website is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is of de verbinding moet worden bijgewerkt. Doorloop het proces later opnieuw of bekijk onze online-hulp.\"},\"NOT_EXISTING_DIRECTORY\":{\"title\":\"Bestemming ontbreekt\",\"description\":\"Het lijkt er op dat de map niet aanwezig is op de bestemming. Herstel deze door je account opnieuw te koppelen.\"},\"TERMS_VERSION_MISMATCH\":{\"title\":\"Recentste algemene voorwaarden niet geaccepteerd\",\"description\":\"Het lijkt er op dat %{name} haar algemene voorwaarden heeft bijgewerkt. Controleer of de dienst is bijgewerkt. Als de fout blijft optreden, neem dan contact met ons op via [%{supportMail}](mailto:%{supportMail}).\"},\"UNKNOWN_ERROR\":{\"title\":\"Verbindingsfout\",\"description\":\"Er is een onbekende fout opgetreden. Probeer of het helpt om je gegevens bij te werken. Als dat niet helpt, neem dan contact met ons op via [%{supportMail}](mailto:%{supportMail}).\"},\"USER_ACTION_NEEDED\":{\"title\":\"Actie benodigd op website van dienst\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt en een specifieke actie uitvoert. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.OAUTH_OUTDATED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"[%{name}](%{link}) vereist dat je de toegang opnieuw goedkeurt. Koppel je account '%{name}' opnieuw - er gaan geen gegevens verloren.\"},\"USER_ACTION_NEEDED.ACCOUNT_REMOVED\":{\"title\":\"Account is niet beschikbaar\",\"description\":\"Het lijkt er op dat je account niet meer beschikbaar is. Controleer je account op [%{name}](%{link}) voordat je het opnieuw probeert.\"},\"USER_ACTION_NEEDED.CHANGE_PASSWORD\":{\"title\":\"Wachtwoord moet worden bijgewerkt\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je wachtwoord moet worden bijgewerkt. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.PERMISSIONS_CHANGED\":{\"title\":\"Nieuwe machtigingen benodigd\",\"description\":\"De connector is bijgewerkt en heeft nieuwe machtigingen nodig. Keur deze goed en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.SCA_REQUIRED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt om te kunnen synchroniseren. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.TWOFA_EXPIRED\":{\"title\":\"Nieuwe goedkeuring vereist\",\"description\":\"De recentste verbindingspoging is mislukt. Probeer het opnieuw en geef desgewenst een goedkeuringscode op.\"},\"USER_ACTION_NEEDED.WEBAUTH_REQUIRED\":{\"title\":\"Goedkeuring op website van dienst vereist\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) vereist dat je inlogt om te kunnen synchroniseren. Verhelp het probleem en doorloop het proces opnieuw.\"},\"USER_ACTION_NEEDED.WRONG_TWOFA_CODE\":{\"title\":\"Onjuiste authenticatiecode\",\"description\":\"De opgegeven authenticatiecode is onjuist. Probeer het opnieuw.\"},\"VENDOR_DOWN\":{\"title\":\"Dienst is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is. Doorloop het proces later opnieuw.\"},\"VENDOR_DOWN.BANK_DOWN\":{\"title\":\"Banksite is niet beschikbaar\",\"description\":\"Het lijkt er op dat [%{name}](%{link}) niet beschikbaar is. Doorloop het proces later opnieuw.\"},\"VENDOR_DOWN.LINXO_DOWN\":{\"title\":\"Dienst is niet beschikbaar\",\"description\":\"Het lijkt er op dat de bankconnectors overbelast zijn. Doorloop het proces later opnieuw.\"},\"ACCOUNT_WITH_SAME_IDENTIFIER_ALREADY_DEFINED\":{\"title\":\"Dit account is al toegevoegd\",\"description\":\"Je hebt al een account met deze identificaties ingesteld.\"}}},\"fields\":{\"answer\":{\"label\":\"Geheim antwoord\"},\"birthdate\":{\"label\":\"Geboortedatum\",\"placeholder\":\"dd-mm-yyyy\"},\"code\":{\"label\":\"Geheime code\"},\"date\":{\"label\":\"Datum\",\"placeholder\":\"dd-mm-yyyy\"},\"email\":{\"label\":\"E-mailadres\"},\"firstname\":{\"label\":\"Voornaam\"},\"lastname\":{\"label\":\"Achternaam\"},\"login\":{\"label\":\"Gebruikersnaam\"},\"password\":{\"label\":\"Wachtwoord\"},\"phone\":{\"label\":\"Telefoonnummer\"},\"two_fa_code\":{\"label\":\"Authenticatiecode\"}},\"folder\":{\"administrative\":\"Administratief\",\"photos\":\"Foto's\"},\"infos\":{\"konnectorUpdate\":{\"title\":\"Er is een update beschikbaar voor deze dienst.\",\"body\":{\"regular\":\"Voer de update uit om je gegevens op te kunnen blijven halen en over de nieuwste functies te beschikken:\",\"blocking\":\"Voer de update uit om je gegevens op te kunnen blijven halen:\"},\"button\":{\"label\":\"Update bekijken\"}}},\"legacy\":{\"fields\":{\"access_token\":{\"label\":\"Toegangssleutel\"},\"accessTokenSecret\":{\"label\":\"Toegangssleutelgeheim\"},\"accountName\":{\"label\":\"Accountnaam\"},\"agreement\":{\"label\":\"Ik ga akkoord\"},\"apikey\":{\"label\":\"API-sleutel\"},\"appKey\":{\"label\":\"Appsleutel\"},\"appSecret\":{\"label\":\"Appgeheim\"},\"authCode\":{\"label\":\"Auth.code\"},\"bank_identifier\":{\"label\":\"Bankidentificatie (optioneel)\"},\"branchName\":{\"label\":\"Filiaal\"},\"cardNumber\":{\"label\":\"Kaartnummer\"},\"consumerKey\":{\"label\":\"Klantsleutel\"},\"consumerSecret\":{\"label\":\"Klantgeheim\"},\"dob\":{\"label\":\"Geboortedatum\"},\"folderPath\":{\"label\":\"Mappad\"},\"identifier\":{\"label\":\"Identificatie\"},\"loginUrl\":{\"label\":\"Inlog-url\"},\"namePath\":{\"label\":\"Mapnaam\"},\"new_identifier\":{\"label\":\"Identificatie\"},\"phoneNumber\":{\"label\":\"Telefoonnummer\"},\"profileName\":{\"label\":\"Profielnaam\"},\"refreshToken\":{\"label\":\"Toegangssleutel vernieuwen\"},\"secret\":{\"label\":\"Wachtwoord\"},\"timeout\":{\"label\":\"Vertraging (in ms)\"},\"token\":{\"label\":\"Toegangssleutel\"},\"tricountUrl\":{\"label\":\"Tricount-url\"}}},\"modal\":{\"aria-label\":\"Connector instellen\",\"konnector\":{\"error\":{\"title\":\"Je account kan niet worden opgehaald\",\"description\":\"Je account kan niet worden opgehaald (%{message}).\",\"button\":\"Sluiten\"}},\"accounts\":{\"title\":\"Kies een %{name}-account\",\"error\":{\"title\":\"Fout\",\"description\":\"Je account(s) kan/kunnen niet worden opgehaald\",\"retry\":\"Opnieuw proberen\"}},\"tabs\":{\"data\":\"Gegevens\",\"configuration\":\"Instellen\"},\"addAccount\":{\"title\":\"%{name} koppelen\",\"button\":\"Account toevoegen\"},\"deleteAccount\":{\"title\":\"Loskoppelen\",\"description\":\"Je account wordt losgekoppeld, maar belangrijke gegevens worden bewaard\",\"confirm\":\"Loskoppelen\",\"cancel\":\"Annuleren\"},\"updateAccount\":{\"general-subheader\":\"Algemeen\",\"identifiers\":\"Identificaties\",\"delete-account-success\":\"Het account is losgekoppeld\",\"delete-account-error\":\"Het account kan niet worden losgekoppeld. Probeer het later opnieuw of neem contact op met ons ondersteuningsteam.\"}},\"oauth\":{\"banking\":{\"connect\":{\"label\":\"Bank toevoegen\"},\"reconnect\":{\"label\":\"Opnieuw koppelen\"}},\"reconnect\":{\"label\":\"Opnieuw koppelen\"},\"connect\":{\"label\":\"Koppelen\"},\"window\":{\"title\":\"OAuth\"}},\"triggerSuccessMessage\":{\"button\":{\"label\":\"Sluiten\"},\"description\":\"Je gegevens zijn over een paar minuten beschikbaar op je Cozy en worden voortaan automatisch bijgewerkt.\",\"figure\":{\"alt\":\"gekoppeld\"},\"title\":\"Instellen voltooid!\"},\"twoFAForm\":{\"modal-label\":\"Authenticatie in twee stappen\",\"providers\":{\"default\":\"Voer de code in die je per e-mail of sms hebt ontvangen\",\"email\":\"Voer de code in die je per e-mail hebt ontvangen\",\"sms\":\"Voer de code in die je per sms hebt ontvangen\",\"app_code\":\"Voer de eenmalige code in die je kunt aanmaken in ${name}\",\"app\":\"Open de app van de dienst om de koppeling goed te keuren.\"},\"desc-2fa\":\"Open de app van de dienst om de koppeling goed te keuren. In sommige gevallen moet je twee keer toestemming geven.\",\"desc_1\":\"Met deze code kun je de koppeling bevestigen.\",\"desc_2\":\"De tweede code, om de koppeling te bevestigen, ontvang je op je telefoon of per e-mail.\",\"code\":{\"label_1\":\"code\",\"label_2\":\"Tweede code\"},\"retry\":\"Ongeldige code - probeer het opnieuw.\",\"CTA\":\"Verifiëren\"},\"account\":{\"success\":{\"title\":\"Instellen voltooid!\",\"connect\":\"Je gegevens zijn over een paar minuten beschikbaar op je Cozy en worden voortaan automatisch bijgewerkt.\",\"banksLinkText\":\"Accounts bekijken in %{appName}\",\"driveLinkText\":\"Map openen in Cozy Schijf\",\"button\":\"Sluiten\"}},\"maintenance\":{\"noService\":\"Dienst is onderbroken\",\"explanationTitle\":\"Wat gebeurt er allemaal?\"},\"suggestions\":{\"title\":\"Gegevens importeren uit %{name}\",\"data\":\"Door %{name} te installeren worden de volgende gegevens automatisch geïmporteerd:\",\"why\":\"Waarom is %{name} aanbevolen?\",\"reason_bank\":\"%{name} is aangetroffen in één van je bankoverschrijvingen. Geen zorgen: niemand anders heeft toegang tot deze informatie.\",\"install\":\"Installeren\",\"silence\":\"Niet meer aanbevelen\"},\"dataType\":{\"none\":\"%{name} heeft geen toegang tot je persoonlijke gegevens\",\"activity\":\"Mijn activiteiten\",\"appointment\":\"Mijn afspraken\",\"bankTransactions\":\"Mijn bankoverschrijvingen\",\"bankAccounts\":\"Mijn bankrekeningen\",\"bill\":\"Mijn rekeningen\",\"bloodPressure\":\"Mijn bloeddruk\",\"calendar\":\"Mijn agenda's\",\"certificate\":\"Mijn certificaten\",\"commit\":\"Mijn commits\",\"consumption\":\"Mijn consumpties\",\"contact\":\"Mijn contactpersonen\",\"contract\":\"Mijn contracten\",\"courseMaterial\":\"Mijn cursusmateriaal\",\"document\":\"Mijn documenten\",\"event\":\"Mijn gebeurtenissen\",\"family\":\"Mijn gezinsinformatie\",\"geopoint\":\"Mijn geolocaties\",\"heartbeat\":\"Mijn hartslagen\",\"home\":\"Mijn woninginformatie\",\"phonecommunicationlog\":\"Mijn oproepgeschiedenis\",\"picture\":\"Mijn afbeeldingen\",\"podcast\":\"Mijn podcasts\",\"profile\":\"Mijn klantprofiel\",\"refund\":\"Mijn terugbetalingen\",\"sinister\":\"Mijn sinisters\",\"sleepTime\":\"Mijn slaaptijd\",\"stepsNumber\":\"Mijn wandelstappen\",\"temperature\":\"Mijn temperatuurgegevens\",\"travelDate\":\"Mijn reisdatums\",\"tweet\":\"Mijn tweets\",\"videostream\":\"Mijn video's\",\"weight\":\"Mijn gewicht\"},\"vaultCiphersList\":{\"title\":\"Vanuit welk account wil je je gegevens importeren?\",\"otherAccount\":\"Uit ander account…\"},\"triggerManager\":{\"connecting\":\"Bezig met koppelen…\",\"confirmationModal\":{\"title\":\"Inloggegevens bijwerken?\",\"description\":\"Je vorige inloggegevens worden gewist - voeg een nieuw account toe om ze te bewaren.\",\"primaryText\":\"Bijwerken\",\"secondaryText\":\"Annuleren\"}},\"disconnectedAccountModal\":{\"disconnected-help\":\"Dit account is losgekoppeld, maar je gegevens zijn bewaard. Als je opnieuw wilt synchroniseren, stel dan je account opnieuw in middels de knop 'Bank toevoegen'.\"},\"konnectorBlock\":{\"account\":\"Klantaccount\",\"disconnected\":\"Losgekoppeld\",\"inMaintenance\":\"Onderhoudswerkzaamheden\",\"hasNewVersionAvailable\":\"Nieuwe versie beschikbaar\",\"fatalError\":\"Er is een fout opgetreden bij het herstellen van de dienst. Als het probleem zich blijft voordoen, neem dan contact met ons op via [%{name}](%{link})\"},\"datacards\":{\"trips\":{\"title\":\"Recente reizen\",\"caption\":\"Bekijk je 5 recentste reizen van %{konnectorName}\",\"modes\":{\"AIR_OR_HSR\":\"Vliegtuig\",\"BICYCLING\":\"Fiets\",\"CAR\":\"Auto\",\"SUBWAY\":\"Metro\",\"TRAIN\":\"Trein\",\"UNKNOWN\":\"\",\"WALKING\":\"Wandelen\"}},\"files\":{\"title\":\"Mijn documenten\",\"imported\":\"Geïmporteerd op %{date}\",\"caption\":\"Deze dienst haalt je recentste documenten op en maakt er een volledige back-up van.\"}}}"); /***/ }), -/* 948 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TWOFA_PROVIDERS", function() { return TWOFA_PROVIDERS; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TWOFA_USER_INPUT", function() { return TWOFA_USER_INPUT; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTwoFANeeded", function() { return isTwoFANeeded; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isTwoFARetry", function() { return isTwoFARetry; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLoginSuccessHandled", function() { return isLoginSuccessHandled; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLoginSuccess", function() { return isLoginSuccess; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTwoFACodeProvider", function() { return getTwoFACodeProvider; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateTwoFAState", function() { return updateTwoFAState; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLabel", function() { return getLabel; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "build", function() { return build; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAuth", function() { return mergeAuth; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getVaultCipherId", function() { return getVaultCipherId; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setVaultCipherRelationship", function() { return setVaultCipherRelationship; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateTwoFaCode", function() { return updateTwoFaCode; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetState", function() { return resetState; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setSessionResetIfNecessary", function() { return setSessionResetIfNecessary; }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(162); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(295); -/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_merge__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var lodash_clone__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(949); -/* harmony import */ var lodash_clone__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_clone__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(950); -/* harmony import */ var _manifest__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(951); +/* 938 */ +/***/ (function(module, exports, __webpack_require__) { +const Document = __webpack_require__(909) +const BankAccount = __webpack_require__(939) -var _TWOFA_USER_INPUT; +class BalanceHistory extends Document { + static async getByYearAndAccount(year, accountId) { + const index = await Document.getIndex(this.doctype, this.idAttributes) + const options = { + selector: { year, 'relationships.account.data._id': accountId }, + limit: 1 + } + const [balance] = await Document.query(index, options) -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + if (balance) { + return balance + } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + return this.getEmptyDocument(year, accountId) + } + static getEmptyDocument(year, accountId) { + return { + year, + balances: {}, + metadata: { + version: this.version + }, + relationships: { + account: { + data: { + _id: accountId, + _type: BankAccount.doctype + } + } + } + } + } +} +BalanceHistory.doctype = 'io.cozy.bank.balancehistories' +BalanceHistory.idAttributes = ['year', 'relationships.account.data._id'] +BalanceHistory.version = 1 +BalanceHistory.checkedAttributes = ['balances'] +module.exports = BalanceHistory +/***/ }), +/* 939 */ +/***/ (function(module, exports, __webpack_require__) { -var DEFAULT_TWOFA_CODE_PROVIDER_TYPE = 'default'; -var TWOFA_PROVIDERS = { - EMAIL: 'email', - SMS: 'sms', - APP_CODE: 'app_code', - APP: 'app' -}; // For some 2FA modes, we do not need user input, this is for example the -// case for the "app" two fa where the user will open the website/app of the -// provider and click on a notification or a button. For those modes, we -// does not need to show an input field with a submit button. We only have -// to wait, the konnector should tell us when everything is OK. +const groupBy = __webpack_require__(386) +const get = __webpack_require__(162) +const merge = __webpack_require__(295) +const Document = __webpack_require__(909) +const matching = __webpack_require__(940) +const { getSlugFromInstitutionLabel } = __webpack_require__(942) +const log = __webpack_require__(917).namespace('BankAccount') -var TWOFA_USER_INPUT = (_TWOFA_USER_INPUT = { - default: true -}, _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.EMAIL, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.SMS, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.APP_CODE, true), _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(_TWOFA_USER_INPUT, TWOFA_PROVIDERS.APP, false), _TWOFA_USER_INPUT); -var TWOFA_NEEDED_STATUS = 'TWOFA_NEEDED'; -var TWOFA_NEEDED_RETRY_STATUS = 'TWOFA_NEEDED_RETRY'; -var RESET_SESSION_STATE = 'RESET_SESSION'; -var HANDLE_LOGIN_SUCCESS_STATE = 'HANDLE_LOGIN_SUCCESS'; -var LOGIN_SUCCESS_STATE = 'LOGIN_SUCCESS'; -/** - * Return a boolean to know if the account is in a two fa code needed - * status - * @param {String} status Account two FA Status - * @return {Boolean} - */ +class BankAccount extends Document { + /** + * Adds _id of existing accounts to fetched accounts + */ + static reconciliate(fetchedAccounts, localAccounts) { + const matchings = matching.matchAccounts(fetchedAccounts, localAccounts) + return matchings.map(matching => { + log( + 'info', + matching.match + ? `${matching.account.label} matched with ${matching.match.label} via ${matching.method}` + : `${matching.account.label} did not match with an existing account` + ) + return { + // eslint-disable-next-line node/no-unsupported-features/es-syntax + ...matching.account, + relationships: merge( + {}, + matching.match ? matching.match.relationships : null, + matching.account.relationships + ), + _id: matching.match ? matching.match._id : undefined + } + }) + } -var isTwoFANeeded = function isTwoFANeeded(status) { - if (!status) return false; - return status.split('.')[0] === TWOFA_NEEDED_STATUS; -}; -var isTwoFARetry = function isTwoFARetry(status) { - if (!status) return false; - return status.split('.')[0] === TWOFA_NEEDED_RETRY_STATUS; -}; -var isLoginSuccessHandled = function isLoginSuccessHandled(status) { - return status === HANDLE_LOGIN_SUCCESS_STATE; -}; -var isLoginSuccess = function isLoginSuccess(status) { - return status === LOGIN_SUCCESS_STATE; -}; -/** - * Return the status object key matching the status value - * @param {String} status Account document - * @return {String} Two FA Code providing type or default one if not known - */ + static findDuplicateAccountsWithNoOperations(accounts, operations) { + const opsByAccountId = groupBy(operations, op => op.account) -var getTwoFACodeProvider = function getTwoFACodeProvider(account) { - if (!account || !account.state) return DEFAULT_TWOFA_CODE_PROVIDER_TYPE; - var codeParts = account.state ? account.state.split('.') : []; + const duplicateAccountGroups = Object.entries( + groupBy(accounts, x => x.institutionLabel + ' > ' + x.label) + ) + .map(([, duplicateGroup]) => duplicateGroup) + .filter(duplicateGroup => duplicateGroup.length > 1) - if (codeParts.length > 1) { - return TWOFA_PROVIDERS[codeParts[1]] || DEFAULT_TWOFA_CODE_PROVIDER_TYPE; - } else { - return DEFAULT_TWOFA_CODE_PROVIDER_TYPE; + const res = [] + for (const duplicateAccounts of duplicateAccountGroups) { + for (const account of duplicateAccounts) { + const accountOperations = opsByAccountId[account._id] || [] + if (accountOperations.length === 0) { + res.push(account) + } + } + } + return res } -}; -var updateTwoFAState = function updateTwoFAState(account_, _ref) { - var retry = _ref.retry, - type = _ref.type; - var account = lodash_clone__WEBPACK_IMPORTED_MODULE_3___default()(account_); - var state = retry ? 'TWOFA_NEEDED_RETRY' : 'TWOFA_NEEDED'; - if (type === 'email') { - state += '.EMAIL'; - } else if (type === 'sms') { - state += '.SMS'; - } else if (type === 'app_code') { - state += '.APP_CODE'; - } else if (type === 'app') { - state += '.APP'; + static hasIncoherentCreatedByApp(account) { + const predictedSlug = getSlugFromInstitutionLabel(account.institutionLabel) + const createdByApp = + account.cozyMetadata && account.cozyMetadata.createdByApp + return Boolean( + predictedSlug && createdByApp && predictedSlug !== createdByApp + ) } - return lodash_merge__WEBPACK_IMPORTED_MODULE_2___default()(account, { - state: state, - twoFACode: null - }); -}; -/** - * Returns the label for the given account. - * This label is by default the value for the identifier field. - * If there is no value for this field, the label is the io.cozy.accounts - * document id. - * @param {Object} account io.cozy.accounts documents - * @return {string} The label associated to this account. - */ - -var getLabel = function getLabel(account) { - return lodash_get__WEBPACK_IMPORTED_MODULE_1___default()(account, "auth.".concat(account.identifier)) || account._id; -}; -/** - * Transforms AccountForm data to io.cozy.accounts document - * @param {object} konnector Konnector related to account - * @param {object} data Data from AccountForm - * @return {object} io.cozy.accounts attributes - */ - -var build = function build(konnector, authData) { - Object(_assert__WEBPACK_IMPORTED_MODULE_4__["default"])(konnector.slug, 'Cannot build an account when the konnector has no slug'); // We are not at the final target for io.cozy.accounts. - // For now we are just ensuring legacy + static getUpdatedAt(account) { + const vendorUpdatedAt = get(account, 'metadata.updatedAt') - return { - auth: authData, - account_type: konnector.slug, - identifier: _manifest__WEBPACK_IMPORTED_MODULE_5__["default"].getIdentifier(konnector.fields), - state: null - }; -}; -/** - * Merges existing io.cozy.accounts auth with Auth data from AccountForm - * @param {object} account io.cozy.accounts document - * @param {object} data Data from AccountForm - * @return {object} io.cozy.accounts attributes - */ + if (vendorUpdatedAt) { + return vendorUpdatedAt + } -var mergeAuth = function mergeAuth(account, authData) { - return _objectSpread(_objectSpread({}, account), {}, { - auth: lodash_merge__WEBPACK_IMPORTED_MODULE_2___default()({}, account.auth, authData) - }); -}; -/** - * Gets the vault cipher relationship to an account - * @param {object} account io.cozy.accounts document - * @return {string} cipher uuid - */ + const cozyUpdatedAt = get(account, 'cozyMetadata.updatedAt') -var getVaultCipherId = function getVaultCipherId(account) { - var relationshipData = lodash_get__WEBPACK_IMPORTED_MODULE_1___default()(account, 'relationships.vaultCipher.data'); + if (cozyUpdatedAt) { + return cozyUpdatedAt + } - if (!relationshipData) { - return; - } else if (Array.isArray(relationshipData)) { - // Support for bug from cipher migration. See link below for context. - // https://github.com/cozy/cozy-stack/pull/2535#discussion_r433986611 - return relationshipData[0]._id; - } else { - return relationshipData._id; + return null } -}; -/** - * Adds or updates a vault cipher relationship to an account - * @param {object} account io.cozy.accounts document - * @param {string} vaultCipherId The id of the cipher mathcing this account in the vault - * @return {object} io.cozy.accounts attributes - */ - -var setVaultCipherRelationship = function setVaultCipherRelationship(account, vaultCipherId) { - return _objectSpread(_objectSpread({}, account), {}, { - relationships: _objectSpread(_objectSpread({}, account.relationships), {}, { - vaultCipher: { - data: { - _id: vaultCipherId, - _type: 'com.bitwarden.ciphers', - _protocol: 'bitwarden' - } - } - }) - }); -}; -/** - * Update Two FA code from TwoFAForm into io.cozy.accounts document - * @param {object} account io.cozy.accounts document - * @param {object} code Code from TwoFAForm - * @return {object} io.cozy.accounts attributes - */ - -var updateTwoFaCode = function updateTwoFaCode(account, code) { - return _objectSpread(_objectSpread({}, resetState(account)), {}, { - twoFACode: code - }); -}; -/** - * Reset the account state - * @param {Object} account Account document - * @return {object} Changed account document - */ +} -var resetState = function resetState(account) { - return _objectSpread(_objectSpread({}, account), {}, { - state: null - }); -}; -/** - * Set a state to reset the konnector session into io.cozy.accounts document - * only if necessary, if password/passphrase have changed - * @param {object} account io.cozy.accounts document - * @return {object} io.cozy.accounts updated document - */ +BankAccount.normalizeAccountNumber = matching.normalizeAccountNumber +BankAccount.doctype = 'io.cozy.bank.accounts' +BankAccount.idAttributes = ['_id'] +BankAccount.version = 1 +BankAccount.checkedAttributes = null +BankAccount.vendorIdAttr = 'vendorId' + +module.exports = BankAccount -var setSessionResetIfNecessary = function setSessionResetIfNecessary(account) { - var changedFields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var isPasswordChanged = !!account && !!(changedFields.password || changedFields.passphrase); - return isPasswordChanged ? _objectSpread(_objectSpread({}, account), {}, { - state: RESET_SESSION_STATE - }) : account; -}; -/* harmony default export */ __webpack_exports__["default"] = ({ - build: build, - getLabel: getLabel, - getTwoFACodeProvider: getTwoFACodeProvider, - isTwoFANeeded: isTwoFANeeded, - isTwoFARetry: isTwoFARetry, - isLoginSuccess: isLoginSuccess, - isLoginSuccessHandled: isLoginSuccessHandled, - mergeAuth: mergeAuth, - resetState: resetState, - setSessionResetIfNecessary: setSessionResetIfNecessary, - updateTwoFaCode: updateTwoFaCode, - setVaultCipherRelationship: setVaultCipherRelationship, - getVaultCipherId: getVaultCipherId -}); /***/ }), -/* 949 */ +/* 940 */ /***/ (function(module, exports, __webpack_require__) { -var baseClone = __webpack_require__(214); +const sortBy = __webpack_require__(485) +const get = __webpack_require__(162) +const { eitherIncludes } = __webpack_require__(941) +const { getSlugFromInstitutionLabel } = __webpack_require__(942) -/** Used to compose bitmasks for cloning. */ -var CLONE_SYMBOLS_FLAG = 4; +const findExactMatch = (attr, account, existingAccounts) => { + const sameAttr = existingAccounts.filter( + existingAccount => existingAccount[attr] === account[attr] + ) + if (sameAttr.length === 1) { + return { match: sameAttr[0], method: attr + '-exact' } + } else if (sameAttr.length > 1) { + return { matches: sameAttr, method: attr + '-exact' } + } else { + return null + } +} + +const untrimmedAccountNumber = /^(?:[A-Za-z]+)?-?([0-9]+)-?(?:[A-Za-z]+)?$/ +// Regexp targeting hidden credit card number like +// ****-****-****-1234;xxxx xxxx xxxx 1234;************1234 +const redactedCreditCard = /[x*]{4}[ -]?[x*]{4}[ -]?[x*]{4}[ -]?(\d{4})/ + +const normalizeAccountNumber = (numberArg, ibanArg) => { + const iban = ibanArg && ibanArg.replace(/\s/g, '') + const number = + numberArg && !numberArg.match(redactedCreditCard) + ? numberArg.replace(/\s/g, '') + : numberArg + let match + if (iban && iban.length == 27) { + return iban.substr(14, 11) + } + + if (!number) { + return number + } + + if (number.length == 23) { + // Must be an IBAN without the COUNTRY code + // See support demand #9102 with BI + // We extract the account number from the IBAN + // COUNTRY (4) BANK (5) COUNTER (5) NUMBER (11) KEY (2) + // FRXX 16275 10501 00300060030 00 + return number.substr(10, 11) + } else if (number.length == 16) { + // Linxo sends Bank account number that contains + // the counter number + return number.substr(5, 11) + } else if ( + number.length > 11 && + (match = number.match(untrimmedAccountNumber)) + ) { + // Some account numbers from BI are in the form + // CC-00300060030 (CC for Compte Courant) or + // LEO-00300060030 + return match[1] + } else { + return number + } +} /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * If either of the account numbers has length 11 and one is contained + * in the other, it's a match + */ +const approxNumberMatch = (account, existingAccount) => { + return ( + existingAccount.number && + account.number && + (existingAccount.number.length === 11 || account.number.length === 11) && + eitherIncludes(existingAccount.number, account.number) && + Math.min(existingAccount.number.length, account.number.length) >= 4 + ) +} + +/** + * If there is no "number" attribute or null, "id" attribute is used + * in the other, it's not a match * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true + * @param account + * @param existingAccount + * @returns {boolean} */ -function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); +const noNumberMatch = (account, existingAccount) => { + const accNumber = account.number || String(account.id) + const existingAccNumber = existingAccount.number || String(existingAccount.id) + if (!account.number || !existingAccount.number) { + return eitherIncludes(accNumber, existingAccNumber) + } + return false } -module.exports = clone; +const creditCardMatch = (account, existingAccount) => { + if (account.type !== 'CreditCard' && existingAccount.type !== 'CreditCard') { + return false + } + let ccAccount, lastDigits + for (let acc of [account, existingAccount]) { + const match = acc && acc.number && acc.number.match(redactedCreditCard) + if (match) { + ccAccount = acc + lastDigits = match[1] + } + } + const other = ccAccount === account ? existingAccount : account + if (other && other.number && other.number.slice(-4) === lastDigits) { + return true + } + return false +} +const slugMatch = (account, existingAccount) => { + const possibleSlug = getSlugFromInstitutionLabel(account.institutionLabel) + const possibleSlugExisting = getSlugFromInstitutionLabel( + existingAccount.institutionLabel + ) + return ( + !possibleSlug || + !possibleSlugExisting || + possibleSlug === possibleSlugExisting + ) +} -/***/ }), -/* 950 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +const currencyMatch = (account, existingAccount) => { + if (!account.currency) { + return false + } + return ( + (existingAccount.rawNumber && + existingAccount.rawNumber.includes(account.currency)) || + (existingAccount.label && + existingAccount.label.includes(account.currency)) || + (existingAccount.originalBankLabel && + existingAccount.originalBankLabel.includes(account.currency)) + ) +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -var assert = function assert(condition, message) { - if (!condition) { - throw new Error(message); +const sameTypeMatch = (account, existingAccount) => { + return account.type === existingAccount.type +} + +const rules = [ + { rule: slugMatch, bonus: 0, malus: -1000 }, + { rule: approxNumberMatch, bonus: 50, malus: -50, name: 'approx-number' }, + { rule: noNumberMatch, bonus: 10, malus: -10, name: 'no-number-attr' }, + { rule: sameTypeMatch, bonus: 50, malus: 0, name: 'same-type' }, + { rule: creditCardMatch, bonus: 150, malus: 0, name: 'credit-card-number' }, + { rule: currencyMatch, bonus: 50, malus: 0, name: 'currency' } +] + +const score = (account, existingAccount) => { + const methods = [] + const res = { + account: existingAccount, + methods } -}; -/* harmony default export */ __webpack_exports__["default"] = (assert); + let points = 0 + for (let { rule, bonus, malus, name } of rules) { + const ok = rule(account, existingAccount) + if (ok && bonus) { + points += bonus + } + if (!ok && malus) { + points += malus + } + if (name && ok) { + methods.push(name) + } + } -/***/ }), -/* 951 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + res.points = points + return res +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ROLE_IDENTIFIER", function() { return ROLE_IDENTIFIER; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "predefinedLabels", function() { return predefinedLabels; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "legacyLabels", function() { return legacyLabels; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sanitize", function() { return sanitize; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDataTypes", function() { return getDataTypes; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getKonnectorName", function() { return getKonnectorName; }); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var lodash_flow__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(449); -/* harmony import */ var lodash_flow__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(lodash_flow__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(213); -/* harmony import */ var lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var lodash_findKey__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(261); -/* harmony import */ var lodash_findKey__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(lodash_findKey__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(61); -/* harmony import */ var lodash_mapValues__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_mapValues__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var lodash_pickBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(329); -/* harmony import */ var lodash_pickBy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash_pickBy__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(162); -/* harmony import */ var lodash_get__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(lodash_get__WEBPACK_IMPORTED_MODULE_7__); -/* harmony import */ var lodash_intersection__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(389); -/* harmony import */ var lodash_intersection__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(lodash_intersection__WEBPACK_IMPORTED_MODULE_8__); +const normalizeAccount = account => { + const normalizedAccountNumber = normalizeAccountNumber( + account.number, + account.iban + ) + return { + // eslint-disable-next-line node/no-unsupported-features/es-syntax + ...account, + rawNumber: account.number, + number: normalizedAccountNumber + } +} +const exactMatchAttributes = ['iban', 'number'] +const eqNotUndefined = (attr1, attr2) => { + return attr1 && attr1 === attr2 +} -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +const findMatch = (account, existingAccounts) => { + // Start with exact attribute matches + for (const exactAttribute of exactMatchAttributes) { + if (account[exactAttribute]) { + const result = findExactMatch(exactAttribute, account, existingAccounts) + if (result && result.match) { + return result + } + } + } -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + const matchOriginalNumber = existingAccounts.find( + otherAccount => + eqNotUndefined(account.originalNumber, otherAccount.number) || + eqNotUndefined(account.number, otherAccount.originalNumber) + ) + if (matchOriginalNumber) { + return { + match: matchOriginalNumber, + method: 'originalNumber-exact' + } + } -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } 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 normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } + const matchRawNumberCurrencyType = existingAccounts.find( + otherAccount => + (eqNotUndefined(account.rawNumber, otherAccount.number) || + eqNotUndefined(account.number, otherAccount.rawNumber)) && + otherAccount.type == account.type && + otherAccount.currency == account.currency + ) + if (matchRawNumberCurrencyType) { + return { + match: matchRawNumberCurrencyType, + method: 'rawNumber-exact-currency-type' + } + } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + // Now we get more fuzzy and score accounts + const scored = sortBy( + existingAccounts.map(existingAccount => score(account, existingAccount)), + x => -x.points + ) + const candidates = scored.filter(x => x.points > 0) + if (candidates.length > 0) { + return { + match: candidates[0].account, + method: candidates[0].methods.join('-') + } + } +} -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } +/** + * Matches existing accounts with accounts fetched on a vendor + * + * @typedef {MatchResult} + * @property {io.cozy.account} account - Account from fetched accounts + * @property {io.cozy.account} match - Existing account that was matched. Null if no match was found. + * @property {string} method - How the two accounts were matched + * + * @param {io.cozy.account} fetchedAccounts - Account that have been fetched + * on the vendor and that will be matched with existing accounts + * @param {io.cozy.accounts} existingAccounts - Will be match against (those + * io.cozy.accounts already have an _id) + * @return {Array<MatchResult>} - Match results (as many results as fetchedAccounts.length) + */ +const matchAccounts = (fetchedAccountsArg, existingAccounts) => { + const fetchedAccounts = fetchedAccountsArg.map(normalizeAccount) + const toMatch = [...existingAccounts].map(normalizeAccount) + const results = [] + for (let fetchedAccount of fetchedAccounts) { + const matchResult = findMatch(fetchedAccount, toMatch) + if (matchResult) { + const i = toMatch.indexOf(matchResult.match) + toMatch.splice(i, 1) + if ( + !get(fetchedAccount, 'metadata.disabledAt') || + !get(matchResult, 'metadata.disabledAt') + ) { + // eslint-disable-next-line node/no-unsupported-features/es-syntax + results.push({ account: fetchedAccount, ...matchResult }) + } + } else { + if (!get(fetchedAccount, 'metadata.disabledAt')) { + results.push({ account: fetchedAccount }) + } + } + } + return results +} +module.exports = { + matchAccounts, + normalizeAccountNumber, + score, + creditCardMatch, + approxNumberMatch +} +/***/ }), +/* 941 */ +/***/ (function(module, exports) { +const eitherIncludes = (str1, str2) => { + return Boolean(str1 && str2 && (str1.includes(str2) || str2.includes(str1))) +} +module.exports = { + eitherIncludes +} +/***/ }), +/* 942 */ +/***/ (function(module, exports, __webpack_require__) { -var ROLE_IDENTIFIER = 'identifier'; -/** - * We defined "predefined labels", as labels wich can be used in manifest, to - * refer to existing locales. - * @example - * This declaration expect that applications resolve automatically the label - * of the field "name", without relying on locales declared in konnector - * manifest. - * ``` - * "fields": { - * "name": { - * "label": "firsname", - * "type": "text" - * } - * } - * ``` - */ +const log = __webpack_require__(917).namespace('slug-account') +const labelSlugs = __webpack_require__(943) -var predefinedLabels = ['answer', 'birthdate', 'code', 'date', 'email', 'firstname', 'lastname', 'login', 'password', 'phone']; -/** - * Out of scope labels already used, should be transferred directly in manifests - * in the future. - */ +const institutionLabelsCompiled = Object.entries(labelSlugs).map( + ([ilabelRx, slug]) => { + if (ilabelRx[0] === '/' && ilabelRx[ilabelRx.length - 1] === '/') { + return [new RegExp(ilabelRx.substr(1, ilabelRx.length - 2), 'i'), slug] + } else { + return [ilabelRx, slug] + } + } +) -var legacyLabels = ['branchName' // Used in banking konnectors -]; -/** - * Legacy login fields declared by some konnectors - */ +const getSlugFromInstitutionLabel = institutionLabel => { + if (!institutionLabel) { + log('warn', 'No institution label, cannot compute slug') + return + } + for (const [rx, slug] of institutionLabelsCompiled) { + if (rx instanceof RegExp) { + const match = institutionLabel.match(rx) + if (match) { + return slug + } + } else if (rx.toLowerCase() === institutionLabel.toLowerCase()) { + return slug + } + } + log('warn', `Could not compute slug for ${institutionLabel}`) +} -var legacyLoginFields = ['login', 'identifier', 'new_identifier', 'email']; -/** - * Returns a key/value object with field as key and default, if it exists in - * fields parameter. - * @example - * ``` - * const fields = { - * username: { - * type: "text" - * }, - * favoriteColor: { - * default: "green" - * type: "text" - * } - * } - * const result = defaultFieldsValues(fields) - * ``` - * `result` here is - * ``` - * { - * favoriteColor: "green" - * } - * ``` - * Def - * @param {object} fields Fields object from manifest - * @return {object} key/value pairs of default values - */ +module.exports = { + getSlugFromInstitutionLabel +} -var defaultFieldsValues = function defaultFieldsValues(fields) { - return lodash_mapValues__WEBPACK_IMPORTED_MODULE_5___default()(lodash_pickBy__WEBPACK_IMPORTED_MODULE_6___default()(fields, function (value) { - return !!value.default; - }), function (value) { - return value.default; - }); -}; -/** - * Returns the key for the field having the role=identifier attribute - * @param {Object} fields Konnector fields - * @return {string} The key for the identifier field, example 'login' - */ +/***/ }), +/* 943 */ +/***/ (function(module, exports) { + +module.exports = { + 'AXA Banque': 'axabanque102', + '/Banque Populaire.*/': 'banquepopulaire', + BforBank: 'bforbank97', + 'BNP Paribas': 'bnpparibas82', + BNPP: 'bnpparibas82', + '/Boursorama.*/': 'boursorama83', + casden: 'casden173', + '/Hello bank!.*/': 'hellobank145', + Bred: 'bred', + CA: 'caatlantica3', + 'Carrefour Banque': 'carrefour159', + "/Caisse d'Épargne.*/": 'caissedepargne1', + 'Compte Nickel': 'comptenickel168', + '/^CIC.*/': 'cic63', + 'Crédit Agricole': 'caatlantica3', + 'Crédit Coopératif': 'creditcooperatif148', + '/Crédit du Nord.*/': 'cdngroup88', + '/Crédit Maritime.*/': 'creditmaritime', + '/Crédit Mutuel.*/': 'cic45', + '/Linxea/': 'linxea', + Fortuneo: 'fortuneo84', + 'Hello bank!': 'hellobank145', + 'HSBC France': 'hsbc119', + HSBC: 'hsbc119', + '/^ING.*/': 'ingdirect95', + '/La Banque Postale.*/': 'labanquepostale44', + '/LCL.*/': 'lcl-linxo', + Milleis: 'barclays136', + Monabanq: 'monabanq96', + 'Société Générale': 'societegenerale', + 'Société marseillaise de crédit': 'cdngroup109' +} -var getIdentifier = function getIdentifier() { - var fields = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return lodash_findKey__WEBPACK_IMPORTED_MODULE_4___default()(sanitizeIdentifier(fields), function (field) { - return field.role === ROLE_IDENTIFIER; - }); -}; -/** - * Ensures old fields are removed - * @param {Object} fields Manifest fields - * @return {Object} Sanitized manifest fields - */ +/***/ }), +/* 944 */ +/***/ (function(module, exports, __webpack_require__) { -var removeOldFields = function removeOldFields(fields) { - var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); +const fromPairs = __webpack_require__(181) +const log = __webpack_require__(917).namespace('BankingReconciliator') - delete sanitized.advancedFields; - return sanitized; -}; -/** - * Ensures that fields has at least one field with the role 'identifier' - * @param {Object} [fields={}] Manifest fields - * @return {Object} Sanitized manifest fields - */ +class BankingReconciliator { + constructor(options) { + this.options = options + } + async saveAccounts(fetchedAccounts, options) { + const { BankAccount } = this.options -var sanitizeIdentifier = function sanitizeIdentifier(fields) { - var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); + const stackAccounts = await BankAccount.fetchAll() - var hasIdentifier = false; + // Reconciliate + const reconciliatedAccounts = BankAccount.reconciliate( + fetchedAccounts, + stackAccounts + ) - for (var fieldName in sanitized) { - if (sanitized[fieldName].role === ROLE_IDENTIFIER) { - if (hasIdentifier) delete sanitized[fieldName].role;else hasIdentifier = true; + log('info', 'Saving accounts...') + const savedAccounts = await BankAccount.bulkSave(reconciliatedAccounts, { + handleDuplicates: 'remove' + }) + if (options.onAccountsSaved) { + options.onAccountsSaved(savedAccounts) } + + return { savedAccounts, reconciliatedAccounts } } - if (hasIdentifier) return sanitized; + /** + * @typedef ReconciliatorResponse + * @attribute {Array<BankAccount>} accounts + * @attribute {Array<BankTransactions>} transactions + */ - var _iterator = _createForOfIteratorHelper(legacyLoginFields), - _step; + /** + * @typedef ReconciliatorSaveOptions + * @attribute {Function} logProgress + */ - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var name = _step.value; + /** + * Save new accounts and transactions + * + * @param {Array<BankAccount>} fetchedAccounts + * @param {Array<BankTransactions>} fetchedTransactions + * @param {ReconciliatorSaveOptions} options + * @returns {ReconciliatorResponse} + * + */ + async save(fetchedAccounts, fetchedTransactions, options = {}) { + const { BankAccount, BankTransaction } = this.options - if (sanitized[name]) { - sanitized[name].role = ROLE_IDENTIFIER; - return sanitized; + const { reconciliatedAccounts, savedAccounts } = await this.saveAccounts( + fetchedAccounts, + options + ) + + // Bank accounts saved in Cozy, we can now link transactions to accounts + // via their cozy id + const vendorIdToCozyId = fromPairs( + savedAccounts.map(acc => [acc[BankAccount.vendorIdAttr], acc._id]) + ) + log('info', 'Linking transactions to accounts...') + log('info', JSON.stringify(vendorIdToCozyId)) + + fetchedTransactions.forEach(tr => { + tr.account = vendorIdToCozyId[tr[BankTransaction.vendorAccountIdAttr]] + if (tr.account === undefined) { + log( + 'warn', + `Transaction without account, vendorAccountIdAttr: ${BankTransaction.vendorAccountIdAttr}` + ) + log('warn', 'transaction: ' + JSON.stringify(tr)) + throw new Error('Transaction without account.') } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } + }) - for (var _fieldName in sanitized) { - if (sanitized[_fieldName].type !== 'password') { - sanitized[_fieldName].role = ROLE_IDENTIFIER; - return sanitized; + const reconciliatedAccountIds = new Set( + reconciliatedAccounts.filter(acc => acc._id).map(acc => acc._id) + ) + + // Pass to transaction reconciliation only transactions that belong + // to one of the reconciliated accounts + const stackTransactions = (await BankTransaction.fetchAll()).filter( + transaction => reconciliatedAccountIds.has(transaction.account) + ) + + const transactions = BankTransaction.reconciliate( + fetchedTransactions, + stackTransactions, + options + ) + + log('info', 'Saving transactions...') + let i = 1 + const logProgressFn = doc => { + log('debug', `[bulkSave] ${i++} Saving ${doc.date} ${doc.label}`) + } + const savedTransactions = await BankTransaction.bulkSave(transactions, { + concurrency: 30, + logProgress: + options.logProgress !== undefined ? options.logProgress : logProgressFn, + handleDuplicates: 'remove' + }) + return { + accounts: savedAccounts, + transactions: savedTransactions } } +} - return sanitized; -}; -/** - * Ensures every field not explicitely tagged as not required is required - * @param {Object} [fields={}] Manifest fields - * @return {Object} Sanitized manifest fields - */ +module.exports = BankingReconciliator -var sanitizeRequired = function sanitizeRequired(fields) { - var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); +/***/ }), +/* 945 */ +/***/ (function(module, exports, __webpack_require__) { - for (var fieldName in sanitized) { - var field = sanitized[fieldName]; // Ensure legacy for field isRequired +const keyBy = __webpack_require__(381) +const groupBy = __webpack_require__(386) +const maxBy = __webpack_require__(946) +const addDays = __webpack_require__(730) +const isAfter = __webpack_require__(814) +const Document = __webpack_require__(909) +const log = __webpack_require__(936) +const BankAccount = __webpack_require__(939) +const { matchTransactions } = __webpack_require__(949) +const cloneDeep = __webpack_require__(213) +const flag = __webpack_require__(256).default - var required = typeof field.required === 'undefined' ? field.isRequired : field.required; - sanitized[fieldName].required = typeof required === 'boolean' ? required : true; - } +const maxValue = (iterable, fn) => { + const res = maxBy(iterable, fn) + return res ? fn(res) : null +} - return sanitized; -}; +const getDate = transaction => { + const date = transaction.realisationDate || transaction.date + return date.slice(0, 10) +} -var legacyEncryptedFields = ['secret', 'dob', 'code', 'answer', 'access_token', 'refresh_token', 'appSecret']; /** - * Ensures: - * * any field flagged as encrypted keeps its flag - * * any legacy encrypted field is tagged as encrypted - * @param {Object} [fields={}] Manifest fields - * @return {Object} Sanitized Manifest fields + * Get the date of the latest transaction in an array. + * Transactions in the future are ignored. + * + * @param {array} stackTransactions + * @returns {string} The date of the latest transaction (YYYY-MM-DD) */ +const getSplitDate = stackTransactions => { + const now = new Date() + const notFutureTransactions = stackTransactions.filter(transaction => { + const date = getDate(transaction) + return !isAfter(date, now) + }) -var sanitizeEncrypted = function sanitizeEncrypted(fields) { - var sanitized = lodash_cloneDeep__WEBPACK_IMPORTED_MODULE_3___default()(fields); + return maxValue(notFutureTransactions, getDate) +} - for (var fieldName in sanitized) { - var field = sanitized[fieldName]; - if (typeof field.encrypted !== 'boolean') field.encrypted = field.type === 'password' || legacyEncryptedFields.includes(fieldName); +const ensureISOString = date => { + if (date instanceof Date) { + return date.toISOString() + } else { + return date + } +} + +class Transaction extends Document { + static async deleteAll(docs) { + if (flag('banking.warn-on-delete')) { + log( + 'warn', + `OPERATION_DELETE: removing operations with _id : ${JSON.stringify( + docs.map(doc => doc._id) + )}` + ) + } + return super.deleteAll(docs) + } + static getDate(transaction) { + return transaction + } + + isAfter(minDate) { + if (!minDate) { + return true + } else { + const day = ensureISOString(this.date).slice(0, 10) + if (day !== 'NaN') { + return day > minDate + } else { + log( + 'warn', + 'transaction date could not be parsed. transaction: ' + + JSON.stringify(this) + ) + return false + } + } + } + + isBeforeOrSame(maxDate) { + if (!maxDate) { + return true + } else { + const day = ensureISOString(this.date).slice(0, 10) + if (day !== 'NaN') { + return day <= maxDate + } else { + log( + 'warn', + 'transaction date could not be parsed. transaction: ' + + JSON.stringify(this) + ) + return false + } + } } - return sanitized; -}; -/* flow() is like compose() but not in reverse order */ - - -var sanitizeFields = lodash_flow__WEBPACK_IMPORTED_MODULE_2___default()([removeOldFields, sanitizeIdentifier, sanitizeRequired, sanitizeEncrypted]); - -var sanitize = function sanitize() { - var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return manifest.fields ? _objectSpread(_objectSpread({}, manifest), {}, { - fields: sanitizeFields(manifest.fields) - }) : manifest; -}; -var getDataTypes = function getDataTypes() { - var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(manifest, 'data_types'); -}; -var getKonnectorName = function getKonnectorName() { - var manifest = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; - return lodash_get__WEBPACK_IMPORTED_MODULE_7___default()(manifest, 'name'); -}; -/** - * Get fields value for a given konnector and account. - * Values present in the account are used and merged with default ones from the - * konnector's manifest - * - * @param {Object} konnector - an io.cozy.konnectors document - * @param {Object} account - an io.cozy.accounts document - * - * @returns {Object} An object with values for the fields - */ + /** + * Get the descriptive (and almost uniq) identifier of a transaction + * @param {object} transaction - The transaction (containing at least amount, originalBankLabel and date) + * @returns {object} + */ + getIdentifier() { + return `${this.amount}-${this.originalBankLabel}-${this.date}` + } -var getFieldsValues = function getFieldsValues(konnector, account) { - var fields = konnector.fields; - var sanitizedFields = sanitizeFields(fields); - var defaultValues = defaultFieldsValues(sanitizedFields); - var initialValues = account && account.auth; + /** + * Get transactions that should be present in the stack but are not. + * Transactions that are older that 1 week before the oldest existing + * transaction are ignored. + * + * @param {array} newTransactions + * @param {array} stackTransactions + * @returns {array} + */ + static getMissedTransactions( + newTransactions, + stackTransactions, + options = {} + ) { + const oldestDate = maxValue(stackTransactions, getDate) + const frontierDate = addDays(oldestDate, -7) + const recentNewTransactions = newTransactions.filter(tr => + isAfter(getDate(tr), frontierDate) + ) + const matchingResults = Array.from( + matchTransactions(recentNewTransactions, stackTransactions) + ) - var initialAndDefaultValues = _objectSpread(_objectSpread({}, defaultValues), initialValues); + const missedTransactions = matchingResults + .filter(result => !result.match) + .map(result => result.transaction) - return initialAndDefaultValues; -}; -/** - * Get required fields names for a given konnector - * - * @param {Object} konnector - an io.cozy.konnectors document - * - * @returns {string[]} An array of all required fields names - */ + const trackEvent = options.trackEvent + if (typeof trackEvent === 'function') { + try { + const nbMissed = missedTransactions.length + const nbExisting = stackTransactions.length + trackEvent({ + e_a: 'ReconciliateMissing', + e_n: 'MissedTransactionPct', + e_v: parseFloat((nbMissed / nbExisting).toFixed(2), 10) + }) + trackEvent({ + e_a: 'ReconciliateMissing', + e_n: 'MissedTransactionAbs', + e_v: nbMissed + }) + } catch (e) { + log('warn', `Could not send MissedTransaction event: ${e.message}`) + } + } + return missedTransactions + } -var getRequiredFields = function getRequiredFields(konnector) { - var fields = konnector.fields; - var sanitizedFields = sanitizeFields(fields); - var requiredFields = Object.entries(sanitizedFields).filter(function (_ref) { - var _ref2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_ref, 2), - value = _ref2[1]; + /** + * Reconcialiate remote transaction with local transaction + * + * @param {Array} remoteTransactions + * @param {Array} localTransactions + * @param {Function} options.trackEvent : this callback will be called in case of split date + * @param {Boolean} options.useSplitDate : should look for a split date or not (default true) + * @returns {Array} : reconciliated transactions + */ + static reconciliate(remoteTransactions, localTransactions, options = {}) { + const localOptions = cloneDeep(options) + if (localOptions.useSplitDate !== false) { + localOptions.useSplitDate = true + } + const findByVendorId = transaction => + localTransactions.find(t => t.vendorId === transaction.vendorId) - return value.required; - }).map(function (_ref3) { - var _ref4 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_ref3, 1), - key = _ref4[0]; + const groups = groupBy(remoteTransactions, transaction => + findByVendorId(transaction) ? 'updatedTransactions' : 'newTransactions' + ) - return key; - }); - return requiredFields; -}; + let newTransactions = groups.newTransactions || [] + const updatedTransactions = groups.updatedTransactions || [] -var hasValuesForRequiredFields = function hasValuesForRequiredFields(konnector, values) { - var requiredFields = getRequiredFields(konnector); - var hasValuesForRequiredFields = lodash_intersection__WEBPACK_IMPORTED_MODULE_8___default()(Object.keys(values), requiredFields).length === requiredFields.length; - return hasValuesForRequiredFields; -}; + const splitDate = localOptions.useSplitDate + ? getSplitDate(localTransactions) + : false -/* harmony default export */ __webpack_exports__["default"] = ({ - defaultFieldsValues: defaultFieldsValues, - getIdentifier: getIdentifier, - sanitize: sanitize, - sanitizeFields: sanitizeFields, - getDataTypes: getDataTypes, - getKonnectorName: getKonnectorName, - getFieldsValues: getFieldsValues, - getRequiredFields: getRequiredFields, - hasValuesForRequiredFields: hasValuesForRequiredFields -}); + if (splitDate) { + if (typeof localOptions.trackEvent === 'function') { + localOptions.trackEvent({ + e_a: 'ReconciliateSplitDate' + }) + } -/***/ }), -/* 952 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const isAfterSplit = x => Transaction.prototype.isAfter.call(x, splitDate) + const isBeforeSplit = x => + Transaction.prototype.isBeforeOrSame.call(x, splitDate) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromFrequency", function() { return fromFrequency; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromKonnector", function() { return fromKonnector; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toFrequency", function() { return toFrequency; }); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(49); -/* harmony import */ var _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _daytime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(953); + const transactionsAfterSplit = newTransactions.filter(isAfterSplit) + if (transactionsAfterSplit.length > 0) { + log( + 'info', + `Found ${transactionsAfterSplit.length} transactions after ${splitDate}` + ) + } else { + log('info', `No transaction after ${splitDate}`) + } + const transactionsBeforeSplit = newTransactions.filter(isBeforeSplit) + log( + 'info', + `Found ${transactionsBeforeSplit.length} transactions before ${splitDate}` + ) -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } + const missedTransactions = Transaction.getMissedTransactions( + transactionsBeforeSplit, + localTransactions, + localOptions + ) -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } + if (missedTransactions.length > 0) { + log( + 'info', + `Found ${missedTransactions.length} missed transactions before ${splitDate}` + ) + } else { + log('info', `No missed transactions before ${splitDate}`) + } + newTransactions = [...transactionsAfterSplit, ...missedTransactions] + } else { + log('info', "Can't find a split date, saving all new transactions") + } -var DAILY = 'daily'; -var HOURLY = 'hourly'; -var MONTHLY = 'monthly'; -var WEEKLY = 'weekly'; -var VALID_FREQUENCIES = [DAILY, HOURLY, MONTHLY, WEEKLY]; -var DEFAULT_FREQUENCY = WEEKLY; // By default konnectors are run at random hour between 12:00PM and 05:00AM. + log( + 'info', + `Transaction reconciliation: new ${newTransactions.length}, updated ${updatedTransactions.length}, split date ${splitDate} ` + ) + return [].concat(newTransactions).concat(updatedTransactions) + } -var DEFAULT_TIME_INTERVAL = [0, 5]; -/** - * Build a cron string for given konnector with given options - * See https://docs.cozy.io/en/cozy-stack/jobs/#cron-syntax - * @param {string} frequency Frequency from `hourly`, `daily`, `weekly` or - * `monthly`. - * @param {object} options Object which may contain `dayOfMonth`, - * `dayOfWeek`, hours`, `minutes`. - * @return {string} The cron definition for trigger - */ + static async getMostRecentForAccounts(accountIds) { + try { + log('debug', 'Transaction.getLast') -var fromFrequency = function fromFrequency(frequency) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var sanitizedFrequency = VALID_FREQUENCIES.includes(frequency) ? frequency : DEFAULT_FREQUENCY; - var _options$dayOfMonth = options.dayOfMonth, - dayOfMonth = _options$dayOfMonth === void 0 ? 1 : _options$dayOfMonth, - _options$dayOfWeek = options.dayOfWeek, - dayOfWeek = _options$dayOfWeek === void 0 ? 1 : _options$dayOfWeek, - _options$hours = options.hours, - hours = _options$hours === void 0 ? 0 : _options$hours, - _options$minutes = options.minutes, - minutes = _options$minutes === void 0 ? 0 : _options$minutes; + const index = await Document.getIndex(this.doctype, ['date', 'account']) + const options = { + selector: { + date: { $gte: null }, + account: { + $in: accountIds + } + }, + sort: [{ date: 'desc' }] + } + const transactions = await Document.query(index, options) + log('info', 'last transactions length: ' + transactions.length) - switch (sanitizedFrequency) { - case DAILY: - return "0 ".concat(minutes, " ").concat(hours, " * * *"); + return transactions + } catch (e) { + log('error', e) - case HOURLY: - return "0 ".concat(minutes, " * * * *"); + return [] + } + } - case MONTHLY: - return "0 ".concat(minutes, " ").concat(hours, " ").concat(dayOfMonth, " * *"); + static async deleteOrphans() { + log('info', 'Deleting up orphan operations') + const accounts = keyBy(await BankAccount.fetchAll(), '_id') + const operations = await this.fetchAll() + const orphanOperations = operations.filter(x => !accounts[x.account]) + log('info', `Total number of operations: ${operations.length}`) + log('info', `Total number of orphan operations: ${orphanOperations.length}`) + log('info', `Deleting ${orphanOperations.length} orphan operations...`) + if (orphanOperations.length > 0) { + log( + flag('banking.warn-on-delete') ? 'warn' : 'info', + `OPERATION_DELETE: removing ${orphanOperations.length} orphan operations` + ) + return this.deleteAll(orphanOperations) + } + } - default: - // also WEEKLY - return "0 ".concat(minutes, " ").concat(hours, " * * ").concat(dayOfWeek); + getVendorAccountId() { + return this[this.constructor.vendorAccountIdAttr] } -}; -var fromKonnector = function fromKonnector(konnector) { - var startDate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date(); - var randomDayTimeFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _daytime__WEBPACK_IMPORTED_MODULE_2__["randomDayTime"]; - return cron.fromFrequency(konnector.frequency, _objectSpread(_objectSpread({}, randomDayTimeFn.apply(null, konnector.time_interval || DEFAULT_TIME_INTERVAL)), {}, { - dayOfWeek: startDate.getDay(), - dayOfMonth: startDate.getDate() - })); -}; -/** - * Transform the given cron string into frequency value - * @param {String} cron cron value - * @return {String} Frequency, could be `daily`, - * `hourly`, `monthly`, `weekly`, or null if undetermined - */ -var toFrequency = function toFrequency(cron) { - var isSet = function isSet(part) { - return part !== '*'; - }; + static getCategoryId(transaction, options) { + const opts = { + localModelOverride: false, + localModelUsageThreshold: this.LOCAL_MODEL_USAGE_THRESHOLD, + globalModelUsageThreshold: this.GLOBAL_MODEL_USAGE_THRESHOLD, + // eslint-disable-next-line node/no-unsupported-features/es-syntax + ...options + } - var _cron$split = cron.split(' '), - _cron$split2 = _babel_runtime_helpers_slicedToArray__WEBPACK_IMPORTED_MODULE_0___default()(_cron$split, 6), - minutes = _cron$split2[1], - hours = _cron$split2[2], - dayOfMonth = _cron$split2[3], - dayOfWeek = _cron$split2[5]; + if (transaction.manualCategoryId) { + return transaction.manualCategoryId + } - if (isSet(dayOfWeek)) return WEEKLY; - if (isSet(dayOfMonth)) return MONTHLY; - if (isSet(hours)) return DAILY; - if (isSet(minutes)) return HOURLY; - return null; -}; -var cron = { - fromFrequency: fromFrequency, - fromKonnector: fromKonnector, - toFrequency: toFrequency -}; -/* harmony default export */ __webpack_exports__["default"] = (cron); + if ( + opts.localModelOverride && + transaction.localCategoryId && + transaction.localCategoryProba && + transaction.localCategoryProba > opts.localModelUsageThreshold + ) { + return transaction.localCategoryId + } -/***/ }), -/* 953 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + if ( + transaction.cozyCategoryId && + transaction.cozyCategoryProba && + transaction.cozyCategoryProba > opts.globalModelUsageThreshold + ) { + return transaction.cozyCategoryId + } -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "randomDayTime", function() { return randomDayTime; }); -/* harmony import */ var lodash_isNumber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(954); -/* harmony import */ var lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash_isNumber__WEBPACK_IMPORTED_MODULE_0__); + // If the cozy categorization models have not been applied, we return null + // so the transaction is considered as « categorization in progress ». + // Otherwize we just use the automatic categorization from the vendor + if (!transaction.localCategoryId && !transaction.cozyCategoryId) { + return null + } -/** - * Returns an hour of the day between two hours given in parameters - * @type {number} min minimal start hour - * @type {number} max maximal end hour - * @type {function} randomize The function used to generate random values - * @return {object} Object containing two atributes : hours and minutes - */ + return transaction.automaticCategoryId + } +} +Transaction.doctype = 'io.cozy.bank.operations' +Transaction.version = 1 +Transaction.vendorAccountIdAttr = 'vendorAccountId' +Transaction.vendorIdAttr = 'vendorId' +Transaction.idAttributes = ['vendorId'] +Transaction.checkedAttributes = [ + 'label', + 'originalBankLabel', + 'automaticCategoryId', + 'account' +] +Transaction.LOCAL_MODEL_USAGE_THRESHOLD = 0.8 +Transaction.GLOBAL_MODEL_USAGE_THRESHOLD = 0.15 +Transaction.getSplitDate = getSplitDate + +module.exports = Transaction -var randomDayTime = function randomDayTime() { - var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; - var end = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; - var randomize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function (min, max) { - return Math.random() * (max - min) + min; - }; - if (!lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default()(start)) throw new Error('Parameter start must be a number'); - if (!lodash_isNumber__WEBPACK_IMPORTED_MODULE_0___default()(end)) throw new Error('Parameter end must be a number'); - if (typeof randomize !== 'function') throw new Error('Parameter randomize must be a function'); - if (start < 0 || end > 24) throw new Error('interval must be inside [0, 24]'); - var r = randomize(start, end); - var hours = Math.floor(r); - var minutes = Math.floor((r - hours) * 60); - if (hours < 0 || hours > 23) throw new Error('randomize function returns invalid hour value'); - return { - hours: hours, - minutes: minutes - }; -}; /***/ }), -/* 954 */ +/* 946 */ /***/ (function(module, exports, __webpack_require__) { -var baseGetTag = __webpack_require__(67), - isObjectLike = __webpack_require__(86); - -/** `Object#toString` result references. */ -var numberTag = '[object Number]'; +var baseExtremum = __webpack_require__(947), + baseGt = __webpack_require__(948), + baseIteratee = __webpack_require__(101); /** - * Checks if `value` is classified as a `Number` primitive or object. - * - * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are - * classified as numbers, use the `_.isFinite` method. + * This method is like `_.max` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * the value is ranked. The iteratee is invoked with one argument: (value). * * @static * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @since 4.0.0 + * @category Math + * @param {Array} array The array to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {*} Returns the maximum value. * @example * - * _.isNumber(3); - * // => true + * var objects = [{ 'n': 1 }, { 'n': 2 }]; * - * _.isNumber(Number.MIN_VALUE); - * // => true + * _.maxBy(objects, function(o) { return o.n; }); + * // => { 'n': 2 } * - * _.isNumber(Infinity); - * // => true + * // The `_.property` iteratee shorthand. + * _.maxBy(objects, 'n'); + * // => { 'n': 2 } + */ +function maxBy(array, iteratee) { + return (array && array.length) + ? baseExtremum(array, baseIteratee(iteratee, 2), baseGt) + : undefined; +} + +module.exports = maxBy; + + +/***/ }), +/* 947 */ +/***/ (function(module, exports, __webpack_require__) { + +var isSymbol = __webpack_require__(166); + +/** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. * - * _.isNumber('3'); - * // => false + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. */ -function isNumber(value) { - return typeof value == 'number' || - (isObjectLike(value) && baseGetTag(value) == numberTag); +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; +} + +module.exports = baseExtremum; + + +/***/ }), +/* 948 */ +/***/ (function(module, exports) { + +/** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ +function baseGt(value, other) { + return value > other; } -module.exports = isNumber; +module.exports = baseGt; /***/ }), -/* 955 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ACCOUNTS_DOCTYPE", function() { return ACCOUNTS_DOCTYPE; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createAccount", function() { return createAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "createAccountQuerySpec", function() { return createAccountQuerySpec; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccount", function() { return fetchAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateAccount", function() { return updateAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "saveAccount", function() { return saveAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "deleteAccount", function() { return deleteAccount; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccountsFromTriggers", function() { return fetchAccountsFromTriggers; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchAccountsWithoutTriggers", function() { return fetchAccountsWithoutTriggers; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fetchReusableAccount", function() { return fetchReusableAccount; }); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); -/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(58); -/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); -/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39); -/* harmony import */ var cozy_client__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(cozy_client__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(784); -/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(295); -/* harmony import */ var lodash_merge__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(lodash_merge__WEBPACK_IMPORTED_MODULE_5__); -/* harmony import */ var lodash_keyBy__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(381); -/* harmony import */ var lodash_keyBy__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(lodash_keyBy__WEBPACK_IMPORTED_MODULE_6__); -/* harmony import */ var _assert__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(950); -/* harmony import */ var _logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(956); +/* 949 */ +/***/ (function(module, exports, __webpack_require__) { +const groupBy = __webpack_require__(386) +const sortBy = __webpack_require__(485) +const { eitherIncludes } = __webpack_require__(941) +const getDateTransaction = op => op.date.substr(0, 10) -function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } +/** + * Groups `iterables` via `grouper` and returns an iterator + * that yields [groupKey, groups] + */ +const zipGroup = function* (iterables, grouper) { + const grouped = iterables.map(items => groupBy(items, grouper)) + for (const key of Object.keys(grouped[0]).sort()) { + const groups = grouped.map(keyedGroups => keyedGroups[key] || []) + yield [key, groups] + } +} -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } +const squash = (str, char) => { + const rx = new RegExp(String.raw`${char}{2,}`, 'gi') + return str && str.replace(rx, char) +} +const redactedNumber = /\b[0-9X]+\b/gi +const dateRx = /\b\d{2}\/\d{2}\/\d{4}\b/g +const cleanLabel = label => label && label.replace(redactedNumber, '') +const withoutDate = str => str && str.replace(dateRx, '') +const compacted = str => str && str.replace(/\s/g, '').replace(/-/g, '') +const scoreLabel = (newTr, existingTr) => { + if ( + squash(existingTr.originalBankLabel, ' ') === + squash(newTr.originalBankLabel, ' ') + ) { + return [200, 'originalBankLabel'] + } else if ( + compacted(existingTr.originalBankLabel) === + compacted(newTr.originalBankLabel) + ) { + return [120, 'originalBankLabelCompacted'] + } else if ( + withoutDate(existingTr.originalBankLabel) === + withoutDate(newTr.originalBankLabel) + ) { + // For some transfers, the date in the originalBankLabel is different between + // BudgetInsight and Linxo + return [150, 'originalBankLabelWithoutDate'] + } else if (existingTr.label === newTr.label) { + return [100, 'label'] + } else if ( + eitherIncludes(existingTr.label.toLowerCase(), newTr.label.toLowerCase()) + ) { + return [70, 'eitherIncludes'] + } else if ( + eitherIncludes( + cleanLabel(existingTr.label.toLowerCase()), + cleanLabel(newTr.label.toLowerCase()) + ) + ) { + return [50, 'fuzzy-eitherIncludes'] + } else { + // Nothing matches, we penalize so that the score is below 0 + return [-1000, 'label-penalty'] + } +} +const DAY = 1000 * 60 * 60 * 24 +const getDeltaDate = (newTr, existingTr) => { + const nDate1 = new Date(newTr.date.substr(0, 10)) + const eDate1 = new Date(existingTr.date.substr(0, 10)) + const delta = Math.abs(eDate1 - nDate1) + if (newTr.realisationDate) { + const nDate2 = new Date(newTr.realisationDate.substr(0, 10)) + const delta2 = Math.abs(eDate1 - nDate2) + return Math.min(delta, delta2) + } else { + return delta + } +} +const scoreMatching = (newTr, existingTr, options = {}) => { + const methods = [] + const res = { + op: existingTr, + methods + } + if (options.maxDateDelta) { + const delta = getDeltaDate(newTr, existingTr) + if (delta > options.maxDateDelta) { + // Early exit, transactions are two far off time-wise + res.points = -1000 + return res + } else { + methods.push('approx-date') + } + } -var ACCOUNTS_DOCTYPE = 'io.cozy.accounts'; -var PERMISSIONS_DOCTYPE = 'io.cozy.permissions'; -/** - * Create an account for the given konnector. - * @param {Object} client CozyClient - * @param {Object} konnector io.cozy.konnectors document - * @param {Object} attributes Account attributes - */ + const [labelPoints, labelMethod] = scoreLabel(newTr, existingTr) + methods.push(labelMethod) + const amountDiff = Math.abs(existingTr.amount - newTr.amount) + const amountPoints = amountDiff === 0 ? methods.push('amount') && 100 : -1000 -var createAccount = /*#__PURE__*/function () { - var _ref = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee(client, konnector, attributes) { - var _ref2, data; + const points = amountPoints + labelPoints + res.points = points + return res +} - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (!konnector.aggregator) { - _context.next = 6; - break; - } +const matchTransaction = (newTr, existingTrs, options = {}) => { + const exactVendorId = existingTrs.find( + existingTr => + existingTr.vendorId && + newTr.vendorId && + existingTr.vendorId === newTr.vendorId + ) + if (exactVendorId) { + return { match: exactVendorId, method: 'vendorId' } + } - _context.next = 3; - return createChildAccount(client, konnector, attributes); + // Now we try to do it based on originalBankLabel, label and amount. + // We score candidates according to their degree of matching + // with the current transaction. + // Candidates with score below 0 will be discarded. + const withPoints = existingTrs.map(existingTr => + scoreMatching(newTr, existingTr, options) + ) - case 3: - _context.t0 = _context.sent; - _context.next = 9; - break; + const candidates = sortBy(withPoints, x => -x.points).filter( + x => x.points > 0 + ) + return candidates.length > 0 + ? { + match: candidates[0].op, + method: candidates[0].methods.join('-') + } + : { + candidates + } +} - case 6: - _context.next = 8; - return client.create(ACCOUNTS_DOCTYPE, attributes); +/** + * Logic to match a transaction and removing it from the transactions to + * match. `matchingFn` is the function used for matching. + */ +const matchTransactionToGroup = function* (newTrs, existingTrs, options = {}) { + const toMatch = Array.isArray(existingTrs) ? [...existingTrs] : [] + for (let newTr of newTrs) { + const res = { + transaction: newTr + } - case 8: - _context.t0 = _context.sent; + const result = + toMatch.length > 0 ? matchTransaction(newTr, toMatch, options) : null + if (result) { + Object.assign(res, result) + const matchIdx = toMatch.indexOf(result.match) + if (matchIdx > -1) { + toMatch.splice(matchIdx, 1) + } + } + yield res + } +} - case 9: - _ref2 = _context.t0; - data = _ref2.data; - return _context.abrupt("return", data); +/** + * Several logics to match transactions. + * + * First group transactions per day and match transactions in + * intra-day mode. + * Then relax the date constraint 1 day per 1 day to reach + * a maximum of 5 days of differences + */ +const matchTransactions = function* (newTrs, existingTrs) { + const unmatchedNew = new Set(newTrs) + const unmatchedExisting = new Set(existingTrs) + // eslint-disable-next-line no-unused-vars + for (let [date, [newGroup, existingGroup]] of zipGroup( + [newTrs, existingTrs], + getDateTransaction + )) { + for (let result of matchTransactionToGroup(newGroup, existingGroup)) { + if (result.match) { + unmatchedExisting.delete(result.match) + unmatchedNew.delete(result.transaction) + yield result + } + } + } - case 12: - case "end": - return _context.stop(); - } + const deltas = [3, 4, 5] + for (let delta of deltas) { + for (let result of matchTransactionToGroup( + Array.from(unmatchedNew), + Array.from(unmatchedExisting), + { + maxDateDelta: delta * DAY + } + )) { + if (result.method) { + result.method += `-delta${delta}` } - }, _callee); - })); - - return function createAccount(_x, _x2, _x3) { - return _ref.apply(this, arguments); - }; -}(); -var createAccountQuerySpec = function createAccountQuerySpec(accountId) { - if (!accountId) { - throw new Error('createAccountQuerySpec called with undefined accountId'); + if (result.match) { + unmatchedExisting.delete(result.match) + unmatchedNew.delete(result.transaction) + } + if (result.match || delta === deltas[deltas.length - 1]) { + yield result + } + } } +} - return { - query: Object(cozy_client__WEBPACK_IMPORTED_MODULE_3__["Q"])(ACCOUNTS_DOCTYPE).getById(accountId), - as: "io.cozy.accounts/".concat(accountId) - }; -}; -/** - * Fetches an account - * Returns null if the account does not exist - * @param {Object} client CozyClient - * @param {string} id io.cozy.accounts document's id - * @return {Object} Retrieved account - */ +module.exports = { + matchTransactions, + scoreMatching +} -var fetchAccount = /*#__PURE__*/function () { - var _ref3 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee2(client, id) { - var qspec, _yield$client$query, data; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.prev = 0; - qspec = createAccountQuerySpec(id); - _context2.next = 4; - return client.query(qspec.query, qspec); +/***/ }), +/* 950 */ +/***/ (function(module, exports, __webpack_require__) { - case 4: - _yield$client$query = _context2.sent; - data = _yield$client$query.data; - return _context2.abrupt("return", data); +const Document = __webpack_require__(909) +const sumBy = __webpack_require__(951) - case 9: - _context2.prev = 9; - _context2.t0 = _context2["catch"](0); +class BankAccountStats extends Document { + static checkCurrencies(accountsStats) { + const currency = accountsStats[0].currency - if (!(_context2.t0.status === 404)) { - _context2.next = 13; - break; - } + for (const accountStats of accountsStats) { + if (accountStats.currency !== currency) { + return false + } + } - return _context2.abrupt("return", null); + return true + } - case 13: - throw _context2.t0; + static sum(accountsStats) { + if (accountsStats.length === 0) { + throw new Error('You must give at least one stats object') + } - case 14: - case "end": - return _context2.stop(); - } - } - }, _callee2, null, [[0, 9]]); - })); + if (!this.checkCurrencies(accountsStats)) { + throw new Error('Currency of all stats object must be the same.') + } - return function fetchAccount(_x4, _x5) { - return _ref3.apply(this, arguments); - }; -}(); -/** - * Creates an account for an konnector needing an aggregator account. - * Creates the aggregator account as well if it does not exist. - * @param {Object} client CozyClient - * @param {Object} konnector io.cozy.konnectors document - * @param {Object} attributes Account attibutes - * @return {Object} The created io.cozy.accounts document - */ + const properties = [ + 'income', + 'additionalIncome', + 'mortgage', + 'loans', + 'fixedCharges' + ] -var createChildAccount = /*#__PURE__*/function () { - var _ref4 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee3(client, konnector, attributes) { - var aggregator, parentAccountId, parentAccount; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - aggregator = konnector.aggregator; + const summedStats = properties.reduce((sums, property) => { + sums[property] = sumBy( + accountsStats, + accountStats => accountStats[property] || 0 + ) - if (!(!aggregator || !aggregator.accountId)) { - _context3.next = 3; - break; - } + return sums + }, {}) - throw new Error('Konnector does not provide aggregator account id'); + summedStats.currency = accountsStats[0].currency - case 3: - parentAccountId = aggregator.accountId; - _context3.prev = 4; - _context3.next = 7; - return fetchAccount(client, parentAccountId); + return summedStats + } +} - case 7: - parentAccount = _context3.sent; - _context3.next = 13; - break; +BankAccountStats.doctype = 'io.cozy.bank.accounts.stats' +BankAccountStats.idAttributes = ['_id'] +BankAccountStats.version = 1 +BankAccountStats.checkedAttributes = null - case 10: - _context3.prev = 10; - _context3.t0 = _context3["catch"](4); - throw new Error("An error occurred when finding parent account ".concat(parentAccountId, " (").concat(_context3.t0.message, ")")); +module.exports = BankAccountStats - case 13: - if (parentAccount) { - _context3.next = 23; - break; - } - _context3.prev = 14; - _context3.next = 17; - return client.create(ACCOUNTS_DOCTYPE, { - _id: parentAccountId - }); +/***/ }), +/* 951 */ +/***/ (function(module, exports, __webpack_require__) { - case 17: - parentAccount = _context3.sent; - _context3.next = 23; - break; +var baseIteratee = __webpack_require__(101), + baseSum = __webpack_require__(952); - case 20: - _context3.prev = 20; - _context3.t1 = _context3["catch"](14); - throw new Error("Cannot create parent account ".concat(parentAccountId, " (").concat(_context3.t1.message, ")")); +/** + * This method is like `_.sum` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the value to be summed. + * The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Math + * @param {Array} array The array to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the sum. + * @example + * + * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }]; + * + * _.sumBy(objects, function(o) { return o.n; }); + * // => 20 + * + * // The `_.property` iteratee shorthand. + * _.sumBy(objects, 'n'); + * // => 20 + */ +function sumBy(array, iteratee) { + return (array && array.length) + ? baseSum(array, baseIteratee(iteratee, 2)) + : 0; +} - case 23: - _context3.prev = 23; - _context3.next = 26; - return client.collection(PERMISSIONS_DOCTYPE).add(konnector, { - aggregatorAccount: { - type: ACCOUNTS_DOCTYPE, - verbs: ['GET', 'PUT'], - values: ["".concat(ACCOUNTS_DOCTYPE, ".").concat(parentAccountId)] - } - }); +module.exports = sumBy; - case 26: - _context3.next = 32; - break; - case 28: - _context3.prev = 28; - _context3.t2 = _context3["catch"](23); - _logger__WEBPACK_IMPORTED_MODULE_8__["default"].warn(_context3.t2); - throw new Error("Cannot set permission for account ".concat(parentAccountId, " (").concat(_context3.t2.message, ")")); +/***/ }), +/* 952 */ +/***/ (function(module, exports) { - case 32: - _context3.next = 34; - return client.create(ACCOUNTS_DOCTYPE, _objectSpread(_objectSpread({}, attributes), {}, { - relationships: { - parent: { - data: { - _id: parentAccountId, - _type: ACCOUNTS_DOCTYPE - } - } - } - })); +/** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ +function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; +} + +module.exports = baseSum; - case 34: - return _context3.abrupt("return", _context3.sent); - case 35: - case "end": - return _context3.stop(); - } - } - }, _callee3, null, [[4, 10], [14, 20], [23, 28]]); - })); +/***/ }), +/* 953 */ +/***/ (function(module, exports, __webpack_require__) { + +const trimEnd = __webpack_require__(479) +const Document = __webpack_require__(909) + +const FILENAME_WITH_EXTENSION_REGEX = /(.+)(\..*)$/ - return function createChildAccount(_x6, _x7, _x8) { - return _ref4.apply(this, arguments); - }; -}(); /** - * Updates existing account - * @param {Object} client CozyClient - * @param {Object} account io.cozy.accounts document to update - * @return {Object} Updated io.cozy.accounts document + * Class representing the file model. + * @extends Document */ +class CozyFile extends Document { + /** + * async getFullpath - Gets a file's path + * + * @param {string} dirID The id of the parent directory + * @param {string} name The file's name + * @return {string} The full path of the file in the cozy + **/ + static async getFullpath(dirId, name) { + if (!dirId) { + throw new Error('You must provide a dirId') + } + const parentDir = await this.get(dirId) + const parentDirectoryPath = trimEnd(parentDir.path, '/') + return `${parentDirectoryPath}/${name}` + } -var updateAccount = /*#__PURE__*/function () { - var _ref5 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee4(client, account) { - var _yield$client$save, data, upToDateAccount, _yield$client$save2, _data; + /** + * Move file to destination. + * + * @param {string} fileId - The file's id (required) + * @param {object} destination + * @param {string} destination.folderId - The destination folder's id (required) + * @param {string} destination.path - The file's path after the move (optional, used to optimize performance in case of conflict) + * @param {string} force - Whether we should overwrite the destination in case of conflict (defaults to false) + * @returns {Promise} - A promise that returns the move action response and the deleted file id (if any) if resolved or an Error if rejected + * + */ + static async move(fileId, destination, force = false) { + const { folderId, path } = destination + const filesCollection = this.cozyClient.collection('io.cozy.files') + try { + const resp = await filesCollection.updateFileMetadata(fileId, { + dir_id: folderId + }) - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - _context4.prev = 0; - _context4.next = 3; - return client.save(account); + return { + moved: resp.data, + deleted: null + } + } catch (e) { + if (e.status === 409 && force) { + let destinationPath + if (path) { + destinationPath = path + } else { + const movedFile = await this.get(fileId) + const filename = movedFile.name + destinationPath = await this.getFullpath(folderId, filename) + } + const conflictResp = await filesCollection.statByPath(destinationPath) + await filesCollection.destroy(conflictResp.data) + const resp = await filesCollection.updateFileMetadata(fileId, { + dir_id: folderId + }) - case 3: - _yield$client$save = _context4.sent; - data = _yield$client$save.data; - return _context4.abrupt("return", data); + return { + moved: resp.data, + deleted: conflictResp.data.id + } + } else { + throw e + } + } + } + /** + * Method to split both the filename and the extension + * + * @param {Object} file An io.cozy.files + * @return {Object} return an object with {filename: , extension: } + */ + static splitFilename(file) { + if (!file.name) throw new Error('file should have a name property ') - case 8: - _context4.prev = 8; - _context4.t0 = _context4["catch"](0); + if (file.type === 'file') { + const match = file.name.match(FILENAME_WITH_EXTENSION_REGEX) + if (match) { + return { filename: match[1], extension: match[2] } + } + } + return { filename: file.name, extension: '' } + } + /** + * + * Method to upload a file even if a file with the same name already exists. + * + * @param {String} path Fullpath for the file ex: path/to/ + * @param {Object} file HTML Object file + * @param {Object} metadata An object containing the wanted metadata to attach + */ + static async overrideFileForPath(pathArg, file, metadata) { + let path = pathArg + if (!path.endsWith('/')) path = path + '/' - if (!(_context4.t0.status === 409)) { - _context4.next = 22; - break; - } + const filesCollection = this.cozyClient.collection('io.cozy.files') + try { + const existingFile = await filesCollection.statByPath(path + file.name) - _context4.next = 13; - return fetchAccount(client, account._id); + const { id: fileId, dir_id: dirId } = existingFile.data + const resp = await filesCollection.updateFile(file, { + dirId, + fileId, + metadata + }) + return resp + } catch (error) { + if (/Not Found/.test(error)) { + const dirId = await filesCollection.ensureDirectoryExists(path) + const createdFile = await filesCollection.createFile(file, { + dirId, + metadata + }) + return createdFile + } + throw error + } + } + /** + * Method to generate a new filename if there is a conflict + * + * @param {String} filenameWithoutExtension A filename without the extension + * @return {String} A filename with the right suffix + */ + static generateNewFileNameOnConflict(filenameWithoutExtension) { + // Check if the string ends by _1 + const regex = new RegExp('(_)([0-9]+)$') + const matches = filenameWithoutExtension.match(regex) + if (matches) { + let versionNumber = parseInt(matches[2]) + // increment versionNumber + versionNumber++ + const newFilenameWithoutExtension = filenameWithoutExtension.replace( + new RegExp('(_)([0-9]+)$'), + `_${versionNumber}` + ) + return newFilenameWithoutExtension + } else { + return `${filenameWithoutExtension}_1` + } + } + + static generateFileNameForRevision(file, revision, f) { + const { filename, extension } = CozyFile.splitFilename({ + name: file.name, + type: 'file' + }) + return `${filename}_${f( + revision.updated_at, + 'DD MMMM - HH[h]mm' + )}${extension}` + } + /** + * The goal of this method is to upload a file based on a conflict strategy. + * Be careful: We need to check if the file exists by doing a statByPath query + * before trying to upload the file since if we post and the stack return a + * 409 conflict, we will get a SPDY_ERROR_PROTOCOL on Chrome. This is the only + * viable workaround + * If there is no conflict, then we upload the file. + * If there is a conflict, then we apply the conflict strategy : `erase` or `rename` + * @param {String} name File Name + * @param {ArrayBuffer} file data + * @param {String} dirId dir id where to upload + * @param {String} conflictStrategy Actually only 2 hardcoded strategies 'erase' or 'rename' + * @param {Object} metadata An object containing the metadata to attach + * @param {String} contentType content type of the file + */ + static async uploadFileWithConflictStrategy( + name, + file, + dirId, + conflictStrategy, + metadata, + contentType + ) { + const filesCollection = this.cozyClient.collection('io.cozy.files') + + try { + const path = await CozyFile.getFullpath(dirId, name) + + const existingFile = await filesCollection.statByPath(path) + const { id: fileId } = existingFile.data + if (conflictStrategy === 'erase') { + // !TODO Bug Fix. Seems we have to pass a name attribute ?! + const resp = await filesCollection.updateFile(file, { + dirId, + fileId, + name, + metadata, + contentType + }) + return resp + } else { + const { filename, extension } = CozyFile.splitFilename({ + name, + type: 'file' + }) + const newFileName = + CozyFile.generateNewFileNameOnConflict(filename) + extension + // recall itself with the newFilename. + return CozyFile.uploadFileWithConflictStrategy( + newFileName, + file, + dirId, + conflictStrategy, + metadata, + contentType + ) + } + } catch (error) { + if (/Not Found/.test(error.message)) { + return await CozyFile.upload(name, file, dirId, metadata, contentType) + } + throw error + } + } + /** + * + * @param {String} name File's name + * @param {ArrayBuffer} file + * @param {String} dirId + * @param {Object} metadata + * @param {String} contentType + */ + static async upload(name, file, dirId, metadata, contentType = 'image/jpeg') { + return this.cozyClient.collection('io.cozy.files').createFile(file, { + name, + dirId, + contentType, + lastModifiedDate: new Date(), + metadata + }) + } +} - case 13: - upToDateAccount = _context4.sent; - delete account._rev; - _context4.next = 17; - return client.save(lodash_merge__WEBPACK_IMPORTED_MODULE_5___default()(upToDateAccount, account)); +CozyFile.doctype = 'io.cozy.files' - case 17: - _yield$client$save2 = _context4.sent; - _data = _yield$client$save2.data; - return _context4.abrupt("return", _data); +module.exports = CozyFile - case 22: - throw _context4.t0; - case 23: - case "end": - return _context4.stop(); - } - } - }, _callee4, null, [[0, 8]]); - })); +/***/ }), +/* 954 */ +/***/ (function(module, exports, __webpack_require__) { - return function updateAccount(_x9, _x10) { - return _ref5.apply(this, arguments); - }; -}(); -/** - * Creates or updates account - * @param {Object} client CozyClient - * @param {Object} konnector io.cozy.konnectors document - * @param {Object} authData Account auth attribute - */ +const Application = __webpack_require__(937) +const CozyFile = __webpack_require__(953) -var saveAccount = function saveAccount(client, konnector, account) { - Object(_assert__WEBPACK_IMPORTED_MODULE_7__["default"])(client && konnector && account, 'Must pass both client, konnector and account to saveAccount'); - return account._id ? updateAccount(client, account) : createAccount(client, konnector, account); -}; /** - * Deletes an account. - * @param {Object} client CozyClient - * @param {Object} account io.cozy.accounts document + * Class representing the folder model. + * @extends CozyFile */ +class CozyFolder extends CozyFile { + /** + * Create a folder with a reference to the given document + * @param {String} path Folder path + * @param {Object} document Document to make reference to. Any doctype. + * @return {Object} Folder document + */ + static async createFolderWithReference(path, document) { + const collection = this.cozyClient.collection(CozyFile.doctype) + const dirId = await collection.ensureDirectoryExists(path) + await collection.addReferencesTo(document, [ + { + _id: dirId + } + ]) -var deleteAccount = /*#__PURE__*/function () { - var _ref6 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee5(client, account) { - var syncedAccount; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - _context5.prev = 0; - _context5.next = 3; - return client.destroy(account); - - case 3: - _context5.next = 16; - break; - - case 5: - _context5.prev = 5; - _context5.t0 = _context5["catch"](0); - - if (!(_context5.t0.status === 409)) { - _context5.next = 15; - break; - } - - _context5.next = 10; - return fetchAccount(client, account._id); + const { data: dirInfos } = await collection.get(dirId) - case 10: - syncedAccount = _context5.sent; - _context5.next = 13; - return client.destroy(syncedAccount); + return dirInfos + } - case 13: - _context5.next = 16; - break; + /** + * Returns a "Magic Folder", given its id + * @param {String} id Magic Folder id. `CozyFolder.magicFolders` contains the + * ids of folders that can be magic folders. + * @param {String} path Default path to use if magic folder does not exist + * @return {Object} Folder document + */ + static async ensureMagicFolder(id, path) { + const magicFolderDocument = { + _type: Application.doctype, + _id: id + } + const folders = await this.getReferencedFolders(magicFolderDocument) + const existingMagicFolder = folders.length ? folders[0] : null - case 15: - throw _context5.t0; + if (existingMagicFolder) return existingMagicFolder - case 16: - case "end": - return _context5.stop(); - } - } - }, _callee5, null, [[0, 5]]); - })); + const magicFoldersValues = Object.values(this.magicFolders) + if (!magicFoldersValues.includes(id)) { + throw new Error( + `Cannot create Magic folder with id ${id}. Allowed values are ${magicFoldersValues.join( + ', ' + )}.` + ) + } - return function deleteAccount(_x11, _x12) { - return _ref6.apply(this, arguments); - }; -}(); -/** - * Returns { trigger, account } list - */ + if (!path) { + throw new Error('Magic folder default path must be defined') + } -var fetchAccountsFromTriggers = /*#__PURE__*/function () { - var _ref7 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee6(client, triggers) { - var accountCol, accountIdToTrigger, accountIds, _yield$accountCol$get, accounts; + return this.createFolderWithReference(path, magicFolderDocument) + } - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee6$(_context6) { - while (1) { - switch (_context6.prev = _context6.next) { - case 0: - accountCol = client.collection('io.cozy.accounts'); - accountIdToTrigger = lodash_keyBy__WEBPACK_IMPORTED_MODULE_6___default()(triggers, _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"]); - accountIds = Object.keys(accountIdToTrigger); - _context6.next = 5; - return accountCol.getAll(accountIds); + /** + * Returns an array of folder referenced by the given document + * @param {Object} document Document to get references from + * @return {Array} Array of folders referenced with the given + * document + */ + static async getReferencedFolders(document) { + const { included } = await this.cozyClient + .collection(CozyFile.doctype) + .findReferencedBy(document) + return included.filter(folder => !this.isTrashed(folder)) + } - case 5: - _yield$accountCol$get = _context6.sent; - accounts = _yield$accountCol$get.data; - return _context6.abrupt("return", accounts.filter(Boolean).map(function (account) { - return { - account: account, - trigger: accountIdToTrigger[account._id] - }; - })); + /** + * Returns an unique folder referenced with the given reference. Creates it + * if it does not exist. + * @param {String} path Path used to create folder if the referenced + * folder does not exist. + * @param {Object} document Document to create references from + * @return {Objet} Folder referenced with the give reference + */ + static async ensureFolderWithReference(path, document) { + const existingFolders = await this.getReferencedFolders(document) + if (existingFolders.length) return existingFolders[0] - case 8: - case "end": - return _context6.stop(); - } + const collection = this.cozyClient.collection(CozyFile.doctype) + const dirId = await collection.ensureDirectoryExists(path) + await collection.addReferencesTo(document, [ + { + _id: dirId } - }, _callee6); - })); - - return function fetchAccountsFromTriggers(_x13, _x14) { - return _ref7.apply(this, arguments); - }; -}(); -/** - * Returns the list of accounts which do not have any associated trigger - * - * @param {CozyClient} client CozyClient - * @param {Array} triggers io.cozy.triggers documents - */ - -var fetchAccountsWithoutTriggers = /*#__PURE__*/function () { - var _ref8 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee7(client, triggers) { - var triggerAccountIds; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee7$(_context7) { - while (1) { - switch (_context7.prev = _context7.next) { - case 0: - triggerAccountIds = triggers.map(function (trigger) { - return _helpers_triggers__WEBPACK_IMPORTED_MODULE_4__["getAccountId"](trigger); - }).filter(function (id) { - return !!id; - }); - _context7.next = 3; - return client.query(Object(cozy_client__WEBPACK_IMPORTED_MODULE_3__["Q"])(ACCOUNTS_DOCTYPE).where({ - _id: { - $nin: triggerAccountIds - } - })); + ]) - case 3: - return _context7.abrupt("return", _context7.sent.data); + const { data: dirInfos } = await collection.get(dirId) - case 4: - case "end": - return _context7.stop(); - } - } - }, _callee7); - })); + return dirInfos + } + + /** + * Indicates if a folder is in trash + * @param {Object} folder `io.cozy.files` document + * @return {Boolean} `true` if the folder is in trash, `false` + * otherwise. + */ + static isTrashed(folder) { + return /^\/\.cozy_trash/.test(folder.attributes.path) + } +} - return function fetchAccountsWithoutTriggers(_x15, _x16) { - return _ref8.apply(this, arguments); - }; -}(); /** - * Returns an account without trigger for the given konnector - * - * @param {CozyClient} client - Cozy client - * @param {Konnector} konnector - Konnector - * @return {Account} An account without trigger for the given konnector + * References used by the Cozy platform and apps for specific folders. */ +CozyFolder.magicFolders = { + ADMINISTRATIVE: `${Application.doctype}/administrative`, + PHOTOS: `${Application.doctype}/photos`, + PHOTOS_BACKUP: `${Application.doctype}/photos/mobile`, + PHOTOS_UPLOAD: `${Application.doctype}/photos/upload`, + NOTES_FOLDER: `${Application.doctype}/notes` +} -var fetchReusableAccount = /*#__PURE__*/function () { - var _ref9 = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.mark(function _callee8(client, konnector) { - var _yield$client$collect, triggers, accountsWithoutTrigger; +module.exports = CozyFolder - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_2___default.a.wrap(function _callee8$(_context8) { - while (1) { - switch (_context8.prev = _context8.next) { - case 0: - _context8.next = 2; - return client.collection('io.cozy.triggers').all(); - case 2: - _yield$client$collect = _context8.sent; - triggers = _yield$client$collect.data; - _context8.next = 6; - return fetchAccountsWithoutTriggers(client, triggers); +/***/ }), +/* 955 */ +/***/ (function(module, exports, __webpack_require__) { - case 6: - accountsWithoutTrigger = _context8.sent; - return _context8.abrupt("return", accountsWithoutTrigger.find(function (account) { - return account.account_type === konnector.slug; - })); +const PropTypes = __webpack_require__(934) - case 8: - case "end": - return _context8.stop(); - } - } - }, _callee8); - })); +const Document = __webpack_require__(909) + +class Group extends Document {} + +const GroupShape = PropTypes.shape({ + _id: PropTypes.string.isRequired, + _type: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + trashed: PropTypes.bool +}) + +Group.doctype = 'io.cozy.contacts.groups' +Group.propType = GroupShape + +module.exports = Group - return function fetchReusableAccount(_x17, _x18) { - return _ref9.apply(this, arguments); - }; -}(); /***/ }), /* 956 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _cozy_minilog__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(265); -/* harmony import */ var _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_cozy_minilog__WEBPACK_IMPORTED_MODULE_0__); +const Document = __webpack_require__(909) + +class Permission extends Document {} + +Permission.schema = { + doctype: 'io.cozy.permissions', + attributes: {} +} + +module.exports = Permission -var inBrowser = typeof window !== 'undefined'; -var minilog = inBrowser && window.minilog || _cozy_minilog__WEBPACK_IMPORTED_MODULE_0___default.a; -var logger = minilog('harvest'); -/* harmony default export */ __webpack_exports__["default"] = (logger); /***/ }), /* 957 */ @@ -112221,165 +112389,44 @@ exports.default = void 0; var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); -var Sentry = _interopRequireWildcard(__webpack_require__(590)); - var _cozyClient = __webpack_require__(39); -var _accounts = __webpack_require__(955); - -var _accounts2 = __webpack_require__(948); - -var _cozyLogger = _interopRequireDefault(__webpack_require__(3)); - var _doctypes = __webpack_require__(559); -var _luxon = __webpack_require__(687); - -var _logger = _interopRequireDefault(__webpack_require__(711)); - -var _triggers = _interopRequireDefault(__webpack_require__(727)); - -function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } - -function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } - -const logStack = _cozyLogger.default.namespace('accountService'); +var _triggers = _interopRequireDefault(__webpack_require__(905)); -class AccountService { +class KonnectorService { constructor(_client) { (0, _defineProperty2.default)(this, "_client", void 0); this._client = _client; } - buildAccountAttributes(konnector, authData) { - return (0, _accounts2.build)(konnector, authData); - } - - async createAccount(konnector, accountAuthData) { - const accountAttributes = this.buildAccountAttributes(konnector, accountAuthData); - return (0, _accounts.createAccount)(this._client, konnector, accountAttributes); - } - - async getAccount(id) { - try { - const account = await (0, _accounts.fetchAccount)(this._client, id); - return account; - } catch (error) { - const errorMessage = `Get account failed :${JSON.stringify(error)}`; - logStack('error', errorMessage); - - _logger.default.error(errorMessage); - - Sentry.captureException(errorMessage); - throw new Error('Get account failed'); - } - } - - async getAccountByType(type) { - try { - const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ - account_type: type - }); // .indexFields(['account_type']) - - const { - data: accounts - } = await this._client.query(query); - - if (accounts.length > 1) { - // If several account are found we will used trigger date to select the older - const triggerService = new _triggers.default(this._client); - const triggers = await Promise.all(accounts.map(_account => triggerService.getTriggerForAccount(_account))); // Keep the accountid which have the older trigger - - let olderDate = _luxon.DateTime.now(); - - let olderAccountId = null; - - for (const _trigger of triggers) { - var _trigger$cozyMetadata; - - if (_trigger !== null && _trigger !== void 0 && (_trigger$cozyMetadata = _trigger.cozyMetadata) !== null && _trigger$cozyMetadata !== void 0 && _trigger$cozyMetadata.createdAt && _luxon.DateTime.fromISO(_trigger.cozyMetadata.createdAt, { - zone: 'utc' - }) < olderDate) { - olderDate = _luxon.DateTime.fromISO(_trigger.cozyMetadata.createdAt, { - zone: 'utc' - }); - olderAccountId = _trigger.message.account; - } - } // Retrieve the accountId and return it - - - const filteredAccounts = accounts.filter(_account => _account._id === olderAccountId); - return filteredAccounts[0] ? filteredAccounts[0] : null; - } else { - return accounts[0] ? accounts[0] : null; - } - } catch (error) { - const errorMessage = `Error GetAccountByType: ${JSON.stringify(error)}`; - logStack('error', errorMessage); - - _logger.default.error(errorMessage); - - Sentry.captureException(errorMessage); - return null; - } - } - - async getAccountsByType(type) { - try { - const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ - account_type: type - }); // .indexFields(['account_type']) - - const { - data: accounts - } = await this._client.query(query); - return accounts; - } catch (error) { - const errorMessage = `Error: GetAccountsByType: ${JSON.stringify(error)}`; - logStack('error', errorMessage); - - _logger.default.error(errorMessage); - - Sentry.captureException(errorMessage); - return []; - } + async getKonnector(id) { + const query = (0, _cozyClient.Q)(_doctypes.KONNECTORS_DOCTYPE).where({ + _id: _doctypes.KONNECTORS_DOCTYPE + '/' + id + }); + const { + data: konnector + } = await this._client.query(query); + return konnector[0] ? konnector[0] : null; } - async updateAccount(account) { - try { - const updatedAccount = await (0, _accounts.updateAccount)(this._client, account); - return updatedAccount; - } catch (error) { - const errorMessage = `Update account failed: ${JSON.stringify(error)}`; - logStack('error', errorMessage); - - _logger.default.error(errorMessage); + async getKonnectorLastState(konnector, account) { + const triggerService = new _triggers.default(this._client); + const trigger = await triggerService.getTrigger(account, konnector); - Sentry.captureException(errorMessage); - throw new Error('Update account failed'); + if (trigger) { + const triggerState = await triggerService.fetchTriggerState(trigger); + return triggerState; } - } - - async deleteAccount(account) { - try { - await (0, _accounts.deleteAccount)(this._client, account); - return true; - } catch (error) { - const errorMessage = `Delete account failed`; - logStack('error', errorMessage); - - _logger.default.error(errorMessage); - Sentry.captureException(errorMessage); - throw new Error(errorMessage); - } + return null; } - async createIndexAccount() { - const query = (0, _cozyClient.Q)(_doctypes.ACCOUNTS_DOCTYPE).where({ - account_type: 'index' - }) // .indexFields(['account_type']) - .limitBy(1); + async createIndexKonnector() { + const query = (0, _cozyClient.Q)(_doctypes.KONNECTORS_DOCTYPE).where({ + _id: 'index' + }).limitBy(1); const { data: result } = await this._client.query(query); @@ -112388,7 +112435,7 @@ class AccountService { } -exports.default = AccountService; +exports.default = KonnectorService; /***/ }), /* 959 */ @@ -113954,7 +114001,7 @@ class EnvironmentService { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com'; } else { - return 'https://ecolyo-agent-rec.grandlyon.com'; + return 'https://ecolyo-agent-rec.apps.grandlyon.com'; } } diff --git a/services/consumptionAlert/ecolyo.js b/services/consumptionAlert/ecolyo.js index 822c3635072f34afe9ea7aa454e32c3ba5333a1d..9dad17f4adf5a9a5f5cb76a2eb62ae67dd6f359c 100644 --- a/services/consumptionAlert/ecolyo.js +++ b/services/consumptionAlert/ecolyo.js @@ -93121,18 +93121,25 @@ class ConsumptionDataManager { return result; } + async getExportableFluids(fluidTypes, timeStep) { + const exportableFluids = []; + + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType); + } + } + + return exportableFluids; + } + async fetchAllFirstDateData(fluidTypes, timeStep) { let firstDay = null; const firstDays = []; - if (fluidTypes.length === 1) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep)) || null; + for (const fluidType of fluidTypes) { + firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; firstDays.push(firstDay); - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; - firstDays.push(firstDay); - } } return firstDays; @@ -93407,9 +93414,20 @@ class ConsumptionFormatterService { const filledData = []; let parsingDate = timePeriod.startDate; + let endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + const dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate)); const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : { date: parsingDate, @@ -93642,7 +93660,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -93818,7 +93835,7 @@ class DateChartService { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -94417,7 +94434,17 @@ class QueryRunner { buildFirstDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -94428,7 +94455,17 @@ class QueryRunner { buildLastDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -94451,17 +94488,31 @@ class QueryRunner { return result; } - filterDataList(data, timePeriod) { - const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + filterDataList(data, timePeriod, timeStep) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + + const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod)); return filteredResult; } - mapDataList(data) { + mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; const mappedResult = data.map(entry => ({ - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -94518,7 +94569,7 @@ class QueryRunner { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -94650,8 +94701,8 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, timePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, timePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); return mappedResult; } @@ -94682,8 +94733,8 @@ class QueryRunner { } if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0]; @@ -94702,7 +94753,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && _result$data$.year && result !== null && result !== void 0 && (_result$data$2 = result.data[0]) !== null && _result$data$2 !== void 0 && _result$data$2.month && (result === null || result === void 0 ? void 0 : (_result$data$3 = result.data[0]) === null || _result$data$3 === void 0 ? void 0 : _result$data$3.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94717,7 +94768,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$4 = result.data[0]) !== null && _result$data$4 !== void 0 && _result$data$4.year && result !== null && result !== void 0 && (_result$data$5 = result.data[0]) !== null && _result$data$5 !== void 0 && _result$data$5.month && (result === null || result === void 0 ? void 0 : (_result$data$6 = result.data[0]) === null || _result$data$6 === void 0 ? void 0 : _result$data$6.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94729,7 +94780,7 @@ class QueryRunner { const doctype = this.getRelevantDoctype(fluidType, timeStep); try { - const query = (0, _cozyClient.Q)(doctype).where({}); + const query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); const result = await this._client.query(query); return result; } catch (error) { @@ -94750,113 +94801,10 @@ exports.default = QueryRunner; /* 730 */, /* 731 */, /* 732 */, -/* 733 */ -/***/ (function(module, exports) { - -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example - * - * function isEven(n) { - * return n % 2 == 0; - * } - * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] - */ -function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - switch (args.length) { - case 0: return !predicate.call(this); - case 1: return !predicate.call(this, args[0]); - case 2: return !predicate.call(this, args[0], args[1]); - case 3: return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; -} - -module.exports = negate; - - -/***/ }), +/* 733 */, /* 734 */, /* 735 */, -/* 736 */ -/***/ (function(module, exports, __webpack_require__) { - -var arrayMap = __webpack_require__(172), - baseIteratee = __webpack_require__(101), - baseMap = __webpack_require__(395), - isArray = __webpack_require__(87); - -/** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ -function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, baseIteratee(iteratee, 3)); -} - -module.exports = map; - - -/***/ }), +/* 736 */, /* 737 */, /* 738 */, /* 739 */, @@ -94889,44 +94837,7 @@ module.exports = map; /* 766 */, /* 767 */, /* 768 */, -/* 769 */ -/***/ (function(module, exports, __webpack_require__) { - -var isSymbol = __webpack_require__(166); - -/** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ -function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if (current != null && (computed === undefined - ? (current === current && !isSymbol(current)) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; -} - -module.exports = baseExtremum; - - -/***/ }), +/* 769 */, /* 770 */, /* 771 */, /* 772 */, @@ -95055,7 +94966,48 @@ module.exports = baseExtremum; /* 895 */, /* 896 */, /* 897 */, -/* 898 */, +/* 898 */ +/***/ (function(module, exports, __webpack_require__) { + +var baseClone = __webpack_require__(214); + +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; + +/** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ +function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); +} + +module.exports = clone; + + +/***/ }), /* 899 */, /* 900 */, /* 901 */, @@ -95068,10 +95020,113 @@ module.exports = baseExtremum; /* 908 */, /* 909 */, /* 910 */, -/* 911 */, +/* 911 */ +/***/ (function(module, exports) { + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ +function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; +} + +module.exports = negate; + + +/***/ }), /* 912 */, /* 913 */, -/* 914 */, +/* 914 */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayMap = __webpack_require__(172), + baseIteratee = __webpack_require__(101), + baseMap = __webpack_require__(395), + isArray = __webpack_require__(87); + +/** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, baseIteratee(iteratee, 3)); +} + +module.exports = map; + + +/***/ }), /* 915 */, /* 916 */, /* 917 */, @@ -95104,50 +95159,46 @@ module.exports = baseExtremum; /* 944 */, /* 945 */, /* 946 */, -/* 947 */, -/* 948 */, -/* 949 */ +/* 947 */ /***/ (function(module, exports, __webpack_require__) { -var baseClone = __webpack_require__(214); - -/** Used to compose bitmasks for cloning. */ -var CLONE_SYMBOLS_FLAG = 4; +var isSymbol = __webpack_require__(166); /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. */ -function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; } -module.exports = clone; +module.exports = baseExtremum; /***/ }), +/* 948 */, +/* 949 */, /* 950 */, /* 951 */, /* 952 */, @@ -96720,7 +96771,7 @@ class EnvironmentService { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com'; } else { - return 'https://ecolyo-agent-rec.grandlyon.com'; + return 'https://ecolyo-agent-rec.apps.grandlyon.com'; } } @@ -97021,7 +97072,7 @@ var _reduce2 = _interopRequireDefault(__webpack_require__(1154)); var _omit2 = _interopRequireDefault(__webpack_require__(286)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _identity2 = _interopRequireDefault(__webpack_require__(177)); @@ -150703,7 +150754,7 @@ module.exports = {}; module.exports = { 'ary': __webpack_require__(1425), 'assign': __webpack_require__(216), - 'clone': __webpack_require__(949), + 'clone': __webpack_require__(898), 'curry': __webpack_require__(1446), 'forEach': __webpack_require__(206), 'isArray': __webpack_require__(87), @@ -151968,7 +152019,7 @@ module.exports = toPath; /***/ (function(module, exports, __webpack_require__) { var convert = __webpack_require__(1420), - func = convert('map', __webpack_require__(736)); + func = convert('map', __webpack_require__(914)); func.placeholder = __webpack_require__(1423); module.exports = func; @@ -154423,11 +154474,11 @@ var _isFunction2 = _interopRequireDefault(__webpack_require__(66)); var _isNil2 = _interopRequireDefault(__webpack_require__(1469)); -var _negate2 = _interopRequireDefault(__webpack_require__(733)); +var _negate2 = _interopRequireDefault(__webpack_require__(911)); var _reduce2 = _interopRequireDefault(__webpack_require__(1154)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _preview = _interopRequireDefault(__webpack_require__(1501)); @@ -154548,7 +154599,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.buildFontsTags = buildFontsTags; -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _forEach2 = _interopRequireDefault(__webpack_require__(205)); @@ -154594,7 +154645,7 @@ exports.default = buildMediaQueriesTags; var _isEmpty2 = _interopRequireDefault(__webpack_require__(490)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); // eslint-disable-next-line import/prefer-default-export function buildMediaQueriesTags(breakpoint, mediaQueries = {}, forceOWADesktop = false) { @@ -155918,7 +155969,7 @@ var _createSuper2 = _interopRequireDefault(__webpack_require__(1152)); var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _min2 = _interopRequireDefault(__webpack_require__(1519)); @@ -156281,7 +156332,7 @@ module.exports = exports.default; /* 1519 */ /***/ (function(module, exports, __webpack_require__) { -var baseExtremum = __webpack_require__(769), +var baseExtremum = __webpack_require__(947), baseLt = __webpack_require__(1520), identity = __webpack_require__(177); diff --git a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js index 0c73904671f566575cbd8e0f31f0ca7859ad8695..83617ba9dacb05081770c93422ae96865649c809 100644 --- a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js +++ b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js @@ -93032,18 +93032,25 @@ class ConsumptionDataManager { return result; } + async getExportableFluids(fluidTypes, timeStep) { + const exportableFluids = []; + + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType); + } + } + + return exportableFluids; + } + async fetchAllFirstDateData(fluidTypes, timeStep) { let firstDay = null; const firstDays = []; - if (fluidTypes.length === 1) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep)) || null; + for (const fluidType of fluidTypes) { + firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; firstDays.push(firstDay); - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; - firstDays.push(firstDay); - } } return firstDays; @@ -93318,9 +93325,20 @@ class ConsumptionFormatterService { const filledData = []; let parsingDate = timePeriod.startDate; + let endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + const dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate)); const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : { date: parsingDate, @@ -93553,7 +93571,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -93729,7 +93746,7 @@ class DateChartService { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -94328,7 +94345,17 @@ class QueryRunner { buildFirstDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -94339,7 +94366,17 @@ class QueryRunner { buildLastDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -94362,17 +94399,31 @@ class QueryRunner { return result; } - filterDataList(data, timePeriod) { - const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + filterDataList(data, timePeriod, timeStep) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + + const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod)); return filteredResult; } - mapDataList(data) { + mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; const mappedResult = data.map(entry => ({ - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -94429,7 +94480,7 @@ class QueryRunner { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -94561,8 +94612,8 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, timePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, timePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); return mappedResult; } @@ -94593,8 +94644,8 @@ class QueryRunner { } if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0]; @@ -94613,7 +94664,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && _result$data$.year && result !== null && result !== void 0 && (_result$data$2 = result.data[0]) !== null && _result$data$2 !== void 0 && _result$data$2.month && (result === null || result === void 0 ? void 0 : (_result$data$3 = result.data[0]) === null || _result$data$3 === void 0 ? void 0 : _result$data$3.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94628,7 +94679,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$4 = result.data[0]) !== null && _result$data$4 !== void 0 && _result$data$4.year && result !== null && result !== void 0 && (_result$data$5 = result.data[0]) !== null && _result$data$5 !== void 0 && _result$data$5.month && (result === null || result === void 0 ? void 0 : (_result$data$6 = result.data[0]) === null || _result$data$6 === void 0 ? void 0 : _result$data$6.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94640,7 +94691,7 @@ class QueryRunner { const doctype = this.getRelevantDoctype(fluidType, timeStep); try { - const query = (0, _cozyClient.Q)(doctype).where({}); + const query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); const result = await this._client.query(query); return result; } catch (error) { diff --git a/services/fluidsPrices/ecolyo.js b/services/fluidsPrices/ecolyo.js index 7ab46c40fc1d224d69dacb1ea3c86b6758011ac8..3c79a4725e9535c26949cb364067fc770268a0f1 100644 --- a/services/fluidsPrices/ecolyo.js +++ b/services/fluidsPrices/ecolyo.js @@ -93032,18 +93032,25 @@ class ConsumptionDataManager { return result; } + async getExportableFluids(fluidTypes, timeStep) { + const exportableFluids = []; + + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType); + } + } + + return exportableFluids; + } + async fetchAllFirstDateData(fluidTypes, timeStep) { let firstDay = null; const firstDays = []; - if (fluidTypes.length === 1) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep)) || null; + for (const fluidType of fluidTypes) { + firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; firstDays.push(firstDay); - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; - firstDays.push(firstDay); - } } return firstDays; @@ -93318,9 +93325,20 @@ class ConsumptionFormatterService { const filledData = []; let parsingDate = timePeriod.startDate; + let endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + const dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate)); const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : { date: parsingDate, @@ -93553,7 +93571,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -93729,7 +93746,7 @@ class DateChartService { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -94328,7 +94345,17 @@ class QueryRunner { buildFirstDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -94339,7 +94366,17 @@ class QueryRunner { buildLastDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -94362,17 +94399,31 @@ class QueryRunner { return result; } - filterDataList(data, timePeriod) { - const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + filterDataList(data, timePeriod, timeStep) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + + const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod)); return filteredResult; } - mapDataList(data) { + mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; const mappedResult = data.map(entry => ({ - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -94429,7 +94480,7 @@ class QueryRunner { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -94561,8 +94612,8 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, timePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, timePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); return mappedResult; } @@ -94593,8 +94644,8 @@ class QueryRunner { } if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0]; @@ -94613,7 +94664,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && _result$data$.year && result !== null && result !== void 0 && (_result$data$2 = result.data[0]) !== null && _result$data$2 !== void 0 && _result$data$2.month && (result === null || result === void 0 ? void 0 : (_result$data$3 = result.data[0]) === null || _result$data$3 === void 0 ? void 0 : _result$data$3.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94628,7 +94679,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$4 = result.data[0]) !== null && _result$data$4 !== void 0 && _result$data$4.year && result !== null && result !== void 0 && (_result$data$5 = result.data[0]) !== null && _result$data$5 !== void 0 && _result$data$5.month && (result === null || result === void 0 ? void 0 : (_result$data$6 = result.data[0]) === null || _result$data$6 === void 0 ? void 0 : _result$data$6.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94640,7 +94691,7 @@ class QueryRunner { const doctype = this.getRelevantDoctype(fluidType, timeStep); try { - const query = (0, _cozyClient.Q)(doctype).where({}); + const query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); const result = await this._client.query(query); return result; } catch (error) { @@ -95095,7 +95146,7 @@ class EnvironmentService { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com'; } else { - return 'https://ecolyo-agent-rec.grandlyon.com'; + return 'https://ecolyo-agent-rec.apps.grandlyon.com'; } } diff --git a/services/monthlyReportNotification/ecolyo.js b/services/monthlyReportNotification/ecolyo.js index 33019b1f0e806b39396f8981bae72682bcf4a87a..311207e55e8f46724d0394bc77a7f0f5b56ee853 100644 --- a/services/monthlyReportNotification/ecolyo.js +++ b/services/monthlyReportNotification/ecolyo.js @@ -93121,18 +93121,25 @@ class ConsumptionDataManager { return result; } + async getExportableFluids(fluidTypes, timeStep) { + const exportableFluids = []; + + for (const fluidType of fluidTypes) { + if (await this.checkDoctypeEntries(fluidType, timeStep)) { + exportableFluids.push(fluidType); + } + } + + return exportableFluids; + } + async fetchAllFirstDateData(fluidTypes, timeStep) { let firstDay = null; const firstDays = []; - if (fluidTypes.length === 1) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidTypes[0], timeStep)) || null; + for (const fluidType of fluidTypes) { + firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; firstDays.push(firstDay); - } else if (fluidTypes.length > 1) { - for (const fluidType of fluidTypes) { - firstDay = (await this._queryRunnerService.getFirstDateData(fluidType, timeStep)) || null; - firstDays.push(firstDay); - } } return firstDays; @@ -93407,9 +93414,20 @@ class ConsumptionFormatterService { const filledData = []; let parsingDate = timePeriod.startDate; + let endDate = timePeriod.endDate; + + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + parsingDate = parsingDate.minus({ + minutes: 30 + }); + endDate = endDate.minus({ + minutes: 30 + }); + } + const dateChartService = new _dateChart.default(); - while (parsingDate <= timePeriod.endDate) { + while (parsingDate <= endDate) { const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate)); const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : { date: parsingDate, @@ -93642,7 +93660,6 @@ exports.FluidState = FluidState; FluidState[FluidState["DONE"] = 200] = "DONE"; FluidState[FluidState["ERROR"] = 300] = "ERROR"; FluidState[FluidState["ERROR_LOGIN_FAILED"] = 301] = "ERROR_LOGIN_FAILED"; - FluidState[FluidState["PARTNER_ISSUE"] = 500] = "PARTNER_ISSUE"; })(FluidState || (exports.FluidState = FluidState = {})); /***/ }), @@ -93818,7 +93835,7 @@ class DateChartService { return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day; case _timeStep.TimeStep.HALF_AN_HOUR: - return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30; + return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) === 0; default: throw new Error('TimeStep unknown'); @@ -94417,7 +94434,17 @@ class QueryRunner { buildFirstDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'asc' }, { month: 'asc' @@ -94428,7 +94455,17 @@ class QueryRunner { buildLastDateQuery(fluidType, limit, timeStep) { const doctype = this.getRelevantDoctype(fluidType, timeStep || _timeStep.TimeStep.DAY); - return (0, _cozyClient.Q)(doctype).where({}).indexFields(['year', 'month', 'day']).sortBy([{ + return (0, _cozyClient.Q)(doctype).where({ + year: { + $ne: null + }, + month: { + $ne: null + }, + day: { + $ne: null + } + }).indexFields(['year', 'month', 'day']).sortBy([{ year: 'desc' }, { month: 'desc' @@ -94451,17 +94488,31 @@ class QueryRunner { return result; } - filterDataList(data, timePeriod) { - const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day).setZone('utc', { + filterDataList(data, timePeriod, timeStep) { + // increase timeperiod range because the last data for a day is actually stored the next day at 00:00 + if (timeStep === _timeStep.TimeStep.HALF_AN_HOUR) { + timePeriod.startDate = timePeriod.startDate.plus({ + minutes: 30 + }); + timePeriod.endDate = timePeriod.endDate.plus({ + minutes: 30 + }); + } + + const filteredResult = data.data.filter(entry => this.withinDateBoundaries(_luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true }), timePeriod)); return filteredResult; } - mapDataList(data) { + mapDataList(data, timeStep) { + // set back every half hour data at -30 minutes so it is displayed as 23:30 instead of 00:00 etc.. + const minusValue = timeStep === _timeStep.TimeStep.HALF_AN_HOUR ? 30 : 0; const mappedResult = data.map(entry => ({ - date: _luxon.DateTime.local(entry.year, entry.month == 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', { + date: _luxon.DateTime.local(entry.year, entry.month || 1, entry.day || 1, entry.hour, entry.minute).setZone('utc', { keepLocalTime: true + }).minus({ + minutes: minusValue }), value: entry.load, state: _dataload.DataloadState.VALID, @@ -94518,7 +94569,7 @@ class QueryRunner { $eq: timePeriod.startDate.month }, day: { - $eq: timePeriod.startDate.day + $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1] } }; break; @@ -94650,8 +94701,8 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, timePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, timePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); return mappedResult; } @@ -94682,8 +94733,8 @@ class QueryRunner { } if (result !== null && result !== void 0 && result.data) { - const filteredResult = this.filterDataList(result, maxTimePeriod); - const mappedResult = this.mapDataList(filteredResult); + const filteredResult = this.filterDataList(result, maxTimePeriod, timeStep); + const mappedResult = this.mapDataList(filteredResult, timeStep); if (withDate) { return mappedResult && mappedResult[0] && mappedResult[0]; @@ -94702,7 +94753,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$ = result.data[0]) !== null && _result$data$ !== void 0 && _result$data$.year && result !== null && result !== void 0 && (_result$data$2 = result.data[0]) !== null && _result$data$2 !== void 0 && _result$data$2.month && (result === null || result === void 0 ? void 0 : (_result$data$3 = result.data[0]) === null || _result$data$3 === void 0 ? void 0 : _result$data$3.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94717,7 +94768,7 @@ class QueryRunner { const result = await this.fetchData(query); if (result !== null && result !== void 0 && (_result$data$4 = result.data[0]) !== null && _result$data$4 !== void 0 && _result$data$4.year && result !== null && result !== void 0 && (_result$data$5 = result.data[0]) !== null && _result$data$5 !== void 0 && _result$data$5.month && (result === null || result === void 0 ? void 0 : (_result$data$6 = result.data[0]) === null || _result$data$6 === void 0 ? void 0 : _result$data$6.day) >= 0) { - return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day === 0 ? 1 : result.data[0].day, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { + return _luxon.DateTime.local(result.data[0].year, result.data[0].month, result.data[0].day || 1, result.data[0].hour || 0, result.data[0].minute || 0).setZone('utc', { keepLocalTime: true }); } @@ -94729,7 +94780,7 @@ class QueryRunner { const doctype = this.getRelevantDoctype(fluidType, timeStep); try { - const query = (0, _cozyClient.Q)(doctype).where({}); + const query = (0, _cozyClient.Q)(doctype).where({}).limitBy(1); const result = await this._client.query(query); return result; } catch (error) { @@ -94750,113 +94801,10 @@ exports.default = QueryRunner; /* 730 */, /* 731 */, /* 732 */, -/* 733 */ -/***/ (function(module, exports) { - -/** Error message constants. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** - * Creates a function that negates the result of the predicate `func`. The - * `func` predicate is invoked with the `this` binding and arguments of the - * created function. - * - * @static - * @memberOf _ - * @since 3.0.0 - * @category Function - * @param {Function} predicate The predicate to negate. - * @returns {Function} Returns the new negated function. - * @example - * - * function isEven(n) { - * return n % 2 == 0; - * } - * - * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); - * // => [1, 3, 5] - */ -function negate(predicate) { - if (typeof predicate != 'function') { - throw new TypeError(FUNC_ERROR_TEXT); - } - return function() { - var args = arguments; - switch (args.length) { - case 0: return !predicate.call(this); - case 1: return !predicate.call(this, args[0]); - case 2: return !predicate.call(this, args[0], args[1]); - case 3: return !predicate.call(this, args[0], args[1], args[2]); - } - return !predicate.apply(this, args); - }; -} - -module.exports = negate; - - -/***/ }), +/* 733 */, /* 734 */, /* 735 */, -/* 736 */ -/***/ (function(module, exports, __webpack_require__) { - -var arrayMap = __webpack_require__(172), - baseIteratee = __webpack_require__(101), - baseMap = __webpack_require__(395), - isArray = __webpack_require__(87); - -/** - * Creates an array of values by running each element in `collection` thru - * `iteratee`. The iteratee is invoked with three arguments: - * (value, index|key, collection). - * - * Many lodash methods are guarded to work as iteratees for methods like - * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. - * - * The guarded methods are: - * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, - * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, - * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, - * `template`, `trim`, `trimEnd`, `trimStart`, and `words` - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Collection - * @param {Array|Object} collection The collection to iterate over. - * @param {Function} [iteratee=_.identity] The function invoked per iteration. - * @returns {Array} Returns the new mapped array. - * @example - * - * function square(n) { - * return n * n; - * } - * - * _.map([4, 8], square); - * // => [16, 64] - * - * _.map({ 'a': 4, 'b': 8 }, square); - * // => [16, 64] (iteration order is not guaranteed) - * - * var users = [ - * { 'user': 'barney' }, - * { 'user': 'fred' } - * ]; - * - * // The `_.property` iteratee shorthand. - * _.map(users, 'user'); - * // => ['barney', 'fred'] - */ -function map(collection, iteratee) { - var func = isArray(collection) ? arrayMap : baseMap; - return func(collection, baseIteratee(iteratee, 3)); -} - -module.exports = map; - - -/***/ }), +/* 736 */, /* 737 */, /* 738 */, /* 739 */, @@ -94889,44 +94837,7 @@ module.exports = map; /* 766 */, /* 767 */, /* 768 */, -/* 769 */ -/***/ (function(module, exports, __webpack_require__) { - -var isSymbol = __webpack_require__(166); - -/** - * The base implementation of methods like `_.max` and `_.min` which accepts a - * `comparator` to determine the extremum value. - * - * @private - * @param {Array} array The array to iterate over. - * @param {Function} iteratee The iteratee invoked per iteration. - * @param {Function} comparator The comparator used to compare values. - * @returns {*} Returns the extremum value. - */ -function baseExtremum(array, iteratee, comparator) { - var index = -1, - length = array.length; - - while (++index < length) { - var value = array[index], - current = iteratee(value); - - if (current != null && (computed === undefined - ? (current === current && !isSymbol(current)) - : comparator(current, computed) - )) { - var computed = current, - result = value; - } - } - return result; -} - -module.exports = baseExtremum; - - -/***/ }), +/* 769 */, /* 770 */, /* 771 */, /* 772 */, @@ -95055,7 +94966,48 @@ module.exports = baseExtremum; /* 895 */, /* 896 */, /* 897 */, -/* 898 */, +/* 898 */ +/***/ (function(module, exports, __webpack_require__) { + +var baseClone = __webpack_require__(214); + +/** Used to compose bitmasks for cloning. */ +var CLONE_SYMBOLS_FLAG = 4; + +/** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ +function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); +} + +module.exports = clone; + + +/***/ }), /* 899 */, /* 900 */, /* 901 */, @@ -95068,10 +95020,113 @@ module.exports = baseExtremum; /* 908 */, /* 909 */, /* 910 */, -/* 911 */, +/* 911 */ +/***/ (function(module, exports) { + +/** Error message constants. */ +var FUNC_ERROR_TEXT = 'Expected a function'; + +/** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ +function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; +} + +module.exports = negate; + + +/***/ }), /* 912 */, /* 913 */, -/* 914 */, +/* 914 */ +/***/ (function(module, exports, __webpack_require__) { + +var arrayMap = __webpack_require__(172), + baseIteratee = __webpack_require__(101), + baseMap = __webpack_require__(395), + isArray = __webpack_require__(87); + +/** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ +function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, baseIteratee(iteratee, 3)); +} + +module.exports = map; + + +/***/ }), /* 915 */, /* 916 */, /* 917 */, @@ -95104,50 +95159,46 @@ module.exports = baseExtremum; /* 944 */, /* 945 */, /* 946 */, -/* 947 */, -/* 948 */, -/* 949 */ +/* 947 */ /***/ (function(module, exports, __webpack_require__) { -var baseClone = __webpack_require__(214); - -/** Used to compose bitmasks for cloning. */ -var CLONE_SYMBOLS_FLAG = 4; +var isSymbol = __webpack_require__(166); /** - * Creates a shallow clone of `value`. - * - * **Note:** This method is loosely based on the - * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) - * and supports cloning arrays, array buffers, booleans, date objects, maps, - * numbers, `Object` objects, regexes, sets, strings, symbols, and typed - * arrays. The own enumerable properties of `arguments` objects are cloned - * as plain objects. An empty object is returned for uncloneable values such - * as error objects, functions, DOM nodes, and WeakMaps. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to clone. - * @returns {*} Returns the cloned value. - * @see _.cloneDeep - * @example - * - * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. * - * var shallow = _.clone(objects); - * console.log(shallow[0] === objects[0]); - * // => true + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. */ -function clone(value) { - return baseClone(value, CLONE_SYMBOLS_FLAG); +function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; } -module.exports = clone; +module.exports = baseExtremum; /***/ }), +/* 948 */, +/* 949 */, /* 950 */, /* 951 */, /* 952 */, @@ -96720,7 +96771,7 @@ class EnvironmentService { if (!this.isAlpha()) { return 'https://ecolyo-agent.apps.grandlyon.com'; } else { - return 'https://ecolyo-agent-rec.grandlyon.com'; + return 'https://ecolyo-agent-rec.apps.grandlyon.com'; } } @@ -96911,7 +96962,7 @@ var _reduce2 = _interopRequireDefault(__webpack_require__(1154)); var _omit2 = _interopRequireDefault(__webpack_require__(286)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _identity2 = _interopRequireDefault(__webpack_require__(177)); @@ -150593,7 +150644,7 @@ module.exports = {}; module.exports = { 'ary': __webpack_require__(1425), 'assign': __webpack_require__(216), - 'clone': __webpack_require__(949), + 'clone': __webpack_require__(898), 'curry': __webpack_require__(1446), 'forEach': __webpack_require__(206), 'isArray': __webpack_require__(87), @@ -151858,7 +151909,7 @@ module.exports = toPath; /***/ (function(module, exports, __webpack_require__) { var convert = __webpack_require__(1420), - func = convert('map', __webpack_require__(736)); + func = convert('map', __webpack_require__(914)); func.placeholder = __webpack_require__(1423); module.exports = func; @@ -154313,11 +154364,11 @@ var _isFunction2 = _interopRequireDefault(__webpack_require__(66)); var _isNil2 = _interopRequireDefault(__webpack_require__(1469)); -var _negate2 = _interopRequireDefault(__webpack_require__(733)); +var _negate2 = _interopRequireDefault(__webpack_require__(911)); var _reduce2 = _interopRequireDefault(__webpack_require__(1154)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _preview = _interopRequireDefault(__webpack_require__(1501)); @@ -154438,7 +154489,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.buildFontsTags = buildFontsTags; -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _forEach2 = _interopRequireDefault(__webpack_require__(205)); @@ -154484,7 +154535,7 @@ exports.default = buildMediaQueriesTags; var _isEmpty2 = _interopRequireDefault(__webpack_require__(490)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); // eslint-disable-next-line import/prefer-default-export function buildMediaQueriesTags(breakpoint, mediaQueries = {}, forceOWADesktop = false) { @@ -155808,7 +155859,7 @@ var _createSuper2 = _interopRequireDefault(__webpack_require__(1152)); var _defineProperty2 = _interopRequireDefault(__webpack_require__(2)); -var _map2 = _interopRequireDefault(__webpack_require__(736)); +var _map2 = _interopRequireDefault(__webpack_require__(914)); var _min2 = _interopRequireDefault(__webpack_require__(1519)); @@ -156171,7 +156222,7 @@ module.exports = exports.default; /* 1519 */ /***/ (function(module, exports, __webpack_require__) { -var baseExtremum = __webpack_require__(769), +var baseExtremum = __webpack_require__(947), baseLt = __webpack_require__(1520), identity = __webpack_require__(177); diff --git a/vendors/ecolyo.0406c2464c616499bece.js b/vendors/ecolyo.71f31ccb2e4e3905e912.js similarity index 96% rename from vendors/ecolyo.0406c2464c616499bece.js rename to vendors/ecolyo.71f31ccb2e4e3905e912.js index 763637bafedb59cf5ad81ee0ef0ec46cf305c49e..4b7806afaacfc9d9e06d35b2f2f9f5542156a629 100644 --- a/vendors/ecolyo.0406c2464c616499bece.js +++ b/vendors/ecolyo.71f31ccb2e4e3905e912.js @@ -999,13 +999,6 @@ var Backdrop = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["forwardRef"](fun /***/ }), -/***/ "+JPL": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("+SFK"), __esModule: true }; - -/***/ }), - /***/ "+JwS": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -1623,18 +1616,6 @@ function baseMerge(object, source, srcIndex, customizer, stack) { module.exports = baseMerge; -/***/ }), - -/***/ "+SFK": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("AUvm"); -__webpack_require__("wgeU"); -__webpack_require__("adOz"); -__webpack_require__("dl0q"); -module.exports = __webpack_require__("WEpk").Symbol; - - /***/ }), /***/ "+Tez": @@ -2294,15 +2275,6 @@ __webpack_require__("OGtf")('blink', function (createHTML) { }); -/***/ }), - -/***/ "+plK": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("ApPD"); -module.exports = __webpack_require__("WEpk").Object.getPrototypeOf; - - /***/ }), /***/ "+qE3": @@ -24776,25 +24748,6 @@ function formControlState(_ref) { }, {}); } -/***/ }), - -/***/ "29s/": -/***/ (function(module, exports, __webpack_require__) { - -var core = __webpack_require__("WEpk"); -var global = __webpack_require__("5T2Y"); -var SHARED = '__core-js_shared__'; -var store = global[SHARED] || (global[SHARED] = {}); - -(module.exports = function (key, value) { - return store[key] || (store[key] = value !== undefined ? value : {}); -})('versions', []).push({ - version: core.version, - mode: __webpack_require__("uOPS") ? 'pure' : 'global', - copyright: '© 2020 Denis Pushkarev (zloirock.ru)' -}); - - /***/ }), /***/ "2Bbb": @@ -25088,16 +25041,6 @@ function buildDistanceInWordsLocale () { module.exports = buildDistanceInWordsLocale -/***/ }), - -/***/ "2Nb0": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("FlQf"); -__webpack_require__("bBy9"); -module.exports = __webpack_require__("zLkG").f('iterator'); - - /***/ }), /***/ "2O0U": @@ -29358,18 +29301,6 @@ function toSource(func) { module.exports = toSource; -/***/ }), - -/***/ "3GJH": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("lCc8"); -var $Object = __webpack_require__("WEpk").Object; -module.exports = function create(P, D) { - return $Object.create(P, D); -}; - - /***/ }), /***/ "3Gsn": @@ -42016,30 +41947,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "5vMV": -/***/ (function(module, exports, __webpack_require__) { - -var has = __webpack_require__("B+OT"); -var toIObject = __webpack_require__("NsO/"); -var arrayIndexOf = __webpack_require__("W070")(false); -var IE_PROTO = __webpack_require__("VVlx")('IE_PROTO'); - -module.exports = function (object, names) { - var O = toIObject(object); - var i = 0; - var result = []; - var key; - for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while (names.length > i) if (has(O, key = names[i++])) { - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; - - /***/ }), /***/ "5vvW": @@ -43089,66 +42996,6 @@ var common = { }; /* harmony default export */ __webpack_exports__["default"] = (common); -/***/ }), - -/***/ "6/1s": -/***/ (function(module, exports, __webpack_require__) { - -var META = __webpack_require__("YqAc")('meta'); -var isObject = __webpack_require__("93I4"); -var has = __webpack_require__("B+OT"); -var setDesc = __webpack_require__("2faE").f; -var id = 0; -var isExtensible = Object.isExtensible || function () { - return true; -}; -var FREEZE = !__webpack_require__("KUxP")(function () { - return isExtensible(Object.preventExtensions({})); -}); -var setMeta = function (it) { - setDesc(it, META, { value: { - i: 'O' + ++id, // object ID - w: {} // weak collections IDs - } }); -}; -var fastKey = function (it, create) { - // return primitive with prefix - if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return 'F'; - // not necessary to add metadata - if (!create) return 'E'; - // add missing metadata - setMeta(it); - // return object ID - } return it[META].i; -}; -var getWeak = function (it, create) { - if (!has(it, META)) { - // can't set metadata to uncaught frozen object - if (!isExtensible(it)) return true; - // not necessary to add metadata - if (!create) return false; - // add missing metadata - setMeta(it); - // return hash weak collections IDs - } return it[META].w; -}; -// add metadata on freeze-family methods calling -var onFreeze = function (it) { - if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); - return it; -}; -var meta = module.exports = { - KEY: META, - NEED: false, - fastKey: fastKey, - getWeak: getWeak, - onFreeze: onFreeze -}; - - /***/ }), /***/ "61xn": @@ -48451,38 +48298,6 @@ function isPrototype(value) { module.exports = isPrototype; -/***/ }), - -/***/ "6tYh": -/***/ (function(module, exports, __webpack_require__) { - -// Works with __proto__ only. Old v8 can't work with null proto objects. -/* eslint-disable no-proto */ -var isObject = __webpack_require__("93I4"); -var anObject = __webpack_require__("5K7Z"); -var check = function (O, proto) { - anObject(O); - if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); -}; -module.exports = { - set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line - function (test, buggy, set) { - try { - set = __webpack_require__("2GTP")(Function.call, __webpack_require__("vwuL").f(Object.prototype, '__proto__').set, 2); - set(test, []); - buggy = !(test instanceof Array); - } catch (e) { buggy = true; } - return function setPrototypeOf(O, proto) { - check(O, proto); - if (buggy) O.__proto__ = proto; - else set(O, proto); - return O; - }; - }({}, false) : undefined), - check: check -}; - - /***/ }), /***/ "6txh": @@ -65294,32 +65109,6 @@ module.exports = function (S, index, unicode) { }; -/***/ }), - -/***/ "A5Xg": -/***/ (function(module, exports, __webpack_require__) { - -// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window -var toIObject = __webpack_require__("NsO/"); -var gOPN = __webpack_require__("ar/p").f; -var toString = {}.toString; - -var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames - ? Object.getOwnPropertyNames(window) : []; - -var getWindowNames = function (it) { - try { - return gOPN(it); - } catch (e) { - return windowNames.slice(); - } -}; - -module.exports.f = function getOwnPropertyNames(it) { - return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); -}; - - /***/ }), /***/ "A6C3": @@ -70125,260 +69914,6 @@ __webpack_require__.r(__webpack_exports__); }); -/***/ }), - -/***/ "AUvm": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// ECMAScript 6 symbols shim -var global = __webpack_require__("5T2Y"); -var has = __webpack_require__("B+OT"); -var DESCRIPTORS = __webpack_require__("jmDH"); -var $export = __webpack_require__("Y7ZC"); -var redefine = __webpack_require__("kTiW"); -var META = __webpack_require__("6/1s").KEY; -var $fails = __webpack_require__("KUxP"); -var shared = __webpack_require__("29s/"); -var setToStringTag = __webpack_require__("RfKB"); -var uid = __webpack_require__("YqAc"); -var wks = __webpack_require__("UWiX"); -var wksExt = __webpack_require__("zLkG"); -var wksDefine = __webpack_require__("Zxgi"); -var enumKeys = __webpack_require__("R+7+"); -var isArray = __webpack_require__("kAMH"); -var anObject = __webpack_require__("5K7Z"); -var isObject = __webpack_require__("93I4"); -var toObject = __webpack_require__("JB68"); -var toIObject = __webpack_require__("NsO/"); -var toPrimitive = __webpack_require__("G8Mo"); -var createDesc = __webpack_require__("rr1i"); -var _create = __webpack_require__("oVml"); -var gOPNExt = __webpack_require__("A5Xg"); -var $GOPD = __webpack_require__("vwuL"); -var $GOPS = __webpack_require__("mqlF"); -var $DP = __webpack_require__("2faE"); -var $keys = __webpack_require__("w6GO"); -var gOPD = $GOPD.f; -var dP = $DP.f; -var gOPN = gOPNExt.f; -var $Symbol = global.Symbol; -var $JSON = global.JSON; -var _stringify = $JSON && $JSON.stringify; -var PROTOTYPE = 'prototype'; -var HIDDEN = wks('_hidden'); -var TO_PRIMITIVE = wks('toPrimitive'); -var isEnum = {}.propertyIsEnumerable; -var SymbolRegistry = shared('symbol-registry'); -var AllSymbols = shared('symbols'); -var OPSymbols = shared('op-symbols'); -var ObjectProto = Object[PROTOTYPE]; -var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; -var QObject = global.QObject; -// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 -var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; - -// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 -var setSymbolDesc = DESCRIPTORS && $fails(function () { - return _create(dP({}, 'a', { - get: function () { return dP(this, 'a', { value: 7 }).a; } - })).a != 7; -}) ? function (it, key, D) { - var protoDesc = gOPD(ObjectProto, key); - if (protoDesc) delete ObjectProto[key]; - dP(it, key, D); - if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); -} : dP; - -var wrap = function (tag) { - var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); - sym._k = tag; - return sym; -}; - -var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { - return typeof it == 'symbol'; -} : function (it) { - return it instanceof $Symbol; -}; - -var $defineProperty = function defineProperty(it, key, D) { - if (it === ObjectProto) $defineProperty(OPSymbols, key, D); - anObject(it); - key = toPrimitive(key, true); - anObject(D); - if (has(AllSymbols, key)) { - if (!D.enumerable) { - if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); - it[HIDDEN][key] = true; - } else { - if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; - D = _create(D, { enumerable: createDesc(0, false) }); - } return setSymbolDesc(it, key, D); - } return dP(it, key, D); -}; -var $defineProperties = function defineProperties(it, P) { - anObject(it); - var keys = enumKeys(P = toIObject(P)); - var i = 0; - var l = keys.length; - var key; - while (l > i) $defineProperty(it, key = keys[i++], P[key]); - return it; -}; -var $create = function create(it, P) { - return P === undefined ? _create(it) : $defineProperties(_create(it), P); -}; -var $propertyIsEnumerable = function propertyIsEnumerable(key) { - var E = isEnum.call(this, key = toPrimitive(key, true)); - if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; - return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; -}; -var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { - it = toIObject(it); - key = toPrimitive(key, true); - if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; - var D = gOPD(it, key); - if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; - return D; -}; -var $getOwnPropertyNames = function getOwnPropertyNames(it) { - var names = gOPN(toIObject(it)); - var result = []; - var i = 0; - var key; - while (names.length > i) { - if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); - } return result; -}; -var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { - var IS_OP = it === ObjectProto; - var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); - var result = []; - var i = 0; - var key; - while (names.length > i) { - if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); - } return result; -}; - -// 19.4.1.1 Symbol([description]) -if (!USE_NATIVE) { - $Symbol = function Symbol() { - if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); - var tag = uid(arguments.length > 0 ? arguments[0] : undefined); - var $set = function (value) { - if (this === ObjectProto) $set.call(OPSymbols, value); - if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; - setSymbolDesc(this, tag, createDesc(1, value)); - }; - if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); - return wrap(tag); - }; - redefine($Symbol[PROTOTYPE], 'toString', function toString() { - return this._k; - }); - - $GOPD.f = $getOwnPropertyDescriptor; - $DP.f = $defineProperty; - __webpack_require__("ar/p").f = gOPNExt.f = $getOwnPropertyNames; - __webpack_require__("NV0k").f = $propertyIsEnumerable; - $GOPS.f = $getOwnPropertySymbols; - - if (DESCRIPTORS && !__webpack_require__("uOPS")) { - redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); - } - - wksExt.f = function (name) { - return wrap(wks(name)); - }; -} - -$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); - -for (var es6Symbols = ( - // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 - 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' -).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); - -for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); - -$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { - // 19.4.2.1 Symbol.for(key) - 'for': function (key) { - return has(SymbolRegistry, key += '') - ? SymbolRegistry[key] - : SymbolRegistry[key] = $Symbol(key); - }, - // 19.4.2.5 Symbol.keyFor(sym) - keyFor: function keyFor(sym) { - if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); - for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; - }, - useSetter: function () { setter = true; }, - useSimple: function () { setter = false; } -}); - -$export($export.S + $export.F * !USE_NATIVE, 'Object', { - // 19.1.2.2 Object.create(O [, Properties]) - create: $create, - // 19.1.2.4 Object.defineProperty(O, P, Attributes) - defineProperty: $defineProperty, - // 19.1.2.3 Object.defineProperties(O, Properties) - defineProperties: $defineProperties, - // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) - getOwnPropertyDescriptor: $getOwnPropertyDescriptor, - // 19.1.2.7 Object.getOwnPropertyNames(O) - getOwnPropertyNames: $getOwnPropertyNames, - // 19.1.2.8 Object.getOwnPropertySymbols(O) - getOwnPropertySymbols: $getOwnPropertySymbols -}); - -// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives -// https://bugs.chromium.org/p/v8/issues/detail?id=3443 -var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); - -$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { - getOwnPropertySymbols: function getOwnPropertySymbols(it) { - return $GOPS.f(toObject(it)); - } -}); - -// 24.3.2 JSON.stringify(value [, replacer [, space]]) -$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { - var S = $Symbol(); - // MS Edge converts symbol values to JSON as {} - // WebKit converts symbol values to JSON as null - // V8 throws on boxed symbols - return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; -})), 'JSON', { - stringify: function stringify(it) { - var args = [it]; - var i = 1; - var replacer, $replacer; - while (arguments.length > i) args.push(arguments[i++]); - $replacer = replacer = args[1]; - if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined - if (!isArray(replacer)) replacer = function (key, value) { - if (typeof $replacer == 'function') value = $replacer.call(this, key, value); - if (!isSymbol(value)) return value; - }; - args[1] = replacer; - return _stringify.apply($JSON, args); - } -}); - -// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) -$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__("NegM")($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); -// 19.4.3.5 Symbol.prototype[@@toStringTag] -setToStringTag($Symbol, 'Symbol'); -// 20.2.1.9 Math[@@toStringTag] -setToStringTag(Math, 'Math', true); -// 24.3.3 JSON[@@toStringTag] -setToStringTag(global.JSON, 'JSON', true); - - /***/ }), /***/ "AVH9": @@ -70941,22 +70476,6 @@ var yellow = { }; /* harmony default export */ __webpack_exports__["default"] = (yellow); -/***/ }), - -/***/ "ApPD": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 Object.getPrototypeOf(O) -var toObject = __webpack_require__("JB68"); -var $getPrototypeOf = __webpack_require__("U+KD"); - -__webpack_require__("zn7N")('getPrototypeOf', function () { - return function getPrototypeOf(it) { - return $getPrototypeOf(toObject(it)); - }; -}); - - /***/ }), /***/ "AphP": @@ -71513,13 +71032,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "AyUB": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("3GJH"), __esModule: true }; - /***/ }), /***/ "B+OT": @@ -83817,20 +83329,6 @@ module.exports = function regexTester(regex) { }; -/***/ }), - -/***/ "D8kY": -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__("Ojgd"); -var max = Math.max; -var min = Math.min; -module.exports = function (index, length) { - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; - - /***/ }), /***/ "D9MD": @@ -92902,34 +92400,6 @@ var FolderRequest = function FolderRequest(folder) { /***/ }), -/***/ "EJiy": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _iterator = __webpack_require__("F+2o"); - -var _iterator2 = _interopRequireDefault(_iterator); - -var _symbol = __webpack_require__("+JPL"); - -var _symbol2 = _interopRequireDefault(_symbol); - -var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; }; - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) { - return typeof obj === "undefined" ? "undefined" : _typeof(obj); -} : function (obj) { - return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); -}; - -/***/ }), - /***/ "EK0E": /***/ (function(module, exports, __webpack_require__) { @@ -105570,13 +105040,6 @@ function lengthPoint(x, y) { /* harmony default export */ __webpack_exports__["default"] = (lengthStream); -/***/ }), - -/***/ "F+2o": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("2Nb0"), __esModule: true }; - /***/ }), /***/ "F+4+": @@ -107181,30 +106644,6 @@ function setQuarter (dirtyDate, dirtyQuarter) { module.exports = setQuarter -/***/ }), - -/***/ "FYw3": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _typeof2 = __webpack_require__("EJiy"); - -var _typeof3 = _interopRequireDefault(_typeof2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function (self, call) { - if (!self) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self; -}; - /***/ }), /***/ "FZoo": @@ -108766,31 +108205,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "FlQf": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var $at = __webpack_require__("ccE7")(true); - -// 21.1.3.27 String.prototype[@@iterator]() -__webpack_require__("MPFp")(String, 'String', function (iterated) { - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function () { - var O = this._t; - var index = this._i; - var point; - if (index >= O.length) return { value: undefined, done: true }; - point = $at(O, index); - this._i += point.length; - return { value: point, done: false }; -}); - - /***/ }), /***/ "FlsD": @@ -109883,17 +109297,6 @@ var HasManyFiles = /*#__PURE__*/function (_HasMany) { exports.default = HasManyFiles; -/***/ }), - -/***/ "FpHa": -/***/ (function(module, exports) { - -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); - - /***/ }), /***/ "FpZJ": @@ -119740,16 +119143,6 @@ function shallowEqual(objA, objB) { return true; } -/***/ }), - -/***/ "Hfiw": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.3.19 Object.setPrototypeOf(O, proto) -var $export = __webpack_require__("Y7ZC"); -$export($export.S, 'Object', { setPrototypeOf: __webpack_require__("6tYh").set }); - - /***/ }), /***/ "Hg2S": @@ -128682,18 +128075,6 @@ function camelCase() { /* harmony default export */ __webpack_exports__["default"] = (camelCase); -/***/ }), - -/***/ "JB68": -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.13 ToObject(argument) -var defined = __webpack_require__("Jes0"); -module.exports = function (it) { - return Object(defined(it)); -}; - - /***/ }), /***/ "JC6p": @@ -133329,15 +132710,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "JbBM": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("Hfiw"); -module.exports = __webpack_require__("WEpk").Object.setPrototypeOf; - - /***/ }), /***/ "JbSc": @@ -158593,18 +157965,6 @@ __webpack_require__("Xtr8")('getOwnPropertyNames', function () { }); -/***/ }), - -/***/ "Jes0": -/***/ (function(module, exports) { - -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function (it) { - if (it == undefined) throw TypeError("Can't call method on " + it); - return it; -}; - - /***/ }), /***/ "JeuH": @@ -191746,19 +191106,6 @@ var CardActionArea = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["forwardRef name: 'MuiCardActionArea' })(CardActionArea)); -/***/ }), - -/***/ "M1xp": -/***/ (function(module, exports, __webpack_require__) { - -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = __webpack_require__("a0xu"); -// eslint-disable-next-line no-prototype-builtins -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { - return cof(it) == 'String' ? it.split('') : Object(it); -}; - - /***/ }), /***/ "M4Ey": @@ -194772,83 +194119,6 @@ function _classCallCheck(instance, Constructor) { module.exports = _classCallCheck; -/***/ }), - -/***/ "MPFp": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var LIBRARY = __webpack_require__("uOPS"); -var $export = __webpack_require__("Y7ZC"); -var redefine = __webpack_require__("kTiW"); -var hide = __webpack_require__("NegM"); -var Iterators = __webpack_require__("SBuE"); -var $iterCreate = __webpack_require__("j2DC"); -var setToStringTag = __webpack_require__("RfKB"); -var getPrototypeOf = __webpack_require__("U+KD"); -var ITERATOR = __webpack_require__("UWiX")('iterator'); -var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` -var FF_ITERATOR = '@@iterator'; -var KEYS = 'keys'; -var VALUES = 'values'; - -var returnThis = function () { return this; }; - -module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { - $iterCreate(Constructor, NAME, next); - var getMethod = function (kind) { - if (!BUGGY && kind in proto) return proto[kind]; - switch (kind) { - case KEYS: return function keys() { return new Constructor(this, kind); }; - case VALUES: return function values() { return new Constructor(this, kind); }; - } return function entries() { return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator'; - var DEF_VALUES = DEFAULT == VALUES; - var VALUES_BUG = false; - var proto = Base.prototype; - var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; - var $default = $native || getMethod(DEFAULT); - var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; - var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; - var methods, key, IteratorPrototype; - // Fix native - if ($anyNative) { - IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); - if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); - } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if (DEF_VALUES && $native && $native.name !== VALUES) { - VALUES_BUG = true; - $default = function values() { return $native.call(this); }; - } - // Define iterator - if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if (DEFAULT) { - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if (FORCED) for (key in methods) { - if (!(key in proto)) redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; - - /***/ }), /***/ "MPK4": @@ -197698,15 +196968,6 @@ var getSymbols = !nativeGetSymbols ? stubArray : function(object) { module.exports = getSymbols; -/***/ }), - -/***/ "MvwC": -/***/ (function(module, exports, __webpack_require__) { - -var document = __webpack_require__("5T2Y").document; -module.exports = document && document.documentElement; - - /***/ }), /***/ "MwvM": @@ -199174,14 +198435,6 @@ function defaultParentId(d) { }); -/***/ }), - -/***/ "NV0k": -/***/ (function(module, exports) { - -exports.f = {}.propertyIsEnumerable; - - /***/ }), /***/ "NdFi": @@ -200674,19 +199927,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "NsO/": -/***/ (function(module, exports, __webpack_require__) { - -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = __webpack_require__("M1xp"); -var defined = __webpack_require__("Jes0"); -module.exports = function (it) { - return IObject(defined(it)); -}; - - /***/ }), /***/ "Nsbk": @@ -204584,19 +203824,6 @@ var WeakMap = getNative(root, 'WeakMap'); module.exports = WeakMap; -/***/ }), - -/***/ "Ojgd": -/***/ (function(module, exports) { - -// 7.1.4 ToInteger -var ceil = Math.ceil; -var floor = Math.floor; -module.exports = function (it) { - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; - - /***/ }), /***/ "Ok6N": @@ -205722,13 +204949,6 @@ var multiKeyStore = { /***/ }), -/***/ "P2sY": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("UbbE"), __esModule: true }; - -/***/ }), - /***/ "P3dq": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -206491,16 +205711,6 @@ var CipherString = /*#__PURE__*/function () { /***/ }), -/***/ "PDX0": -/***/ (function(module, exports) { - -/* WEBPACK VAR INJECTION */(function(__webpack_amd_options__) {/* globals __webpack_amd_options__ */ -module.exports = __webpack_amd_options__; - -/* WEBPACK VAR INJECTION */}.call(this, {})) - -/***/ }), - /***/ "PFvu": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -210839,36 +210049,6 @@ module.exports = function (Constructor, NAME, next) { }; -/***/ }), - -/***/ "QbLZ": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _assign = __webpack_require__("P2sY"); - -var _assign2 = _interopRequireDefault(_assign); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = _assign2.default || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; -}; - /***/ }), /***/ "QcOe": @@ -211501,28 +210681,6 @@ var Field = /*#__PURE__*/function (_Domain) { return Field; }(_domainBase__WEBPACK_IMPORTED_MODULE_7__["default"]); -/***/ }), - -/***/ "R+7+": -/***/ (function(module, exports, __webpack_require__) { - -// all enumerable object keys, includes symbols -var getKeys = __webpack_require__("w6GO"); -var gOPS = __webpack_require__("mqlF"); -var pIE = __webpack_require__("NV0k"); -module.exports = function (it) { - var result = getKeys(it); - var getSymbols = gOPS.f; - if (getSymbols) { - var symbols = getSymbols(it); - var isEnum = pIE.f; - var i = 0; - var key; - while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); - } return result; -}; - - /***/ }), /***/ "R/W3": @@ -214643,18 +213801,6 @@ function isBrowserBundle() { //# sourceMappingURL=env.js.map -/***/ }), - -/***/ "RU/L": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("Rqdy"); -var $Object = __webpack_require__("WEpk").Object; -module.exports = function defineProperty(it, key, desc) { - return $Object.defineProperty(it, key, desc); -}; - - /***/ }), /***/ "RW0V": @@ -215303,20 +214449,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "RfKB": -/***/ (function(module, exports, __webpack_require__) { - -var def = __webpack_require__("2faE").f; -var has = __webpack_require__("B+OT"); -var TAG = __webpack_require__("UWiX")('toStringTag'); - -module.exports = function (it, tag, stat) { - if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); -}; - - /***/ }), /***/ "RhHs": @@ -215606,16 +214738,6 @@ var amber = { }; /* harmony default export */ __webpack_exports__["default"] = (amber); -/***/ }), - -/***/ "Rqdy": -/***/ (function(module, exports, __webpack_require__) { - -var $export = __webpack_require__("Y7ZC"); -// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) -$export($export.S + $export.F * !__webpack_require__("jmDH"), 'Object', { defineProperty: __webpack_require__("2faE").f }); - - /***/ }), /***/ "RrRF": @@ -216991,14 +216113,6 @@ function _toArray(arr) { module.exports = _toArray, module.exports.__esModule = true, module.exports["default"] = module.exports; -/***/ }), - -/***/ "SBuE": -/***/ (function(module, exports) { - -module.exports = {}; - - /***/ }), /***/ "SC+/": @@ -217070,13 +216184,6 @@ Linear.prototype = { }); -/***/ }), - -/***/ "SEkw": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("RU/L"), __esModule: true }; - /***/ }), /***/ "SGTC": @@ -225976,26 +225083,6 @@ __webpack_require__("qncB")('trim', function ($trim) { }); -/***/ }), - -/***/ "U+KD": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = __webpack_require__("B+OT"); -var toObject = __webpack_require__("JB68"); -var IE_PROTO = __webpack_require__("VVlx")('IE_PROTO'); -var ObjectProto = Object.prototype; - -module.exports = Object.getPrototypeOf || function (O) { - O = toObject(O); - if (has(O, IE_PROTO)) return O[IE_PROTO]; - if (typeof O.constructor == 'function' && O instanceof O.constructor) { - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; - - /***/ }), /***/ "U2H9": @@ -231875,16 +230962,6 @@ function baseTimes(n, iteratee) { module.exports = baseTimes; -/***/ }), - -/***/ "UO39": -/***/ (function(module, exports) { - -module.exports = function (done, value) { - return { value: value, done: !!done }; -}; - - /***/ }), /***/ "UPWK": @@ -232365,24 +231442,6 @@ var makeTypography = function makeTypography(palette) { exports.makeTypography = makeTypography; -/***/ }), - -/***/ "UWiX": -/***/ (function(module, exports, __webpack_require__) { - -var store = __webpack_require__("29s/")('wks'); -var uid = __webpack_require__("YqAc"); -var Symbol = __webpack_require__("5T2Y").Symbol; -var USE_SYMBOL = typeof Symbol == 'function'; - -var $exports = module.exports = function (name) { - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; - -$exports.store = store; - - /***/ }), /***/ "UXlw": @@ -232478,15 +231537,6 @@ module.exports = function Type(x) { }; -/***/ }), - -/***/ "UbbE": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("o8NH"); -module.exports = __webpack_require__("WEpk").Object.assign; - - /***/ }), /***/ "Ud7J": @@ -237312,40 +236362,6 @@ ReplaceTransition.propTypes = false ? undefined : {}; /***/ }), -/***/ "V7oC": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _defineProperty = __webpack_require__("SEkw"); - -var _defineProperty2 = _interopRequireDefault(_defineProperty); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function () { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - (0, _defineProperty2.default)(target, descriptor.key, descriptor); - } - } - - return function (Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); - return Constructor; - }; -}(); - -/***/ }), - /***/ "V8uu": /***/ (function(module, __webpack_exports__, __webpack_require__) { @@ -239508,18 +238524,6 @@ var store = global[SHARED] || (global[SHARED] = {}); }); -/***/ }), - -/***/ "VVlx": -/***/ (function(module, exports, __webpack_require__) { - -var shared = __webpack_require__("29s/")('keys'); -var uid = __webpack_require__("YqAc"); -module.exports = function (key) { - return shared[key] || (shared[key] = uid(key)); -}; - - /***/ }), /***/ "VXJj": @@ -242801,36 +241805,6 @@ function getReportDialogEndpoint(dsnLike, dialogOptions) { } //# sourceMappingURL=api.js.map -/***/ }), - -/***/ "W070": -/***/ (function(module, exports, __webpack_require__) { - -// false -> Array#indexOf -// true -> Array#includes -var toIObject = __webpack_require__("NsO/"); -var toLength = __webpack_require__("tEej"); -var toAbsoluteIndex = __webpack_require__("D8kY"); -module.exports = function (IS_INCLUDES) { - return function ($this, el, fromIndex) { - var O = toIObject($this); - var length = toLength(O.length); - var index = toAbsoluteIndex(fromIndex, length); - var value; - // Array#includes uses SameValueZero equality algorithm - // eslint-disable-next-line no-self-compare - if (IS_INCLUDES && el != el) while (length > index) { - value = O[index++]; - // eslint-disable-next-line no-self-compare - if (value != value) return true; - // Array#indexOf ignores holes, Array#includes - not - } else for (;length > index; index++) if (IS_INCLUDES || index in O) { - if (O[index] === el) return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; - - /***/ }), /***/ "W2Be": @@ -252701,18 +251675,6 @@ __webpack_require__("6VaU"); module.exports = __webpack_require__("g3g5").Array.flatMap; -/***/ }), - -/***/ "YqAc": -/***/ (function(module, exports) { - -var id = 0; -var px = Math.random(); -module.exports = function (key) { - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; - - /***/ }), /***/ "YrTO": @@ -252971,13 +251933,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "Yz+Y": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("+plK"), __esModule: true }; - /***/ }), /***/ "Yz9m": @@ -257203,22 +256158,6 @@ var Login = /*#__PURE__*/function () { return Login; }(); -/***/ }), - -/***/ "Zxgi": -/***/ (function(module, exports, __webpack_require__) { - -var global = __webpack_require__("5T2Y"); -var core = __webpack_require__("WEpk"); -var LIBRARY = __webpack_require__("uOPS"); -var wksExt = __webpack_require__("zLkG"); -var defineProperty = __webpack_require__("2faE").f; -module.exports = function (name) { - var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); - if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); -}; - - /***/ }), /***/ "Zz4T": @@ -257268,18 +256207,6 @@ function genericArray(a, b) { } -/***/ }), - -/***/ "a0xu": -/***/ (function(module, exports) { - -var toString = {}.toString; - -module.exports = function (it) { - return toString.call(it).slice(8, -1); -}; - - /***/ }), /***/ "a1Th": @@ -262085,14 +261012,6 @@ function createCallbackRef(callback) { } -/***/ }), - -/***/ "adOz": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("Zxgi")('asyncIterator'); - - /***/ }), /***/ "adU4": @@ -263972,20 +262891,6 @@ var PasswordGenerationService = /*#__PURE__*/function () { return PasswordGenerationService; }(); -/***/ }), - -/***/ "ar/p": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) -var $keys = __webpack_require__("5vMV"); -var hiddenKeys = __webpack_require__("FpHa").concat('length', 'prototype'); - -exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { - return $keys(O, hiddenKeys); -}; - - /***/ }), /***/ "atdx": @@ -265148,32 +264053,6 @@ $export($export.S + $export.F * __webpack_require__("eeVq")(function () { }); -/***/ }), - -/***/ "bBy9": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("w2d+"); -var global = __webpack_require__("5T2Y"); -var hide = __webpack_require__("NegM"); -var Iterators = __webpack_require__("SBuE"); -var TO_STRING_TAG = __webpack_require__("UWiX")('toStringTag'); - -var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' + - 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' + - 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' + - 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' + - 'TextTrackList,TouchList').split(','); - -for (var i = 0; i < DOMIterables.length; i++) { - var NAME = DOMIterables[i]; - var Collection = global[NAME]; - var proto = Collection && Collection.prototype; - if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = Iterators.Array; -} - - /***/ }), /***/ "bCum": @@ -272570,30 +271449,6 @@ __webpack_require__.r(__webpack_exports__); d: "M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z" }), 'CheckBox')); -/***/ }), - -/***/ "ccE7": -/***/ (function(module, exports, __webpack_require__) { - -var toInteger = __webpack_require__("Ojgd"); -var defined = __webpack_require__("Jes0"); -// true -> String#at -// false -> String#codePointAt -module.exports = function (TO_STRING) { - return function (that, pos) { - var s = String(defined(that)); - var i = toInteger(pos); - var l = s.length; - var a, b; - if (i < 0 || i >= l) return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; - - /***/ }), /***/ "ccHA": @@ -279763,14 +278618,6 @@ var red = { }; /* harmony default export */ __webpack_exports__["default"] = (red); -/***/ }), - -/***/ "dl0q": -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__("Zxgi")('observable'); - - /***/ }), /***/ "dl3O": @@ -287138,26 +285985,6 @@ function _getPrototypeOf(o) { return _getPrototypeOf(o); } -/***/ }), - -/***/ "fpC5": -/***/ (function(module, exports, __webpack_require__) { - -var dP = __webpack_require__("2faE"); -var anObject = __webpack_require__("5K7Z"); -var getKeys = __webpack_require__("w6GO"); - -module.exports = __webpack_require__("jmDH") ? Object.defineProperties : function defineProperties(O, Properties) { - anObject(O); - var keys = getKeys(Properties); - var length = keys.length; - var i = 0; - var P; - while (length > i) dP.f(O, P = keys[i++], Properties[P]); - return O; -}; - - /***/ }), /***/ "fqQG": @@ -294756,14 +293583,6 @@ module.exports = { } -/***/ }), - -/***/ "hDam": -/***/ (function(module, exports) { - -module.exports = function () { /* empty */ }; - - /***/ }), /***/ "hEa4": @@ -300087,289 +298906,6 @@ function deprecatedPropType(validator, reason) { /***/ }), -/***/ "hxQi": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -var _extends2 = __webpack_require__("QbLZ"); - -var _extends3 = _interopRequireDefault(_extends2); - -var _getPrototypeOf = __webpack_require__("Yz+Y"); - -var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); - -var _classCallCheck2 = __webpack_require__("iCc5"); - -var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); - -var _createClass2 = __webpack_require__("V7oC"); - -var _createClass3 = _interopRequireDefault(_createClass2); - -var _possibleConstructorReturn2 = __webpack_require__("FYw3"); - -var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); - -var _inherits2 = __webpack_require__("mRg0"); - -var _inherits3 = _interopRequireDefault(_inherits2); - -var _react = __webpack_require__("q1tI"); - -var _react2 = _interopRequireDefault(_react); - -var _propTypes = __webpack_require__("17x9"); - -var _propTypes2 = _interopRequireDefault(_propTypes); - -var _lottieWeb = __webpack_require__("lPHp"); - -var _lottieWeb2 = _interopRequireDefault(_lottieWeb); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -var Lottie = function (_React$Component) { - (0, _inherits3.default)(Lottie, _React$Component); - - function Lottie() { - var _ref; - - var _temp, _this, _ret; - - (0, _classCallCheck3.default)(this, Lottie); - - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, (_ref = Lottie.__proto__ || (0, _getPrototypeOf2.default)(Lottie)).call.apply(_ref, [this].concat(args))), _this), _this.handleClickToPause = function () { - // The pause() method is for handling pausing by passing a prop isPaused - // This method is for handling the ability to pause by clicking on the animation - if (_this.anim.isPaused) { - _this.anim.play(); - } else { - _this.anim.pause(); - } - }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret); - } - - (0, _createClass3.default)(Lottie, [{ - key: 'componentDidMount', - value: function componentDidMount() { - var _props = this.props, - options = _props.options, - eventListeners = _props.eventListeners; - var loop = options.loop, - autoplay = options.autoplay, - animationData = options.animationData, - rendererSettings = options.rendererSettings, - segments = options.segments; - - - this.options = { - container: this.el, - renderer: 'svg', - loop: loop !== false, - autoplay: autoplay !== false, - segments: segments !== false, - animationData: animationData, - rendererSettings: rendererSettings - }; - - this.options = (0, _extends3.default)({}, this.options, options); - - this.anim = _lottieWeb2.default.loadAnimation(this.options); - this.registerEvents(eventListeners); - } - }, { - key: 'componentWillUpdate', - value: function componentWillUpdate(nextProps /* , nextState */) { - /* Recreate the animation handle if the data is changed */ - if (this.options.animationData !== nextProps.options.animationData) { - this.deRegisterEvents(this.props.eventListeners); - this.destroy(); - this.options = (0, _extends3.default)({}, this.options, nextProps.options); - this.anim = _lottieWeb2.default.loadAnimation(this.options); - this.registerEvents(nextProps.eventListeners); - } - } - }, { - key: 'componentDidUpdate', - value: function componentDidUpdate() { - if (this.props.isStopped) { - this.stop(); - } else if (this.props.segments) { - this.playSegments(); - } else { - this.play(); - } - - this.pause(); - this.setSpeed(); - this.setDirection(); - } - }, { - key: 'componentWillUnmount', - value: function componentWillUnmount() { - this.deRegisterEvents(this.props.eventListeners); - this.destroy(); - this.options.animationData = null; - this.anim = null; - } - }, { - key: 'setSpeed', - value: function setSpeed() { - this.anim.setSpeed(this.props.speed); - } - }, { - key: 'setDirection', - value: function setDirection() { - this.anim.setDirection(this.props.direction); - } - }, { - key: 'play', - value: function play() { - this.anim.play(); - } - }, { - key: 'playSegments', - value: function playSegments() { - this.anim.playSegments(this.props.segments); - } - }, { - key: 'stop', - value: function stop() { - this.anim.stop(); - } - }, { - key: 'pause', - value: function pause() { - if (this.props.isPaused && !this.anim.isPaused) { - this.anim.pause(); - } else if (!this.props.isPaused && this.anim.isPaused) { - this.anim.pause(); - } - } - }, { - key: 'destroy', - value: function destroy() { - this.anim.destroy(); - } - }, { - key: 'registerEvents', - value: function registerEvents(eventListeners) { - var _this2 = this; - - eventListeners.forEach(function (eventListener) { - _this2.anim.addEventListener(eventListener.eventName, eventListener.callback); - }); - } - }, { - key: 'deRegisterEvents', - value: function deRegisterEvents(eventListeners) { - var _this3 = this; - - eventListeners.forEach(function (eventListener) { - _this3.anim.removeEventListener(eventListener.eventName, eventListener.callback); - }); - } - }, { - key: 'render', - value: function render() { - var _this4 = this; - - var _props2 = this.props, - width = _props2.width, - height = _props2.height, - ariaRole = _props2.ariaRole, - ariaLabel = _props2.ariaLabel, - isClickToPauseDisabled = _props2.isClickToPauseDisabled, - title = _props2.title; - - - var getSize = function getSize(initial) { - var size = void 0; - - if (typeof initial === 'number') { - size = initial + 'px'; - } else { - size = initial || '100%'; - } - - return size; - }; - - var lottieStyles = (0, _extends3.default)({ - width: getSize(width), - height: getSize(height), - overflow: 'hidden', - margin: '0 auto', - outline: 'none' - }, this.props.style); - - var onClickHandler = isClickToPauseDisabled ? function () { - return null; - } : this.handleClickToPause; - - return ( - // Bug with eslint rules https://github.com/airbnb/javascript/issues/1374 - // eslint-disable-next-line jsx-a11y/no-static-element-interactions - _react2.default.createElement('div', { - ref: function ref(c) { - _this4.el = c; - }, - style: lottieStyles, - onClick: onClickHandler, - title: title, - role: ariaRole, - 'aria-label': ariaLabel, - tabIndex: '0' - }) - ); - } - }]); - return Lottie; -}(_react2.default.Component); - -exports.default = Lottie; - - -Lottie.propTypes = { - eventListeners: _propTypes2.default.arrayOf(_propTypes2.default.object), - options: _propTypes2.default.object.isRequired, - height: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), - width: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]), - isStopped: _propTypes2.default.bool, - isPaused: _propTypes2.default.bool, - speed: _propTypes2.default.number, - segments: _propTypes2.default.arrayOf(_propTypes2.default.number), - direction: _propTypes2.default.number, - ariaRole: _propTypes2.default.string, - ariaLabel: _propTypes2.default.string, - isClickToPauseDisabled: _propTypes2.default.bool, - title: _propTypes2.default.string -}; - -Lottie.defaultProps = { - eventListeners: [], - isStopped: false, - isPaused: false, - speed: 1, - ariaRole: 'button', - ariaLabel: 'animation', - isClickToPauseDisabled: false, - title: '' -}; - -/***/ }), - /***/ "hxgj": /***/ (function(module, exports, __webpack_require__) { @@ -301460,22 +299996,6 @@ function axisLeft(scale) { } -/***/ }), - -/***/ "iCc5": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -exports.default = function (instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } -}; - /***/ }), /***/ "iEdP": @@ -304957,27 +303477,6 @@ function shuffle(array) { } -/***/ }), - -/***/ "j2DC": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var create = __webpack_require__("oVml"); -var descriptor = __webpack_require__("rr1i"); -var setToStringTag = __webpack_require__("RfKB"); -var IteratorPrototype = {}; - -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -__webpack_require__("NegM")(IteratorPrototype, __webpack_require__("UWiX")('iterator'), function () { return this; }); - -module.exports = function (Constructor, NAME, next) { - Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); - setToStringTag(Constructor, NAME + ' Iterator'); -}; - - /***/ }), /***/ "j43s": @@ -309236,18 +307735,6 @@ function resetLoggedProperties() { //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2ludGVybmFsL3Byb3RvLWFjY2Vzcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O3FDQUFzQyw0QkFBNEI7O3NCQUMxQyxXQUFXOztJQUF2QixNQUFNOztBQUVsQixJQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRXRDLFNBQVMsd0JBQXdCLENBQUMsY0FBYyxFQUFFO0FBQ3ZELE1BQUksc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCx3QkFBc0IsQ0FBQyxhQUFhLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDOUMsd0JBQXNCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbkQsd0JBQXNCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUM7QUFDbkQsd0JBQXNCLENBQUMsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRW5ELE1BQUksd0JBQXdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFbkQsMEJBQXdCLENBQUMsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDOztBQUU5QyxTQUFPO0FBQ0wsY0FBVSxFQUFFO0FBQ1YsZUFBUyxFQUFFLDZDQUNULHdCQUF3QixFQUN4QixjQUFjLENBQUMsc0JBQXNCLENBQ3RDO0FBQ0Qsa0JBQVksRUFBRSxjQUFjLENBQUMsNkJBQTZCO0tBQzNEO0FBQ0QsV0FBTyxFQUFFO0FBQ1AsZUFBUyxFQUFFLDZDQUNULHNCQUFzQixFQUN0QixjQUFjLENBQUMsbUJBQW1CLENBQ25DO0FBQ0Qsa0JBQVksRUFBRSxjQUFjLENBQUMsMEJBQTBCO0tBQ3hEO0dBQ0YsQ0FBQztDQUNIOztBQUVNLFNBQVMsZUFBZSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUU7QUFDeEUsTUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7QUFDaEMsV0FBTyxjQUFjLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0dBQ2pFLE1BQU07QUFDTCxXQUFPLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7R0FDcEU7Q0FDRjs7QUFFRCxTQUFTLGNBQWMsQ0FBQyx5QkFBeUIsRUFBRSxZQUFZLEVBQUU7QUFDL0QsTUFBSSx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQ25FLFdBQU8seUJBQXlCLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQztHQUNuRTtBQUNELE1BQUkseUJBQXlCLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRTtBQUN4RCxXQUFPLHlCQUF5QixDQUFDLFlBQVksQ0FBQztHQUMvQztBQUNELGdDQUE4QixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzdDLFNBQU8sS0FBSyxDQUFDO0NBQ2Q7O0FBRUQsU0FBUyw4QkFBOEIsQ0FBQyxZQUFZLEVBQUU7QUFDcEQsTUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDM0Msb0JBQWdCLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLFVBQU0sQ0FBQyxHQUFHLENBQ1IsT0FBTyxFQUNQLGlFQUErRCxZQUFZLG9JQUNILG9IQUMyQyxDQUNwSCxDQUFDO0dBQ0g7Q0FDRjs7QUFFTSxTQUFTLHFCQUFxQixHQUFHO0FBQ3RDLFFBQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQSxZQUFZLEVBQUk7QUFDcEQsV0FBTyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztHQUN2QyxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJwcm90by1hY2Nlc3MuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVOZXdMb29rdXBPYmplY3QgfSBmcm9tICcuL2NyZWF0ZS1uZXctbG9va3VwLW9iamVjdCc7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcblxuY29uc3QgbG9nZ2VkUHJvcGVydGllcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm90b0FjY2Vzc0NvbnRyb2wocnVudGltZU9wdGlvbnMpIHtcbiAgbGV0IGRlZmF1bHRNZXRob2RXaGl0ZUxpc3QgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBkZWZhdWx0TWV0aG9kV2hpdGVMaXN0Wydjb25zdHJ1Y3RvciddID0gZmFsc2U7XG4gIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3RbJ19fZGVmaW5lR2V0dGVyX18nXSA9IGZhbHNlO1xuICBkZWZhdWx0TWV0aG9kV2hpdGVMaXN0WydfX2RlZmluZVNldHRlcl9fJ10gPSBmYWxzZTtcbiAgZGVmYXVsdE1ldGhvZFdoaXRlTGlzdFsnX19sb29rdXBHZXR0ZXJfXyddID0gZmFsc2U7XG5cbiAgbGV0IGRlZmF1bHRQcm9wZXJ0eVdoaXRlTGlzdCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b1xuICBkZWZhdWx0UHJvcGVydHlXaGl0ZUxpc3RbJ19fcHJvdG9fXyddID0gZmFsc2U7XG5cbiAgcmV0dXJuIHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB3aGl0ZWxpc3Q6IGNyZWF0ZU5ld0xvb2t1cE9iamVjdChcbiAgICAgICAgZGVmYXVsdFByb3BlcnR5V2hpdGVMaXN0LFxuICAgICAgICBydW50aW1lT3B0aW9ucy5hbGxvd2VkUHJvdG9Qcm9wZXJ0aWVzXG4gICAgICApLFxuICAgICAgZGVmYXVsdFZhbHVlOiBydW50aW1lT3B0aW9ucy5hbGxvd1Byb3RvUHJvcGVydGllc0J5RGVmYXVsdFxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgd2hpdGVsaXN0OiBjcmVhdGVOZXdMb29rdXBPYmplY3QoXG4gICAgICAgIGRlZmF1bHRNZXRob2RXaGl0ZUxpc3QsXG4gICAgICAgIHJ1bnRpbWVPcHRpb25zLmFsbG93ZWRQcm90b01ldGhvZHNcbiAgICAgICksXG4gICAgICBkZWZhdWx0VmFsdWU6IHJ1bnRpbWVPcHRpb25zLmFsbG93UHJvdG9NZXRob2RzQnlEZWZhdWx0XG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzdWx0SXNBbGxvd2VkKHJlc3VsdCwgcHJvdG9BY2Nlc3NDb250cm9sLCBwcm9wZXJ0eU5hbWUpIHtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gY2hlY2tXaGl0ZUxpc3QocHJvdG9BY2Nlc3NDb250cm9sLm1ldGhvZHMsIHByb3BlcnR5TmFtZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNoZWNrV2hpdGVMaXN0KHByb3RvQWNjZXNzQ29udHJvbC5wcm9wZXJ0aWVzLCBwcm9wZXJ0eU5hbWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrV2hpdGVMaXN0KHByb3RvQWNjZXNzQ29udHJvbEZvclR5cGUsIHByb3BlcnR5TmFtZSkge1xuICBpZiAocHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS53aGl0ZWxpc3RbcHJvcGVydHlOYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHByb3RvQWNjZXNzQ29udHJvbEZvclR5cGUud2hpdGVsaXN0W3Byb3BlcnR5TmFtZV0gPT09IHRydWU7XG4gIH1cbiAgaWYgKHByb3RvQWNjZXNzQ29udHJvbEZvclR5cGUuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcHJvdG9BY2Nlc3NDb250cm9sRm9yVHlwZS5kZWZhdWx0VmFsdWU7XG4gIH1cbiAgbG9nVW5leHBlY2VkUHJvcGVydHlBY2Nlc3NPbmNlKHByb3BlcnR5TmFtZSk7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbG9nVW5leHBlY2VkUHJvcGVydHlBY2Nlc3NPbmNlKHByb3BlcnR5TmFtZSkge1xuICBpZiAobG9nZ2VkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdICE9PSB0cnVlKSB7XG4gICAgbG9nZ2VkUHJvcGVydGllc1twcm9wZXJ0eU5hbWVdID0gdHJ1ZTtcbiAgICBsb2dnZXIubG9nKFxuICAgICAgJ2Vycm9yJyxcbiAgICAgIGBIYW5kbGViYXJzOiBBY2Nlc3MgaGFzIGJlZW4gZGVuaWVkIHRvIHJlc29sdmUgdGhlIHByb3BlcnR5IFwiJHtwcm9wZXJ0eU5hbWV9XCIgYmVjYXVzZSBpdCBpcyBub3QgYW4gXCJvd24gcHJvcGVydHlcIiBvZiBpdHMgcGFyZW50LlxcbmAgK1xuICAgICAgICBgWW91IGNhbiBhZGQgYSBydW50aW1lIG9wdGlvbiB0byBkaXNhYmxlIHRoZSBjaGVjayBvciB0aGlzIHdhcm5pbmc6XFxuYCArXG4gICAgICAgIGBTZWUgaHR0cHM6Ly9oYW5kbGViYXJzanMuY29tL2FwaS1yZWZlcmVuY2UvcnVudGltZS1vcHRpb25zLmh0bWwjb3B0aW9ucy10by1jb250cm9sLXByb3RvdHlwZS1hY2Nlc3MgZm9yIGRldGFpbHNgXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRMb2dnZWRQcm9wZXJ0aWVzKCkge1xuICBPYmplY3Qua2V5cyhsb2dnZWRQcm9wZXJ0aWVzKS5mb3JFYWNoKHByb3BlcnR5TmFtZSA9PiB7XG4gICAgZGVsZXRlIGxvZ2dlZFByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcbiAgfSk7XG59XG4iXX0= -/***/ }), - -/***/ "kAMH": -/***/ (function(module, exports, __webpack_require__) { - -// 7.2.2 IsArray(argument) -var cof = __webpack_require__("a0xu"); -module.exports = Array.isArray || function isArray(arg) { - return cof(arg) == 'Array'; -}; - - /***/ }), /***/ "kAPC": @@ -311342,14 +309829,6 @@ function setSeconds (dirtyDate, dirtySeconds) { module.exports = setSeconds -/***/ }), - -/***/ "kTiW": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__("NegM"); - - /***/ }), /***/ "kVCJ": @@ -314221,52 +312700,6 @@ var SwitchBase = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__["forwardRef"](f module.exports = JSON.parse("{\"1\":{\"id\":1155,\"slug\":\"CEP\",\"name\":\"Caisse d'Épargne Particuliers\"},\"2\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-alpesprovence.fr\",\"label\":\"Alpes Provence\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"3\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-alsace-vosges.fr\",\"label\":\"Alsace-Vosges\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"4\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-aquitaine.fr\",\"label\":\"Aquitaine\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"5\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-briepicardie.fr\",\"label\":\"Brie Picardie\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"6\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-atlantique-vendee.fr\",\"label\":\"Atlantique Vendée\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"7\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-anjou-maine.fr\",\"label\":\"Anjou Maine\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"8\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-centrest.fr\",\"label\":\"Centre Est\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"9\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-centrefrance.fr\",\"label\":\"Centre France\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"10\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-centreloire.fr\",\"label\":\"Centre Loire\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"11\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-centreouest.fr\",\"label\":\"Centre Ouest\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"12\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-cb.fr\",\"label\":\"Champagne Bourgogne\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"13\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-cmds.fr\",\"label\":\"Charente-Maritime Deux-Sèvres\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"14\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-charente-perigord.fr\",\"label\":\"Charente Périgord\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"15\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-corse.fr\",\"label\":\"Corse\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"16\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-cotesdarmor.fr\",\"label\":\"Côtes d'Armor\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"17\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-finistere.fr\",\"label\":\"Finistere\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"18\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-franchecomte.fr\",\"label\":\"Franche-Comté\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"19\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-guadeloupe.fr\",\"label\":\"Guadeloupe\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"20\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-paris.fr\",\"label\":\"Ile-de-France\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"21\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-illeetvilaine.fr\",\"label\":\"Ille-et-Vilaine\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"22\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-languedoc.fr\",\"label\":\"Languedoc\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"23\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-loirehauteloire.fr\",\"label\":\"Loire Haute Loire\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"24\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-lorraine.fr\",\"label\":\"Lorraine\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"25\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-martinique.fr\",\"label\":\"Martinique Guyane\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"26\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-morbihan.fr\",\"label\":\"Morbihan\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"27\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-norddefrance.fr\",\"label\":\"Nord de France\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"28\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-nord-est.fr\",\"label\":\"Nord Est\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"29\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-nmp.fr\",\"label\":\"Nord Midi-Pyrénées\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"30\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-normandie.fr\",\"label\":\"Normandie\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"31\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-normandie-seine.fr\",\"label\":\"Normandie Seine\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"32\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-pca.fr\",\"label\":\"Provence Côte d'Azur\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"33\":{\"id\":6,\"autoFields\":[{\"value\":\"m.lefil.com\",\"label\":\"Pyrénées Gascogne\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"34\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-reunion.fr\",\"label\":\"Réunion\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"35\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-des-savoie.fr\",\"label\":\"Des Savoie\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"36\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-sudmed.fr\",\"label\":\"Sud Méditerranée\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"37\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-sudrhonealpes.fr\",\"label\":\"Sud Rhône Alpes\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"38\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-toulouse31.fr\",\"label\":\"Toulouse 31\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"39\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-tourainepoitou.fr\",\"label\":\"Tourraine Poitou\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"40\":{\"id\":6,\"autoFields\":[{\"value\":\"m.ca-valdefrance.fr\",\"label\":\"Val de France\",\"name\":\"website\"}],\"slug\":\"CRA\",\"name\":\"Crédit Agricole\"},\"42\":{\"id\":9,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"SOC\",\"name\":\"Société Générale\"},\"44\":{\"id\":5,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"LBP\",\"name\":\"La Banque Postale\"},\"45\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"46\":{\"id\":14,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"CMB\",\"name\":\"Crédit Mutuel Bretagne\"},\"47\":{\"id\":524,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"CMM\",\"name\":\"Crédit Mutuel Massif Central\"},\"48\":{\"id\":19,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"CMS\",\"name\":\"Crédit Mutuel Sud-Ouest\"},\"63\":{\"id\":10,\"slug\":\"CIC\",\"name\":\"CIC\"},\"64\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.bpaura.banquepopulaire.fr\",\"label\":\"Auvergne Rhône Alpes\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"65\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.bpalc.banquepopulaire.fr\",\"label\":\"Alsace Lorraine Champagne\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"66\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.banquedesavoie.banquepopulaire.fr\",\"label\":\"Banque de Savoie\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"67\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.bpbfc.banquepopulaire.fr\",\"label\":\"Bourgogne Franche-Comté\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"68\":{\"id\":11,\"autoFields\":[{\"value\":\"bred\",\"label\":\"Bred\",\"name\":\"website\"}],\"slug\":\"BRE\",\"name\":\"Bred\"},\"69\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.bpaca.banquepopulaire.fr\",\"label\":\"Aquitaine Centre atlantique\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"74\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.nord.banquepopulaire.fr\",\"label\":\"Nord\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"75\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.occitane.banquepopulaire.fr\",\"label\":\"Occitane\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"76\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.bpgo.banquepopulaire.fr\",\"label\":\"Grand Ouest\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"77\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.mediterranee.banquepopulaire.fr\",\"label\":\"Méditerranée\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"78\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.rivesparis.banquepopulaire.fr\",\"label\":\"Rives de Paris\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"79\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.sud.banquepopulaire.fr\",\"label\":\"Sud\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"81\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.valdefrance.banquepopulaire.fr\",\"label\":\"Val de France\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"82\":{\"id\":3,\"autoFields\":[{\"value\":\"pp\",\"label\":\"Particuliers/Professionnels\",\"name\":\"website\"}],\"slug\":\"BNP\",\"name\":\"BNP Paribas\"},\"83\":{\"id\":4,\"slug\":\"BOU\",\"name\":\"Boursorama\"},\"84\":{\"id\":13,\"slug\":\"FOR\",\"name\":\"Fortuneo\"},\"88\":{\"id\":25,\"slug\":\"CDN\",\"name\":\"Crédit du Nord\"},\"95\":{\"id\":7,\"slug\":\"ING\",\"name\":\"ING Direct\"},\"96\":{\"id\":553,\"slug\":\"MON\",\"name\":\"Monabanq\"},\"97\":{\"id\":48,\"slug\":\"BFB\",\"name\":\"BforBank\"},\"101\":{\"id\":11,\"autoFields\":[{\"value\":\"bred\",\"label\":\"Bred\",\"name\":\"website\"}],\"slug\":\"BRE\",\"name\":\"Bred\"},\"102\":{\"id\":21,\"slug\":\"AXA\",\"name\":\"AXA Banque\"},\"105\":{\"id\":22,\"autoFields\":[{\"value\":\"www.ibps.cmgo.creditmaritime.groupe.banquepopulaire.fr\",\"label\":\"Grand Ouest\",\"name\":\"website\"}],\"slug\":\"CRE\",\"name\":\"Crédit Maritime\"},\"106\":{\"id\":15,\"autoFields\":[{\"value\":\"www.ibps.nord.banquepopulaire.fr\",\"label\":\"Nord\",\"name\":\"website\"}],\"slug\":\"BAN\",\"name\":\"Banque Populaire\"},\"107\":{\"id\":22,\"autoFields\":[{\"value\":\"www.ibps.sudouest.creditmaritime.groupe.banquepopulaire.fr\",\"label\":\"Littoral du Sud-Ouest\",\"name\":\"website\"}],\"slug\":\"CRE\",\"name\":\"Crédit Maritime\"},\"108\":{\"id\":22,\"autoFields\":[{\"value\":\"www.ibps.sudouest.creditmaritime.groupe.banquepopulaire.fr\",\"label\":\"Littoral du Sud-Ouest\",\"name\":\"website\"}],\"slug\":\"CRE\",\"name\":\"Crédit Maritime\"},\"109\":{\"id\":28,\"slug\":\"SMC\",\"name\":\"Société Marseillaise de Crédit\"},\"110\":{\"id\":11,\"autoFields\":[{\"value\":\"bred\",\"label\":\"Bred\",\"name\":\"website\"}],\"slug\":\"BRE\",\"name\":\"Bred\"},\"119\":{\"id\":2,\"slug\":\"HSB\",\"name\":\"HSBC France\"},\"120\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"121\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"122\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"123\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"124\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"125\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"126\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"127\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"128\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"129\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"130\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"131\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"132\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"133\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"134\":{\"id\":1,\"slug\":\"CM\",\"name\":\"Crédit Mutuel\"},\"136\":{\"id\":17,\"slug\":\"MIL\",\"name\":\"Milleis\"},\"143\":{\"id\":8,\"autoFields\":[{\"value\":\"par\",\"label\":\"Particuliers\",\"name\":\"website\"}],\"slug\":\"LCL\",\"name\":\"LCL\"},\"144\":{\"id\":8,\"autoFields\":[{\"value\":\"elcl\",\"label\":\"e.LCL\",\"name\":\"website\"}],\"slug\":\"LCL\",\"name\":\"LCL\"},\"145\":{\"id\":33,\"slug\":\"HEL\",\"name\":\"Hello bank!\"},\"146\":{\"id\":8,\"autoFields\":[{\"value\":\"pro\",\"label\":\"Professionnels\",\"name\":\"website\"}],\"slug\":\"LCL\",\"name\":\"LCL\"},\"148\":{\"id\":16,\"slug\":\"COO\",\"name\":\"Crédit Coopératif\"},\"155\":{\"id\":9,\"autoFields\":[{\"value\":\"pro\",\"label\":\"Professionnels\",\"name\":\"website\"}],\"slug\":\"SOC\",\"name\":\"Société Générale\"},\"156\":{\"id\":9,\"autoFields\":[{\"value\":\"ent\",\"label\":\"Entreprises\",\"name\":\"website\"}],\"slug\":\"SOC\",\"name\":\"Société Générale\"},\"158\":{\"id\":9,\"autoFields\":[{\"value\":\"pro\",\"label\":\"Professionnels\",\"name\":\"website\"}],\"slug\":\"SOC\",\"name\":\"Société Générale\"},\"159\":{\"id\":23,\"slug\":\"CAR\",\"name\":\"Carrefour Banque\"},\"165\":{\"id\":11,\"autoFields\":[{\"value\":\"bred\",\"label\":\"Bred\",\"name\":\"website\"}],\"slug\":\"BRE\",\"name\":\"Bred\"},\"166\":{\"id\":11,\"autoFields\":[{\"value\":\"bred\",\"label\":\"Bred\",\"name\":\"website\"}],\"slug\":\"BRE\",\"name\":\"Bred\"},\"168\":{\"id\":797,\"slug\":\"NKL\",\"name\":\"Compte Nickel\"},\"100000\":{\"id\":40,\"slug\":\"TEST\",\"name\":\"Connecteur de test\"},\"bi-REV\":{\"id\":1027,\"slug\":\"REV\",\"name\":\"Revolut\"},\"bi-N26\":{\"id\":529,\"slug\":\"N26\",\"name\":\"N26\"},\"bi-CSO\":{\"id\":1142,\"slug\":\"CSO\",\"name\":\"Banque Casino\"},\"bi-CET\":{\"id\":764,\"slug\":\"CET\",\"name\":\"Cetelem\"},\"bi-SFC\":{\"id\":1137,\"slug\":\"SFC\",\"name\":\"Sofinco\"},\"bi-ONE\":{\"id\":38,\"slug\":\"ONE\",\"name\":\"Oney\"},\"bi-AME\":{\"id\":30,\"slug\":\"AME\",\"name\":\"American Express\"},\"bi-ABP\":{\"id\":1144,\"slug\":\"ABP\",\"name\":\"Arkea Banque Privée\"},\"bi-BDN\":{\"id\":1151,\"slug\":\"BDN\",\"name\":\"Bolden\"},\"bi-BAN\":{\"id\":44,\"slug\":\"BAN\",\"name\":\"Banque BCP\"},\"bi-COU\":{\"id\":27,\"slug\":\"COU\",\"name\":\"Banque Courtois\"},\"bi-KOL\":{\"id\":29,\"slug\":\"KOL\",\"name\":\"Banque Kolb\"},\"bi-LAY\":{\"id\":32,\"slug\":\"LAY\",\"name\":\"Banque Laydernier\"},\"bi-RHO\":{\"id\":37,\"slug\":\"RHO\",\"name\":\"Banque Rhône-Alpes\"},\"bi-TAR\":{\"id\":26,\"slug\":\"TAR\",\"name\":\"Banque Tarneaud\"},\"bi-CIC\":{\"id\":20,\"slug\":\"CIC\",\"name\":\"Banque Transatlantique\"},\"bi-GAN\":{\"id\":18,\"slug\":\"GAN\",\"name\":\"Gan Assurances\"},\"bi-GPM\":{\"id\":70,\"slug\":\"GPM\",\"name\":\"Groupama\"},\"bi-MAA\":{\"id\":502,\"slug\":\"MAA\",\"name\":\"MAAF Vie\"},\"bi-MRO\":{\"id\":1021,\"slug\":\"MRO\",\"name\":\"Moneo Resto\"},\"bi-PAY\":{\"id\":1166,\"slug\":\"PAY\",\"name\":\"Paypal\"},\"bi-YOM\":{\"id\":432,\"slug\":\"YOM\",\"name\":\"Yomoni\"},\"bi-WES\":{\"id\":665,\"slug\":\"WES\",\"name\":\"Wesave\"},\"bi-OBK\":{\"id\":1119,\"slug\":\"OBK\",\"name\":\"Orange Bank\"},\"bi-MSB\":{\"id\":1247,\"slug\":\"MSB\",\"name\":\"Socram\"},\"bi-NAT\":{\"id\":418,\"slug\":\"NAT\",\"name\":\"Natixis, Palatine\"},\"bi-AMU\":{\"id\":84,\"slug\":\"AMU\",\"name\":\"Amundi TC\"},\"bi-BEC\":{\"id\":1078,\"slug\":\"BEC\",\"name\":\"Banque Européenne Crédit Mutuel\"},\"bi-AFE\":{\"id\":78,\"slug\":\"AFE\",\"name\":\"Afer\"},\"bi-PSA\":{\"id\":682,\"slug\":\"PSA\",\"name\":\"PSA Banque\"},\"bi-CAE\":{\"id\":442,\"slug\":\"CAE\",\"name\":\"Crédit Agricole - Epargne Longue des Salariés\"},\"bi-LIN\":{\"id\":386,\"slug\":\"LIN\",\"name\":\"LinXea\"},\"bi-BPE\":{\"id\":1158,\"slug\":\"BPE\",\"name\":\"BPE Banque privée\"},\"bi-BRE\":{\"id\":11,\"slug\":\"BRE\",\"name\":\"BRED Dispobank\"},\"bi-CME\":{\"id\":1086,\"slug\":\"CME\",\"name\":\"Banque Transatlantique épargne salariale\"},\"bi-RCI\":{\"id\":1084,\"slug\":\"RCI\",\"name\":\"Livret Zesto (RCI Banque)\"},\"bi-ASS\":{\"id\":41,\"slug\":\"ASS\",\"name\":\"assurancevie.com\"},\"bi-MES\":{\"id\":388,\"slug\":\"MES\",\"name\":\"mes-placements.fr\"},\"bi-SBE\":{\"id\":1246,\"slug\":\"SBE\",\"name\":\"Banque SBE\"},\"bi-SIB\":{\"id\":875,\"slug\":\"SIB\",\"name\":\"Sharinbox\"},\"bi-ESA\":{\"id\":81,\"slug\":\"ESA\",\"name\":\"Esalia\"},\"bi-EPS\":{\"id\":1182,\"slug\":\"EPS\",\"name\":\"Epsens Épargne Salariale\"},\"bi-CFO\":{\"id\":1130,\"slug\":\"CFO\",\"name\":\"Crédit Foncier\"},\"bi-BFC\":{\"id\":1042,\"slug\":\"BFC\",\"name\":\"Banque Française Commerciale Océan Indien\"},\"bi-MAC\":{\"id\":89,\"slug\":\"MAC\",\"name\":\"MACSF\"},\"bi-NUG\":{\"id\":670,\"slug\":\"NUG\",\"name\":\"Banque Nuger\"},\"bi-CHA\":{\"id\":1202,\"slug\":\"CHA\",\"name\":\"Banque Chalus\"},\"bi-EPA\":{\"id\":1172,\"slug\":\"EPA\",\"name\":\"Epargnissimo\"},\"bi-CAP\":{\"id\":82,\"slug\":\"CAP\",\"name\":\"AXA Épargne Salariale\"},\"bi-SOG\":{\"id\":46,\"slug\":\"SOG\",\"name\":\"Sogeretraite\"},\"bi-EDR\":{\"id\":1146,\"slug\":\"EDR\",\"name\":\"Edmond de Rothschild\"},\"bi-MUT\":{\"id\":791,\"slug\":\"MUT\",\"name\":\"Mutavie\"},\"bi-AGI\":{\"id\":487,\"slug\":\"AGI\",\"name\":\"Agipi\"},\"bi-CCS\":{\"id\":845,\"slug\":\"CCS\",\"name\":\"Crédit Commercial du Sud-Ouest\"},\"bi-ARC\":{\"id\":1188,\"slug\":\"ARC\",\"name\":\"Allianz Retraite Collective\"},\"bi-AGE\":{\"id\":1101,\"slug\":\"AGE\",\"name\":\"Ageas\"},\"bi-MNM\":{\"id\":1201,\"slug\":\"MNM\",\"name\":\"Manymore\"},\"bi-ALT\":{\"id\":337,\"slug\":\"ALT\",\"name\":\"Altaprofits\"},\"bi-AXA\":{\"id\":21,\"slug\":\"AXA\",\"name\":\"AXA Épargne Retraite \"},\"bnp_es\":{\"id\":79,\"slug\":\"BNP\",\"name\":\"BNP Paribas Épargne Salariale\"},\"bi-CRE\":{\"id\":475,\"slug\":\"CRE\",\"name\":\"Crédit du Nord Épargne Salariale\"},\"bi-GEN\":{\"id\":390,\"slug\":\"GEN\",\"name\":\"Generali\"},\"bi-GRO\":{\"id\":71,\"slug\":\"GRO\",\"name\":\"Groupama Épargne Salariale\"},\"bi-ODD\":{\"id\":545,\"slug\":\"ODD\",\"name\":\"Oddo - Banque Privée\"},\"bi-SPI\":{\"id\":414,\"slug\":\"SPI\",\"name\":\"Spirica\"},\"bi-SWI\":{\"id\":57,\"slug\":\"SWI\",\"name\":\"Swisslife\"},\"bi-SLB\":{\"id\":65,\"slug\":\"SLB\",\"name\":\"SwissLife Banque Privée\"},\"bi-UFF\":{\"id\":863,\"slug\":\"UFF\",\"name\":\"Union Financière de France\"},\"bi-MFV\":{\"id\":1256,\"slug\":\"MFV\",\"name\":\"Maif Vie\"},\"bi-PAL\":{\"id\":649,\"slug\":\"PAL\",\"name\":\"Banque Palatine (Particuliers)\"},\"bi-SCRM\":{\"id\":1269,\"slug\":\"SCRM\",\"name\":\"Maif Socram Crédit\"},\"bi-MCF\":{\"id\":1111,\"slug\":\"MCF\",\"name\":\"Macif Espace Banque\"},\"bi-NAL\":{\"id\":1154,\"slug\":\"NAL\",\"name\":\"Nalo\"},\"cic_es\":{\"id\":357,\"slug\":\"CIC\",\"name\":\"CIC Épargne Salariale\"}}"); -/***/ }), - -/***/ "kwZ1": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -// 19.1.2.1 Object.assign(target, source, ...) -var DESCRIPTORS = __webpack_require__("jmDH"); -var getKeys = __webpack_require__("w6GO"); -var gOPS = __webpack_require__("mqlF"); -var pIE = __webpack_require__("NV0k"); -var toObject = __webpack_require__("JB68"); -var IObject = __webpack_require__("M1xp"); -var $assign = Object.assign; - -// should work with symbols and should have deterministic property order (V8 bug) -module.exports = !$assign || __webpack_require__("KUxP")(function () { - var A = {}; - var B = {}; - // eslint-disable-next-line no-undef - var S = Symbol(); - var K = 'abcdefghijklmnopqrst'; - A[S] = 7; - K.split('').forEach(function (k) { B[k] = k; }); - return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K; -}) ? function assign(target, source) { // eslint-disable-line no-unused-vars - var T = toObject(target); - var aLen = arguments.length; - var index = 1; - var getSymbols = gOPS.f; - var isEnum = pIE.f; - while (aLen > index) { - var S = IObject(arguments[index++]); - var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S); - var length = keys.length; - var j = 0; - var key; - while (length > j) { - key = keys[j++]; - if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key]; - } - } return T; -} : $assign; - - /***/ }), /***/ "kxw0": @@ -315767,16 +314200,6 @@ function resolvePathname(to, from) { /* harmony default export */ __webpack_exports__["default"] = (resolvePathname); -/***/ }), - -/***/ "lCc8": -/***/ (function(module, exports, __webpack_require__) { - -var $export = __webpack_require__("Y7ZC"); -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -$export($export.S, 'Object', { create: __webpack_require__("oVml") }); - - /***/ }), /***/ "lCdf": @@ -318165,19534 +316588,851 @@ var CipherService = /*#__PURE__*/function () { var bLastUsed = b.localData && b.localData.lastUsedDate ? b.localData.lastUsedDate : null; var bothNotNull = aLastUsed != null && bLastUsed != null; - if (bothNotNull && aLastUsed < bLastUsed) { - return 1; - } - - if (aLastUsed != null && bLastUsed == null) { - return -1; - } - - if (bothNotNull && aLastUsed > bLastUsed) { - return -1; - } - - if (bLastUsed != null && aLastUsed == null) { - return 1; - } - - return 0; - } - }, { - key: "sortCiphersByLastUsedThenName", - value: function sortCiphersByLastUsedThenName(a, b) { - var result = this.sortCiphersByLastUsed(a, b); - - if (result !== 0) { - return result; - } - - return this.getLocaleSortingFunction()(a, b); - } - }, { - key: "getLocaleSortingFunction", - value: function getLocaleSortingFunction() { - var _this5 = this; - - return function (a, b) { - var aName = a.name; - var bName = b.name; - - if (aName == null && bName != null) { - return -1; - } - - if (aName != null && bName == null) { - return 1; - } - - if (aName == null && bName == null) { - return 0; - } - - var result = _this5.i18nService.collator ? _this5.i18nService.collator.compare(aName, bName) : aName.localeCompare(bName); - - if (result !== 0 || a.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login || b.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login) { - return result; - } - - if (a.login.username != null) { - aName += a.login.username; - } - - if (b.login.username != null) { - bName += b.login.username; - } - - return _this5.i18nService.collator ? _this5.i18nService.collator.compare(aName, bName) : aName.localeCompare(bName); - }; - } - }, { - key: "softDelete", - value: function softDelete(id) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee36() { - var userId, ciphers, setDeletedDate; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee36$(_context36) { - while (1) { - switch (_context36.prev = _context36.next) { - case 0: - _context36.next = 2; - return this.userService.getUserId(); - - case 2: - userId = _context36.sent; - _context36.next = 5; - return this.storageService.get(Keys.ciphersPrefix + userId); - - case 5: - ciphers = _context36.sent; - - if (!(ciphers == null)) { - _context36.next = 8; - break; - } - - return _context36.abrupt("return"); - - case 8: - setDeletedDate = function setDeletedDate(cipherId) { - if (ciphers[cipherId] == null) { - return; - } - - ciphers[cipherId].deletedDate = new Date().toISOString(); - }; - - if (typeof id === 'string') { - setDeletedDate(id); - } else { - id.forEach(setDeletedDate); - } - - _context36.next = 12; - return this.storageService.save(Keys.ciphersPrefix + userId, ciphers); - - case 12: - this.decryptedCipherCache = null; - - case 13: - case "end": - return _context36.stop(); - } - } - }, _callee36, this); - })); - } - }, { - key: "softDeleteWithServer", - value: function softDeleteWithServer(id) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee37() { - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee37$(_context37) { - while (1) { - switch (_context37.prev = _context37.next) { - case 0: - _context37.next = 2; - return this.apiService.putDeleteCipher(id); - - case 2: - _context37.next = 4; - return this.softDelete(id); - - case 4: - case "end": - return _context37.stop(); - } - } - }, _callee37, this); - })); - } - }, { - key: "softDeleteManyWithServer", - value: function softDeleteManyWithServer(ids) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee38() { - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee38$(_context38) { - while (1) { - switch (_context38.prev = _context38.next) { - case 0: - _context38.next = 2; - return this.apiService.putDeleteManyCiphers(new _models_request_cipherBulkDeleteRequest__WEBPACK_IMPORTED_MODULE_16__["CipherBulkDeleteRequest"](ids)); - - case 2: - _context38.next = 4; - return this.softDelete(ids); - - case 4: - case "end": - return _context38.stop(); - } - } - }, _callee38, this); - })); - } - }, { - key: "restore", - value: function restore(id) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee39() { - var userId, ciphers, clearDeletedDate; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee39$(_context39) { - while (1) { - switch (_context39.prev = _context39.next) { - case 0: - _context39.next = 2; - return this.userService.getUserId(); - - case 2: - userId = _context39.sent; - _context39.next = 5; - return this.storageService.get(Keys.ciphersPrefix + userId); - - case 5: - ciphers = _context39.sent; - - if (!(ciphers == null)) { - _context39.next = 8; - break; - } - - return _context39.abrupt("return"); - - case 8: - clearDeletedDate = function clearDeletedDate(cipherId) { - if (ciphers[cipherId] == null) { - return; - } - - ciphers[cipherId].deletedDate = null; - }; - - if (typeof id === 'string') { - clearDeletedDate(id); - } else { - id.forEach(clearDeletedDate); - } - - _context39.next = 12; - return this.storageService.save(Keys.ciphersPrefix + userId, ciphers); - - case 12: - this.decryptedCipherCache = null; - - case 13: - case "end": - return _context39.stop(); - } - } - }, _callee39, this); - })); - } - }, { - key: "restoreWithServer", - value: function restoreWithServer(id) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee40() { - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee40$(_context40) { - while (1) { - switch (_context40.prev = _context40.next) { - case 0: - _context40.next = 2; - return this.apiService.putRestoreCipher(id); - - case 2: - _context40.next = 4; - return this.restore(id); - - case 4: - case "end": - return _context40.stop(); - } - } - }, _callee40, this); - })); - } - }, { - key: "restoreManyWithServer", - value: function restoreManyWithServer(ids) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee41() { - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee41$(_context41) { - while (1) { - switch (_context41.prev = _context41.next) { - case 0: - _context41.next = 2; - return this.apiService.putRestoreManyCiphers(new _models_request_cipherBulkRestoreRequest__WEBPACK_IMPORTED_MODULE_18__["CipherBulkRestoreRequest"](ids)); - - case 2: - _context41.next = 4; - return this.restore(ids); - - case 4: - case "end": - return _context41.stop(); - } - } - }, _callee41, this); - })); - } // Helpers - - }, { - key: "shareAttachmentWithServer", - value: function shareAttachmentWithServer(attachmentView, cipherId, organizationId) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee42() { - var attachmentResponse, buf, decBuf, key, encFileName, dataEncKey, encData, fd, blob; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee42$(_context42) { - while (1) { - switch (_context42.prev = _context42.next) { - case 0: - _context42.next = 2; - return this.apiService.nativeFetch(new Request(attachmentView.url, { - cache: 'no-store' - })); - - case 2: - attachmentResponse = _context42.sent; - - if (!(attachmentResponse.status !== 200)) { - _context42.next = 5; - break; - } - - throw Error('Failed to download attachment: ' + attachmentResponse.status.toString()); - - case 5: - _context42.next = 7; - return attachmentResponse.arrayBuffer(); - - case 7: - buf = _context42.sent; - _context42.next = 10; - return this.cryptoService.decryptFromBytes(buf, null); - - case 10: - decBuf = _context42.sent; - _context42.next = 13; - return this.cryptoService.getOrgKey(organizationId); - - case 13: - key = _context42.sent; - _context42.next = 16; - return this.cryptoService.encrypt(attachmentView.fileName, key); - - case 16: - encFileName = _context42.sent; - _context42.next = 19; - return this.cryptoService.makeEncKey(key); - - case 19: - dataEncKey = _context42.sent; - _context42.next = 22; - return this.cryptoService.encryptToBytes(decBuf, dataEncKey[0]); - - case 22: - encData = _context42.sent; - fd = new FormData(); - _context42.prev = 24; - blob = new Blob([encData], { - type: 'application/octet-stream' - }); - fd.append('key', dataEncKey[1].encryptedString); - fd.append('data', blob, encFileName.encryptedString); - _context42.next = 38; - break; - - case 30: - _context42.prev = 30; - _context42.t0 = _context42["catch"](24); - - if (!(_misc_utils__WEBPACK_IMPORTED_MODULE_28__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_28__["Utils"].isBrowser)) { - _context42.next = 37; - break; - } - - fd.append('key', dataEncKey[1].encryptedString); - fd.append('data', Buffer.from(encData), { - filepath: encFileName.encryptedString, - contentType: 'application/octet-stream' - }); - _context42.next = 38; - break; - - case 37: - throw _context42.t0; - - case 38: - _context42.prev = 38; - _context42.next = 41; - return this.apiService.postShareCipherAttachment(cipherId, attachmentView.id, fd, organizationId); - - case 41: - _context42.next = 46; - break; - - case 43: - _context42.prev = 43; - _context42.t1 = _context42["catch"](38); - throw new Error(_context42.t1.getSingleMessage()); - - case 46: - case "end": - return _context42.stop(); - } - } - }, _callee42, this, [[24, 30], [38, 43]]); - })); - } - }, { - key: "encryptObjProperty", - value: function encryptObjProperty(model, obj, map, key) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee43() { - var promises, self, prop; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee43$(_context43) { - while (1) { - switch (_context43.prev = _context43.next) { - case 0: - promises = []; - self = this; - _context43.t0 = _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.keys(map); - - case 3: - if ((_context43.t1 = _context43.t0()).done) { - _context43.next = 10; - break; - } - - prop = _context43.t1.value; - - if (map.hasOwnProperty(prop)) { - _context43.next = 7; - break; - } - - return _context43.abrupt("continue", 3); - - case 7: - // tslint:disable-next-line - (function (theProp, theObj) { - var p = Promise.resolve().then(function () { - var modelProp = model[map[theProp] || theProp]; - - if (modelProp && modelProp !== '') { - return self.cryptoService.encrypt(modelProp, key); - } - - return null; - }).then(function (val) { - theObj[theProp] = val; - }); - promises.push(p); - })(prop, obj); - - _context43.next = 3; - break; - - case 10: - _context43.next = 12; - return Promise.all(promises); - - case 12: - case "end": - return _context43.stop(); - } - } - }, _callee43, this); - })); - } - }, { - key: "encryptCipherData", - value: function encryptCipherData(cipher, model, key) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee44() { - var i, loginUri; - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee44$(_context44) { - while (1) { - switch (_context44.prev = _context44.next) { - case 0: - _context44.t0 = cipher.type; - _context44.next = _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login ? 3 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].SecureNote ? 20 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Card ? 23 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Identity ? 27 : 31; - break; - - case 3: - cipher.login = new _models_domain_login__WEBPACK_IMPORTED_MODULE_12__["Login"](); - cipher.login.passwordRevisionDate = model.login.passwordRevisionDate; - _context44.next = 7; - return this.encryptObjProperty(model.login, cipher.login, { - username: null, - password: null, - totp: null - }, key); - - case 7: - if (!(model.login.uris != null)) { - _context44.next = 19; - break; - } - - cipher.login.uris = []; - i = 0; - - case 10: - if (!(i < model.login.uris.length)) { - _context44.next = 19; - break; - } - - loginUri = new _models_domain_loginUri__WEBPACK_IMPORTED_MODULE_13__["LoginUri"](); - loginUri.match = model.login.uris[i].match; - _context44.next = 15; - return this.encryptObjProperty(model.login.uris[i], loginUri, { - uri: null - }, key); - - case 15: - cipher.login.uris.push(loginUri); - - case 16: - i++; - _context44.next = 10; - break; - - case 19: - return _context44.abrupt("return"); - - case 20: - cipher.secureNote = new _models_domain_secureNote__WEBPACK_IMPORTED_MODULE_15__["SecureNote"](); - cipher.secureNote.type = model.secureNote.type; - return _context44.abrupt("return"); - - case 23: - cipher.card = new _models_domain_card__WEBPACK_IMPORTED_MODULE_8__["Card"](); - _context44.next = 26; - return this.encryptObjProperty(model.card, cipher.card, { - cardholderName: null, - brand: null, - number: null, - expMonth: null, - expYear: null, - code: null - }, key); - - case 26: - return _context44.abrupt("return"); - - case 27: - cipher.identity = new _models_domain_identity__WEBPACK_IMPORTED_MODULE_11__["Identity"](); - _context44.next = 30; - return this.encryptObjProperty(model.identity, cipher.identity, { - title: null, - firstName: null, - middleName: null, - lastName: null, - address1: null, - address2: null, - address3: null, - city: null, - state: null, - postalCode: null, - country: null, - company: null, - email: null, - phone: null, - ssn: null, - username: null, - passportNumber: null, - licenseNumber: null - }, key); - - case 30: - return _context44.abrupt("return"); - - case 31: - throw new Error('Unknown cipher type.'); - - case 32: - case "end": - return _context44.stop(); - } - } - }, _callee44, this); - })); - } - }, { - key: "getCipherForUrl", - value: function getCipherForUrl(url, lastUsed, lastLaunched) { - return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee45() { - var _ciphers; - - return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee45$(_context45) { - while (1) { - switch (_context45.prev = _context45.next) { - case 0: - if (this.sortedCiphersCache.isCached(url)) { - _context45.next = 7; - break; - } - - _context45.next = 3; - return this.getAllDecryptedForUrl(url); - - case 3: - _ciphers = _context45.sent; - - if (_ciphers) { - _context45.next = 6; - break; - } - - return _context45.abrupt("return", null); - - case 6: - this.sortedCiphersCache.addCiphers(url, _ciphers); - - case 7: - if (!lastLaunched) { - _context45.next = 11; - break; - } - - return _context45.abrupt("return", this.sortedCiphersCache.getLastLaunched(url)); - - case 11: - if (!lastUsed) { - _context45.next = 15; - break; - } - - return _context45.abrupt("return", this.sortedCiphersCache.getLastUsed(url)); - - case 15: - return _context45.abrupt("return", this.sortedCiphersCache.getNext(url)); - - case 16: - case "end": - return _context45.stop(); - } - } - }, _callee45, this); - })); - } - }, { - key: "decryptedCipherCache", - get: function get() { - return this._decryptedCipherCache; - }, - set: function set(value) { - this._decryptedCipherCache = value; - - if (this.searchService != null) { - if (value == null) { - this.searchService().clearIndex(); - } else { - this.searchService().indexCiphers(); - } - } - } - }]); - - return CipherService; -}(); - -__decorate([Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_27__["sequentialize"])(function () { - return 'getAllDecrypted'; -}), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise)], CipherService.prototype, "getAllDecrypted", null); -/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__("tjlA").Buffer)) - -/***/ }), - -/***/ "lO0E": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styles", function() { return styles; }); -/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("wx14"); -/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("Ff2n"); -/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("rePB"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("q1tI"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("17x9"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); -/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("iuhU"); -/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("H2TA"); - - - - - - - -var styles = function styles(theme) { - return { - /* Styles applied to the root element. */ - root: { - position: 'relative', - display: 'flex', - alignItems: 'center' - }, - - /* Styles applied to the root element if `disableGutters={false}`. */ - gutters: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])({ - paddingLeft: theme.spacing(2), - paddingRight: theme.spacing(2) - }, theme.breakpoints.up('sm'), { - paddingLeft: theme.spacing(3), - paddingRight: theme.spacing(3) - }), - - /* Styles applied to the root element if `variant="regular"`. */ - regular: theme.mixins.toolbar, - - /* Styles applied to the root element if `variant="dense"`. */ - dense: { - minHeight: 48 - } - }; -}; -var Toolbar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__["forwardRef"](function Toolbar(props, ref) { - var classes = props.classes, - className = props.className, - _props$component = props.component, - Component = _props$component === void 0 ? 'div' : _props$component, - _props$disableGutters = props.disableGutters, - disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, - _props$variant = props.variant, - variant = _props$variant === void 0 ? 'regular' : _props$variant, - other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(props, ["classes", "className", "component", "disableGutters", "variant"]); - - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__["createElement"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ - className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(classes.root, classes[variant], className, !disableGutters && classes.gutters), - ref: ref - }, other)); -}); - false ? undefined : void 0; -/* harmony default export */ __webpack_exports__["default"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__["default"])(styles, { - name: 'MuiToolbar' -})(Toolbar)); - -/***/ }), - -/***/ "lOB1": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var abs = __webpack_require__("6X7+"); -var floor = __webpack_require__("/Xn7"); -var ToNumber = __webpack_require__("/s5K"); - -var $isNaN = __webpack_require__("IFfy"); -var $isFinite = __webpack_require__("xhJ2"); -var $sign = __webpack_require__("WXWk"); - -// https://262.ecma-international.org/12.0/#sec-tointegerorinfinity - -module.exports = function ToIntegerOrInfinity(value) { - var number = ToNumber(value); - if ($isNaN(number) || number === 0) { return 0; } - if (!$isFinite(number)) { return number; } - return $sign(number) * floor(abs(number)); -}; - - -/***/ }), - -/***/ "lOKL": -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styles", function() { return styles; }); -/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("wx14"); -/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("Ff2n"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("q1tI"); -/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("17x9"); -/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("iuhU"); -/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("KgOg"); -/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("YiTZ"); - - - - - - - -var styles = { - /* Styles applied to the root element. */ - root: { - display: 'flex', - alignItems: 'center', - padding: 16 - }, - - /* Styles applied to the avatar element. */ - avatar: { - flex: '0 0 auto', - marginRight: 16 - }, - - /* Styles applied to the action element. */ - action: { - flex: '0 0 auto', - alignSelf: 'flex-start', - marginTop: -8, - marginRight: -8 - }, - - /* Styles applied to the content wrapper element. */ - content: { - flex: '1 1 auto' - }, - - /* Styles applied to the title Typography element. */ - title: {}, - - /* Styles applied to the subheader Typography element. */ - subheader: {} -}; -var CardHeader = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["forwardRef"](function CardHeader(props, ref) { - var action = props.action, - avatar = props.avatar, - classes = props.classes, - className = props.className, - _props$component = props.component, - Component = _props$component === void 0 ? 'div' : _props$component, - _props$disableTypogra = props.disableTypography, - disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, - subheaderProp = props.subheader, - subheaderTypographyProps = props.subheaderTypographyProps, - titleProp = props.title, - titleTypographyProps = props.titleTypographyProps, - other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(props, ["action", "avatar", "classes", "className", "component", "disableTypography", "subheader", "subheaderTypographyProps", "title", "titleTypographyProps"]); - - var title = titleProp; - - if (title != null && title.type !== _Typography__WEBPACK_IMPORTED_MODULE_6__["default"] && !disableTypography) { - title = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](_Typography__WEBPACK_IMPORTED_MODULE_6__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ - variant: avatar ? 'body2' : 'h5', - className: classes.title, - component: "span", - display: "block" - }, titleTypographyProps), title); - } - - var subheader = subheaderProp; - - if (subheader != null && subheader.type !== _Typography__WEBPACK_IMPORTED_MODULE_6__["default"] && !disableTypography) { - subheader = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](_Typography__WEBPACK_IMPORTED_MODULE_6__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ - variant: avatar ? 'body2' : 'body1', - className: classes.subheader, - color: "textSecondary", - component: "span", - display: "block" - }, subheaderTypographyProps), subheader); - } - - return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ - className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(classes.root, className), - ref: ref - }, other), avatar && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { - className: classes.avatar - }, avatar), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { - className: classes.content - }, title, subheader), action && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { - className: classes.action - }, action)); -}); - false ? undefined : void 0; -/* harmony default export */ __webpack_exports__["default"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__["default"])(styles, { - name: 'MuiCardHeader' -})(CardHeader)); - -/***/ }), - -/***/ "lPHp": -/***/ (function(module, exports, __webpack_require__) { - -(typeof navigator !== "undefined") && (function (global, factory) { - true ? module.exports = factory() : - undefined; -})(this, (function () { 'use strict'; - - var svgNS = 'http://www.w3.org/2000/svg'; - var locationHref = ''; - var _useWebWorker = false; - var initialDefaultFrame = -999999; - - var setWebWorker = function setWebWorker(flag) { - _useWebWorker = !!flag; - }; - - var getWebWorker = function getWebWorker() { - return _useWebWorker; - }; - - var setLocationHref = function setLocationHref(value) { - locationHref = value; - }; - - var getLocationHref = function getLocationHref() { - return locationHref; - }; - - function createTag(type) { - // return {appendChild:function(){},setAttribute:function(){},style:{}} - return document.createElement(type); - } - - function extendPrototype(sources, destination) { - var i; - var len = sources.length; - var sourcePrototype; - - for (i = 0; i < len; i += 1) { - sourcePrototype = sources[i].prototype; - - for (var attr in sourcePrototype) { - if (Object.prototype.hasOwnProperty.call(sourcePrototype, attr)) destination.prototype[attr] = sourcePrototype[attr]; - } - } - } - - function getDescriptor(object, prop) { - return Object.getOwnPropertyDescriptor(object, prop); - } - - function createProxyFunction(prototype) { - function ProxyFunction() {} - - ProxyFunction.prototype = prototype; - return ProxyFunction; - } - - // import Howl from '../../3rd_party/howler'; - var audioControllerFactory = function () { - function AudioController(audioFactory) { - this.audios = []; - this.audioFactory = audioFactory; - this._volume = 1; - this._isMuted = false; - } - - AudioController.prototype = { - addAudio: function addAudio(audio) { - this.audios.push(audio); - }, - pause: function pause() { - var i; - var len = this.audios.length; - - for (i = 0; i < len; i += 1) { - this.audios[i].pause(); - } - }, - resume: function resume() { - var i; - var len = this.audios.length; - - for (i = 0; i < len; i += 1) { - this.audios[i].resume(); - } - }, - setRate: function setRate(rateValue) { - var i; - var len = this.audios.length; - - for (i = 0; i < len; i += 1) { - this.audios[i].setRate(rateValue); - } - }, - createAudio: function createAudio(assetPath) { - if (this.audioFactory) { - return this.audioFactory(assetPath); - } - - if (window.Howl) { - return new window.Howl({ - src: [assetPath] - }); - } - - return { - isPlaying: false, - play: function play() { - this.isPlaying = true; - }, - seek: function seek() { - this.isPlaying = false; - }, - playing: function playing() {}, - rate: function rate() {}, - setVolume: function setVolume() {} - }; - }, - setAudioFactory: function setAudioFactory(audioFactory) { - this.audioFactory = audioFactory; - }, - setVolume: function setVolume(value) { - this._volume = value; - - this._updateVolume(); - }, - mute: function mute() { - this._isMuted = true; - - this._updateVolume(); - }, - unmute: function unmute() { - this._isMuted = false; - - this._updateVolume(); - }, - getVolume: function getVolume() { - return this._volume; - }, - _updateVolume: function _updateVolume() { - var i; - var len = this.audios.length; - - for (i = 0; i < len; i += 1) { - this.audios[i].volume(this._volume * (this._isMuted ? 0 : 1)); - } - } - }; - return function () { - return new AudioController(); - }; - }(); - - var createTypedArray = function () { - function createRegularArray(type, len) { - var i = 0; - var arr = []; - var value; - - switch (type) { - case 'int16': - case 'uint8c': - value = 1; - break; - - default: - value = 1.1; - break; - } - - for (i = 0; i < len; i += 1) { - arr.push(value); - } - - return arr; - } - - function createTypedArrayFactory(type, len) { - if (type === 'float32') { - return new Float32Array(len); - } - - if (type === 'int16') { - return new Int16Array(len); - } - - if (type === 'uint8c') { - return new Uint8ClampedArray(len); - } - - return createRegularArray(type, len); - } - - if (typeof Uint8ClampedArray === 'function' && typeof Float32Array === 'function') { - return createTypedArrayFactory; - } - - return createRegularArray; - }(); - - function createSizedArray(len) { - return Array.apply(null, { - length: len - }); - } - - function _typeof$6(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$6 = function _typeof(obj) { return typeof obj; }; } else { _typeof$6 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$6(obj); } - var subframeEnabled = true; - var expressionsPlugin = null; - var idPrefix$1 = ''; - var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); - var _shouldRoundValues = false; - var bmPow = Math.pow; - var bmSqrt = Math.sqrt; - var bmFloor = Math.floor; - var bmMax = Math.max; - var bmMin = Math.min; - var BMMath = {}; - - (function () { - var propertyNames = ['abs', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atanh', 'atan2', 'ceil', 'cbrt', 'expm1', 'clz32', 'cos', 'cosh', 'exp', 'floor', 'fround', 'hypot', 'imul', 'log', 'log1p', 'log2', 'log10', 'max', 'min', 'pow', 'random', 'round', 'sign', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'trunc', 'E', 'LN10', 'LN2', 'LOG10E', 'LOG2E', 'PI', 'SQRT1_2', 'SQRT2']; - var i; - var len = propertyNames.length; - - for (i = 0; i < len; i += 1) { - BMMath[propertyNames[i]] = Math[propertyNames[i]]; - } - })(); - - function ProjectInterface$1() { - return {}; - } - - BMMath.random = Math.random; - - BMMath.abs = function (val) { - var tOfVal = _typeof$6(val); - - if (tOfVal === 'object' && val.length) { - var absArr = createSizedArray(val.length); - var i; - var len = val.length; - - for (i = 0; i < len; i += 1) { - absArr[i] = Math.abs(val[i]); - } - - return absArr; - } - - return Math.abs(val); - }; - - var defaultCurveSegments = 150; - var degToRads = Math.PI / 180; - var roundCorner = 0.5519; - - function roundValues(flag) { - _shouldRoundValues = !!flag; - } - - function bmRnd(value) { - if (_shouldRoundValues) { - return Math.round(value); - } - - return value; - } - - function styleDiv(element) { - element.style.position = 'absolute'; - element.style.top = 0; - element.style.left = 0; - element.style.display = 'block'; - element.style.transformOrigin = '0 0'; - element.style.webkitTransformOrigin = '0 0'; - element.style.backfaceVisibility = 'visible'; - element.style.webkitBackfaceVisibility = 'visible'; - element.style.transformStyle = 'preserve-3d'; - element.style.webkitTransformStyle = 'preserve-3d'; - element.style.mozTransformStyle = 'preserve-3d'; - } - - function BMEnterFrameEvent(type, currentTime, totalTime, frameMultiplier) { - this.type = type; - this.currentTime = currentTime; - this.totalTime = totalTime; - this.direction = frameMultiplier < 0 ? -1 : 1; - } - - function BMCompleteEvent(type, frameMultiplier) { - this.type = type; - this.direction = frameMultiplier < 0 ? -1 : 1; - } - - function BMCompleteLoopEvent(type, totalLoops, currentLoop, frameMultiplier) { - this.type = type; - this.currentLoop = currentLoop; - this.totalLoops = totalLoops; - this.direction = frameMultiplier < 0 ? -1 : 1; - } - - function BMSegmentStartEvent(type, firstFrame, totalFrames) { - this.type = type; - this.firstFrame = firstFrame; - this.totalFrames = totalFrames; - } - - function BMDestroyEvent(type, target) { - this.type = type; - this.target = target; - } - - function BMRenderFrameErrorEvent(nativeError, currentTime) { - this.type = 'renderFrameError'; - this.nativeError = nativeError; - this.currentTime = currentTime; - } - - function BMConfigErrorEvent(nativeError) { - this.type = 'configError'; - this.nativeError = nativeError; - } - - function BMAnimationConfigErrorEvent(type, nativeError) { - this.type = type; - this.nativeError = nativeError; - } - - var createElementID = function () { - var _count = 0; - return function createID() { - _count += 1; - return idPrefix$1 + '__lottie_element_' + _count; - }; - }(); - - function HSVtoRGB(h, s, v) { - var r; - var g; - var b; - var i; - var f; - var p; - var q; - var t; - i = Math.floor(h * 6); - f = h * 6 - i; - p = v * (1 - s); - q = v * (1 - f * s); - t = v * (1 - (1 - f) * s); - - switch (i % 6) { - case 0: - r = v; - g = t; - b = p; - break; - - case 1: - r = q; - g = v; - b = p; - break; - - case 2: - r = p; - g = v; - b = t; - break; - - case 3: - r = p; - g = q; - b = v; - break; - - case 4: - r = t; - g = p; - b = v; - break; - - case 5: - r = v; - g = p; - b = q; - break; - - default: - break; - } - - return [r, g, b]; - } - - function RGBtoHSV(r, g, b) { - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var d = max - min; - var h; - var s = max === 0 ? 0 : d / max; - var v = max / 255; - - switch (max) { - case min: - h = 0; - break; - - case r: - h = g - b + d * (g < b ? 6 : 0); - h /= 6 * d; - break; - - case g: - h = b - r + d * 2; - h /= 6 * d; - break; - - case b: - h = r - g + d * 4; - h /= 6 * d; - break; - - default: - break; - } - - return [h, s, v]; - } - - function addSaturationToRGB(color, offset) { - var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255); - hsv[1] += offset; - - if (hsv[1] > 1) { - hsv[1] = 1; - } else if (hsv[1] <= 0) { - hsv[1] = 0; - } - - return HSVtoRGB(hsv[0], hsv[1], hsv[2]); - } - - function addBrightnessToRGB(color, offset) { - var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255); - hsv[2] += offset; - - if (hsv[2] > 1) { - hsv[2] = 1; - } else if (hsv[2] < 0) { - hsv[2] = 0; - } - - return HSVtoRGB(hsv[0], hsv[1], hsv[2]); - } - - function addHueToRGB(color, offset) { - var hsv = RGBtoHSV(color[0] * 255, color[1] * 255, color[2] * 255); - hsv[0] += offset / 360; - - if (hsv[0] > 1) { - hsv[0] -= 1; - } else if (hsv[0] < 0) { - hsv[0] += 1; - } - - return HSVtoRGB(hsv[0], hsv[1], hsv[2]); - } - - var rgbToHex = function () { - var colorMap = []; - var i; - var hex; - - for (i = 0; i < 256; i += 1) { - hex = i.toString(16); - colorMap[i] = hex.length === 1 ? '0' + hex : hex; - } - - return function (r, g, b) { - if (r < 0) { - r = 0; - } - - if (g < 0) { - g = 0; - } - - if (b < 0) { - b = 0; - } - - return '#' + colorMap[r] + colorMap[g] + colorMap[b]; - }; - }(); - - var setSubframeEnabled = function setSubframeEnabled(flag) { - subframeEnabled = !!flag; - }; - - var getSubframeEnabled = function getSubframeEnabled() { - return subframeEnabled; - }; - - var setExpressionsPlugin = function setExpressionsPlugin(value) { - expressionsPlugin = value; - }; - - var getExpressionsPlugin = function getExpressionsPlugin() { - return expressionsPlugin; - }; - - var setDefaultCurveSegments = function setDefaultCurveSegments(value) { - defaultCurveSegments = value; - }; - - var getDefaultCurveSegments = function getDefaultCurveSegments() { - return defaultCurveSegments; - }; - - var setIdPrefix = function setIdPrefix(value) { - idPrefix$1 = value; - }; - - var getIdPrefix = function getIdPrefix() { - return idPrefix$1; - }; - - function createNS(type) { - // return {appendChild:function(){},setAttribute:function(){},style:{}} - return document.createElementNS(svgNS, type); - } - - function _typeof$5(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$5 = function _typeof(obj) { return typeof obj; }; } else { _typeof$5 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$5(obj); } - - var dataManager = function () { - var _counterId = 1; - var processes = []; - var workerFn; - var workerInstance; - var workerProxy = { - onmessage: function onmessage() {}, - postMessage: function postMessage(path) { - workerFn({ - data: path - }); - } - }; - var _workerSelf = { - postMessage: function postMessage(data) { - workerProxy.onmessage({ - data: data - }); - } - }; - - function createWorker(fn) { - if (window.Worker && window.Blob && getWebWorker()) { - var blob = new Blob(['var _workerSelf = self; self.onmessage = ', fn.toString()], { - type: 'text/javascript' - }); // var blob = new Blob(['self.onmessage = ', fn.toString()], { type: 'text/javascript' }); - - var url = URL.createObjectURL(blob); - return new Worker(url); - } - - workerFn = fn; - return workerProxy; - } - - function setupWorker() { - if (!workerInstance) { - workerInstance = createWorker(function workerStart(e) { - function dataFunctionManager() { - function completeLayers(layers, comps) { - var layerData; - var i; - var len = layers.length; - var j; - var jLen; - var k; - var kLen; - - for (i = 0; i < len; i += 1) { - layerData = layers[i]; - - if ('ks' in layerData && !layerData.completed) { - layerData.completed = true; - - if (layerData.tt) { - layers[i - 1].td = layerData.tt; - } - - if (layerData.hasMask) { - var maskProps = layerData.masksProperties; - jLen = maskProps.length; - - for (j = 0; j < jLen; j += 1) { - if (maskProps[j].pt.k.i) { - convertPathsToAbsoluteValues(maskProps[j].pt.k); - } else { - kLen = maskProps[j].pt.k.length; - - for (k = 0; k < kLen; k += 1) { - if (maskProps[j].pt.k[k].s) { - convertPathsToAbsoluteValues(maskProps[j].pt.k[k].s[0]); - } - - if (maskProps[j].pt.k[k].e) { - convertPathsToAbsoluteValues(maskProps[j].pt.k[k].e[0]); - } - } - } - } - } - - if (layerData.ty === 0) { - layerData.layers = findCompLayers(layerData.refId, comps); - completeLayers(layerData.layers, comps); - } else if (layerData.ty === 4) { - completeShapes(layerData.shapes); - } else if (layerData.ty === 5) { - completeText(layerData); - } - } - } - } - - function completeChars(chars, assets) { - if (chars) { - var i = 0; - var len = chars.length; - - for (i = 0; i < len; i += 1) { - if (chars[i].t === 1) { - // var compData = findComp(chars[i].data.refId, assets); - chars[i].data.layers = findCompLayers(chars[i].data.refId, assets); // chars[i].data.ip = 0; - // chars[i].data.op = 99999; - // chars[i].data.st = 0; - // chars[i].data.sr = 1; - // chars[i].w = compData.w; - // chars[i].data.ks = { - // a: { k: [0, 0, 0], a: 0 }, - // p: { k: [0, -compData.h, 0], a: 0 }, - // r: { k: 0, a: 0 }, - // s: { k: [100, 100], a: 0 }, - // o: { k: 100, a: 0 }, - // }; - - completeLayers(chars[i].data.layers, assets); - } - } - } - } - - function findComp(id, comps) { - var i = 0; - var len = comps.length; - - while (i < len) { - if (comps[i].id === id) { - return comps[i]; - } - - i += 1; - } - - return null; - } - - function findCompLayers(id, comps) { - var comp = findComp(id, comps); - - if (comp) { - if (!comp.layers.__used) { - comp.layers.__used = true; - return comp.layers; - } - - return JSON.parse(JSON.stringify(comp.layers)); - } - - return null; - } - - function completeShapes(arr) { - var i; - var len = arr.length; - var j; - var jLen; - - for (i = len - 1; i >= 0; i -= 1) { - if (arr[i].ty === 'sh') { - if (arr[i].ks.k.i) { - convertPathsToAbsoluteValues(arr[i].ks.k); - } else { - jLen = arr[i].ks.k.length; - - for (j = 0; j < jLen; j += 1) { - if (arr[i].ks.k[j].s) { - convertPathsToAbsoluteValues(arr[i].ks.k[j].s[0]); - } - - if (arr[i].ks.k[j].e) { - convertPathsToAbsoluteValues(arr[i].ks.k[j].e[0]); - } - } - } - } else if (arr[i].ty === 'gr') { - completeShapes(arr[i].it); - } - } - } - - function convertPathsToAbsoluteValues(path) { - var i; - var len = path.i.length; - - for (i = 0; i < len; i += 1) { - path.i[i][0] += path.v[i][0]; - path.i[i][1] += path.v[i][1]; - path.o[i][0] += path.v[i][0]; - path.o[i][1] += path.v[i][1]; - } - } - - function checkVersion(minimum, animVersionString) { - var animVersion = animVersionString ? animVersionString.split('.') : [100, 100, 100]; - - if (minimum[0] > animVersion[0]) { - return true; - } - - if (animVersion[0] > minimum[0]) { - return false; - } - - if (minimum[1] > animVersion[1]) { - return true; - } - - if (animVersion[1] > minimum[1]) { - return false; - } - - if (minimum[2] > animVersion[2]) { - return true; - } - - if (animVersion[2] > minimum[2]) { - return false; - } - - return null; - } - - var checkText = function () { - var minimumVersion = [4, 4, 14]; - - function updateTextLayer(textLayer) { - var documentData = textLayer.t.d; - textLayer.t.d = { - k: [{ - s: documentData, - t: 0 - }] - }; - } - - function iterateLayers(layers) { - var i; - var len = layers.length; - - for (i = 0; i < len; i += 1) { - if (layers[i].ty === 5) { - updateTextLayer(layers[i]); - } - } - } - - return function (animationData) { - if (checkVersion(minimumVersion, animationData.v)) { - iterateLayers(animationData.layers); - - if (animationData.assets) { - var i; - var len = animationData.assets.length; - - for (i = 0; i < len; i += 1) { - if (animationData.assets[i].layers) { - iterateLayers(animationData.assets[i].layers); - } - } - } - } - }; - }(); - - var checkChars = function () { - var minimumVersion = [4, 7, 99]; - return function (animationData) { - if (animationData.chars && !checkVersion(minimumVersion, animationData.v)) { - var i; - var len = animationData.chars.length; - - for (i = 0; i < len; i += 1) { - var charData = animationData.chars[i]; - - if (charData.data && charData.data.shapes) { - completeShapes(charData.data.shapes); - charData.data.ip = 0; - charData.data.op = 99999; - charData.data.st = 0; - charData.data.sr = 1; - charData.data.ks = { - p: { - k: [0, 0], - a: 0 - }, - s: { - k: [100, 100], - a: 0 - }, - a: { - k: [0, 0], - a: 0 - }, - r: { - k: 0, - a: 0 - }, - o: { - k: 100, - a: 0 - } - }; - - if (!animationData.chars[i].t) { - charData.data.shapes.push({ - ty: 'no' - }); - charData.data.shapes[0].it.push({ - p: { - k: [0, 0], - a: 0 - }, - s: { - k: [100, 100], - a: 0 - }, - a: { - k: [0, 0], - a: 0 - }, - r: { - k: 0, - a: 0 - }, - o: { - k: 100, - a: 0 - }, - sk: { - k: 0, - a: 0 - }, - sa: { - k: 0, - a: 0 - }, - ty: 'tr' - }); - } - } - } - } - }; - }(); - - var checkPathProperties = function () { - var minimumVersion = [5, 7, 15]; - - function updateTextLayer(textLayer) { - var pathData = textLayer.t.p; - - if (typeof pathData.a === 'number') { - pathData.a = { - a: 0, - k: pathData.a - }; - } - - if (typeof pathData.p === 'number') { - pathData.p = { - a: 0, - k: pathData.p - }; - } - - if (typeof pathData.r === 'number') { - pathData.r = { - a: 0, - k: pathData.r - }; - } - } - - function iterateLayers(layers) { - var i; - var len = layers.length; - - for (i = 0; i < len; i += 1) { - if (layers[i].ty === 5) { - updateTextLayer(layers[i]); - } - } - } - - return function (animationData) { - if (checkVersion(minimumVersion, animationData.v)) { - iterateLayers(animationData.layers); - - if (animationData.assets) { - var i; - var len = animationData.assets.length; - - for (i = 0; i < len; i += 1) { - if (animationData.assets[i].layers) { - iterateLayers(animationData.assets[i].layers); - } - } - } - } - }; - }(); - - var checkColors = function () { - var minimumVersion = [4, 1, 9]; - - function iterateShapes(shapes) { - var i; - var len = shapes.length; - var j; - var jLen; - - for (i = 0; i < len; i += 1) { - if (shapes[i].ty === 'gr') { - iterateShapes(shapes[i].it); - } else if (shapes[i].ty === 'fl' || shapes[i].ty === 'st') { - if (shapes[i].c.k && shapes[i].c.k[0].i) { - jLen = shapes[i].c.k.length; - - for (j = 0; j < jLen; j += 1) { - if (shapes[i].c.k[j].s) { - shapes[i].c.k[j].s[0] /= 255; - shapes[i].c.k[j].s[1] /= 255; - shapes[i].c.k[j].s[2] /= 255; - shapes[i].c.k[j].s[3] /= 255; - } - - if (shapes[i].c.k[j].e) { - shapes[i].c.k[j].e[0] /= 255; - shapes[i].c.k[j].e[1] /= 255; - shapes[i].c.k[j].e[2] /= 255; - shapes[i].c.k[j].e[3] /= 255; - } - } - } else { - shapes[i].c.k[0] /= 255; - shapes[i].c.k[1] /= 255; - shapes[i].c.k[2] /= 255; - shapes[i].c.k[3] /= 255; - } - } - } - } - - function iterateLayers(layers) { - var i; - var len = layers.length; - - for (i = 0; i < len; i += 1) { - if (layers[i].ty === 4) { - iterateShapes(layers[i].shapes); - } - } - } - - return function (animationData) { - if (checkVersion(minimumVersion, animationData.v)) { - iterateLayers(animationData.layers); - - if (animationData.assets) { - var i; - var len = animationData.assets.length; - - for (i = 0; i < len; i += 1) { - if (animationData.assets[i].layers) { - iterateLayers(animationData.assets[i].layers); - } - } - } - } - }; - }(); - - var checkShapes = function () { - var minimumVersion = [4, 4, 18]; - - function completeClosingShapes(arr) { - var i; - var len = arr.length; - var j; - var jLen; - - for (i = len - 1; i >= 0; i -= 1) { - if (arr[i].ty === 'sh') { - if (arr[i].ks.k.i) { - arr[i].ks.k.c = arr[i].closed; - } else { - jLen = arr[i].ks.k.length; - - for (j = 0; j < jLen; j += 1) { - if (arr[i].ks.k[j].s) { - arr[i].ks.k[j].s[0].c = arr[i].closed; - } - - if (arr[i].ks.k[j].e) { - arr[i].ks.k[j].e[0].c = arr[i].closed; - } - } - } - } else if (arr[i].ty === 'gr') { - completeClosingShapes(arr[i].it); - } - } - } - - function iterateLayers(layers) { - var layerData; - var i; - var len = layers.length; - var j; - var jLen; - var k; - var kLen; - - for (i = 0; i < len; i += 1) { - layerData = layers[i]; - - if (layerData.hasMask) { - var maskProps = layerData.masksProperties; - jLen = maskProps.length; - - for (j = 0; j < jLen; j += 1) { - if (maskProps[j].pt.k.i) { - maskProps[j].pt.k.c = maskProps[j].cl; - } else { - kLen = maskProps[j].pt.k.length; - - for (k = 0; k < kLen; k += 1) { - if (maskProps[j].pt.k[k].s) { - maskProps[j].pt.k[k].s[0].c = maskProps[j].cl; - } - - if (maskProps[j].pt.k[k].e) { - maskProps[j].pt.k[k].e[0].c = maskProps[j].cl; - } - } - } - } - } - - if (layerData.ty === 4) { - completeClosingShapes(layerData.shapes); - } - } - } - - return function (animationData) { - if (checkVersion(minimumVersion, animationData.v)) { - iterateLayers(animationData.layers); - - if (animationData.assets) { - var i; - var len = animationData.assets.length; - - for (i = 0; i < len; i += 1) { - if (animationData.assets[i].layers) { - iterateLayers(animationData.assets[i].layers); - } - } - } - } - }; - }(); - - function completeData(animationData) { - if (animationData.__complete) { - return; - } - - checkColors(animationData); - checkText(animationData); - checkChars(animationData); - checkPathProperties(animationData); - checkShapes(animationData); - completeLayers(animationData.layers, animationData.assets); - completeChars(animationData.chars, animationData.assets); - animationData.__complete = true; - } - - function completeText(data) { - if (data.t.a.length === 0 && !('m' in data.t.p)) {// data.singleShape = true; - } - } - - var moduleOb = {}; - moduleOb.completeData = completeData; - moduleOb.checkColors = checkColors; - moduleOb.checkChars = checkChars; - moduleOb.checkPathProperties = checkPathProperties; - moduleOb.checkShapes = checkShapes; - moduleOb.completeLayers = completeLayers; - return moduleOb; - } - - if (!_workerSelf.dataManager) { - _workerSelf.dataManager = dataFunctionManager(); - } - - if (!_workerSelf.assetLoader) { - _workerSelf.assetLoader = function () { - function formatResponse(xhr) { - // using typeof doubles the time of execution of this method, - // so if available, it's better to use the header to validate the type - var contentTypeHeader = xhr.getResponseHeader('content-type'); - - if (contentTypeHeader && xhr.responseType === 'json' && contentTypeHeader.indexOf('json') !== -1) { - return xhr.response; - } - - if (xhr.response && _typeof$5(xhr.response) === 'object') { - return xhr.response; - } - - if (xhr.response && typeof xhr.response === 'string') { - return JSON.parse(xhr.response); - } - - if (xhr.responseText) { - return JSON.parse(xhr.responseText); - } - - return null; - } - - function loadAsset(path, fullPath, callback, errorCallback) { - var response; - var xhr = new XMLHttpRequest(); // set responseType after calling open or IE will break. - - try { - // This crashes on Android WebView prior to KitKat - xhr.responseType = 'json'; - } catch (err) {} // eslint-disable-line no-empty - - - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - response = formatResponse(xhr); - callback(response); - } else { - try { - response = formatResponse(xhr); - callback(response); - } catch (err) { - if (errorCallback) { - errorCallback(err); - } - } - } - } - }; - - try { - xhr.open('GET', path, true); - } catch (error) { - xhr.open('GET', fullPath + '/' + path, true); - } - - xhr.send(); - } - - return { - load: loadAsset - }; - }(); - } - - if (e.data.type === 'loadAnimation') { - _workerSelf.assetLoader.load(e.data.path, e.data.fullPath, function (data) { - _workerSelf.dataManager.completeData(data); - - _workerSelf.postMessage({ - id: e.data.id, - payload: data, - status: 'success' - }); - }, function () { - _workerSelf.postMessage({ - id: e.data.id, - status: 'error' - }); - }); - } else if (e.data.type === 'complete') { - var animation = e.data.animation; - - _workerSelf.dataManager.completeData(animation); - - _workerSelf.postMessage({ - id: e.data.id, - payload: animation, - status: 'success' - }); - } else if (e.data.type === 'loadData') { - _workerSelf.assetLoader.load(e.data.path, e.data.fullPath, function (data) { - _workerSelf.postMessage({ - id: e.data.id, - payload: data, - status: 'success' - }); - }, function () { - _workerSelf.postMessage({ - id: e.data.id, - status: 'error' - }); - }); - } - }); - - workerInstance.onmessage = function (event) { - var data = event.data; - var id = data.id; - var process = processes[id]; - processes[id] = null; - - if (data.status === 'success') { - process.onComplete(data.payload); - } else if (process.onError) { - process.onError(); - } - }; - } - } - - function createProcess(onComplete, onError) { - _counterId += 1; - var id = 'processId_' + _counterId; - processes[id] = { - onComplete: onComplete, - onError: onError - }; - return id; - } - - function loadAnimation(path, onComplete, onError) { - setupWorker(); - var processId = createProcess(onComplete, onError); - workerInstance.postMessage({ - type: 'loadAnimation', - path: path, - fullPath: window.location.origin + window.location.pathname, - id: processId - }); - } - - function loadData(path, onComplete, onError) { - setupWorker(); - var processId = createProcess(onComplete, onError); - workerInstance.postMessage({ - type: 'loadData', - path: path, - fullPath: window.location.origin + window.location.pathname, - id: processId - }); - } - - function completeAnimation(anim, onComplete, onError) { - setupWorker(); - var processId = createProcess(onComplete, onError); - workerInstance.postMessage({ - type: 'complete', - animation: anim, - id: processId - }); - } - - return { - loadAnimation: loadAnimation, - loadData: loadData, - completeAnimation: completeAnimation - }; - }(); - - var ImagePreloader = function () { - var proxyImage = function () { - var canvas = createTag('canvas'); - canvas.width = 1; - canvas.height = 1; - var ctx = canvas.getContext('2d'); - ctx.fillStyle = 'rgba(0,0,0,0)'; - ctx.fillRect(0, 0, 1, 1); - return canvas; - }(); - - function imageLoaded() { - this.loadedAssets += 1; - - if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) { - if (this.imagesLoadedCb) { - this.imagesLoadedCb(null); - } - } - } - - function footageLoaded() { - this.loadedFootagesCount += 1; - - if (this.loadedAssets === this.totalImages && this.loadedFootagesCount === this.totalFootages) { - if (this.imagesLoadedCb) { - this.imagesLoadedCb(null); - } - } - } - - function getAssetsPath(assetData, assetsPath, originalPath) { - var path = ''; - - if (assetData.e) { - path = assetData.p; - } else if (assetsPath) { - var imagePath = assetData.p; - - if (imagePath.indexOf('images/') !== -1) { - imagePath = imagePath.split('/')[1]; - } - - path = assetsPath + imagePath; - } else { - path = originalPath; - path += assetData.u ? assetData.u : ''; - path += assetData.p; - } - - return path; - } - - function testImageLoaded(img) { - var _count = 0; - var intervalId = setInterval(function () { - var box = img.getBBox(); - - if (box.width || _count > 500) { - this._imageLoaded(); - - clearInterval(intervalId); - } - - _count += 1; - }.bind(this), 50); - } - - function createImageData(assetData) { - var path = getAssetsPath(assetData, this.assetsPath, this.path); - var img = createNS('image'); - - if (isSafari) { - this.testImageLoaded(img); - } else { - img.addEventListener('load', this._imageLoaded, false); - } - - img.addEventListener('error', function () { - ob.img = proxyImage; - - this._imageLoaded(); - }.bind(this), false); - img.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path); - - if (this._elementHelper.append) { - this._elementHelper.append(img); - } else { - this._elementHelper.appendChild(img); - } - - var ob = { - img: img, - assetData: assetData - }; - return ob; - } - - function createImgData(assetData) { - var path = getAssetsPath(assetData, this.assetsPath, this.path); - var img = createTag('img'); - img.crossOrigin = 'anonymous'; - img.addEventListener('load', this._imageLoaded, false); - img.addEventListener('error', function () { - ob.img = proxyImage; - - this._imageLoaded(); - }.bind(this), false); - img.src = path; - var ob = { - img: img, - assetData: assetData - }; - return ob; - } - - function createFootageData(data) { - var ob = { - assetData: data - }; - var path = getAssetsPath(data, this.assetsPath, this.path); - dataManager.loadData(path, function (footageData) { - ob.img = footageData; - - this._footageLoaded(); - }.bind(this), function () { - ob.img = {}; - - this._footageLoaded(); - }.bind(this)); - return ob; - } - - function loadAssets(assets, cb) { - this.imagesLoadedCb = cb; - var i; - var len = assets.length; - - for (i = 0; i < len; i += 1) { - if (!assets[i].layers) { - if (!assets[i].t || assets[i].t === 'seq') { - this.totalImages += 1; - this.images.push(this._createImageData(assets[i])); - } else if (assets[i].t === 3) { - this.totalFootages += 1; - this.images.push(this.createFootageData(assets[i])); - } - } - } - } - - function setPath(path) { - this.path = path || ''; - } - - function setAssetsPath(path) { - this.assetsPath = path || ''; - } - - function getAsset(assetData) { - var i = 0; - var len = this.images.length; - - while (i < len) { - if (this.images[i].assetData === assetData) { - return this.images[i].img; - } - - i += 1; - } - - return null; - } - - function destroy() { - this.imagesLoadedCb = null; - this.images.length = 0; - } - - function loadedImages() { - return this.totalImages === this.loadedAssets; - } - - function loadedFootages() { - return this.totalFootages === this.loadedFootagesCount; - } - - function setCacheType(type, elementHelper) { - if (type === 'svg') { - this._elementHelper = elementHelper; - this._createImageData = this.createImageData.bind(this); - } else { - this._createImageData = this.createImgData.bind(this); - } - } - - function ImagePreloaderFactory() { - this._imageLoaded = imageLoaded.bind(this); - this._footageLoaded = footageLoaded.bind(this); - this.testImageLoaded = testImageLoaded.bind(this); - this.createFootageData = createFootageData.bind(this); - this.assetsPath = ''; - this.path = ''; - this.totalImages = 0; - this.totalFootages = 0; - this.loadedAssets = 0; - this.loadedFootagesCount = 0; - this.imagesLoadedCb = null; - this.images = []; - } - - ImagePreloaderFactory.prototype = { - loadAssets: loadAssets, - setAssetsPath: setAssetsPath, - setPath: setPath, - loadedImages: loadedImages, - loadedFootages: loadedFootages, - destroy: destroy, - getAsset: getAsset, - createImgData: createImgData, - createImageData: createImageData, - imageLoaded: imageLoaded, - footageLoaded: footageLoaded, - setCacheType: setCacheType - }; - return ImagePreloaderFactory; - }(); - - function BaseEvent() {} - - BaseEvent.prototype = { - triggerEvent: function triggerEvent(eventName, args) { - if (this._cbs[eventName]) { - var callbacks = this._cbs[eventName]; - - for (var i = 0; i < callbacks.length; i += 1) { - callbacks[i](args); - } - } - }, - addEventListener: function addEventListener(eventName, callback) { - if (!this._cbs[eventName]) { - this._cbs[eventName] = []; - } - - this._cbs[eventName].push(callback); - - return function () { - this.removeEventListener(eventName, callback); - }.bind(this); - }, - removeEventListener: function removeEventListener(eventName, callback) { - if (!callback) { - this._cbs[eventName] = null; - } else if (this._cbs[eventName]) { - var i = 0; - var len = this._cbs[eventName].length; - - while (i < len) { - if (this._cbs[eventName][i] === callback) { - this._cbs[eventName].splice(i, 1); - - i -= 1; - len -= 1; - } - - i += 1; - } - - if (!this._cbs[eventName].length) { - this._cbs[eventName] = null; - } - } - } - }; - - var markerParser = function () { - function parsePayloadLines(payload) { - var lines = payload.split('\r\n'); - var keys = {}; - var line; - var keysCount = 0; - - for (var i = 0; i < lines.length; i += 1) { - line = lines[i].split(':'); - - if (line.length === 2) { - keys[line[0]] = line[1].trim(); - keysCount += 1; - } - } - - if (keysCount === 0) { - throw new Error(); - } - - return keys; - } - - return function (_markers) { - var markers = []; - - for (var i = 0; i < _markers.length; i += 1) { - var _marker = _markers[i]; - var markerData = { - time: _marker.tm, - duration: _marker.dr - }; - - try { - markerData.payload = JSON.parse(_markers[i].cm); - } catch (_) { - try { - markerData.payload = parsePayloadLines(_markers[i].cm); - } catch (__) { - markerData.payload = { - name: _markers[i].cm - }; - } - } - - markers.push(markerData); - } - - return markers; - }; - }(); - - var ProjectInterface = function () { - function registerComposition(comp) { - this.compositions.push(comp); - } - - return function () { - function _thisProjectFunction(name) { - var i = 0; - var len = this.compositions.length; - - while (i < len) { - if (this.compositions[i].data && this.compositions[i].data.nm === name) { - if (this.compositions[i].prepareFrame && this.compositions[i].data.xt) { - this.compositions[i].prepareFrame(this.currentFrame); - } - - return this.compositions[i].compInterface; - } - - i += 1; - } - - return null; - } - - _thisProjectFunction.compositions = []; - _thisProjectFunction.currentFrame = 0; - _thisProjectFunction.registerComposition = registerComposition; - return _thisProjectFunction; - }; - }(); - - var renderers = {}; - - var registerRenderer = function registerRenderer(key, value) { - renderers[key] = value; - }; - - function getRenderer(key) { - return renderers[key]; - } - - function _typeof$4(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$4 = function _typeof(obj) { return typeof obj; }; } else { _typeof$4 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$4(obj); } - - var AnimationItem = function AnimationItem() { - this._cbs = []; - this.name = ''; - this.path = ''; - this.isLoaded = false; - this.currentFrame = 0; - this.currentRawFrame = 0; - this.firstFrame = 0; - this.totalFrames = 0; - this.frameRate = 0; - this.frameMult = 0; - this.playSpeed = 1; - this.playDirection = 1; - this.playCount = 0; - this.animationData = {}; - this.assets = []; - this.isPaused = true; - this.autoplay = false; - this.loop = true; - this.renderer = null; - this.animationID = createElementID(); - this.assetsPath = ''; - this.timeCompleted = 0; - this.segmentPos = 0; - this.isSubframeEnabled = getSubframeEnabled(); - this.segments = []; - this._idle = true; - this._completedLoop = false; - this.projectInterface = ProjectInterface(); - this.imagePreloader = new ImagePreloader(); - this.audioController = audioControllerFactory(); - this.markers = []; - this.configAnimation = this.configAnimation.bind(this); - this.onSetupError = this.onSetupError.bind(this); - this.onSegmentComplete = this.onSegmentComplete.bind(this); - this.drawnFrameEvent = new BMEnterFrameEvent('drawnFrame', 0, 0, 0); - }; - - extendPrototype([BaseEvent], AnimationItem); - - AnimationItem.prototype.setParams = function (params) { - if (params.wrapper || params.container) { - this.wrapper = params.wrapper || params.container; - } - - var animType = 'svg'; - - if (params.animType) { - animType = params.animType; - } else if (params.renderer) { - animType = params.renderer; - } - - var RendererClass = getRenderer(animType); - this.renderer = new RendererClass(this, params.rendererSettings); - this.imagePreloader.setCacheType(animType, this.renderer.globalData.defs); - this.renderer.setProjectInterface(this.projectInterface); - this.animType = animType; - - if (params.loop === '' || params.loop === null || params.loop === undefined || params.loop === true) { - this.loop = true; - } else if (params.loop === false) { - this.loop = false; - } else { - this.loop = parseInt(params.loop, 10); - } - - this.autoplay = 'autoplay' in params ? params.autoplay : true; - this.name = params.name ? params.name : ''; - this.autoloadSegments = Object.prototype.hasOwnProperty.call(params, 'autoloadSegments') ? params.autoloadSegments : true; - this.assetsPath = params.assetsPath; - this.initialSegment = params.initialSegment; - - if (params.audioFactory) { - this.audioController.setAudioFactory(params.audioFactory); - } - - if (params.animationData) { - this.setupAnimation(params.animationData); - } else if (params.path) { - if (params.path.lastIndexOf('\\') !== -1) { - this.path = params.path.substr(0, params.path.lastIndexOf('\\') + 1); - } else { - this.path = params.path.substr(0, params.path.lastIndexOf('/') + 1); - } - - this.fileName = params.path.substr(params.path.lastIndexOf('/') + 1); - this.fileName = this.fileName.substr(0, this.fileName.lastIndexOf('.json')); - dataManager.loadAnimation(params.path, this.configAnimation, this.onSetupError); - } - }; - - AnimationItem.prototype.onSetupError = function () { - this.trigger('data_failed'); - }; - - AnimationItem.prototype.setupAnimation = function (data) { - dataManager.completeAnimation(data, this.configAnimation); - }; - - AnimationItem.prototype.setData = function (wrapper, animationData) { - if (animationData) { - if (_typeof$4(animationData) !== 'object') { - animationData = JSON.parse(animationData); - } - } - - var params = { - wrapper: wrapper, - animationData: animationData - }; - var wrapperAttributes = wrapper.attributes; - params.path = wrapperAttributes.getNamedItem('data-animation-path') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-animation-path').value : wrapperAttributes.getNamedItem('data-bm-path') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-path').value : wrapperAttributes.getNamedItem('bm-path') ? wrapperAttributes.getNamedItem('bm-path').value : ''; - params.animType = wrapperAttributes.getNamedItem('data-anim-type') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-anim-type').value : wrapperAttributes.getNamedItem('data-bm-type') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-type').value : wrapperAttributes.getNamedItem('bm-type') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('bm-type').value : wrapperAttributes.getNamedItem('data-bm-renderer') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-renderer').value : wrapperAttributes.getNamedItem('bm-renderer') ? wrapperAttributes.getNamedItem('bm-renderer').value : 'canvas'; - var loop = wrapperAttributes.getNamedItem('data-anim-loop') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-anim-loop').value : wrapperAttributes.getNamedItem('data-bm-loop') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-loop').value : wrapperAttributes.getNamedItem('bm-loop') ? wrapperAttributes.getNamedItem('bm-loop').value : ''; - - if (loop === 'false') { - params.loop = false; - } else if (loop === 'true') { - params.loop = true; - } else if (loop !== '') { - params.loop = parseInt(loop, 10); - } - - var autoplay = wrapperAttributes.getNamedItem('data-anim-autoplay') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-anim-autoplay').value : wrapperAttributes.getNamedItem('data-bm-autoplay') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-autoplay').value : wrapperAttributes.getNamedItem('bm-autoplay') ? wrapperAttributes.getNamedItem('bm-autoplay').value : true; - params.autoplay = autoplay !== 'false'; - params.name = wrapperAttributes.getNamedItem('data-name') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-name').value : wrapperAttributes.getNamedItem('data-bm-name') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-name').value : wrapperAttributes.getNamedItem('bm-name') ? wrapperAttributes.getNamedItem('bm-name').value : ''; - var prerender = wrapperAttributes.getNamedItem('data-anim-prerender') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-anim-prerender').value : wrapperAttributes.getNamedItem('data-bm-prerender') // eslint-disable-line no-nested-ternary - ? wrapperAttributes.getNamedItem('data-bm-prerender').value : wrapperAttributes.getNamedItem('bm-prerender') ? wrapperAttributes.getNamedItem('bm-prerender').value : ''; - - if (prerender === 'false') { - params.prerender = false; - } - - this.setParams(params); - }; - - AnimationItem.prototype.includeLayers = function (data) { - if (data.op > this.animationData.op) { - this.animationData.op = data.op; - this.totalFrames = Math.floor(data.op - this.animationData.ip); - } - - var layers = this.animationData.layers; - var i; - var len = layers.length; - var newLayers = data.layers; - var j; - var jLen = newLayers.length; - - for (j = 0; j < jLen; j += 1) { - i = 0; - - while (i < len) { - if (layers[i].id === newLayers[j].id) { - layers[i] = newLayers[j]; - break; - } - - i += 1; - } - } - - if (data.chars || data.fonts) { - this.renderer.globalData.fontManager.addChars(data.chars); - this.renderer.globalData.fontManager.addFonts(data.fonts, this.renderer.globalData.defs); - } - - if (data.assets) { - len = data.assets.length; - - for (i = 0; i < len; i += 1) { - this.animationData.assets.push(data.assets[i]); - } - } - - this.animationData.__complete = false; - dataManager.completeAnimation(this.animationData, this.onSegmentComplete); - }; - - AnimationItem.prototype.onSegmentComplete = function (data) { - this.animationData = data; - var expressionsPlugin = getExpressionsPlugin(); - - if (expressionsPlugin) { - expressionsPlugin.initExpressions(this); - } - - this.loadNextSegment(); - }; - - AnimationItem.prototype.loadNextSegment = function () { - var segments = this.animationData.segments; - - if (!segments || segments.length === 0 || !this.autoloadSegments) { - this.trigger('data_ready'); - this.timeCompleted = this.totalFrames; - return; - } - - var segment = segments.shift(); - this.timeCompleted = segment.time * this.frameRate; - var segmentPath = this.path + this.fileName + '_' + this.segmentPos + '.json'; - this.segmentPos += 1; - dataManager.loadData(segmentPath, this.includeLayers.bind(this), function () { - this.trigger('data_failed'); - }.bind(this)); - }; - - AnimationItem.prototype.loadSegments = function () { - var segments = this.animationData.segments; - - if (!segments) { - this.timeCompleted = this.totalFrames; - } - - this.loadNextSegment(); - }; - - AnimationItem.prototype.imagesLoaded = function () { - this.trigger('loaded_images'); - this.checkLoaded(); - }; - - AnimationItem.prototype.preloadImages = function () { - this.imagePreloader.setAssetsPath(this.assetsPath); - this.imagePreloader.setPath(this.path); - this.imagePreloader.loadAssets(this.animationData.assets, this.imagesLoaded.bind(this)); - }; - - AnimationItem.prototype.configAnimation = function (animData) { - if (!this.renderer) { - return; - } - - try { - this.animationData = animData; - - if (this.initialSegment) { - this.totalFrames = Math.floor(this.initialSegment[1] - this.initialSegment[0]); - this.firstFrame = Math.round(this.initialSegment[0]); - } else { - this.totalFrames = Math.floor(this.animationData.op - this.animationData.ip); - this.firstFrame = Math.round(this.animationData.ip); - } - - this.renderer.configAnimation(animData); - - if (!animData.assets) { - animData.assets = []; - } - - this.assets = this.animationData.assets; - this.frameRate = this.animationData.fr; - this.frameMult = this.animationData.fr / 1000; - this.renderer.searchExtraCompositions(animData.assets); - this.markers = markerParser(animData.markers || []); - this.trigger('config_ready'); - this.preloadImages(); - this.loadSegments(); - this.updaFrameModifier(); - this.waitForFontsLoaded(); - - if (this.isPaused) { - this.audioController.pause(); - } - } catch (error) { - this.triggerConfigError(error); - } - }; - - AnimationItem.prototype.waitForFontsLoaded = function () { - if (!this.renderer) { - return; - } - - if (this.renderer.globalData.fontManager.isLoaded) { - this.checkLoaded(); - } else { - setTimeout(this.waitForFontsLoaded.bind(this), 20); - } - }; - - AnimationItem.prototype.checkLoaded = function () { - if (!this.isLoaded && this.renderer.globalData.fontManager.isLoaded && (this.imagePreloader.loadedImages() || this.renderer.rendererType !== 'canvas') && this.imagePreloader.loadedFootages()) { - this.isLoaded = true; - var expressionsPlugin = getExpressionsPlugin(); - - if (expressionsPlugin) { - expressionsPlugin.initExpressions(this); - } - - this.renderer.initItems(); - setTimeout(function () { - this.trigger('DOMLoaded'); - }.bind(this), 0); - this.gotoFrame(); - - if (this.autoplay) { - this.play(); - } - } - }; - - AnimationItem.prototype.resize = function () { - this.renderer.updateContainerSize(); - }; - - AnimationItem.prototype.setSubframe = function (flag) { - this.isSubframeEnabled = !!flag; - }; - - AnimationItem.prototype.gotoFrame = function () { - this.currentFrame = this.isSubframeEnabled ? this.currentRawFrame : ~~this.currentRawFrame; // eslint-disable-line no-bitwise - - if (this.timeCompleted !== this.totalFrames && this.currentFrame > this.timeCompleted) { - this.currentFrame = this.timeCompleted; - } - - this.trigger('enterFrame'); - this.renderFrame(); - this.trigger('drawnFrame'); - }; - - AnimationItem.prototype.renderFrame = function () { - if (this.isLoaded === false || !this.renderer) { - return; - } - - try { - this.renderer.renderFrame(this.currentFrame + this.firstFrame); - } catch (error) { - this.triggerRenderFrameError(error); - } - }; - - AnimationItem.prototype.play = function (name) { - if (name && this.name !== name) { - return; - } - - if (this.isPaused === true) { - this.isPaused = false; - this.trigger('_pause'); - this.audioController.resume(); - - if (this._idle) { - this._idle = false; - this.trigger('_active'); - } - } - }; - - AnimationItem.prototype.pause = function (name) { - if (name && this.name !== name) { - return; - } - - if (this.isPaused === false) { - this.isPaused = true; - this.trigger('_play'); - this._idle = true; - this.trigger('_idle'); - this.audioController.pause(); - } - }; - - AnimationItem.prototype.togglePause = function (name) { - if (name && this.name !== name) { - return; - } - - if (this.isPaused === true) { - this.play(); - } else { - this.pause(); - } - }; - - AnimationItem.prototype.stop = function (name) { - if (name && this.name !== name) { - return; - } - - this.pause(); - this.playCount = 0; - this._completedLoop = false; - this.setCurrentRawFrameValue(0); - }; - - AnimationItem.prototype.getMarkerData = function (markerName) { - var marker; - - for (var i = 0; i < this.markers.length; i += 1) { - marker = this.markers[i]; - - if (marker.payload && marker.payload.name === markerName) { - return marker; - } - } - - return null; - }; - - AnimationItem.prototype.goToAndStop = function (value, isFrame, name) { - if (name && this.name !== name) { - return; - } - - var numValue = Number(value); - - if (isNaN(numValue)) { - var marker = this.getMarkerData(value); - - if (marker) { - this.goToAndStop(marker.time, true); - } - } else if (isFrame) { - this.setCurrentRawFrameValue(value); - } else { - this.setCurrentRawFrameValue(value * this.frameModifier); - } - - this.pause(); - }; - - AnimationItem.prototype.goToAndPlay = function (value, isFrame, name) { - if (name && this.name !== name) { - return; - } - - var numValue = Number(value); - - if (isNaN(numValue)) { - var marker = this.getMarkerData(value); - - if (marker) { - if (!marker.duration) { - this.goToAndStop(marker.time, true); - } else { - this.playSegments([marker.time, marker.time + marker.duration], true); - } - } - } else { - this.goToAndStop(numValue, isFrame, name); - } - - this.play(); - }; - - AnimationItem.prototype.advanceTime = function (value) { - if (this.isPaused === true || this.isLoaded === false) { - return; - } - - var nextValue = this.currentRawFrame + value * this.frameModifier; - var _isComplete = false; // Checking if nextValue > totalFrames - 1 for addressing non looping and looping animations. - // If animation won't loop, it should stop at totalFrames - 1. If it will loop it should complete the last frame and then loop. - - if (nextValue >= this.totalFrames - 1 && this.frameModifier > 0) { - if (!this.loop || this.playCount === this.loop) { - if (!this.checkSegments(nextValue > this.totalFrames ? nextValue % this.totalFrames : 0)) { - _isComplete = true; - nextValue = this.totalFrames - 1; - } - } else if (nextValue >= this.totalFrames) { - this.playCount += 1; - - if (!this.checkSegments(nextValue % this.totalFrames)) { - this.setCurrentRawFrameValue(nextValue % this.totalFrames); - this._completedLoop = true; - this.trigger('loopComplete'); - } - } else { - this.setCurrentRawFrameValue(nextValue); - } - } else if (nextValue < 0) { - if (!this.checkSegments(nextValue % this.totalFrames)) { - if (this.loop && !(this.playCount-- <= 0 && this.loop !== true)) { - // eslint-disable-line no-plusplus - this.setCurrentRawFrameValue(this.totalFrames + nextValue % this.totalFrames); - - if (!this._completedLoop) { - this._completedLoop = true; - } else { - this.trigger('loopComplete'); - } - } else { - _isComplete = true; - nextValue = 0; - } - } - } else { - this.setCurrentRawFrameValue(nextValue); - } - - if (_isComplete) { - this.setCurrentRawFrameValue(nextValue); - this.pause(); - this.trigger('complete'); - } - }; - - AnimationItem.prototype.adjustSegment = function (arr, offset) { - this.playCount = 0; - - if (arr[1] < arr[0]) { - if (this.frameModifier > 0) { - if (this.playSpeed < 0) { - this.setSpeed(-this.playSpeed); - } else { - this.setDirection(-1); - } - } - - this.totalFrames = arr[0] - arr[1]; - this.timeCompleted = this.totalFrames; - this.firstFrame = arr[1]; - this.setCurrentRawFrameValue(this.totalFrames - 0.001 - offset); - } else if (arr[1] > arr[0]) { - if (this.frameModifier < 0) { - if (this.playSpeed < 0) { - this.setSpeed(-this.playSpeed); - } else { - this.setDirection(1); - } - } - - this.totalFrames = arr[1] - arr[0]; - this.timeCompleted = this.totalFrames; - this.firstFrame = arr[0]; - this.setCurrentRawFrameValue(0.001 + offset); - } - - this.trigger('segmentStart'); - }; - - AnimationItem.prototype.setSegment = function (init, end) { - var pendingFrame = -1; - - if (this.isPaused) { - if (this.currentRawFrame + this.firstFrame < init) { - pendingFrame = init; - } else if (this.currentRawFrame + this.firstFrame > end) { - pendingFrame = end - init; - } - } - - this.firstFrame = init; - this.totalFrames = end - init; - this.timeCompleted = this.totalFrames; - - if (pendingFrame !== -1) { - this.goToAndStop(pendingFrame, true); - } - }; - - AnimationItem.prototype.playSegments = function (arr, forceFlag) { - if (forceFlag) { - this.segments.length = 0; - } - - if (_typeof$4(arr[0]) === 'object') { - var i; - var len = arr.length; - - for (i = 0; i < len; i += 1) { - this.segments.push(arr[i]); - } - } else { - this.segments.push(arr); - } - - if (this.segments.length && forceFlag) { - this.adjustSegment(this.segments.shift(), 0); - } - - if (this.isPaused) { - this.play(); - } - }; - - AnimationItem.prototype.resetSegments = function (forceFlag) { - this.segments.length = 0; - this.segments.push([this.animationData.ip, this.animationData.op]); - - if (forceFlag) { - this.checkSegments(0); - } - }; - - AnimationItem.prototype.checkSegments = function (offset) { - if (this.segments.length) { - this.adjustSegment(this.segments.shift(), offset); - return true; - } - - return false; - }; - - AnimationItem.prototype.destroy = function (name) { - if (name && this.name !== name || !this.renderer) { - return; - } - - this.renderer.destroy(); - this.imagePreloader.destroy(); - this.trigger('destroy'); - this._cbs = null; - this.onEnterFrame = null; - this.onLoopComplete = null; - this.onComplete = null; - this.onSegmentStart = null; - this.onDestroy = null; - this.renderer = null; - this.renderer = null; - this.imagePreloader = null; - this.projectInterface = null; - }; - - AnimationItem.prototype.setCurrentRawFrameValue = function (value) { - this.currentRawFrame = value; - this.gotoFrame(); - }; - - AnimationItem.prototype.setSpeed = function (val) { - this.playSpeed = val; - this.updaFrameModifier(); - }; - - AnimationItem.prototype.setDirection = function (val) { - this.playDirection = val < 0 ? -1 : 1; - this.updaFrameModifier(); - }; - - AnimationItem.prototype.setVolume = function (val, name) { - if (name && this.name !== name) { - return; - } - - this.audioController.setVolume(val); - }; - - AnimationItem.prototype.getVolume = function () { - return this.audioController.getVolume(); - }; - - AnimationItem.prototype.mute = function (name) { - if (name && this.name !== name) { - return; - } - - this.audioController.mute(); - }; - - AnimationItem.prototype.unmute = function (name) { - if (name && this.name !== name) { - return; - } - - this.audioController.unmute(); - }; - - AnimationItem.prototype.updaFrameModifier = function () { - this.frameModifier = this.frameMult * this.playSpeed * this.playDirection; - this.audioController.setRate(this.playSpeed * this.playDirection); - }; - - AnimationItem.prototype.getPath = function () { - return this.path; - }; - - AnimationItem.prototype.getAssetsPath = function (assetData) { - var path = ''; - - if (assetData.e) { - path = assetData.p; - } else if (this.assetsPath) { - var imagePath = assetData.p; - - if (imagePath.indexOf('images/') !== -1) { - imagePath = imagePath.split('/')[1]; - } - - path = this.assetsPath + imagePath; - } else { - path = this.path; - path += assetData.u ? assetData.u : ''; - path += assetData.p; - } - - return path; - }; - - AnimationItem.prototype.getAssetData = function (id) { - var i = 0; - var len = this.assets.length; - - while (i < len) { - if (id === this.assets[i].id) { - return this.assets[i]; - } - - i += 1; - } - - return null; - }; - - AnimationItem.prototype.hide = function () { - this.renderer.hide(); - }; - - AnimationItem.prototype.show = function () { - this.renderer.show(); - }; - - AnimationItem.prototype.getDuration = function (isFrame) { - return isFrame ? this.totalFrames : this.totalFrames / this.frameRate; - }; - - AnimationItem.prototype.updateDocumentData = function (path, documentData, index) { - try { - var element = this.renderer.getElementByPath(path); - element.updateDocumentData(documentData, index); - } catch (error) {// TODO: decide how to handle catch case - } - }; - - AnimationItem.prototype.trigger = function (name) { - if (this._cbs && this._cbs[name]) { - switch (name) { - case 'enterFrame': - this.triggerEvent(name, new BMEnterFrameEvent(name, this.currentFrame, this.totalFrames, this.frameModifier)); - break; - - case 'drawnFrame': - this.drawnFrameEvent.currentTime = this.currentFrame; - this.drawnFrameEvent.totalTime = this.totalFrames; - this.drawnFrameEvent.direction = this.frameModifier; - this.triggerEvent(name, this.drawnFrameEvent); - break; - - case 'loopComplete': - this.triggerEvent(name, new BMCompleteLoopEvent(name, this.loop, this.playCount, this.frameMult)); - break; - - case 'complete': - this.triggerEvent(name, new BMCompleteEvent(name, this.frameMult)); - break; - - case 'segmentStart': - this.triggerEvent(name, new BMSegmentStartEvent(name, this.firstFrame, this.totalFrames)); - break; - - case 'destroy': - this.triggerEvent(name, new BMDestroyEvent(name, this)); - break; - - default: - this.triggerEvent(name); - } - } - - if (name === 'enterFrame' && this.onEnterFrame) { - this.onEnterFrame.call(this, new BMEnterFrameEvent(name, this.currentFrame, this.totalFrames, this.frameMult)); - } - - if (name === 'loopComplete' && this.onLoopComplete) { - this.onLoopComplete.call(this, new BMCompleteLoopEvent(name, this.loop, this.playCount, this.frameMult)); - } - - if (name === 'complete' && this.onComplete) { - this.onComplete.call(this, new BMCompleteEvent(name, this.frameMult)); - } - - if (name === 'segmentStart' && this.onSegmentStart) { - this.onSegmentStart.call(this, new BMSegmentStartEvent(name, this.firstFrame, this.totalFrames)); - } - - if (name === 'destroy' && this.onDestroy) { - this.onDestroy.call(this, new BMDestroyEvent(name, this)); - } - }; - - AnimationItem.prototype.triggerRenderFrameError = function (nativeError) { - var error = new BMRenderFrameErrorEvent(nativeError, this.currentFrame); - this.triggerEvent('error', error); - - if (this.onError) { - this.onError.call(this, error); - } - }; - - AnimationItem.prototype.triggerConfigError = function (nativeError) { - var error = new BMConfigErrorEvent(nativeError, this.currentFrame); - this.triggerEvent('error', error); - - if (this.onError) { - this.onError.call(this, error); - } - }; - - var animationManager = function () { - var moduleOb = {}; - var registeredAnimations = []; - var initTime = 0; - var len = 0; - var playingAnimationsNum = 0; - var _stopped = true; - var _isFrozen = false; - - function removeElement(ev) { - var i = 0; - var animItem = ev.target; - - while (i < len) { - if (registeredAnimations[i].animation === animItem) { - registeredAnimations.splice(i, 1); - i -= 1; - len -= 1; - - if (!animItem.isPaused) { - subtractPlayingCount(); - } - } - - i += 1; - } - } - - function registerAnimation(element, animationData) { - if (!element) { - return null; - } - - var i = 0; - - while (i < len) { - if (registeredAnimations[i].elem === element && registeredAnimations[i].elem !== null) { - return registeredAnimations[i].animation; - } - - i += 1; - } - - var animItem = new AnimationItem(); - setupAnimation(animItem, element); - animItem.setData(element, animationData); - return animItem; - } - - function getRegisteredAnimations() { - var i; - var lenAnims = registeredAnimations.length; - var animations = []; - - for (i = 0; i < lenAnims; i += 1) { - animations.push(registeredAnimations[i].animation); - } - - return animations; - } - - function addPlayingCount() { - playingAnimationsNum += 1; - activate(); - } - - function subtractPlayingCount() { - playingAnimationsNum -= 1; - } - - function setupAnimation(animItem, element) { - animItem.addEventListener('destroy', removeElement); - animItem.addEventListener('_active', addPlayingCount); - animItem.addEventListener('_idle', subtractPlayingCount); - registeredAnimations.push({ - elem: element, - animation: animItem - }); - len += 1; - } - - function loadAnimation(params) { - var animItem = new AnimationItem(); - setupAnimation(animItem, null); - animItem.setParams(params); - return animItem; - } - - function setSpeed(val, animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.setSpeed(val, animation); - } - } - - function setDirection(val, animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.setDirection(val, animation); - } - } - - function play(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.play(animation); - } - } - - function resume(nowTime) { - var elapsedTime = nowTime - initTime; - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.advanceTime(elapsedTime); - } - - initTime = nowTime; - - if (playingAnimationsNum && !_isFrozen) { - window.requestAnimationFrame(resume); - } else { - _stopped = true; - } - } - - function first(nowTime) { - initTime = nowTime; - window.requestAnimationFrame(resume); - } - - function pause(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.pause(animation); - } - } - - function goToAndStop(value, isFrame, animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.goToAndStop(value, isFrame, animation); - } - } - - function stop(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.stop(animation); - } - } - - function togglePause(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.togglePause(animation); - } - } - - function destroy(animation) { - var i; - - for (i = len - 1; i >= 0; i -= 1) { - registeredAnimations[i].animation.destroy(animation); - } - } - - function searchAnimations(animationData, standalone, renderer) { - var animElements = [].concat([].slice.call(document.getElementsByClassName('lottie')), [].slice.call(document.getElementsByClassName('bodymovin'))); - var i; - var lenAnims = animElements.length; - - for (i = 0; i < lenAnims; i += 1) { - if (renderer) { - animElements[i].setAttribute('data-bm-type', renderer); - } - - registerAnimation(animElements[i], animationData); - } - - if (standalone && lenAnims === 0) { - if (!renderer) { - renderer = 'svg'; - } - - var body = document.getElementsByTagName('body')[0]; - body.innerText = ''; - var div = createTag('div'); - div.style.width = '100%'; - div.style.height = '100%'; - div.setAttribute('data-bm-type', renderer); - body.appendChild(div); - registerAnimation(div, animationData); - } - } - - function resize() { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.resize(); - } - } - - function activate() { - if (!_isFrozen && playingAnimationsNum) { - if (_stopped) { - window.requestAnimationFrame(first); - _stopped = false; - } - } - } - - function freeze() { - _isFrozen = true; - } - - function unfreeze() { - _isFrozen = false; - activate(); - } - - function setVolume(val, animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.setVolume(val, animation); - } - } - - function mute(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.mute(animation); - } - } - - function unmute(animation) { - var i; - - for (i = 0; i < len; i += 1) { - registeredAnimations[i].animation.unmute(animation); - } - } - - moduleOb.registerAnimation = registerAnimation; - moduleOb.loadAnimation = loadAnimation; - moduleOb.setSpeed = setSpeed; - moduleOb.setDirection = setDirection; - moduleOb.play = play; - moduleOb.pause = pause; - moduleOb.stop = stop; - moduleOb.togglePause = togglePause; - moduleOb.searchAnimations = searchAnimations; - moduleOb.resize = resize; // moduleOb.start = start; - - moduleOb.goToAndStop = goToAndStop; - moduleOb.destroy = destroy; - moduleOb.freeze = freeze; - moduleOb.unfreeze = unfreeze; - moduleOb.setVolume = setVolume; - moduleOb.mute = mute; - moduleOb.unmute = unmute; - moduleOb.getRegisteredAnimations = getRegisteredAnimations; - return moduleOb; - }(); - - /* eslint-disable */ - var BezierFactory = function () { - /** - * BezierEasing - use bezier curve for transition easing function - * by Gaëtan Renaudeau 2014 - 2015 – MIT License - * - * Credits: is based on Firefox's nsSMILKeySpline.cpp - * Usage: - * var spline = BezierEasing([ 0.25, 0.1, 0.25, 1.0 ]) - * spline.get(x) => returns the easing value | x must be in [0, 1] range - * - */ - var ob = {}; - ob.getBezierEasing = getBezierEasing; - var beziers = {}; - - function getBezierEasing(a, b, c, d, nm) { - var str = nm || ('bez_' + a + '_' + b + '_' + c + '_' + d).replace(/\./g, 'p'); - - if (beziers[str]) { - return beziers[str]; - } - - var bezEasing = new BezierEasing([a, b, c, d]); - beziers[str] = bezEasing; - return bezEasing; - } // These values are established by empiricism with tests (tradeoff: performance VS precision) - - - var NEWTON_ITERATIONS = 4; - var NEWTON_MIN_SLOPE = 0.001; - var SUBDIVISION_PRECISION = 0.0000001; - var SUBDIVISION_MAX_ITERATIONS = 10; - var kSplineTableSize = 11; - var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); - var float32ArraySupported = typeof Float32Array === 'function'; - - function A(aA1, aA2) { - return 1.0 - 3.0 * aA2 + 3.0 * aA1; - } - - function B(aA1, aA2) { - return 3.0 * aA2 - 6.0 * aA1; - } - - function C(aA1) { - return 3.0 * aA1; - } // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2. - - - function calcBezier(aT, aA1, aA2) { - return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; - } // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. - - - function getSlope(aT, aA1, aA2) { - return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); - } - - function binarySubdivide(aX, aA, aB, mX1, mX2) { - var currentX, - currentT, - i = 0; - - do { - currentT = aA + (aB - aA) / 2.0; - currentX = calcBezier(currentT, mX1, mX2) - aX; - - if (currentX > 0.0) { - aB = currentT; - } else { - aA = currentT; - } - } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS); - - return currentT; - } - - function newtonRaphsonIterate(aX, aGuessT, mX1, mX2) { - for (var i = 0; i < NEWTON_ITERATIONS; ++i) { - var currentSlope = getSlope(aGuessT, mX1, mX2); - if (currentSlope === 0.0) return aGuessT; - var currentX = calcBezier(aGuessT, mX1, mX2) - aX; - aGuessT -= currentX / currentSlope; - } - - return aGuessT; - } - /** - * points is an array of [ mX1, mY1, mX2, mY2 ] - */ - - - function BezierEasing(points) { - this._p = points; - this._mSampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize); - this._precomputed = false; - this.get = this.get.bind(this); - } - - BezierEasing.prototype = { - get: function get(x) { - var mX1 = this._p[0], - mY1 = this._p[1], - mX2 = this._p[2], - mY2 = this._p[3]; - if (!this._precomputed) this._precompute(); - if (mX1 === mY1 && mX2 === mY2) return x; // linear - // Because JavaScript number are imprecise, we should guarantee the extremes are right. - - if (x === 0) return 0; - if (x === 1) return 1; - return calcBezier(this._getTForX(x), mY1, mY2); - }, - // Private part - _precompute: function _precompute() { - var mX1 = this._p[0], - mY1 = this._p[1], - mX2 = this._p[2], - mY2 = this._p[3]; - this._precomputed = true; - - if (mX1 !== mY1 || mX2 !== mY2) { - this._calcSampleValues(); - } - }, - _calcSampleValues: function _calcSampleValues() { - var mX1 = this._p[0], - mX2 = this._p[2]; - - for (var i = 0; i < kSplineTableSize; ++i) { - this._mSampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2); - } - }, - - /** - * getTForX chose the fastest heuristic to determine the percentage value precisely from a given X projection. - */ - _getTForX: function _getTForX(aX) { - var mX1 = this._p[0], - mX2 = this._p[2], - mSampleValues = this._mSampleValues; - var intervalStart = 0.0; - var currentSample = 1; - var lastSample = kSplineTableSize - 1; - - for (; currentSample !== lastSample && mSampleValues[currentSample] <= aX; ++currentSample) { - intervalStart += kSampleStepSize; - } - - --currentSample; // Interpolate to provide an initial guess for t - - var dist = (aX - mSampleValues[currentSample]) / (mSampleValues[currentSample + 1] - mSampleValues[currentSample]); - var guessForT = intervalStart + dist * kSampleStepSize; - var initialSlope = getSlope(guessForT, mX1, mX2); - - if (initialSlope >= NEWTON_MIN_SLOPE) { - return newtonRaphsonIterate(aX, guessForT, mX1, mX2); - } - - if (initialSlope === 0.0) { - return guessForT; - } - - return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2); - } - }; - return ob; - }(); - - var pooling = function () { - function _double(arr) { - return arr.concat(createSizedArray(arr.length)); - } - - return { - "double": _double - }; - }(); - - var poolFactory = function () { - return function (initialLength, _create, _release) { - var _length = 0; - var _maxLength = initialLength; - var pool = createSizedArray(_maxLength); - var ob = { - newElement: newElement, - release: release - }; - - function newElement() { - var element; - - if (_length) { - _length -= 1; - element = pool[_length]; - } else { - element = _create(); - } - - return element; - } - - function release(element) { - if (_length === _maxLength) { - pool = pooling["double"](pool); - _maxLength *= 2; - } - - if (_release) { - _release(element); - } - - pool[_length] = element; - _length += 1; - } - - return ob; - }; - }(); - - var bezierLengthPool = function () { - function create() { - return { - addedLength: 0, - percents: createTypedArray('float32', getDefaultCurveSegments()), - lengths: createTypedArray('float32', getDefaultCurveSegments()) - }; - } - - return poolFactory(8, create); - }(); - - var segmentsLengthPool = function () { - function create() { - return { - lengths: [], - totalLength: 0 - }; - } - - function release(element) { - var i; - var len = element.lengths.length; - - for (i = 0; i < len; i += 1) { - bezierLengthPool.release(element.lengths[i]); - } - - element.lengths.length = 0; - } - - return poolFactory(8, create, release); - }(); - - function bezFunction() { - var math = Math; - - function pointOnLine2D(x1, y1, x2, y2, x3, y3) { - var det1 = x1 * y2 + y1 * x3 + x2 * y3 - x3 * y2 - y3 * x1 - x2 * y1; - return det1 > -0.001 && det1 < 0.001; - } - - function pointOnLine3D(x1, y1, z1, x2, y2, z2, x3, y3, z3) { - if (z1 === 0 && z2 === 0 && z3 === 0) { - return pointOnLine2D(x1, y1, x2, y2, x3, y3); - } - - var dist1 = math.sqrt(math.pow(x2 - x1, 2) + math.pow(y2 - y1, 2) + math.pow(z2 - z1, 2)); - var dist2 = math.sqrt(math.pow(x3 - x1, 2) + math.pow(y3 - y1, 2) + math.pow(z3 - z1, 2)); - var dist3 = math.sqrt(math.pow(x3 - x2, 2) + math.pow(y3 - y2, 2) + math.pow(z3 - z2, 2)); - var diffDist; - - if (dist1 > dist2) { - if (dist1 > dist3) { - diffDist = dist1 - dist2 - dist3; - } else { - diffDist = dist3 - dist2 - dist1; - } - } else if (dist3 > dist2) { - diffDist = dist3 - dist2 - dist1; - } else { - diffDist = dist2 - dist1 - dist3; - } - - return diffDist > -0.0001 && diffDist < 0.0001; - } - - var getBezierLength = function () { - return function (pt1, pt2, pt3, pt4) { - var curveSegments = getDefaultCurveSegments(); - var k; - var i; - var len; - var ptCoord; - var perc; - var addedLength = 0; - var ptDistance; - var point = []; - var lastPoint = []; - var lengthData = bezierLengthPool.newElement(); - len = pt3.length; - - for (k = 0; k < curveSegments; k += 1) { - perc = k / (curveSegments - 1); - ptDistance = 0; - - for (i = 0; i < len; i += 1) { - ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * pt3[i] + 3 * (1 - perc) * bmPow(perc, 2) * pt4[i] + bmPow(perc, 3) * pt2[i]; - point[i] = ptCoord; - - if (lastPoint[i] !== null) { - ptDistance += bmPow(point[i] - lastPoint[i], 2); - } - - lastPoint[i] = point[i]; - } - - if (ptDistance) { - ptDistance = bmSqrt(ptDistance); - addedLength += ptDistance; - } - - lengthData.percents[k] = perc; - lengthData.lengths[k] = addedLength; - } - - lengthData.addedLength = addedLength; - return lengthData; - }; - }(); - - function getSegmentsLength(shapeData) { - var segmentsLength = segmentsLengthPool.newElement(); - var closed = shapeData.c; - var pathV = shapeData.v; - var pathO = shapeData.o; - var pathI = shapeData.i; - var i; - var len = shapeData._length; - var lengths = segmentsLength.lengths; - var totalLength = 0; - - for (i = 0; i < len - 1; i += 1) { - lengths[i] = getBezierLength(pathV[i], pathV[i + 1], pathO[i], pathI[i + 1]); - totalLength += lengths[i].addedLength; - } - - if (closed && len) { - lengths[i] = getBezierLength(pathV[i], pathV[0], pathO[i], pathI[0]); - totalLength += lengths[i].addedLength; - } - - segmentsLength.totalLength = totalLength; - return segmentsLength; - } - - function BezierData(length) { - this.segmentLength = 0; - this.points = new Array(length); - } - - function PointData(partial, point) { - this.partialLength = partial; - this.point = point; - } - - var buildBezierData = function () { - var storedData = {}; - return function (pt1, pt2, pt3, pt4) { - var bezierName = (pt1[0] + '_' + pt1[1] + '_' + pt2[0] + '_' + pt2[1] + '_' + pt3[0] + '_' + pt3[1] + '_' + pt4[0] + '_' + pt4[1]).replace(/\./g, 'p'); - - if (!storedData[bezierName]) { - var curveSegments = getDefaultCurveSegments(); - var k; - var i; - var len; - var ptCoord; - var perc; - var addedLength = 0; - var ptDistance; - var point; - var lastPoint = null; - - if (pt1.length === 2 && (pt1[0] !== pt2[0] || pt1[1] !== pt2[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt1[0] + pt3[0], pt1[1] + pt3[1]) && pointOnLine2D(pt1[0], pt1[1], pt2[0], pt2[1], pt2[0] + pt4[0], pt2[1] + pt4[1])) { - curveSegments = 2; - } - - var bezierData = new BezierData(curveSegments); - len = pt3.length; - - for (k = 0; k < curveSegments; k += 1) { - point = createSizedArray(len); - perc = k / (curveSegments - 1); - ptDistance = 0; - - for (i = 0; i < len; i += 1) { - ptCoord = bmPow(1 - perc, 3) * pt1[i] + 3 * bmPow(1 - perc, 2) * perc * (pt1[i] + pt3[i]) + 3 * (1 - perc) * bmPow(perc, 2) * (pt2[i] + pt4[i]) + bmPow(perc, 3) * pt2[i]; - point[i] = ptCoord; - - if (lastPoint !== null) { - ptDistance += bmPow(point[i] - lastPoint[i], 2); - } - } - - ptDistance = bmSqrt(ptDistance); - addedLength += ptDistance; - bezierData.points[k] = new PointData(ptDistance, point); - lastPoint = point; - } - - bezierData.segmentLength = addedLength; - storedData[bezierName] = bezierData; - } - - return storedData[bezierName]; - }; - }(); - - function getDistancePerc(perc, bezierData) { - var percents = bezierData.percents; - var lengths = bezierData.lengths; - var len = percents.length; - var initPos = bmFloor((len - 1) * perc); - var lengthPos = perc * bezierData.addedLength; - var lPerc = 0; - - if (initPos === len - 1 || initPos === 0 || lengthPos === lengths[initPos]) { - return percents[initPos]; - } - - var dir = lengths[initPos] > lengthPos ? -1 : 1; - var flag = true; - - while (flag) { - if (lengths[initPos] <= lengthPos && lengths[initPos + 1] > lengthPos) { - lPerc = (lengthPos - lengths[initPos]) / (lengths[initPos + 1] - lengths[initPos]); - flag = false; - } else { - initPos += dir; - } - - if (initPos < 0 || initPos >= len - 1) { - // FIX for TypedArrays that don't store floating point values with enough accuracy - if (initPos === len - 1) { - return percents[initPos]; - } - - flag = false; - } - } - - return percents[initPos] + (percents[initPos + 1] - percents[initPos]) * lPerc; - } - - function getPointInSegment(pt1, pt2, pt3, pt4, percent, bezierData) { - var t1 = getDistancePerc(percent, bezierData); - var u1 = 1 - t1; - var ptX = math.round((u1 * u1 * u1 * pt1[0] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[0] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[0] + t1 * t1 * t1 * pt2[0]) * 1000) / 1000; - var ptY = math.round((u1 * u1 * u1 * pt1[1] + (t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1) * pt3[1] + (t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1) * pt4[1] + t1 * t1 * t1 * pt2[1]) * 1000) / 1000; - return [ptX, ptY]; - } - - var bezierSegmentPoints = createTypedArray('float32', 8); - - function getNewSegment(pt1, pt2, pt3, pt4, startPerc, endPerc, bezierData) { - if (startPerc < 0) { - startPerc = 0; - } else if (startPerc > 1) { - startPerc = 1; - } - - var t0 = getDistancePerc(startPerc, bezierData); - endPerc = endPerc > 1 ? 1 : endPerc; - var t1 = getDistancePerc(endPerc, bezierData); - var i; - var len = pt1.length; - var u0 = 1 - t0; - var u1 = 1 - t1; - var u0u0u0 = u0 * u0 * u0; - var t0u0u0_3 = t0 * u0 * u0 * 3; // eslint-disable-line camelcase - - var t0t0u0_3 = t0 * t0 * u0 * 3; // eslint-disable-line camelcase - - var t0t0t0 = t0 * t0 * t0; // - - var u0u0u1 = u0 * u0 * u1; - var t0u0u1_3 = t0 * u0 * u1 + u0 * t0 * u1 + u0 * u0 * t1; // eslint-disable-line camelcase - - var t0t0u1_3 = t0 * t0 * u1 + u0 * t0 * t1 + t0 * u0 * t1; // eslint-disable-line camelcase - - var t0t0t1 = t0 * t0 * t1; // - - var u0u1u1 = u0 * u1 * u1; - var t0u1u1_3 = t0 * u1 * u1 + u0 * t1 * u1 + u0 * u1 * t1; // eslint-disable-line camelcase - - var t0t1u1_3 = t0 * t1 * u1 + u0 * t1 * t1 + t0 * u1 * t1; // eslint-disable-line camelcase - - var t0t1t1 = t0 * t1 * t1; // - - var u1u1u1 = u1 * u1 * u1; - var t1u1u1_3 = t1 * u1 * u1 + u1 * t1 * u1 + u1 * u1 * t1; // eslint-disable-line camelcase - - var t1t1u1_3 = t1 * t1 * u1 + u1 * t1 * t1 + t1 * u1 * t1; // eslint-disable-line camelcase - - var t1t1t1 = t1 * t1 * t1; - - for (i = 0; i < len; i += 1) { - bezierSegmentPoints[i * 4] = math.round((u0u0u0 * pt1[i] + t0u0u0_3 * pt3[i] + t0t0u0_3 * pt4[i] + t0t0t0 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase - - bezierSegmentPoints[i * 4 + 1] = math.round((u0u0u1 * pt1[i] + t0u0u1_3 * pt3[i] + t0t0u1_3 * pt4[i] + t0t0t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase - - bezierSegmentPoints[i * 4 + 2] = math.round((u0u1u1 * pt1[i] + t0u1u1_3 * pt3[i] + t0t1u1_3 * pt4[i] + t0t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase - - bezierSegmentPoints[i * 4 + 3] = math.round((u1u1u1 * pt1[i] + t1u1u1_3 * pt3[i] + t1t1u1_3 * pt4[i] + t1t1t1 * pt2[i]) * 1000) / 1000; // eslint-disable-line camelcase - } - - return bezierSegmentPoints; - } - - return { - getSegmentsLength: getSegmentsLength, - getNewSegment: getNewSegment, - getPointInSegment: getPointInSegment, - buildBezierData: buildBezierData, - pointOnLine2D: pointOnLine2D, - pointOnLine3D: pointOnLine3D - }; - } - - var bez = bezFunction(); - - var PropertyFactory = function () { - var initFrame = initialDefaultFrame; - var mathAbs = Math.abs; - - function interpolateValue(frameNum, caching) { - var offsetTime = this.offsetTime; - var newValue; - - if (this.propType === 'multidimensional') { - newValue = createTypedArray('float32', this.pv.length); - } - - var iterationIndex = caching.lastIndex; - var i = iterationIndex; - var len = this.keyframes.length - 1; - var flag = true; - var keyData; - var nextKeyData; - var keyframeMetadata; - - while (flag) { - keyData = this.keyframes[i]; - nextKeyData = this.keyframes[i + 1]; - - if (i === len - 1 && frameNum >= nextKeyData.t - offsetTime) { - if (keyData.h) { - keyData = nextKeyData; - } - - iterationIndex = 0; - break; - } - - if (nextKeyData.t - offsetTime > frameNum) { - iterationIndex = i; - break; - } - - if (i < len - 1) { - i += 1; - } else { - iterationIndex = 0; - flag = false; - } - } - - keyframeMetadata = this.keyframesMetadata[i] || {}; - var k; - var kLen; - var perc; - var jLen; - var j; - var fnc; - var nextKeyTime = nextKeyData.t - offsetTime; - var keyTime = keyData.t - offsetTime; - var endValue; - - if (keyData.to) { - if (!keyframeMetadata.bezierData) { - keyframeMetadata.bezierData = bez.buildBezierData(keyData.s, nextKeyData.s || keyData.e, keyData.to, keyData.ti); - } - - var bezierData = keyframeMetadata.bezierData; - - if (frameNum >= nextKeyTime || frameNum < keyTime) { - var ind = frameNum >= nextKeyTime ? bezierData.points.length - 1 : 0; - kLen = bezierData.points[ind].point.length; - - for (k = 0; k < kLen; k += 1) { - newValue[k] = bezierData.points[ind].point[k]; - } // caching._lastKeyframeIndex = -1; - - } else { - if (keyframeMetadata.__fnct) { - fnc = keyframeMetadata.__fnct; - } else { - fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y, keyData.n).get; - keyframeMetadata.__fnct = fnc; - } - - perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime)); - var distanceInLine = bezierData.segmentLength * perc; - var segmentPerc; - var addedLength = caching.lastFrame < frameNum && caching._lastKeyframeIndex === i ? caching._lastAddedLength : 0; - j = caching.lastFrame < frameNum && caching._lastKeyframeIndex === i ? caching._lastPoint : 0; - flag = true; - jLen = bezierData.points.length; - - while (flag) { - addedLength += bezierData.points[j].partialLength; - - if (distanceInLine === 0 || perc === 0 || j === bezierData.points.length - 1) { - kLen = bezierData.points[j].point.length; - - for (k = 0; k < kLen; k += 1) { - newValue[k] = bezierData.points[j].point[k]; - } - - break; - } else if (distanceInLine >= addedLength && distanceInLine < addedLength + bezierData.points[j + 1].partialLength) { - segmentPerc = (distanceInLine - addedLength) / bezierData.points[j + 1].partialLength; - kLen = bezierData.points[j].point.length; - - for (k = 0; k < kLen; k += 1) { - newValue[k] = bezierData.points[j].point[k] + (bezierData.points[j + 1].point[k] - bezierData.points[j].point[k]) * segmentPerc; - } - - break; - } - - if (j < jLen - 1) { - j += 1; - } else { - flag = false; - } - } - - caching._lastPoint = j; - caching._lastAddedLength = addedLength - bezierData.points[j].partialLength; - caching._lastKeyframeIndex = i; - } - } else { - var outX; - var outY; - var inX; - var inY; - var keyValue; - len = keyData.s.length; - endValue = nextKeyData.s || keyData.e; - - if (this.sh && keyData.h !== 1) { - if (frameNum >= nextKeyTime) { - newValue[0] = endValue[0]; - newValue[1] = endValue[1]; - newValue[2] = endValue[2]; - } else if (frameNum <= keyTime) { - newValue[0] = keyData.s[0]; - newValue[1] = keyData.s[1]; - newValue[2] = keyData.s[2]; - } else { - var quatStart = createQuaternion(keyData.s); - var quatEnd = createQuaternion(endValue); - var time = (frameNum - keyTime) / (nextKeyTime - keyTime); - quaternionToEuler(newValue, slerp(quatStart, quatEnd, time)); - } - } else { - for (i = 0; i < len; i += 1) { - if (keyData.h !== 1) { - if (frameNum >= nextKeyTime) { - perc = 1; - } else if (frameNum < keyTime) { - perc = 0; - } else { - if (keyData.o.x.constructor === Array) { - if (!keyframeMetadata.__fnct) { - keyframeMetadata.__fnct = []; - } - - if (!keyframeMetadata.__fnct[i]) { - outX = keyData.o.x[i] === undefined ? keyData.o.x[0] : keyData.o.x[i]; - outY = keyData.o.y[i] === undefined ? keyData.o.y[0] : keyData.o.y[i]; - inX = keyData.i.x[i] === undefined ? keyData.i.x[0] : keyData.i.x[i]; - inY = keyData.i.y[i] === undefined ? keyData.i.y[0] : keyData.i.y[i]; - fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get; - keyframeMetadata.__fnct[i] = fnc; - } else { - fnc = keyframeMetadata.__fnct[i]; - } - } else if (!keyframeMetadata.__fnct) { - outX = keyData.o.x; - outY = keyData.o.y; - inX = keyData.i.x; - inY = keyData.i.y; - fnc = BezierFactory.getBezierEasing(outX, outY, inX, inY).get; - keyData.keyframeMetadata = fnc; - } else { - fnc = keyframeMetadata.__fnct; - } - - perc = fnc((frameNum - keyTime) / (nextKeyTime - keyTime)); - } - } - - endValue = nextKeyData.s || keyData.e; - keyValue = keyData.h === 1 ? keyData.s[i] : keyData.s[i] + (endValue[i] - keyData.s[i]) * perc; - - if (this.propType === 'multidimensional') { - newValue[i] = keyValue; - } else { - newValue = keyValue; - } - } - } - } - - caching.lastIndex = iterationIndex; - return newValue; - } // based on @Toji's https://github.com/toji/gl-matrix/ - - - function slerp(a, b, t) { - var out = []; - var ax = a[0]; - var ay = a[1]; - var az = a[2]; - var aw = a[3]; - var bx = b[0]; - var by = b[1]; - var bz = b[2]; - var bw = b[3]; - var omega; - var cosom; - var sinom; - var scale0; - var scale1; - cosom = ax * bx + ay * by + az * bz + aw * bw; - - if (cosom < 0.0) { - cosom = -cosom; - bx = -bx; - by = -by; - bz = -bz; - bw = -bw; - } - - if (1.0 - cosom > 0.000001) { - omega = Math.acos(cosom); - sinom = Math.sin(omega); - scale0 = Math.sin((1.0 - t) * omega) / sinom; - scale1 = Math.sin(t * omega) / sinom; - } else { - scale0 = 1.0 - t; - scale1 = t; - } - - out[0] = scale0 * ax + scale1 * bx; - out[1] = scale0 * ay + scale1 * by; - out[2] = scale0 * az + scale1 * bz; - out[3] = scale0 * aw + scale1 * bw; - return out; - } - - function quaternionToEuler(out, quat) { - var qx = quat[0]; - var qy = quat[1]; - var qz = quat[2]; - var qw = quat[3]; - var heading = Math.atan2(2 * qy * qw - 2 * qx * qz, 1 - 2 * qy * qy - 2 * qz * qz); - var attitude = Math.asin(2 * qx * qy + 2 * qz * qw); - var bank = Math.atan2(2 * qx * qw - 2 * qy * qz, 1 - 2 * qx * qx - 2 * qz * qz); - out[0] = heading / degToRads; - out[1] = attitude / degToRads; - out[2] = bank / degToRads; - } - - function createQuaternion(values) { - var heading = values[0] * degToRads; - var attitude = values[1] * degToRads; - var bank = values[2] * degToRads; - var c1 = Math.cos(heading / 2); - var c2 = Math.cos(attitude / 2); - var c3 = Math.cos(bank / 2); - var s1 = Math.sin(heading / 2); - var s2 = Math.sin(attitude / 2); - var s3 = Math.sin(bank / 2); - var w = c1 * c2 * c3 - s1 * s2 * s3; - var x = s1 * s2 * c3 + c1 * c2 * s3; - var y = s1 * c2 * c3 + c1 * s2 * s3; - var z = c1 * s2 * c3 - s1 * c2 * s3; - return [x, y, z, w]; - } - - function getValueAtCurrentTime() { - var frameNum = this.comp.renderedFrame - this.offsetTime; - var initTime = this.keyframes[0].t - this.offsetTime; - var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime; - - if (!(frameNum === this._caching.lastFrame || this._caching.lastFrame !== initFrame && (this._caching.lastFrame >= endTime && frameNum >= endTime || this._caching.lastFrame < initTime && frameNum < initTime))) { - if (this._caching.lastFrame >= frameNum) { - this._caching._lastKeyframeIndex = -1; - this._caching.lastIndex = 0; - } - - var renderResult = this.interpolateValue(frameNum, this._caching); - this.pv = renderResult; - } - - this._caching.lastFrame = frameNum; - return this.pv; - } - - function setVValue(val) { - var multipliedValue; - - if (this.propType === 'unidimensional') { - multipliedValue = val * this.mult; - - if (mathAbs(this.v - multipliedValue) > 0.00001) { - this.v = multipliedValue; - this._mdf = true; - } - } else { - var i = 0; - var len = this.v.length; - - while (i < len) { - multipliedValue = val[i] * this.mult; - - if (mathAbs(this.v[i] - multipliedValue) > 0.00001) { - this.v[i] = multipliedValue; - this._mdf = true; - } - - i += 1; - } - } - } - - function processEffectsSequence() { - if (this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) { - return; - } - - if (this.lock) { - this.setVValue(this.pv); - return; - } - - this.lock = true; - this._mdf = this._isFirstFrame; - var i; - var len = this.effectsSequence.length; - var finalValue = this.kf ? this.pv : this.data.k; - - for (i = 0; i < len; i += 1) { - finalValue = this.effectsSequence[i](finalValue); - } - - this.setVValue(finalValue); - this._isFirstFrame = false; - this.lock = false; - this.frameId = this.elem.globalData.frameId; - } - - function addEffect(effectFunction) { - this.effectsSequence.push(effectFunction); - this.container.addDynamicProperty(this); - } - - function ValueProperty(elem, data, mult, container) { - this.propType = 'unidimensional'; - this.mult = mult || 1; - this.data = data; - this.v = mult ? data.k * mult : data.k; - this.pv = data.k; - this._mdf = false; - this.elem = elem; - this.container = container; - this.comp = elem.comp; - this.k = false; - this.kf = false; - this.vel = 0; - this.effectsSequence = []; - this._isFirstFrame = true; - this.getValue = processEffectsSequence; - this.setVValue = setVValue; - this.addEffect = addEffect; - } - - function MultiDimensionalProperty(elem, data, mult, container) { - this.propType = 'multidimensional'; - this.mult = mult || 1; - this.data = data; - this._mdf = false; - this.elem = elem; - this.container = container; - this.comp = elem.comp; - this.k = false; - this.kf = false; - this.frameId = -1; - var i; - var len = data.k.length; - this.v = createTypedArray('float32', len); - this.pv = createTypedArray('float32', len); - this.vel = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - this.v[i] = data.k[i] * this.mult; - this.pv[i] = data.k[i]; - } - - this._isFirstFrame = true; - this.effectsSequence = []; - this.getValue = processEffectsSequence; - this.setVValue = setVValue; - this.addEffect = addEffect; - } - - function KeyframedValueProperty(elem, data, mult, container) { - this.propType = 'unidimensional'; - this.keyframes = data.k; - this.keyframesMetadata = []; - this.offsetTime = elem.data.st; - this.frameId = -1; - this._caching = { - lastFrame: initFrame, - lastIndex: 0, - value: 0, - _lastKeyframeIndex: -1 - }; - this.k = true; - this.kf = true; - this.data = data; - this.mult = mult || 1; - this.elem = elem; - this.container = container; - this.comp = elem.comp; - this.v = initFrame; - this.pv = initFrame; - this._isFirstFrame = true; - this.getValue = processEffectsSequence; - this.setVValue = setVValue; - this.interpolateValue = interpolateValue; - this.effectsSequence = [getValueAtCurrentTime.bind(this)]; - this.addEffect = addEffect; - } - - function KeyframedMultidimensionalProperty(elem, data, mult, container) { - this.propType = 'multidimensional'; - var i; - var len = data.k.length; - var s; - var e; - var to; - var ti; - - for (i = 0; i < len - 1; i += 1) { - if (data.k[i].to && data.k[i].s && data.k[i + 1] && data.k[i + 1].s) { - s = data.k[i].s; - e = data.k[i + 1].s; - to = data.k[i].to; - ti = data.k[i].ti; - - if (s.length === 2 && !(s[0] === e[0] && s[1] === e[1]) && bez.pointOnLine2D(s[0], s[1], e[0], e[1], s[0] + to[0], s[1] + to[1]) && bez.pointOnLine2D(s[0], s[1], e[0], e[1], e[0] + ti[0], e[1] + ti[1]) || s.length === 3 && !(s[0] === e[0] && s[1] === e[1] && s[2] === e[2]) && bez.pointOnLine3D(s[0], s[1], s[2], e[0], e[1], e[2], s[0] + to[0], s[1] + to[1], s[2] + to[2]) && bez.pointOnLine3D(s[0], s[1], s[2], e[0], e[1], e[2], e[0] + ti[0], e[1] + ti[1], e[2] + ti[2])) { - data.k[i].to = null; - data.k[i].ti = null; - } - - if (s[0] === e[0] && s[1] === e[1] && to[0] === 0 && to[1] === 0 && ti[0] === 0 && ti[1] === 0) { - if (s.length === 2 || s[2] === e[2] && to[2] === 0 && ti[2] === 0) { - data.k[i].to = null; - data.k[i].ti = null; - } - } - } - } - - this.effectsSequence = [getValueAtCurrentTime.bind(this)]; - this.data = data; - this.keyframes = data.k; - this.keyframesMetadata = []; - this.offsetTime = elem.data.st; - this.k = true; - this.kf = true; - this._isFirstFrame = true; - this.mult = mult || 1; - this.elem = elem; - this.container = container; - this.comp = elem.comp; - this.getValue = processEffectsSequence; - this.setVValue = setVValue; - this.interpolateValue = interpolateValue; - this.frameId = -1; - var arrLen = data.k[0].s.length; - this.v = createTypedArray('float32', arrLen); - this.pv = createTypedArray('float32', arrLen); - - for (i = 0; i < arrLen; i += 1) { - this.v[i] = initFrame; - this.pv[i] = initFrame; - } - - this._caching = { - lastFrame: initFrame, - lastIndex: 0, - value: createTypedArray('float32', arrLen) - }; - this.addEffect = addEffect; - } - - function getProp(elem, data, type, mult, container) { - var p; - - if (!data.k.length) { - p = new ValueProperty(elem, data, mult, container); - } else if (typeof data.k[0] === 'number') { - p = new MultiDimensionalProperty(elem, data, mult, container); - } else { - switch (type) { - case 0: - p = new KeyframedValueProperty(elem, data, mult, container); - break; - - case 1: - p = new KeyframedMultidimensionalProperty(elem, data, mult, container); - break; - - default: - break; - } - } - - if (p.effectsSequence.length) { - container.addDynamicProperty(p); - } - - return p; - } - - var ob = { - getProp: getProp - }; - return ob; - }(); - - function DynamicPropertyContainer() {} - - DynamicPropertyContainer.prototype = { - addDynamicProperty: function addDynamicProperty(prop) { - if (this.dynamicProperties.indexOf(prop) === -1) { - this.dynamicProperties.push(prop); - this.container.addDynamicProperty(this); - this._isAnimated = true; - } - }, - iterateDynamicProperties: function iterateDynamicProperties() { - this._mdf = false; - var i; - var len = this.dynamicProperties.length; - - for (i = 0; i < len; i += 1) { - this.dynamicProperties[i].getValue(); - - if (this.dynamicProperties[i]._mdf) { - this._mdf = true; - } - } - }, - initDynamicPropertyContainer: function initDynamicPropertyContainer(container) { - this.container = container; - this.dynamicProperties = []; - this._mdf = false; - this._isAnimated = false; - } - }; - - var pointPool = function () { - function create() { - return createTypedArray('float32', 2); - } - - return poolFactory(8, create); - }(); - - function ShapePath() { - this.c = false; - this._length = 0; - this._maxLength = 8; - this.v = createSizedArray(this._maxLength); - this.o = createSizedArray(this._maxLength); - this.i = createSizedArray(this._maxLength); - } - - ShapePath.prototype.setPathData = function (closed, len) { - this.c = closed; - this.setLength(len); - var i = 0; - - while (i < len) { - this.v[i] = pointPool.newElement(); - this.o[i] = pointPool.newElement(); - this.i[i] = pointPool.newElement(); - i += 1; - } - }; - - ShapePath.prototype.setLength = function (len) { - while (this._maxLength < len) { - this.doubleArrayLength(); - } - - this._length = len; - }; - - ShapePath.prototype.doubleArrayLength = function () { - this.v = this.v.concat(createSizedArray(this._maxLength)); - this.i = this.i.concat(createSizedArray(this._maxLength)); - this.o = this.o.concat(createSizedArray(this._maxLength)); - this._maxLength *= 2; - }; - - ShapePath.prototype.setXYAt = function (x, y, type, pos, replace) { - var arr; - this._length = Math.max(this._length, pos + 1); - - if (this._length >= this._maxLength) { - this.doubleArrayLength(); - } - - switch (type) { - case 'v': - arr = this.v; - break; - - case 'i': - arr = this.i; - break; - - case 'o': - arr = this.o; - break; - - default: - arr = []; - break; - } - - if (!arr[pos] || arr[pos] && !replace) { - arr[pos] = pointPool.newElement(); - } - - arr[pos][0] = x; - arr[pos][1] = y; - }; - - ShapePath.prototype.setTripleAt = function (vX, vY, oX, oY, iX, iY, pos, replace) { - this.setXYAt(vX, vY, 'v', pos, replace); - this.setXYAt(oX, oY, 'o', pos, replace); - this.setXYAt(iX, iY, 'i', pos, replace); - }; - - ShapePath.prototype.reverse = function () { - var newPath = new ShapePath(); - newPath.setPathData(this.c, this._length); - var vertices = this.v; - var outPoints = this.o; - var inPoints = this.i; - var init = 0; - - if (this.c) { - newPath.setTripleAt(vertices[0][0], vertices[0][1], inPoints[0][0], inPoints[0][1], outPoints[0][0], outPoints[0][1], 0, false); - init = 1; - } - - var cnt = this._length - 1; - var len = this._length; - var i; - - for (i = init; i < len; i += 1) { - newPath.setTripleAt(vertices[cnt][0], vertices[cnt][1], inPoints[cnt][0], inPoints[cnt][1], outPoints[cnt][0], outPoints[cnt][1], i, false); - cnt -= 1; - } - - return newPath; - }; - - var shapePool = function () { - function create() { - return new ShapePath(); - } - - function release(shapePath) { - var len = shapePath._length; - var i; - - for (i = 0; i < len; i += 1) { - pointPool.release(shapePath.v[i]); - pointPool.release(shapePath.i[i]); - pointPool.release(shapePath.o[i]); - shapePath.v[i] = null; - shapePath.i[i] = null; - shapePath.o[i] = null; - } - - shapePath._length = 0; - shapePath.c = false; - } - - function clone(shape) { - var cloned = factory.newElement(); - var i; - var len = shape._length === undefined ? shape.v.length : shape._length; - cloned.setLength(len); - cloned.c = shape.c; - - for (i = 0; i < len; i += 1) { - cloned.setTripleAt(shape.v[i][0], shape.v[i][1], shape.o[i][0], shape.o[i][1], shape.i[i][0], shape.i[i][1], i); - } - - return cloned; - } - - var factory = poolFactory(4, create, release); - factory.clone = clone; - return factory; - }(); - - function ShapeCollection() { - this._length = 0; - this._maxLength = 4; - this.shapes = createSizedArray(this._maxLength); - } - - ShapeCollection.prototype.addShape = function (shapeData) { - if (this._length === this._maxLength) { - this.shapes = this.shapes.concat(createSizedArray(this._maxLength)); - this._maxLength *= 2; - } - - this.shapes[this._length] = shapeData; - this._length += 1; - }; - - ShapeCollection.prototype.releaseShapes = function () { - var i; - - for (i = 0; i < this._length; i += 1) { - shapePool.release(this.shapes[i]); - } - - this._length = 0; - }; - - var shapeCollectionPool = function () { - var ob = { - newShapeCollection: newShapeCollection, - release: release - }; - var _length = 0; - var _maxLength = 4; - var pool = createSizedArray(_maxLength); - - function newShapeCollection() { - var shapeCollection; - - if (_length) { - _length -= 1; - shapeCollection = pool[_length]; - } else { - shapeCollection = new ShapeCollection(); - } - - return shapeCollection; - } - - function release(shapeCollection) { - var i; - var len = shapeCollection._length; - - for (i = 0; i < len; i += 1) { - shapePool.release(shapeCollection.shapes[i]); - } - - shapeCollection._length = 0; - - if (_length === _maxLength) { - pool = pooling["double"](pool); - _maxLength *= 2; - } - - pool[_length] = shapeCollection; - _length += 1; - } - - return ob; - }(); - - var ShapePropertyFactory = function () { - var initFrame = -999999; - - function interpolateShape(frameNum, previousValue, caching) { - var iterationIndex = caching.lastIndex; - var keyPropS; - var keyPropE; - var isHold; - var j; - var k; - var jLen; - var kLen; - var perc; - var vertexValue; - var kf = this.keyframes; - - if (frameNum < kf[0].t - this.offsetTime) { - keyPropS = kf[0].s[0]; - isHold = true; - iterationIndex = 0; - } else if (frameNum >= kf[kf.length - 1].t - this.offsetTime) { - keyPropS = kf[kf.length - 1].s ? kf[kf.length - 1].s[0] : kf[kf.length - 2].e[0]; - /* if(kf[kf.length - 1].s){ - keyPropS = kf[kf.length - 1].s[0]; - }else{ - keyPropS = kf[kf.length - 2].e[0]; - } */ - - isHold = true; - } else { - var i = iterationIndex; - var len = kf.length - 1; - var flag = true; - var keyData; - var nextKeyData; - var keyframeMetadata; - - while (flag) { - keyData = kf[i]; - nextKeyData = kf[i + 1]; - - if (nextKeyData.t - this.offsetTime > frameNum) { - break; - } - - if (i < len - 1) { - i += 1; - } else { - flag = false; - } - } - - keyframeMetadata = this.keyframesMetadata[i] || {}; - isHold = keyData.h === 1; - iterationIndex = i; - - if (!isHold) { - if (frameNum >= nextKeyData.t - this.offsetTime) { - perc = 1; - } else if (frameNum < keyData.t - this.offsetTime) { - perc = 0; - } else { - var fnc; - - if (keyframeMetadata.__fnct) { - fnc = keyframeMetadata.__fnct; - } else { - fnc = BezierFactory.getBezierEasing(keyData.o.x, keyData.o.y, keyData.i.x, keyData.i.y).get; - keyframeMetadata.__fnct = fnc; - } - - perc = fnc((frameNum - (keyData.t - this.offsetTime)) / (nextKeyData.t - this.offsetTime - (keyData.t - this.offsetTime))); - } - - keyPropE = nextKeyData.s ? nextKeyData.s[0] : keyData.e[0]; - } - - keyPropS = keyData.s[0]; - } - - jLen = previousValue._length; - kLen = keyPropS.i[0].length; - caching.lastIndex = iterationIndex; - - for (j = 0; j < jLen; j += 1) { - for (k = 0; k < kLen; k += 1) { - vertexValue = isHold ? keyPropS.i[j][k] : keyPropS.i[j][k] + (keyPropE.i[j][k] - keyPropS.i[j][k]) * perc; - previousValue.i[j][k] = vertexValue; - vertexValue = isHold ? keyPropS.o[j][k] : keyPropS.o[j][k] + (keyPropE.o[j][k] - keyPropS.o[j][k]) * perc; - previousValue.o[j][k] = vertexValue; - vertexValue = isHold ? keyPropS.v[j][k] : keyPropS.v[j][k] + (keyPropE.v[j][k] - keyPropS.v[j][k]) * perc; - previousValue.v[j][k] = vertexValue; - } - } - } - - function interpolateShapeCurrentTime() { - var frameNum = this.comp.renderedFrame - this.offsetTime; - var initTime = this.keyframes[0].t - this.offsetTime; - var endTime = this.keyframes[this.keyframes.length - 1].t - this.offsetTime; - var lastFrame = this._caching.lastFrame; - - if (!(lastFrame !== initFrame && (lastFrame < initTime && frameNum < initTime || lastFrame > endTime && frameNum > endTime))) { - /// / - this._caching.lastIndex = lastFrame < frameNum ? this._caching.lastIndex : 0; - this.interpolateShape(frameNum, this.pv, this._caching); /// / - } - - this._caching.lastFrame = frameNum; - return this.pv; - } - - function resetShape() { - this.paths = this.localShapeCollection; - } - - function shapesEqual(shape1, shape2) { - if (shape1._length !== shape2._length || shape1.c !== shape2.c) { - return false; - } - - var i; - var len = shape1._length; - - for (i = 0; i < len; i += 1) { - if (shape1.v[i][0] !== shape2.v[i][0] || shape1.v[i][1] !== shape2.v[i][1] || shape1.o[i][0] !== shape2.o[i][0] || shape1.o[i][1] !== shape2.o[i][1] || shape1.i[i][0] !== shape2.i[i][0] || shape1.i[i][1] !== shape2.i[i][1]) { - return false; - } - } - - return true; - } - - function setVValue(newPath) { - if (!shapesEqual(this.v, newPath)) { - this.v = shapePool.clone(newPath); - this.localShapeCollection.releaseShapes(); - this.localShapeCollection.addShape(this.v); - this._mdf = true; - this.paths = this.localShapeCollection; - } - } - - function processEffectsSequence() { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - if (!this.effectsSequence.length) { - this._mdf = false; - return; - } - - if (this.lock) { - this.setVValue(this.pv); - return; - } - - this.lock = true; - this._mdf = false; - var finalValue; - - if (this.kf) { - finalValue = this.pv; - } else if (this.data.ks) { - finalValue = this.data.ks.k; - } else { - finalValue = this.data.pt.k; - } - - var i; - var len = this.effectsSequence.length; - - for (i = 0; i < len; i += 1) { - finalValue = this.effectsSequence[i](finalValue); - } - - this.setVValue(finalValue); - this.lock = false; - this.frameId = this.elem.globalData.frameId; - } - - function ShapeProperty(elem, data, type) { - this.propType = 'shape'; - this.comp = elem.comp; - this.container = elem; - this.elem = elem; - this.data = data; - this.k = false; - this.kf = false; - this._mdf = false; - var pathData = type === 3 ? data.pt.k : data.ks.k; - this.v = shapePool.clone(pathData); - this.pv = shapePool.clone(this.v); - this.localShapeCollection = shapeCollectionPool.newShapeCollection(); - this.paths = this.localShapeCollection; - this.paths.addShape(this.v); - this.reset = resetShape; - this.effectsSequence = []; - } - - function addEffect(effectFunction) { - this.effectsSequence.push(effectFunction); - this.container.addDynamicProperty(this); - } - - ShapeProperty.prototype.interpolateShape = interpolateShape; - ShapeProperty.prototype.getValue = processEffectsSequence; - ShapeProperty.prototype.setVValue = setVValue; - ShapeProperty.prototype.addEffect = addEffect; - - function KeyframedShapeProperty(elem, data, type) { - this.propType = 'shape'; - this.comp = elem.comp; - this.elem = elem; - this.container = elem; - this.offsetTime = elem.data.st; - this.keyframes = type === 3 ? data.pt.k : data.ks.k; - this.keyframesMetadata = []; - this.k = true; - this.kf = true; - var len = this.keyframes[0].s[0].i.length; - this.v = shapePool.newElement(); - this.v.setPathData(this.keyframes[0].s[0].c, len); - this.pv = shapePool.clone(this.v); - this.localShapeCollection = shapeCollectionPool.newShapeCollection(); - this.paths = this.localShapeCollection; - this.paths.addShape(this.v); - this.lastFrame = initFrame; - this.reset = resetShape; - this._caching = { - lastFrame: initFrame, - lastIndex: 0 - }; - this.effectsSequence = [interpolateShapeCurrentTime.bind(this)]; - } - - KeyframedShapeProperty.prototype.getValue = processEffectsSequence; - KeyframedShapeProperty.prototype.interpolateShape = interpolateShape; - KeyframedShapeProperty.prototype.setVValue = setVValue; - KeyframedShapeProperty.prototype.addEffect = addEffect; - - var EllShapeProperty = function () { - var cPoint = roundCorner; - - function EllShapePropertyFactory(elem, data) { - this.v = shapePool.newElement(); - this.v.setPathData(true, 4); - this.localShapeCollection = shapeCollectionPool.newShapeCollection(); - this.paths = this.localShapeCollection; - this.localShapeCollection.addShape(this.v); - this.d = data.d; - this.elem = elem; - this.comp = elem.comp; - this.frameId = -1; - this.initDynamicPropertyContainer(elem); - this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this); - this.s = PropertyFactory.getProp(elem, data.s, 1, 0, this); - - if (this.dynamicProperties.length) { - this.k = true; - } else { - this.k = false; - this.convertEllToPath(); - } - } - - EllShapePropertyFactory.prototype = { - reset: resetShape, - getValue: function getValue() { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - this.frameId = this.elem.globalData.frameId; - this.iterateDynamicProperties(); - - if (this._mdf) { - this.convertEllToPath(); - } - }, - convertEllToPath: function convertEllToPath() { - var p0 = this.p.v[0]; - var p1 = this.p.v[1]; - var s0 = this.s.v[0] / 2; - var s1 = this.s.v[1] / 2; - - var _cw = this.d !== 3; - - var _v = this.v; - _v.v[0][0] = p0; - _v.v[0][1] = p1 - s1; - _v.v[1][0] = _cw ? p0 + s0 : p0 - s0; - _v.v[1][1] = p1; - _v.v[2][0] = p0; - _v.v[2][1] = p1 + s1; - _v.v[3][0] = _cw ? p0 - s0 : p0 + s0; - _v.v[3][1] = p1; - _v.i[0][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint; - _v.i[0][1] = p1 - s1; - _v.i[1][0] = _cw ? p0 + s0 : p0 - s0; - _v.i[1][1] = p1 - s1 * cPoint; - _v.i[2][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint; - _v.i[2][1] = p1 + s1; - _v.i[3][0] = _cw ? p0 - s0 : p0 + s0; - _v.i[3][1] = p1 + s1 * cPoint; - _v.o[0][0] = _cw ? p0 + s0 * cPoint : p0 - s0 * cPoint; - _v.o[0][1] = p1 - s1; - _v.o[1][0] = _cw ? p0 + s0 : p0 - s0; - _v.o[1][1] = p1 + s1 * cPoint; - _v.o[2][0] = _cw ? p0 - s0 * cPoint : p0 + s0 * cPoint; - _v.o[2][1] = p1 + s1; - _v.o[3][0] = _cw ? p0 - s0 : p0 + s0; - _v.o[3][1] = p1 - s1 * cPoint; - } - }; - extendPrototype([DynamicPropertyContainer], EllShapePropertyFactory); - return EllShapePropertyFactory; - }(); - - var StarShapeProperty = function () { - function StarShapePropertyFactory(elem, data) { - this.v = shapePool.newElement(); - this.v.setPathData(true, 0); - this.elem = elem; - this.comp = elem.comp; - this.data = data; - this.frameId = -1; - this.d = data.d; - this.initDynamicPropertyContainer(elem); - - if (data.sy === 1) { - this.ir = PropertyFactory.getProp(elem, data.ir, 0, 0, this); - this.is = PropertyFactory.getProp(elem, data.is, 0, 0.01, this); - this.convertToPath = this.convertStarToPath; - } else { - this.convertToPath = this.convertPolygonToPath; - } - - this.pt = PropertyFactory.getProp(elem, data.pt, 0, 0, this); - this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this); - this.r = PropertyFactory.getProp(elem, data.r, 0, degToRads, this); - this.or = PropertyFactory.getProp(elem, data.or, 0, 0, this); - this.os = PropertyFactory.getProp(elem, data.os, 0, 0.01, this); - this.localShapeCollection = shapeCollectionPool.newShapeCollection(); - this.localShapeCollection.addShape(this.v); - this.paths = this.localShapeCollection; - - if (this.dynamicProperties.length) { - this.k = true; - } else { - this.k = false; - this.convertToPath(); - } - } - - StarShapePropertyFactory.prototype = { - reset: resetShape, - getValue: function getValue() { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - this.frameId = this.elem.globalData.frameId; - this.iterateDynamicProperties(); - - if (this._mdf) { - this.convertToPath(); - } - }, - convertStarToPath: function convertStarToPath() { - var numPts = Math.floor(this.pt.v) * 2; - var angle = Math.PI * 2 / numPts; - /* this.v.v.length = numPts; - this.v.i.length = numPts; - this.v.o.length = numPts; */ - - var longFlag = true; - var longRad = this.or.v; - var shortRad = this.ir.v; - var longRound = this.os.v; - var shortRound = this.is.v; - var longPerimSegment = 2 * Math.PI * longRad / (numPts * 2); - var shortPerimSegment = 2 * Math.PI * shortRad / (numPts * 2); - var i; - var rad; - var roundness; - var perimSegment; - var currentAng = -Math.PI / 2; - currentAng += this.r.v; - var dir = this.data.d === 3 ? -1 : 1; - this.v._length = 0; - - for (i = 0; i < numPts; i += 1) { - rad = longFlag ? longRad : shortRad; - roundness = longFlag ? longRound : shortRound; - perimSegment = longFlag ? longPerimSegment : shortPerimSegment; - var x = rad * Math.cos(currentAng); - var y = rad * Math.sin(currentAng); - var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y); - var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y); - x += +this.p.v[0]; - y += +this.p.v[1]; - this.v.setTripleAt(x, y, x - ox * perimSegment * roundness * dir, y - oy * perimSegment * roundness * dir, x + ox * perimSegment * roundness * dir, y + oy * perimSegment * roundness * dir, i, true); - /* this.v.v[i] = [x,y]; - this.v.i[i] = [x+ox*perimSegment*roundness*dir,y+oy*perimSegment*roundness*dir]; - this.v.o[i] = [x-ox*perimSegment*roundness*dir,y-oy*perimSegment*roundness*dir]; - this.v._length = numPts; */ - - longFlag = !longFlag; - currentAng += angle * dir; - } - }, - convertPolygonToPath: function convertPolygonToPath() { - var numPts = Math.floor(this.pt.v); - var angle = Math.PI * 2 / numPts; - var rad = this.or.v; - var roundness = this.os.v; - var perimSegment = 2 * Math.PI * rad / (numPts * 4); - var i; - var currentAng = -Math.PI * 0.5; - var dir = this.data.d === 3 ? -1 : 1; - currentAng += this.r.v; - this.v._length = 0; - - for (i = 0; i < numPts; i += 1) { - var x = rad * Math.cos(currentAng); - var y = rad * Math.sin(currentAng); - var ox = x === 0 && y === 0 ? 0 : y / Math.sqrt(x * x + y * y); - var oy = x === 0 && y === 0 ? 0 : -x / Math.sqrt(x * x + y * y); - x += +this.p.v[0]; - y += +this.p.v[1]; - this.v.setTripleAt(x, y, x - ox * perimSegment * roundness * dir, y - oy * perimSegment * roundness * dir, x + ox * perimSegment * roundness * dir, y + oy * perimSegment * roundness * dir, i, true); - currentAng += angle * dir; - } - - this.paths.length = 0; - this.paths[0] = this.v; - } - }; - extendPrototype([DynamicPropertyContainer], StarShapePropertyFactory); - return StarShapePropertyFactory; - }(); - - var RectShapeProperty = function () { - function RectShapePropertyFactory(elem, data) { - this.v = shapePool.newElement(); - this.v.c = true; - this.localShapeCollection = shapeCollectionPool.newShapeCollection(); - this.localShapeCollection.addShape(this.v); - this.paths = this.localShapeCollection; - this.elem = elem; - this.comp = elem.comp; - this.frameId = -1; - this.d = data.d; - this.initDynamicPropertyContainer(elem); - this.p = PropertyFactory.getProp(elem, data.p, 1, 0, this); - this.s = PropertyFactory.getProp(elem, data.s, 1, 0, this); - this.r = PropertyFactory.getProp(elem, data.r, 0, 0, this); - - if (this.dynamicProperties.length) { - this.k = true; - } else { - this.k = false; - this.convertRectToPath(); - } - } - - RectShapePropertyFactory.prototype = { - convertRectToPath: function convertRectToPath() { - var p0 = this.p.v[0]; - var p1 = this.p.v[1]; - var v0 = this.s.v[0] / 2; - var v1 = this.s.v[1] / 2; - var round = bmMin(v0, v1, this.r.v); - var cPoint = round * (1 - roundCorner); - this.v._length = 0; - - if (this.d === 2 || this.d === 1) { - this.v.setTripleAt(p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + cPoint, 0, true); - this.v.setTripleAt(p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - cPoint, p0 + v0, p1 + v1 - round, 1, true); - - if (round !== 0) { - this.v.setTripleAt(p0 + v0 - round, p1 + v1, p0 + v0 - round, p1 + v1, p0 + v0 - cPoint, p1 + v1, 2, true); - this.v.setTripleAt(p0 - v0 + round, p1 + v1, p0 - v0 + cPoint, p1 + v1, p0 - v0 + round, p1 + v1, 3, true); - this.v.setTripleAt(p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - cPoint, 4, true); - this.v.setTripleAt(p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + cPoint, p0 - v0, p1 - v1 + round, 5, true); - this.v.setTripleAt(p0 - v0 + round, p1 - v1, p0 - v0 + round, p1 - v1, p0 - v0 + cPoint, p1 - v1, 6, true); - this.v.setTripleAt(p0 + v0 - round, p1 - v1, p0 + v0 - cPoint, p1 - v1, p0 + v0 - round, p1 - v1, 7, true); - } else { - this.v.setTripleAt(p0 - v0, p1 + v1, p0 - v0 + cPoint, p1 + v1, p0 - v0, p1 + v1, 2); - this.v.setTripleAt(p0 - v0, p1 - v1, p0 - v0, p1 - v1 + cPoint, p0 - v0, p1 - v1, 3); - } - } else { - this.v.setTripleAt(p0 + v0, p1 - v1 + round, p0 + v0, p1 - v1 + cPoint, p0 + v0, p1 - v1 + round, 0, true); - - if (round !== 0) { - this.v.setTripleAt(p0 + v0 - round, p1 - v1, p0 + v0 - round, p1 - v1, p0 + v0 - cPoint, p1 - v1, 1, true); - this.v.setTripleAt(p0 - v0 + round, p1 - v1, p0 - v0 + cPoint, p1 - v1, p0 - v0 + round, p1 - v1, 2, true); - this.v.setTripleAt(p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + round, p0 - v0, p1 - v1 + cPoint, 3, true); - this.v.setTripleAt(p0 - v0, p1 + v1 - round, p0 - v0, p1 + v1 - cPoint, p0 - v0, p1 + v1 - round, 4, true); - this.v.setTripleAt(p0 - v0 + round, p1 + v1, p0 - v0 + round, p1 + v1, p0 - v0 + cPoint, p1 + v1, 5, true); - this.v.setTripleAt(p0 + v0 - round, p1 + v1, p0 + v0 - cPoint, p1 + v1, p0 + v0 - round, p1 + v1, 6, true); - this.v.setTripleAt(p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - round, p0 + v0, p1 + v1 - cPoint, 7, true); - } else { - this.v.setTripleAt(p0 - v0, p1 - v1, p0 - v0 + cPoint, p1 - v1, p0 - v0, p1 - v1, 1, true); - this.v.setTripleAt(p0 - v0, p1 + v1, p0 - v0, p1 + v1 - cPoint, p0 - v0, p1 + v1, 2, true); - this.v.setTripleAt(p0 + v0, p1 + v1, p0 + v0 - cPoint, p1 + v1, p0 + v0, p1 + v1, 3, true); - } - } - }, - getValue: function getValue() { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - this.frameId = this.elem.globalData.frameId; - this.iterateDynamicProperties(); - - if (this._mdf) { - this.convertRectToPath(); - } - }, - reset: resetShape - }; - extendPrototype([DynamicPropertyContainer], RectShapePropertyFactory); - return RectShapePropertyFactory; - }(); - - function getShapeProp(elem, data, type) { - var prop; - - if (type === 3 || type === 4) { - var dataProp = type === 3 ? data.pt : data.ks; - var keys = dataProp.k; - - if (keys.length) { - prop = new KeyframedShapeProperty(elem, data, type); - } else { - prop = new ShapeProperty(elem, data, type); - } - } else if (type === 5) { - prop = new RectShapeProperty(elem, data); - } else if (type === 6) { - prop = new EllShapeProperty(elem, data); - } else if (type === 7) { - prop = new StarShapeProperty(elem, data); - } - - if (prop.k) { - elem.addDynamicProperty(prop); - } - - return prop; - } - - function getConstructorFunction() { - return ShapeProperty; - } - - function getKeyframedConstructorFunction() { - return KeyframedShapeProperty; - } - - var ob = {}; - ob.getShapeProp = getShapeProp; - ob.getConstructorFunction = getConstructorFunction; - ob.getKeyframedConstructorFunction = getKeyframedConstructorFunction; - return ob; - }(); - - /*! - Transformation Matrix v2.0 - (c) Epistemex 2014-2015 - www.epistemex.com - By Ken Fyrstenberg - Contributions by leeoniya. - License: MIT, header required. - */ - - /** - * 2D transformation matrix object initialized with identity matrix. - * - * The matrix can synchronize a canvas context by supplying the context - * as an argument, or later apply current absolute transform to an - * existing context. - * - * All values are handled as floating point values. - * - * @param {CanvasRenderingContext2D} [context] - Optional context to sync with Matrix - * @prop {number} a - scale x - * @prop {number} b - shear y - * @prop {number} c - shear x - * @prop {number} d - scale y - * @prop {number} e - translate x - * @prop {number} f - translate y - * @prop {CanvasRenderingContext2D|null} [context=null] - set or get current canvas context - * @constructor - */ - - var Matrix = function () { - var _cos = Math.cos; - var _sin = Math.sin; - var _tan = Math.tan; - var _rnd = Math.round; - - function reset() { - this.props[0] = 1; - this.props[1] = 0; - this.props[2] = 0; - this.props[3] = 0; - this.props[4] = 0; - this.props[5] = 1; - this.props[6] = 0; - this.props[7] = 0; - this.props[8] = 0; - this.props[9] = 0; - this.props[10] = 1; - this.props[11] = 0; - this.props[12] = 0; - this.props[13] = 0; - this.props[14] = 0; - this.props[15] = 1; - return this; - } - - function rotate(angle) { - if (angle === 0) { - return this; - } - - var mCos = _cos(angle); - - var mSin = _sin(angle); - - return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); - } - - function rotateX(angle) { - if (angle === 0) { - return this; - } - - var mCos = _cos(angle); - - var mSin = _sin(angle); - - return this._t(1, 0, 0, 0, 0, mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1); - } - - function rotateY(angle) { - if (angle === 0) { - return this; - } - - var mCos = _cos(angle); - - var mSin = _sin(angle); - - return this._t(mCos, 0, mSin, 0, 0, 1, 0, 0, -mSin, 0, mCos, 0, 0, 0, 0, 1); - } - - function rotateZ(angle) { - if (angle === 0) { - return this; - } - - var mCos = _cos(angle); - - var mSin = _sin(angle); - - return this._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); - } - - function shear(sx, sy) { - return this._t(1, sy, sx, 1, 0, 0); - } - - function skew(ax, ay) { - return this.shear(_tan(ax), _tan(ay)); - } - - function skewFromAxis(ax, angle) { - var mCos = _cos(angle); - - var mSin = _sin(angle); - - return this._t(mCos, mSin, 0, 0, -mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)._t(1, 0, 0, 0, _tan(ax), 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1)._t(mCos, -mSin, 0, 0, mSin, mCos, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); // return this._t(mCos, mSin, -mSin, mCos, 0, 0)._t(1, 0, _tan(ax), 1, 0, 0)._t(mCos, -mSin, mSin, mCos, 0, 0); - } - - function scale(sx, sy, sz) { - if (!sz && sz !== 0) { - sz = 1; - } - - if (sx === 1 && sy === 1 && sz === 1) { - return this; - } - - return this._t(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1); - } - - function setTransform(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) { - this.props[0] = a; - this.props[1] = b; - this.props[2] = c; - this.props[3] = d; - this.props[4] = e; - this.props[5] = f; - this.props[6] = g; - this.props[7] = h; - this.props[8] = i; - this.props[9] = j; - this.props[10] = k; - this.props[11] = l; - this.props[12] = m; - this.props[13] = n; - this.props[14] = o; - this.props[15] = p; - return this; - } - - function translate(tx, ty, tz) { - tz = tz || 0; - - if (tx !== 0 || ty !== 0 || tz !== 0) { - return this._t(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1); - } - - return this; - } - - function transform(a2, b2, c2, d2, e2, f2, g2, h2, i2, j2, k2, l2, m2, n2, o2, p2) { - var _p = this.props; - - if (a2 === 1 && b2 === 0 && c2 === 0 && d2 === 0 && e2 === 0 && f2 === 1 && g2 === 0 && h2 === 0 && i2 === 0 && j2 === 0 && k2 === 1 && l2 === 0) { - // NOTE: commenting this condition because TurboFan deoptimizes code when present - // if(m2 !== 0 || n2 !== 0 || o2 !== 0){ - _p[12] = _p[12] * a2 + _p[15] * m2; - _p[13] = _p[13] * f2 + _p[15] * n2; - _p[14] = _p[14] * k2 + _p[15] * o2; - _p[15] *= p2; // } - - this._identityCalculated = false; - return this; - } - - var a1 = _p[0]; - var b1 = _p[1]; - var c1 = _p[2]; - var d1 = _p[3]; - var e1 = _p[4]; - var f1 = _p[5]; - var g1 = _p[6]; - var h1 = _p[7]; - var i1 = _p[8]; - var j1 = _p[9]; - var k1 = _p[10]; - var l1 = _p[11]; - var m1 = _p[12]; - var n1 = _p[13]; - var o1 = _p[14]; - var p1 = _p[15]; - /* matrix order (canvas compatible): - * ace - * bdf - * 001 - */ - - _p[0] = a1 * a2 + b1 * e2 + c1 * i2 + d1 * m2; - _p[1] = a1 * b2 + b1 * f2 + c1 * j2 + d1 * n2; - _p[2] = a1 * c2 + b1 * g2 + c1 * k2 + d1 * o2; - _p[3] = a1 * d2 + b1 * h2 + c1 * l2 + d1 * p2; - _p[4] = e1 * a2 + f1 * e2 + g1 * i2 + h1 * m2; - _p[5] = e1 * b2 + f1 * f2 + g1 * j2 + h1 * n2; - _p[6] = e1 * c2 + f1 * g2 + g1 * k2 + h1 * o2; - _p[7] = e1 * d2 + f1 * h2 + g1 * l2 + h1 * p2; - _p[8] = i1 * a2 + j1 * e2 + k1 * i2 + l1 * m2; - _p[9] = i1 * b2 + j1 * f2 + k1 * j2 + l1 * n2; - _p[10] = i1 * c2 + j1 * g2 + k1 * k2 + l1 * o2; - _p[11] = i1 * d2 + j1 * h2 + k1 * l2 + l1 * p2; - _p[12] = m1 * a2 + n1 * e2 + o1 * i2 + p1 * m2; - _p[13] = m1 * b2 + n1 * f2 + o1 * j2 + p1 * n2; - _p[14] = m1 * c2 + n1 * g2 + o1 * k2 + p1 * o2; - _p[15] = m1 * d2 + n1 * h2 + o1 * l2 + p1 * p2; - this._identityCalculated = false; - return this; - } - - function isIdentity() { - if (!this._identityCalculated) { - this._identity = !(this.props[0] !== 1 || this.props[1] !== 0 || this.props[2] !== 0 || this.props[3] !== 0 || this.props[4] !== 0 || this.props[5] !== 1 || this.props[6] !== 0 || this.props[7] !== 0 || this.props[8] !== 0 || this.props[9] !== 0 || this.props[10] !== 1 || this.props[11] !== 0 || this.props[12] !== 0 || this.props[13] !== 0 || this.props[14] !== 0 || this.props[15] !== 1); - this._identityCalculated = true; - } - - return this._identity; - } - - function equals(matr) { - var i = 0; - - while (i < 16) { - if (matr.props[i] !== this.props[i]) { - return false; - } - - i += 1; - } - - return true; - } - - function clone(matr) { - var i; - - for (i = 0; i < 16; i += 1) { - matr.props[i] = this.props[i]; - } - - return matr; - } - - function cloneFromProps(props) { - var i; - - for (i = 0; i < 16; i += 1) { - this.props[i] = props[i]; - } - } - - function applyToPoint(x, y, z) { - return { - x: x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12], - y: x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13], - z: x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14] - }; - /* return { - x: x * me.a + y * me.c + me.e, - y: x * me.b + y * me.d + me.f - }; */ - } - - function applyToX(x, y, z) { - return x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12]; - } - - function applyToY(x, y, z) { - return x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13]; - } - - function applyToZ(x, y, z) { - return x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]; - } - - function getInverseMatrix() { - var determinant = this.props[0] * this.props[5] - this.props[1] * this.props[4]; - var a = this.props[5] / determinant; - var b = -this.props[1] / determinant; - var c = -this.props[4] / determinant; - var d = this.props[0] / determinant; - var e = (this.props[4] * this.props[13] - this.props[5] * this.props[12]) / determinant; - var f = -(this.props[0] * this.props[13] - this.props[1] * this.props[12]) / determinant; - var inverseMatrix = new Matrix(); - inverseMatrix.props[0] = a; - inverseMatrix.props[1] = b; - inverseMatrix.props[4] = c; - inverseMatrix.props[5] = d; - inverseMatrix.props[12] = e; - inverseMatrix.props[13] = f; - return inverseMatrix; - } - - function inversePoint(pt) { - var inverseMatrix = this.getInverseMatrix(); - return inverseMatrix.applyToPointArray(pt[0], pt[1], pt[2] || 0); - } - - function inversePoints(pts) { - var i; - var len = pts.length; - var retPts = []; - - for (i = 0; i < len; i += 1) { - retPts[i] = inversePoint(pts[i]); - } - - return retPts; - } - - function applyToTriplePoints(pt1, pt2, pt3) { - var arr = createTypedArray('float32', 6); - - if (this.isIdentity()) { - arr[0] = pt1[0]; - arr[1] = pt1[1]; - arr[2] = pt2[0]; - arr[3] = pt2[1]; - arr[4] = pt3[0]; - arr[5] = pt3[1]; - } else { - var p0 = this.props[0]; - var p1 = this.props[1]; - var p4 = this.props[4]; - var p5 = this.props[5]; - var p12 = this.props[12]; - var p13 = this.props[13]; - arr[0] = pt1[0] * p0 + pt1[1] * p4 + p12; - arr[1] = pt1[0] * p1 + pt1[1] * p5 + p13; - arr[2] = pt2[0] * p0 + pt2[1] * p4 + p12; - arr[3] = pt2[0] * p1 + pt2[1] * p5 + p13; - arr[4] = pt3[0] * p0 + pt3[1] * p4 + p12; - arr[5] = pt3[0] * p1 + pt3[1] * p5 + p13; - } - - return arr; - } - - function applyToPointArray(x, y, z) { - var arr; - - if (this.isIdentity()) { - arr = [x, y, z]; - } else { - arr = [x * this.props[0] + y * this.props[4] + z * this.props[8] + this.props[12], x * this.props[1] + y * this.props[5] + z * this.props[9] + this.props[13], x * this.props[2] + y * this.props[6] + z * this.props[10] + this.props[14]]; - } - - return arr; - } - - function applyToPointStringified(x, y) { - if (this.isIdentity()) { - return x + ',' + y; - } - - var _p = this.props; - return Math.round((x * _p[0] + y * _p[4] + _p[12]) * 100) / 100 + ',' + Math.round((x * _p[1] + y * _p[5] + _p[13]) * 100) / 100; - } - - function toCSS() { - // Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed. - - /* if(this.isIdentity()) { - return ''; - } */ - var i = 0; - var props = this.props; - var cssValue = 'matrix3d('; - var v = 10000; - - while (i < 16) { - cssValue += _rnd(props[i] * v) / v; - cssValue += i === 15 ? ')' : ','; - i += 1; - } - - return cssValue; - } - - function roundMatrixProperty(val) { - var v = 10000; - - if (val < 0.000001 && val > 0 || val > -0.000001 && val < 0) { - return _rnd(val * v) / v; - } - - return val; - } - - function to2dCSS() { - // Doesn't make much sense to add this optimization. If it is an identity matrix, it's very likely this will get called only once since it won't be keyframed. - - /* if(this.isIdentity()) { - return ''; - } */ - var props = this.props; - - var _a = roundMatrixProperty(props[0]); - - var _b = roundMatrixProperty(props[1]); - - var _c = roundMatrixProperty(props[4]); - - var _d = roundMatrixProperty(props[5]); - - var _e = roundMatrixProperty(props[12]); - - var _f = roundMatrixProperty(props[13]); - - return 'matrix(' + _a + ',' + _b + ',' + _c + ',' + _d + ',' + _e + ',' + _f + ')'; - } - - return function () { - this.reset = reset; - this.rotate = rotate; - this.rotateX = rotateX; - this.rotateY = rotateY; - this.rotateZ = rotateZ; - this.skew = skew; - this.skewFromAxis = skewFromAxis; - this.shear = shear; - this.scale = scale; - this.setTransform = setTransform; - this.translate = translate; - this.transform = transform; - this.applyToPoint = applyToPoint; - this.applyToX = applyToX; - this.applyToY = applyToY; - this.applyToZ = applyToZ; - this.applyToPointArray = applyToPointArray; - this.applyToTriplePoints = applyToTriplePoints; - this.applyToPointStringified = applyToPointStringified; - this.toCSS = toCSS; - this.to2dCSS = to2dCSS; - this.clone = clone; - this.cloneFromProps = cloneFromProps; - this.equals = equals; - this.inversePoints = inversePoints; - this.inversePoint = inversePoint; - this.getInverseMatrix = getInverseMatrix; - this._t = this.transform; - this.isIdentity = isIdentity; - this._identity = true; - this._identityCalculated = false; - this.props = createTypedArray('float32', 16); - this.reset(); - }; - }(); - - function _typeof$3(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$3 = function _typeof(obj) { return typeof obj; }; } else { _typeof$3 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$3(obj); } - var lottie = {}; - var standalone = '__[STANDALONE]__'; - var animationData = '__[ANIMATIONDATA]__'; - var renderer = ''; - - function setLocation(href) { - setLocationHref(href); - } - - function searchAnimations() { - if (standalone === true) { - animationManager.searchAnimations(animationData, standalone, renderer); - } else { - animationManager.searchAnimations(); - } - } - - function setSubframeRendering(flag) { - setSubframeEnabled(flag); - } - - function setPrefix(prefix) { - setIdPrefix(prefix); - } - - function loadAnimation(params) { - if (standalone === true) { - params.animationData = JSON.parse(animationData); - } - - return animationManager.loadAnimation(params); - } - - function setQuality(value) { - if (typeof value === 'string') { - switch (value) { - case 'high': - setDefaultCurveSegments(200); - break; - - default: - case 'medium': - setDefaultCurveSegments(50); - break; - - case 'low': - setDefaultCurveSegments(10); - break; - } - } else if (!isNaN(value) && value > 1) { - setDefaultCurveSegments(value); - } - - if (getDefaultCurveSegments() >= 50) { - roundValues(false); - } else { - roundValues(true); - } - } - - function inBrowser() { - return typeof navigator !== 'undefined'; - } - - function installPlugin(type, plugin) { - if (type === 'expressions') { - setExpressionsPlugin(plugin); - } - } - - function getFactory(name) { - switch (name) { - case 'propertyFactory': - return PropertyFactory; - - case 'shapePropertyFactory': - return ShapePropertyFactory; - - case 'matrix': - return Matrix; - - default: - return null; - } - } - - lottie.play = animationManager.play; - lottie.pause = animationManager.pause; - lottie.setLocationHref = setLocation; - lottie.togglePause = animationManager.togglePause; - lottie.setSpeed = animationManager.setSpeed; - lottie.setDirection = animationManager.setDirection; - lottie.stop = animationManager.stop; - lottie.searchAnimations = searchAnimations; - lottie.registerAnimation = animationManager.registerAnimation; - lottie.loadAnimation = loadAnimation; - lottie.setSubframeRendering = setSubframeRendering; - lottie.resize = animationManager.resize; // lottie.start = start; - - lottie.goToAndStop = animationManager.goToAndStop; - lottie.destroy = animationManager.destroy; - lottie.setQuality = setQuality; - lottie.inBrowser = inBrowser; - lottie.installPlugin = installPlugin; - lottie.freeze = animationManager.freeze; - lottie.unfreeze = animationManager.unfreeze; - lottie.setVolume = animationManager.setVolume; - lottie.mute = animationManager.mute; - lottie.unmute = animationManager.unmute; - lottie.getRegisteredAnimations = animationManager.getRegisteredAnimations; - lottie.useWebWorker = setWebWorker; - lottie.setIDPrefix = setPrefix; - lottie.__getFactory = getFactory; - lottie.version = '5.9.5'; - - function checkReady() { - if (document.readyState === 'complete') { - clearInterval(readyStateCheckInterval); - searchAnimations(); - } - } - - function getQueryVariable(variable) { - var vars = queryString.split('&'); - - for (var i = 0; i < vars.length; i += 1) { - var pair = vars[i].split('='); - - if (decodeURIComponent(pair[0]) == variable) { - // eslint-disable-line eqeqeq - return decodeURIComponent(pair[1]); - } - } - - return null; - } - - var queryString = ''; - - if (standalone) { - var scripts = document.getElementsByTagName('script'); - var index = scripts.length - 1; - var myScript = scripts[index] || { - src: '' - }; - queryString = myScript.src ? myScript.src.replace(/^[^\?]+\??/, '') : ''; // eslint-disable-line no-useless-escape - - renderer = getQueryVariable('renderer'); - } - - var readyStateCheckInterval = setInterval(checkReady, 100); // this adds bodymovin to the window object for backwards compatibility - - try { - if (!(( false ? undefined : _typeof$3(exports)) === 'object' && typeof module !== 'undefined') && !( true && __webpack_require__("PDX0")) // eslint-disable-line no-undef - ) { - window.bodymovin = lottie; - } - } catch (err) {// - } - - var ShapeModifiers = function () { - var ob = {}; - var modifiers = {}; - ob.registerModifier = registerModifier; - ob.getModifier = getModifier; - - function registerModifier(nm, factory) { - if (!modifiers[nm]) { - modifiers[nm] = factory; - } - } - - function getModifier(nm, elem, data) { - return new modifiers[nm](elem, data); - } - - return ob; - }(); - - function ShapeModifier() {} - - ShapeModifier.prototype.initModifierProperties = function () {}; - - ShapeModifier.prototype.addShapeToModifier = function () {}; - - ShapeModifier.prototype.addShape = function (data) { - if (!this.closed) { - // Adding shape to dynamic properties. It covers the case where a shape has no effects applied, to reset it's _mdf state on every tick. - data.sh.container.addDynamicProperty(data.sh); - var shapeData = { - shape: data.sh, - data: data, - localShapeCollection: shapeCollectionPool.newShapeCollection() - }; - this.shapes.push(shapeData); - this.addShapeToModifier(shapeData); - - if (this._isAnimated) { - data.setAsAnimated(); - } - } - }; - - ShapeModifier.prototype.init = function (elem, data) { - this.shapes = []; - this.elem = elem; - this.initDynamicPropertyContainer(elem); - this.initModifierProperties(elem, data); - this.frameId = initialDefaultFrame; - this.closed = false; - this.k = false; - - if (this.dynamicProperties.length) { - this.k = true; - } else { - this.getValue(true); - } - }; - - ShapeModifier.prototype.processKeys = function () { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - this.frameId = this.elem.globalData.frameId; - this.iterateDynamicProperties(); - }; - - extendPrototype([DynamicPropertyContainer], ShapeModifier); - - function TrimModifier() {} - - extendPrototype([ShapeModifier], TrimModifier); - - TrimModifier.prototype.initModifierProperties = function (elem, data) { - this.s = PropertyFactory.getProp(elem, data.s, 0, 0.01, this); - this.e = PropertyFactory.getProp(elem, data.e, 0, 0.01, this); - this.o = PropertyFactory.getProp(elem, data.o, 0, 0, this); - this.sValue = 0; - this.eValue = 0; - this.getValue = this.processKeys; - this.m = data.m; - this._isAnimated = !!this.s.effectsSequence.length || !!this.e.effectsSequence.length || !!this.o.effectsSequence.length; - }; - - TrimModifier.prototype.addShapeToModifier = function (shapeData) { - shapeData.pathsData = []; - }; - - TrimModifier.prototype.calculateShapeEdges = function (s, e, shapeLength, addedLength, totalModifierLength) { - var segments = []; - - if (e <= 1) { - segments.push({ - s: s, - e: e - }); - } else if (s >= 1) { - segments.push({ - s: s - 1, - e: e - 1 - }); - } else { - segments.push({ - s: s, - e: 1 - }); - segments.push({ - s: 0, - e: e - 1 - }); - } - - var shapeSegments = []; - var i; - var len = segments.length; - var segmentOb; - - for (i = 0; i < len; i += 1) { - segmentOb = segments[i]; - - if (!(segmentOb.e * totalModifierLength < addedLength || segmentOb.s * totalModifierLength > addedLength + shapeLength)) { - var shapeS; - var shapeE; - - if (segmentOb.s * totalModifierLength <= addedLength) { - shapeS = 0; - } else { - shapeS = (segmentOb.s * totalModifierLength - addedLength) / shapeLength; - } - - if (segmentOb.e * totalModifierLength >= addedLength + shapeLength) { - shapeE = 1; - } else { - shapeE = (segmentOb.e * totalModifierLength - addedLength) / shapeLength; - } - - shapeSegments.push([shapeS, shapeE]); - } - } - - if (!shapeSegments.length) { - shapeSegments.push([0, 0]); - } - - return shapeSegments; - }; - - TrimModifier.prototype.releasePathsData = function (pathsData) { - var i; - var len = pathsData.length; - - for (i = 0; i < len; i += 1) { - segmentsLengthPool.release(pathsData[i]); - } - - pathsData.length = 0; - return pathsData; - }; - - TrimModifier.prototype.processShapes = function (_isFirstFrame) { - var s; - var e; - - if (this._mdf || _isFirstFrame) { - var o = this.o.v % 360 / 360; - - if (o < 0) { - o += 1; - } - - if (this.s.v > 1) { - s = 1 + o; - } else if (this.s.v < 0) { - s = 0 + o; - } else { - s = this.s.v + o; - } - - if (this.e.v > 1) { - e = 1 + o; - } else if (this.e.v < 0) { - e = 0 + o; - } else { - e = this.e.v + o; - } - - if (s > e) { - var _s = s; - s = e; - e = _s; - } - - s = Math.round(s * 10000) * 0.0001; - e = Math.round(e * 10000) * 0.0001; - this.sValue = s; - this.eValue = e; - } else { - s = this.sValue; - e = this.eValue; - } - - var shapePaths; - var i; - var len = this.shapes.length; - var j; - var jLen; - var pathsData; - var pathData; - var totalShapeLength; - var totalModifierLength = 0; - - if (e === s) { - for (i = 0; i < len; i += 1) { - this.shapes[i].localShapeCollection.releaseShapes(); - this.shapes[i].shape._mdf = true; - this.shapes[i].shape.paths = this.shapes[i].localShapeCollection; - - if (this._mdf) { - this.shapes[i].pathsData.length = 0; - } - } - } else if (!(e === 1 && s === 0 || e === 0 && s === 1)) { - var segments = []; - var shapeData; - var localShapeCollection; - - for (i = 0; i < len; i += 1) { - shapeData = this.shapes[i]; // if shape hasn't changed and trim properties haven't changed, cached previous path can be used - - if (!shapeData.shape._mdf && !this._mdf && !_isFirstFrame && this.m !== 2) { - shapeData.shape.paths = shapeData.localShapeCollection; - } else { - shapePaths = shapeData.shape.paths; - jLen = shapePaths._length; - totalShapeLength = 0; - - if (!shapeData.shape._mdf && shapeData.pathsData.length) { - totalShapeLength = shapeData.totalShapeLength; - } else { - pathsData = this.releasePathsData(shapeData.pathsData); - - for (j = 0; j < jLen; j += 1) { - pathData = bez.getSegmentsLength(shapePaths.shapes[j]); - pathsData.push(pathData); - totalShapeLength += pathData.totalLength; - } - - shapeData.totalShapeLength = totalShapeLength; - shapeData.pathsData = pathsData; - } - - totalModifierLength += totalShapeLength; - shapeData.shape._mdf = true; - } - } - - var shapeS = s; - var shapeE = e; - var addedLength = 0; - var edges; - - for (i = len - 1; i >= 0; i -= 1) { - shapeData = this.shapes[i]; - - if (shapeData.shape._mdf) { - localShapeCollection = shapeData.localShapeCollection; - localShapeCollection.releaseShapes(); // if m === 2 means paths are trimmed individually so edges need to be found for this specific shape relative to whoel group - - if (this.m === 2 && len > 1) { - edges = this.calculateShapeEdges(s, e, shapeData.totalShapeLength, addedLength, totalModifierLength); - addedLength += shapeData.totalShapeLength; - } else { - edges = [[shapeS, shapeE]]; - } - - jLen = edges.length; - - for (j = 0; j < jLen; j += 1) { - shapeS = edges[j][0]; - shapeE = edges[j][1]; - segments.length = 0; - - if (shapeE <= 1) { - segments.push({ - s: shapeData.totalShapeLength * shapeS, - e: shapeData.totalShapeLength * shapeE - }); - } else if (shapeS >= 1) { - segments.push({ - s: shapeData.totalShapeLength * (shapeS - 1), - e: shapeData.totalShapeLength * (shapeE - 1) - }); - } else { - segments.push({ - s: shapeData.totalShapeLength * shapeS, - e: shapeData.totalShapeLength - }); - segments.push({ - s: 0, - e: shapeData.totalShapeLength * (shapeE - 1) - }); - } - - var newShapesData = this.addShapes(shapeData, segments[0]); - - if (segments[0].s !== segments[0].e) { - if (segments.length > 1) { - var lastShapeInCollection = shapeData.shape.paths.shapes[shapeData.shape.paths._length - 1]; - - if (lastShapeInCollection.c) { - var lastShape = newShapesData.pop(); - this.addPaths(newShapesData, localShapeCollection); - newShapesData = this.addShapes(shapeData, segments[1], lastShape); - } else { - this.addPaths(newShapesData, localShapeCollection); - newShapesData = this.addShapes(shapeData, segments[1]); - } - } - - this.addPaths(newShapesData, localShapeCollection); - } - } - - shapeData.shape.paths = localShapeCollection; - } - } - } else if (this._mdf) { - for (i = 0; i < len; i += 1) { - // Releasign Trim Cached paths data when no trim applied in case shapes are modified inbetween. - // Don't remove this even if it's losing cached info. - this.shapes[i].pathsData.length = 0; - this.shapes[i].shape._mdf = true; - } - } - }; - - TrimModifier.prototype.addPaths = function (newPaths, localShapeCollection) { - var i; - var len = newPaths.length; - - for (i = 0; i < len; i += 1) { - localShapeCollection.addShape(newPaths[i]); - } - }; - - TrimModifier.prototype.addSegment = function (pt1, pt2, pt3, pt4, shapePath, pos, newShape) { - shapePath.setXYAt(pt2[0], pt2[1], 'o', pos); - shapePath.setXYAt(pt3[0], pt3[1], 'i', pos + 1); - - if (newShape) { - shapePath.setXYAt(pt1[0], pt1[1], 'v', pos); - } - - shapePath.setXYAt(pt4[0], pt4[1], 'v', pos + 1); - }; - - TrimModifier.prototype.addSegmentFromArray = function (points, shapePath, pos, newShape) { - shapePath.setXYAt(points[1], points[5], 'o', pos); - shapePath.setXYAt(points[2], points[6], 'i', pos + 1); - - if (newShape) { - shapePath.setXYAt(points[0], points[4], 'v', pos); - } - - shapePath.setXYAt(points[3], points[7], 'v', pos + 1); - }; - - TrimModifier.prototype.addShapes = function (shapeData, shapeSegment, shapePath) { - var pathsData = shapeData.pathsData; - var shapePaths = shapeData.shape.paths.shapes; - var i; - var len = shapeData.shape.paths._length; - var j; - var jLen; - var addedLength = 0; - var currentLengthData; - var segmentCount; - var lengths; - var segment; - var shapes = []; - var initPos; - var newShape = true; - - if (!shapePath) { - shapePath = shapePool.newElement(); - segmentCount = 0; - initPos = 0; - } else { - segmentCount = shapePath._length; - initPos = shapePath._length; - } - - shapes.push(shapePath); - - for (i = 0; i < len; i += 1) { - lengths = pathsData[i].lengths; - shapePath.c = shapePaths[i].c; - jLen = shapePaths[i].c ? lengths.length : lengths.length + 1; - - for (j = 1; j < jLen; j += 1) { - currentLengthData = lengths[j - 1]; - - if (addedLength + currentLengthData.addedLength < shapeSegment.s) { - addedLength += currentLengthData.addedLength; - shapePath.c = false; - } else if (addedLength > shapeSegment.e) { - shapePath.c = false; - break; - } else { - if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + currentLengthData.addedLength) { - this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[j], shapePaths[i].v[j], shapePath, segmentCount, newShape); - newShape = false; - } else { - segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[j], shapePaths[i].o[j - 1], shapePaths[i].i[j], (shapeSegment.s - addedLength) / currentLengthData.addedLength, (shapeSegment.e - addedLength) / currentLengthData.addedLength, lengths[j - 1]); - this.addSegmentFromArray(segment, shapePath, segmentCount, newShape); // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape); - - newShape = false; - shapePath.c = false; - } - - addedLength += currentLengthData.addedLength; - segmentCount += 1; - } - } - - if (shapePaths[i].c && lengths.length) { - currentLengthData = lengths[j - 1]; - - if (addedLength <= shapeSegment.e) { - var segmentLength = lengths[j - 1].addedLength; - - if (shapeSegment.s <= addedLength && shapeSegment.e >= addedLength + segmentLength) { - this.addSegment(shapePaths[i].v[j - 1], shapePaths[i].o[j - 1], shapePaths[i].i[0], shapePaths[i].v[0], shapePath, segmentCount, newShape); - newShape = false; - } else { - segment = bez.getNewSegment(shapePaths[i].v[j - 1], shapePaths[i].v[0], shapePaths[i].o[j - 1], shapePaths[i].i[0], (shapeSegment.s - addedLength) / segmentLength, (shapeSegment.e - addedLength) / segmentLength, lengths[j - 1]); - this.addSegmentFromArray(segment, shapePath, segmentCount, newShape); // this.addSegment(segment.pt1, segment.pt3, segment.pt4, segment.pt2, shapePath, segmentCount, newShape); - - newShape = false; - shapePath.c = false; - } - } else { - shapePath.c = false; - } - - addedLength += currentLengthData.addedLength; - segmentCount += 1; - } - - if (shapePath._length) { - shapePath.setXYAt(shapePath.v[initPos][0], shapePath.v[initPos][1], 'i', initPos); - shapePath.setXYAt(shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1], 'o', shapePath._length - 1); - } - - if (addedLength > shapeSegment.e) { - break; - } - - if (i < len - 1) { - shapePath = shapePool.newElement(); - newShape = true; - shapes.push(shapePath); - segmentCount = 0; - } - } - - return shapes; - }; - - function PuckerAndBloatModifier() {} - - extendPrototype([ShapeModifier], PuckerAndBloatModifier); - - PuckerAndBloatModifier.prototype.initModifierProperties = function (elem, data) { - this.getValue = this.processKeys; - this.amount = PropertyFactory.getProp(elem, data.a, 0, null, this); - this._isAnimated = !!this.amount.effectsSequence.length; - }; - - PuckerAndBloatModifier.prototype.processPath = function (path, amount) { - var percent = amount / 100; - var centerPoint = [0, 0]; - var pathLength = path._length; - var i = 0; - - for (i = 0; i < pathLength; i += 1) { - centerPoint[0] += path.v[i][0]; - centerPoint[1] += path.v[i][1]; - } - - centerPoint[0] /= pathLength; - centerPoint[1] /= pathLength; - var clonedPath = shapePool.newElement(); - clonedPath.c = path.c; - var vX; - var vY; - var oX; - var oY; - var iX; - var iY; - - for (i = 0; i < pathLength; i += 1) { - vX = path.v[i][0] + (centerPoint[0] - path.v[i][0]) * percent; - vY = path.v[i][1] + (centerPoint[1] - path.v[i][1]) * percent; - oX = path.o[i][0] + (centerPoint[0] - path.o[i][0]) * -percent; - oY = path.o[i][1] + (centerPoint[1] - path.o[i][1]) * -percent; - iX = path.i[i][0] + (centerPoint[0] - path.i[i][0]) * -percent; - iY = path.i[i][1] + (centerPoint[1] - path.i[i][1]) * -percent; - clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, i); - } - - return clonedPath; - }; - - PuckerAndBloatModifier.prototype.processShapes = function (_isFirstFrame) { - var shapePaths; - var i; - var len = this.shapes.length; - var j; - var jLen; - var amount = this.amount.v; - - if (amount !== 0) { - var shapeData; - var localShapeCollection; - - for (i = 0; i < len; i += 1) { - shapeData = this.shapes[i]; - localShapeCollection = shapeData.localShapeCollection; - - if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) { - localShapeCollection.releaseShapes(); - shapeData.shape._mdf = true; - shapePaths = shapeData.shape.paths.shapes; - jLen = shapeData.shape.paths._length; - - for (j = 0; j < jLen; j += 1) { - localShapeCollection.addShape(this.processPath(shapePaths[j], amount)); - } - } - - shapeData.shape.paths = shapeData.localShapeCollection; - } - } - - if (!this.dynamicProperties.length) { - this._mdf = false; - } - }; - - var TransformPropertyFactory = function () { - var defaultVector = [0, 0]; - - function applyToMatrix(mat) { - var _mdf = this._mdf; - this.iterateDynamicProperties(); - this._mdf = this._mdf || _mdf; - - if (this.a) { - mat.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]); - } - - if (this.s) { - mat.scale(this.s.v[0], this.s.v[1], this.s.v[2]); - } - - if (this.sk) { - mat.skewFromAxis(-this.sk.v, this.sa.v); - } - - if (this.r) { - mat.rotate(-this.r.v); - } else { - mat.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]); - } - - if (this.data.p.s) { - if (this.data.p.z) { - mat.translate(this.px.v, this.py.v, -this.pz.v); - } else { - mat.translate(this.px.v, this.py.v, 0); - } - } else { - mat.translate(this.p.v[0], this.p.v[1], -this.p.v[2]); - } - } - - function processKeys(forceRender) { - if (this.elem.globalData.frameId === this.frameId) { - return; - } - - if (this._isDirty) { - this.precalculateMatrix(); - this._isDirty = false; - } - - this.iterateDynamicProperties(); - - if (this._mdf || forceRender) { - var frameRate; - this.v.cloneFromProps(this.pre.props); - - if (this.appliedTransformations < 1) { - this.v.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]); - } - - if (this.appliedTransformations < 2) { - this.v.scale(this.s.v[0], this.s.v[1], this.s.v[2]); - } - - if (this.sk && this.appliedTransformations < 3) { - this.v.skewFromAxis(-this.sk.v, this.sa.v); - } - - if (this.r && this.appliedTransformations < 4) { - this.v.rotate(-this.r.v); - } else if (!this.r && this.appliedTransformations < 4) { - this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]); - } - - if (this.autoOriented) { - var v1; - var v2; - frameRate = this.elem.globalData.frameRate; - - if (this.p && this.p.keyframes && this.p.getValueAtTime) { - if (this.p._caching.lastFrame + this.p.offsetTime <= this.p.keyframes[0].t) { - v1 = this.p.getValueAtTime((this.p.keyframes[0].t + 0.01) / frameRate, 0); - v2 = this.p.getValueAtTime(this.p.keyframes[0].t / frameRate, 0); - } else if (this.p._caching.lastFrame + this.p.offsetTime >= this.p.keyframes[this.p.keyframes.length - 1].t) { - v1 = this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length - 1].t / frameRate, 0); - v2 = this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length - 1].t - 0.05) / frameRate, 0); - } else { - v1 = this.p.pv; - v2 = this.p.getValueAtTime((this.p._caching.lastFrame + this.p.offsetTime - 0.01) / frameRate, this.p.offsetTime); - } - } else if (this.px && this.px.keyframes && this.py.keyframes && this.px.getValueAtTime && this.py.getValueAtTime) { - v1 = []; - v2 = []; - var px = this.px; - var py = this.py; - - if (px._caching.lastFrame + px.offsetTime <= px.keyframes[0].t) { - v1[0] = px.getValueAtTime((px.keyframes[0].t + 0.01) / frameRate, 0); - v1[1] = py.getValueAtTime((py.keyframes[0].t + 0.01) / frameRate, 0); - v2[0] = px.getValueAtTime(px.keyframes[0].t / frameRate, 0); - v2[1] = py.getValueAtTime(py.keyframes[0].t / frameRate, 0); - } else if (px._caching.lastFrame + px.offsetTime >= px.keyframes[px.keyframes.length - 1].t) { - v1[0] = px.getValueAtTime(px.keyframes[px.keyframes.length - 1].t / frameRate, 0); - v1[1] = py.getValueAtTime(py.keyframes[py.keyframes.length - 1].t / frameRate, 0); - v2[0] = px.getValueAtTime((px.keyframes[px.keyframes.length - 1].t - 0.01) / frameRate, 0); - v2[1] = py.getValueAtTime((py.keyframes[py.keyframes.length - 1].t - 0.01) / frameRate, 0); - } else { - v1 = [px.pv, py.pv]; - v2[0] = px.getValueAtTime((px._caching.lastFrame + px.offsetTime - 0.01) / frameRate, px.offsetTime); - v2[1] = py.getValueAtTime((py._caching.lastFrame + py.offsetTime - 0.01) / frameRate, py.offsetTime); - } - } else { - v2 = defaultVector; - v1 = v2; - } - - this.v.rotate(-Math.atan2(v1[1] - v2[1], v1[0] - v2[0])); - } - - if (this.data.p && this.data.p.s) { - if (this.data.p.z) { - this.v.translate(this.px.v, this.py.v, -this.pz.v); - } else { - this.v.translate(this.px.v, this.py.v, 0); - } - } else { - this.v.translate(this.p.v[0], this.p.v[1], -this.p.v[2]); - } - } - - this.frameId = this.elem.globalData.frameId; - } - - function precalculateMatrix() { - if (!this.a.k) { - this.pre.translate(-this.a.v[0], -this.a.v[1], this.a.v[2]); - this.appliedTransformations = 1; - } else { - return; - } - - if (!this.s.effectsSequence.length) { - this.pre.scale(this.s.v[0], this.s.v[1], this.s.v[2]); - this.appliedTransformations = 2; - } else { - return; - } - - if (this.sk) { - if (!this.sk.effectsSequence.length && !this.sa.effectsSequence.length) { - this.pre.skewFromAxis(-this.sk.v, this.sa.v); - this.appliedTransformations = 3; - } else { - return; - } - } - - if (this.r) { - if (!this.r.effectsSequence.length) { - this.pre.rotate(-this.r.v); - this.appliedTransformations = 4; - } - } else if (!this.rz.effectsSequence.length && !this.ry.effectsSequence.length && !this.rx.effectsSequence.length && !this.or.effectsSequence.length) { - this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]); - this.appliedTransformations = 4; - } - } - - function autoOrient() {// - // var prevP = this.getValueAtTime(); - } - - function addDynamicProperty(prop) { - this._addDynamicProperty(prop); - - this.elem.addDynamicProperty(prop); - this._isDirty = true; - } - - function TransformProperty(elem, data, container) { - this.elem = elem; - this.frameId = -1; - this.propType = 'transform'; - this.data = data; - this.v = new Matrix(); // Precalculated matrix with non animated properties - - this.pre = new Matrix(); - this.appliedTransformations = 0; - this.initDynamicPropertyContainer(container || elem); - - if (data.p && data.p.s) { - this.px = PropertyFactory.getProp(elem, data.p.x, 0, 0, this); - this.py = PropertyFactory.getProp(elem, data.p.y, 0, 0, this); - - if (data.p.z) { - this.pz = PropertyFactory.getProp(elem, data.p.z, 0, 0, this); - } - } else { - this.p = PropertyFactory.getProp(elem, data.p || { - k: [0, 0, 0] - }, 1, 0, this); - } - - if (data.rx) { - this.rx = PropertyFactory.getProp(elem, data.rx, 0, degToRads, this); - this.ry = PropertyFactory.getProp(elem, data.ry, 0, degToRads, this); - this.rz = PropertyFactory.getProp(elem, data.rz, 0, degToRads, this); - - if (data.or.k[0].ti) { - var i; - var len = data.or.k.length; - - for (i = 0; i < len; i += 1) { - data.or.k[i].to = null; - data.or.k[i].ti = null; - } - } - - this.or = PropertyFactory.getProp(elem, data.or, 1, degToRads, this); // sh Indicates it needs to be capped between -180 and 180 - - this.or.sh = true; - } else { - this.r = PropertyFactory.getProp(elem, data.r || { - k: 0 - }, 0, degToRads, this); - } - - if (data.sk) { - this.sk = PropertyFactory.getProp(elem, data.sk, 0, degToRads, this); - this.sa = PropertyFactory.getProp(elem, data.sa, 0, degToRads, this); - } - - this.a = PropertyFactory.getProp(elem, data.a || { - k: [0, 0, 0] - }, 1, 0, this); - this.s = PropertyFactory.getProp(elem, data.s || { - k: [100, 100, 100] - }, 1, 0.01, this); // Opacity is not part of the transform properties, that's why it won't use this.dynamicProperties. That way transforms won't get updated if opacity changes. - - if (data.o) { - this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, elem); - } else { - this.o = { - _mdf: false, - v: 1 - }; - } - - this._isDirty = true; - - if (!this.dynamicProperties.length) { - this.getValue(true); - } - } - - TransformProperty.prototype = { - applyToMatrix: applyToMatrix, - getValue: processKeys, - precalculateMatrix: precalculateMatrix, - autoOrient: autoOrient - }; - extendPrototype([DynamicPropertyContainer], TransformProperty); - TransformProperty.prototype.addDynamicProperty = addDynamicProperty; - TransformProperty.prototype._addDynamicProperty = DynamicPropertyContainer.prototype.addDynamicProperty; - - function getTransformProperty(elem, data, container) { - return new TransformProperty(elem, data, container); - } - - return { - getTransformProperty: getTransformProperty - }; - }(); - - function RepeaterModifier() {} - - extendPrototype([ShapeModifier], RepeaterModifier); - - RepeaterModifier.prototype.initModifierProperties = function (elem, data) { - this.getValue = this.processKeys; - this.c = PropertyFactory.getProp(elem, data.c, 0, null, this); - this.o = PropertyFactory.getProp(elem, data.o, 0, null, this); - this.tr = TransformPropertyFactory.getTransformProperty(elem, data.tr, this); - this.so = PropertyFactory.getProp(elem, data.tr.so, 0, 0.01, this); - this.eo = PropertyFactory.getProp(elem, data.tr.eo, 0, 0.01, this); - this.data = data; - - if (!this.dynamicProperties.length) { - this.getValue(true); - } - - this._isAnimated = !!this.dynamicProperties.length; - this.pMatrix = new Matrix(); - this.rMatrix = new Matrix(); - this.sMatrix = new Matrix(); - this.tMatrix = new Matrix(); - this.matrix = new Matrix(); - }; - - RepeaterModifier.prototype.applyTransforms = function (pMatrix, rMatrix, sMatrix, transform, perc, inv) { - var dir = inv ? -1 : 1; - var scaleX = transform.s.v[0] + (1 - transform.s.v[0]) * (1 - perc); - var scaleY = transform.s.v[1] + (1 - transform.s.v[1]) * (1 - perc); - pMatrix.translate(transform.p.v[0] * dir * perc, transform.p.v[1] * dir * perc, transform.p.v[2]); - rMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]); - rMatrix.rotate(-transform.r.v * dir * perc); - rMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]); - sMatrix.translate(-transform.a.v[0], -transform.a.v[1], transform.a.v[2]); - sMatrix.scale(inv ? 1 / scaleX : scaleX, inv ? 1 / scaleY : scaleY); - sMatrix.translate(transform.a.v[0], transform.a.v[1], transform.a.v[2]); - }; - - RepeaterModifier.prototype.init = function (elem, arr, pos, elemsData) { - this.elem = elem; - this.arr = arr; - this.pos = pos; - this.elemsData = elemsData; - this._currentCopies = 0; - this._elements = []; - this._groups = []; - this.frameId = -1; - this.initDynamicPropertyContainer(elem); - this.initModifierProperties(elem, arr[pos]); - - while (pos > 0) { - pos -= 1; // this._elements.unshift(arr.splice(pos,1)[0]); - - this._elements.unshift(arr[pos]); - } - - if (this.dynamicProperties.length) { - this.k = true; - } else { - this.getValue(true); - } - }; - - RepeaterModifier.prototype.resetElements = function (elements) { - var i; - var len = elements.length; - - for (i = 0; i < len; i += 1) { - elements[i]._processed = false; - - if (elements[i].ty === 'gr') { - this.resetElements(elements[i].it); - } - } - }; - - RepeaterModifier.prototype.cloneElements = function (elements) { - var newElements = JSON.parse(JSON.stringify(elements)); - this.resetElements(newElements); - return newElements; - }; - - RepeaterModifier.prototype.changeGroupRender = function (elements, renderFlag) { - var i; - var len = elements.length; - - for (i = 0; i < len; i += 1) { - elements[i]._render = renderFlag; - - if (elements[i].ty === 'gr') { - this.changeGroupRender(elements[i].it, renderFlag); - } - } - }; - - RepeaterModifier.prototype.processShapes = function (_isFirstFrame) { - var items; - var itemsTransform; - var i; - var dir; - var cont; - var hasReloaded = false; - - if (this._mdf || _isFirstFrame) { - var copies = Math.ceil(this.c.v); - - if (this._groups.length < copies) { - while (this._groups.length < copies) { - var group = { - it: this.cloneElements(this._elements), - ty: 'gr' - }; - group.it.push({ - a: { - a: 0, - ix: 1, - k: [0, 0] - }, - nm: 'Transform', - o: { - a: 0, - ix: 7, - k: 100 - }, - p: { - a: 0, - ix: 2, - k: [0, 0] - }, - r: { - a: 1, - ix: 6, - k: [{ - s: 0, - e: 0, - t: 0 - }, { - s: 0, - e: 0, - t: 1 - }] - }, - s: { - a: 0, - ix: 3, - k: [100, 100] - }, - sa: { - a: 0, - ix: 5, - k: 0 - }, - sk: { - a: 0, - ix: 4, - k: 0 - }, - ty: 'tr' - }); - this.arr.splice(0, 0, group); - - this._groups.splice(0, 0, group); - - this._currentCopies += 1; - } - - this.elem.reloadShapes(); - hasReloaded = true; - } - - cont = 0; - var renderFlag; - - for (i = 0; i <= this._groups.length - 1; i += 1) { - renderFlag = cont < copies; - this._groups[i]._render = renderFlag; - this.changeGroupRender(this._groups[i].it, renderFlag); - - if (!renderFlag) { - var elems = this.elemsData[i].it; - var transformData = elems[elems.length - 1]; - - if (transformData.transform.op.v !== 0) { - transformData.transform.op._mdf = true; - transformData.transform.op.v = 0; - } else { - transformData.transform.op._mdf = false; - } - } - - cont += 1; - } - - this._currentCopies = copies; /// / - - var offset = this.o.v; - var offsetModulo = offset % 1; - var roundOffset = offset > 0 ? Math.floor(offset) : Math.ceil(offset); - var pProps = this.pMatrix.props; - var rProps = this.rMatrix.props; - var sProps = this.sMatrix.props; - this.pMatrix.reset(); - this.rMatrix.reset(); - this.sMatrix.reset(); - this.tMatrix.reset(); - this.matrix.reset(); - var iteration = 0; - - if (offset > 0) { - while (iteration < roundOffset) { - this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false); - iteration += 1; - } - - if (offsetModulo) { - this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, offsetModulo, false); - iteration += offsetModulo; - } - } else if (offset < 0) { - while (iteration > roundOffset) { - this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, true); - iteration -= 1; - } - - if (offsetModulo) { - this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, -offsetModulo, true); - iteration -= offsetModulo; - } - } - - i = this.data.m === 1 ? 0 : this._currentCopies - 1; - dir = this.data.m === 1 ? 1 : -1; - cont = this._currentCopies; - var j; - var jLen; - - while (cont) { - items = this.elemsData[i].it; - itemsTransform = items[items.length - 1].transform.mProps.v.props; - jLen = itemsTransform.length; - items[items.length - 1].transform.mProps._mdf = true; - items[items.length - 1].transform.op._mdf = true; - items[items.length - 1].transform.op.v = this._currentCopies === 1 ? this.so.v : this.so.v + (this.eo.v - this.so.v) * (i / (this._currentCopies - 1)); - - if (iteration !== 0) { - if (i !== 0 && dir === 1 || i !== this._currentCopies - 1 && dir === -1) { - this.applyTransforms(this.pMatrix, this.rMatrix, this.sMatrix, this.tr, 1, false); - } - - this.matrix.transform(rProps[0], rProps[1], rProps[2], rProps[3], rProps[4], rProps[5], rProps[6], rProps[7], rProps[8], rProps[9], rProps[10], rProps[11], rProps[12], rProps[13], rProps[14], rProps[15]); - this.matrix.transform(sProps[0], sProps[1], sProps[2], sProps[3], sProps[4], sProps[5], sProps[6], sProps[7], sProps[8], sProps[9], sProps[10], sProps[11], sProps[12], sProps[13], sProps[14], sProps[15]); - this.matrix.transform(pProps[0], pProps[1], pProps[2], pProps[3], pProps[4], pProps[5], pProps[6], pProps[7], pProps[8], pProps[9], pProps[10], pProps[11], pProps[12], pProps[13], pProps[14], pProps[15]); - - for (j = 0; j < jLen; j += 1) { - itemsTransform[j] = this.matrix.props[j]; - } - - this.matrix.reset(); - } else { - this.matrix.reset(); - - for (j = 0; j < jLen; j += 1) { - itemsTransform[j] = this.matrix.props[j]; - } - } - - iteration += 1; - cont -= 1; - i += dir; - } - } else { - cont = this._currentCopies; - i = 0; - dir = 1; - - while (cont) { - items = this.elemsData[i].it; - itemsTransform = items[items.length - 1].transform.mProps.v.props; - items[items.length - 1].transform.mProps._mdf = false; - items[items.length - 1].transform.op._mdf = false; - cont -= 1; - i += dir; - } - } - - return hasReloaded; - }; - - RepeaterModifier.prototype.addShape = function () {}; - - function RoundCornersModifier() {} - - extendPrototype([ShapeModifier], RoundCornersModifier); - - RoundCornersModifier.prototype.initModifierProperties = function (elem, data) { - this.getValue = this.processKeys; - this.rd = PropertyFactory.getProp(elem, data.r, 0, null, this); - this._isAnimated = !!this.rd.effectsSequence.length; - }; - - RoundCornersModifier.prototype.processPath = function (path, round) { - var clonedPath = shapePool.newElement(); - clonedPath.c = path.c; - var i; - var len = path._length; - var currentV; - var currentI; - var currentO; - var closerV; - var distance; - var newPosPerc; - var index = 0; - var vX; - var vY; - var oX; - var oY; - var iX; - var iY; - - for (i = 0; i < len; i += 1) { - currentV = path.v[i]; - currentO = path.o[i]; - currentI = path.i[i]; - - if (currentV[0] === currentO[0] && currentV[1] === currentO[1] && currentV[0] === currentI[0] && currentV[1] === currentI[1]) { - if ((i === 0 || i === len - 1) && !path.c) { - clonedPath.setTripleAt(currentV[0], currentV[1], currentO[0], currentO[1], currentI[0], currentI[1], index); - /* clonedPath.v[index] = currentV; - clonedPath.o[index] = currentO; - clonedPath.i[index] = currentI; */ - - index += 1; - } else { - if (i === 0) { - closerV = path.v[len - 1]; - } else { - closerV = path.v[i - 1]; - } - - distance = Math.sqrt(Math.pow(currentV[0] - closerV[0], 2) + Math.pow(currentV[1] - closerV[1], 2)); - newPosPerc = distance ? Math.min(distance / 2, round) / distance : 0; - iX = currentV[0] + (closerV[0] - currentV[0]) * newPosPerc; - vX = iX; - iY = currentV[1] - (currentV[1] - closerV[1]) * newPosPerc; - vY = iY; - oX = vX - (vX - currentV[0]) * roundCorner; - oY = vY - (vY - currentV[1]) * roundCorner; - clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, index); - index += 1; - - if (i === len - 1) { - closerV = path.v[0]; - } else { - closerV = path.v[i + 1]; - } - - distance = Math.sqrt(Math.pow(currentV[0] - closerV[0], 2) + Math.pow(currentV[1] - closerV[1], 2)); - newPosPerc = distance ? Math.min(distance / 2, round) / distance : 0; - oX = currentV[0] + (closerV[0] - currentV[0]) * newPosPerc; - vX = oX; - oY = currentV[1] + (closerV[1] - currentV[1]) * newPosPerc; - vY = oY; - iX = vX - (vX - currentV[0]) * roundCorner; - iY = vY - (vY - currentV[1]) * roundCorner; - clonedPath.setTripleAt(vX, vY, oX, oY, iX, iY, index); - index += 1; - } - } else { - clonedPath.setTripleAt(path.v[i][0], path.v[i][1], path.o[i][0], path.o[i][1], path.i[i][0], path.i[i][1], index); - index += 1; - } - } - - return clonedPath; - }; - - RoundCornersModifier.prototype.processShapes = function (_isFirstFrame) { - var shapePaths; - var i; - var len = this.shapes.length; - var j; - var jLen; - var rd = this.rd.v; - - if (rd !== 0) { - var shapeData; - var localShapeCollection; - - for (i = 0; i < len; i += 1) { - shapeData = this.shapes[i]; - localShapeCollection = shapeData.localShapeCollection; - - if (!(!shapeData.shape._mdf && !this._mdf && !_isFirstFrame)) { - localShapeCollection.releaseShapes(); - shapeData.shape._mdf = true; - shapePaths = shapeData.shape.paths.shapes; - jLen = shapeData.shape.paths._length; - - for (j = 0; j < jLen; j += 1) { - localShapeCollection.addShape(this.processPath(shapePaths[j], rd)); - } - } - - shapeData.shape.paths = shapeData.localShapeCollection; - } - } - - if (!this.dynamicProperties.length) { - this._mdf = false; - } - }; - - function getFontProperties(fontData) { - var styles = fontData.fStyle ? fontData.fStyle.split(' ') : []; - var fWeight = 'normal'; - var fStyle = 'normal'; - var len = styles.length; - var styleName; - - for (var i = 0; i < len; i += 1) { - styleName = styles[i].toLowerCase(); - - switch (styleName) { - case 'italic': - fStyle = 'italic'; - break; - - case 'bold': - fWeight = '700'; - break; - - case 'black': - fWeight = '900'; - break; - - case 'medium': - fWeight = '500'; - break; - - case 'regular': - case 'normal': - fWeight = '400'; - break; - - case 'light': - case 'thin': - fWeight = '200'; - break; - - default: - break; - } - } - - return { - style: fStyle, - weight: fontData.fWeight || fWeight - }; - } - - var FontManager = function () { - var maxWaitingTime = 5000; - var emptyChar = { - w: 0, - size: 0, - shapes: [], - data: { - shapes: [] - } - }; - var combinedCharacters = []; // Hindi characters - - combinedCharacters = combinedCharacters.concat([2304, 2305, 2306, 2307, 2362, 2363, 2364, 2364, 2366, 2367, 2368, 2369, 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379, 2380, 2381, 2382, 2383, 2387, 2388, 2389, 2390, 2391, 2402, 2403]); - var surrogateModifiers = ['d83cdffb', 'd83cdffc', 'd83cdffd', 'd83cdffe', 'd83cdfff']; - var zeroWidthJoiner = [65039, 8205]; - - function trimFontOptions(font) { - var familyArray = font.split(','); - var i; - var len = familyArray.length; - var enabledFamilies = []; - - for (i = 0; i < len; i += 1) { - if (familyArray[i] !== 'sans-serif' && familyArray[i] !== 'monospace') { - enabledFamilies.push(familyArray[i]); - } - } - - return enabledFamilies.join(','); - } - - function setUpNode(font, family) { - var parentNode = createTag('span'); // Node is invisible to screen readers. - - parentNode.setAttribute('aria-hidden', true); - parentNode.style.fontFamily = family; - var node = createTag('span'); // Characters that vary significantly among different fonts - - node.innerText = 'giItT1WQy@!-/#'; // Visible - so we can measure it - but not on the screen - - parentNode.style.position = 'absolute'; - parentNode.style.left = '-10000px'; - parentNode.style.top = '-10000px'; // Large font size makes even subtle changes obvious - - parentNode.style.fontSize = '300px'; // Reset any font properties - - parentNode.style.fontVariant = 'normal'; - parentNode.style.fontStyle = 'normal'; - parentNode.style.fontWeight = 'normal'; - parentNode.style.letterSpacing = '0'; - parentNode.appendChild(node); - document.body.appendChild(parentNode); // Remember width with no applied web font - - var width = node.offsetWidth; - node.style.fontFamily = trimFontOptions(font) + ', ' + family; - return { - node: node, - w: width, - parent: parentNode - }; - } - - function checkLoadedFonts() { - var i; - var len = this.fonts.length; - var node; - var w; - var loadedCount = len; - - for (i = 0; i < len; i += 1) { - if (this.fonts[i].loaded) { - loadedCount -= 1; - } else if (this.fonts[i].fOrigin === 'n' || this.fonts[i].origin === 0) { - this.fonts[i].loaded = true; - } else { - node = this.fonts[i].monoCase.node; - w = this.fonts[i].monoCase.w; - - if (node.offsetWidth !== w) { - loadedCount -= 1; - this.fonts[i].loaded = true; - } else { - node = this.fonts[i].sansCase.node; - w = this.fonts[i].sansCase.w; - - if (node.offsetWidth !== w) { - loadedCount -= 1; - this.fonts[i].loaded = true; - } - } - - if (this.fonts[i].loaded) { - this.fonts[i].sansCase.parent.parentNode.removeChild(this.fonts[i].sansCase.parent); - this.fonts[i].monoCase.parent.parentNode.removeChild(this.fonts[i].monoCase.parent); - } - } - } - - if (loadedCount !== 0 && Date.now() - this.initTime < maxWaitingTime) { - setTimeout(this.checkLoadedFontsBinded, 20); - } else { - setTimeout(this.setIsLoadedBinded, 10); - } - } - - function createHelper(fontData, def) { - var engine = document.body && def ? 'svg' : 'canvas'; - var helper; - var fontProps = getFontProperties(fontData); - - if (engine === 'svg') { - var tHelper = createNS('text'); - tHelper.style.fontSize = '100px'; // tHelper.style.fontFamily = fontData.fFamily; - - tHelper.setAttribute('font-family', fontData.fFamily); - tHelper.setAttribute('font-style', fontProps.style); - tHelper.setAttribute('font-weight', fontProps.weight); - tHelper.textContent = '1'; - - if (fontData.fClass) { - tHelper.style.fontFamily = 'inherit'; - tHelper.setAttribute('class', fontData.fClass); - } else { - tHelper.style.fontFamily = fontData.fFamily; - } - - def.appendChild(tHelper); - helper = tHelper; - } else { - var tCanvasHelper = new OffscreenCanvas(500, 500).getContext('2d'); - tCanvasHelper.font = fontProps.style + ' ' + fontProps.weight + ' 100px ' + fontData.fFamily; - helper = tCanvasHelper; - } - - function measure(text) { - if (engine === 'svg') { - helper.textContent = text; - return helper.getComputedTextLength(); - } - - return helper.measureText(text).width; - } - - return { - measureText: measure - }; - } - - function addFonts(fontData, defs) { - if (!fontData) { - this.isLoaded = true; - return; - } - - if (this.chars) { - this.isLoaded = true; - this.fonts = fontData.list; - return; - } - - if (!document.body) { - this.isLoaded = true; - fontData.list.forEach(function (data) { - data.helper = createHelper(data); - data.cache = {}; - }); - this.fonts = fontData.list; - return; - } - - var fontArr = fontData.list; - var i; - var len = fontArr.length; - var _pendingFonts = len; - - for (i = 0; i < len; i += 1) { - var shouldLoadFont = true; - var loadedSelector; - var j; - fontArr[i].loaded = false; - fontArr[i].monoCase = setUpNode(fontArr[i].fFamily, 'monospace'); - fontArr[i].sansCase = setUpNode(fontArr[i].fFamily, 'sans-serif'); - - if (!fontArr[i].fPath) { - fontArr[i].loaded = true; - _pendingFonts -= 1; - } else if (fontArr[i].fOrigin === 'p' || fontArr[i].origin === 3) { - loadedSelector = document.querySelectorAll('style[f-forigin="p"][f-family="' + fontArr[i].fFamily + '"], style[f-origin="3"][f-family="' + fontArr[i].fFamily + '"]'); - - if (loadedSelector.length > 0) { - shouldLoadFont = false; - } - - if (shouldLoadFont) { - var s = createTag('style'); - s.setAttribute('f-forigin', fontArr[i].fOrigin); - s.setAttribute('f-origin', fontArr[i].origin); - s.setAttribute('f-family', fontArr[i].fFamily); - s.type = 'text/css'; - s.innerText = '@font-face {font-family: ' + fontArr[i].fFamily + "; font-style: normal; src: url('" + fontArr[i].fPath + "');}"; - defs.appendChild(s); - } - } else if (fontArr[i].fOrigin === 'g' || fontArr[i].origin === 1) { - loadedSelector = document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'); - - for (j = 0; j < loadedSelector.length; j += 1) { - if (loadedSelector[j].href.indexOf(fontArr[i].fPath) !== -1) { - // Font is already loaded - shouldLoadFont = false; - } - } - - if (shouldLoadFont) { - var l = createTag('link'); - l.setAttribute('f-forigin', fontArr[i].fOrigin); - l.setAttribute('f-origin', fontArr[i].origin); - l.type = 'text/css'; - l.rel = 'stylesheet'; - l.href = fontArr[i].fPath; - document.body.appendChild(l); - } - } else if (fontArr[i].fOrigin === 't' || fontArr[i].origin === 2) { - loadedSelector = document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'); - - for (j = 0; j < loadedSelector.length; j += 1) { - if (fontArr[i].fPath === loadedSelector[j].src) { - // Font is already loaded - shouldLoadFont = false; - } - } - - if (shouldLoadFont) { - var sc = createTag('link'); - sc.setAttribute('f-forigin', fontArr[i].fOrigin); - sc.setAttribute('f-origin', fontArr[i].origin); - sc.setAttribute('rel', 'stylesheet'); - sc.setAttribute('href', fontArr[i].fPath); - defs.appendChild(sc); - } - } - - fontArr[i].helper = createHelper(fontArr[i], defs); - fontArr[i].cache = {}; - this.fonts.push(fontArr[i]); - } - - if (_pendingFonts === 0) { - this.isLoaded = true; - } else { - // On some cases even if the font is loaded, it won't load correctly when measuring text on canvas. - // Adding this timeout seems to fix it - setTimeout(this.checkLoadedFonts.bind(this), 100); - } - } - - function addChars(chars) { - if (!chars) { - return; - } - - if (!this.chars) { - this.chars = []; - } - - var i; - var len = chars.length; - var j; - var jLen = this.chars.length; - var found; - - for (i = 0; i < len; i += 1) { - j = 0; - found = false; - - while (j < jLen) { - if (this.chars[j].style === chars[i].style && this.chars[j].fFamily === chars[i].fFamily && this.chars[j].ch === chars[i].ch) { - found = true; - } - - j += 1; - } - - if (!found) { - this.chars.push(chars[i]); - jLen += 1; - } - } - } - - function getCharData(_char, style, font) { - var i = 0; - var len = this.chars.length; - - while (i < len) { - if (this.chars[i].ch === _char && this.chars[i].style === style && this.chars[i].fFamily === font) { - return this.chars[i]; - } - - i += 1; - } - - if ((typeof _char === 'string' && _char.charCodeAt(0) !== 13 || !_char) && console && console.warn // eslint-disable-line no-console - && !this._warned) { - this._warned = true; - console.warn('Missing character from exported characters list: ', _char, style, font); // eslint-disable-line no-console - } - - return emptyChar; - } - - function measureText(_char2, fontName, size) { - var fontData = this.getFontByName(fontName); - - var index = _char2.charCodeAt(0); - - if (!fontData.cache[index + 1]) { - var tHelper = fontData.helper; - - if (_char2 === ' ') { - var doubleSize = tHelper.measureText('|' + _char2 + '|'); - var singleSize = tHelper.measureText('||'); - fontData.cache[index + 1] = (doubleSize - singleSize) / 100; - } else { - fontData.cache[index + 1] = tHelper.measureText(_char2) / 100; - } - } - - return fontData.cache[index + 1] * size; - } - - function getFontByName(name) { - var i = 0; - var len = this.fonts.length; - - while (i < len) { - if (this.fonts[i].fName === name) { - return this.fonts[i]; - } - - i += 1; - } - - return this.fonts[0]; - } - - function isModifier(firstCharCode, secondCharCode) { - var sum = firstCharCode.toString(16) + secondCharCode.toString(16); - return surrogateModifiers.indexOf(sum) !== -1; - } - - function isZeroWidthJoiner(firstCharCode, secondCharCode) { - if (!secondCharCode) { - return firstCharCode === zeroWidthJoiner[1]; - } - - return firstCharCode === zeroWidthJoiner[0] && secondCharCode === zeroWidthJoiner[1]; - } - - function isCombinedCharacter(_char3) { - return combinedCharacters.indexOf(_char3) !== -1; - } - - function setIsLoaded() { - this.isLoaded = true; - } - - var Font = function Font() { - this.fonts = []; - this.chars = null; - this.typekitLoaded = 0; - this.isLoaded = false; - this._warned = false; - this.initTime = Date.now(); - this.setIsLoadedBinded = this.setIsLoaded.bind(this); - this.checkLoadedFontsBinded = this.checkLoadedFonts.bind(this); - }; - - Font.isModifier = isModifier; - Font.isZeroWidthJoiner = isZeroWidthJoiner; - Font.isCombinedCharacter = isCombinedCharacter; - var fontPrototype = { - addChars: addChars, - addFonts: addFonts, - getCharData: getCharData, - getFontByName: getFontByName, - measureText: measureText, - checkLoadedFonts: checkLoadedFonts, - setIsLoaded: setIsLoaded - }; - Font.prototype = fontPrototype; - return Font; - }(); - - function RenderableElement() {} - - RenderableElement.prototype = { - initRenderable: function initRenderable() { - // layer's visibility related to inpoint and outpoint. Rename isVisible to isInRange - this.isInRange = false; // layer's display state - - this.hidden = false; // If layer's transparency equals 0, it can be hidden - - this.isTransparent = false; // list of animated components - - this.renderableComponents = []; - }, - addRenderableComponent: function addRenderableComponent(component) { - if (this.renderableComponents.indexOf(component) === -1) { - this.renderableComponents.push(component); - } - }, - removeRenderableComponent: function removeRenderableComponent(component) { - if (this.renderableComponents.indexOf(component) !== -1) { - this.renderableComponents.splice(this.renderableComponents.indexOf(component), 1); - } - }, - prepareRenderableFrame: function prepareRenderableFrame(num) { - this.checkLayerLimits(num); - }, - checkTransparency: function checkTransparency() { - if (this.finalTransform.mProp.o.v <= 0) { - if (!this.isTransparent && this.globalData.renderConfig.hideOnTransparent) { - this.isTransparent = true; - this.hide(); - } - } else if (this.isTransparent) { - this.isTransparent = false; - this.show(); - } - }, - - /** - * @function - * Initializes frame related properties. - * - * @param {number} num - * current frame number in Layer's time - * - */ - checkLayerLimits: function checkLayerLimits(num) { - if (this.data.ip - this.data.st <= num && this.data.op - this.data.st > num) { - if (this.isInRange !== true) { - this.globalData._mdf = true; - this._mdf = true; - this.isInRange = true; - this.show(); - } - } else if (this.isInRange !== false) { - this.globalData._mdf = true; - this.isInRange = false; - this.hide(); - } - }, - renderRenderable: function renderRenderable() { - var i; - var len = this.renderableComponents.length; - - for (i = 0; i < len; i += 1) { - this.renderableComponents[i].renderFrame(this._isFirstFrame); - } - /* this.maskManager.renderFrame(this.finalTransform.mat); - this.renderableEffectsManager.renderFrame(this._isFirstFrame); */ - - }, - sourceRectAtTime: function sourceRectAtTime() { - return { - top: 0, - left: 0, - width: 100, - height: 100 - }; - }, - getLayerSize: function getLayerSize() { - if (this.data.ty === 5) { - return { - w: this.data.textData.width, - h: this.data.textData.height - }; - } - - return { - w: this.data.width, - h: this.data.height - }; - } - }; - - var MaskManagerInterface = function () { - function MaskInterface(mask, data) { - this._mask = mask; - this._data = data; - } - - Object.defineProperty(MaskInterface.prototype, 'maskPath', { - get: function get() { - if (this._mask.prop.k) { - this._mask.prop.getValue(); - } - - return this._mask.prop; - } - }); - Object.defineProperty(MaskInterface.prototype, 'maskOpacity', { - get: function get() { - if (this._mask.op.k) { - this._mask.op.getValue(); - } - - return this._mask.op.v * 100; - } - }); - - var MaskManager = function MaskManager(maskManager) { - var _masksInterfaces = createSizedArray(maskManager.viewData.length); - - var i; - var len = maskManager.viewData.length; - - for (i = 0; i < len; i += 1) { - _masksInterfaces[i] = new MaskInterface(maskManager.viewData[i], maskManager.masksProperties[i]); - } - - var maskFunction = function maskFunction(name) { - i = 0; - - while (i < len) { - if (maskManager.masksProperties[i].nm === name) { - return _masksInterfaces[i]; - } - - i += 1; - } - - return null; - }; - - return maskFunction; - }; - - return MaskManager; - }(); - - var ExpressionPropertyInterface = function () { - var defaultUnidimensionalValue = { - pv: 0, - v: 0, - mult: 1 - }; - var defaultMultidimensionalValue = { - pv: [0, 0, 0], - v: [0, 0, 0], - mult: 1 - }; - - function completeProperty(expressionValue, property, type) { - Object.defineProperty(expressionValue, 'velocity', { - get: function get() { - return property.getVelocityAtTime(property.comp.currentFrame); - } - }); - expressionValue.numKeys = property.keyframes ? property.keyframes.length : 0; - - expressionValue.key = function (pos) { - if (!expressionValue.numKeys) { - return 0; - } - - var value = ''; - - if ('s' in property.keyframes[pos - 1]) { - value = property.keyframes[pos - 1].s; - } else if ('e' in property.keyframes[pos - 2]) { - value = property.keyframes[pos - 2].e; - } else { - value = property.keyframes[pos - 2].s; - } - - var valueProp = type === 'unidimensional' ? new Number(value) : Object.assign({}, value); // eslint-disable-line no-new-wrappers - - valueProp.time = property.keyframes[pos - 1].t / property.elem.comp.globalData.frameRate; - valueProp.value = type === 'unidimensional' ? value[0] : value; - return valueProp; - }; - - expressionValue.valueAtTime = property.getValueAtTime; - expressionValue.speedAtTime = property.getSpeedAtTime; - expressionValue.velocityAtTime = property.getVelocityAtTime; - expressionValue.propertyGroup = property.propertyGroup; - } - - function UnidimensionalPropertyInterface(property) { - if (!property || !('pv' in property)) { - property = defaultUnidimensionalValue; - } - - var mult = 1 / property.mult; - var val = property.pv * mult; - var expressionValue = new Number(val); // eslint-disable-line no-new-wrappers - - expressionValue.value = val; - completeProperty(expressionValue, property, 'unidimensional'); - return function () { - if (property.k) { - property.getValue(); - } - - val = property.v * mult; - - if (expressionValue.value !== val) { - expressionValue = new Number(val); // eslint-disable-line no-new-wrappers - - expressionValue.value = val; - completeProperty(expressionValue, property, 'unidimensional'); - } - - return expressionValue; - }; - } - - function MultidimensionalPropertyInterface(property) { - if (!property || !('pv' in property)) { - property = defaultMultidimensionalValue; - } - - var mult = 1 / property.mult; - var len = property.data && property.data.l || property.pv.length; - var expressionValue = createTypedArray('float32', len); - var arrValue = createTypedArray('float32', len); - expressionValue.value = arrValue; - completeProperty(expressionValue, property, 'multidimensional'); - return function () { - if (property.k) { - property.getValue(); - } - - for (var i = 0; i < len; i += 1) { - arrValue[i] = property.v[i] * mult; - expressionValue[i] = arrValue[i]; - } - - return expressionValue; - }; - } // TODO: try to avoid using this getter - - - function defaultGetter() { - return defaultUnidimensionalValue; - } - - return function (property) { - if (!property) { - return defaultGetter; - } - - if (property.propType === 'unidimensional') { - return UnidimensionalPropertyInterface(property); - } - - return MultidimensionalPropertyInterface(property); - }; - }(); - - var TransformExpressionInterface = function () { - return function (transform) { - function _thisFunction(name) { - switch (name) { - case 'scale': - case 'Scale': - case 'ADBE Scale': - case 6: - return _thisFunction.scale; - - case 'rotation': - case 'Rotation': - case 'ADBE Rotation': - case 'ADBE Rotate Z': - case 10: - return _thisFunction.rotation; - - case 'ADBE Rotate X': - return _thisFunction.xRotation; - - case 'ADBE Rotate Y': - return _thisFunction.yRotation; - - case 'position': - case 'Position': - case 'ADBE Position': - case 2: - return _thisFunction.position; - - case 'ADBE Position_0': - return _thisFunction.xPosition; - - case 'ADBE Position_1': - return _thisFunction.yPosition; - - case 'ADBE Position_2': - return _thisFunction.zPosition; - - case 'anchorPoint': - case 'AnchorPoint': - case 'Anchor Point': - case 'ADBE AnchorPoint': - case 1: - return _thisFunction.anchorPoint; - - case 'opacity': - case 'Opacity': - case 11: - return _thisFunction.opacity; - - default: - return null; - } - } - - Object.defineProperty(_thisFunction, 'rotation', { - get: ExpressionPropertyInterface(transform.r || transform.rz) - }); - Object.defineProperty(_thisFunction, 'zRotation', { - get: ExpressionPropertyInterface(transform.rz || transform.r) - }); - Object.defineProperty(_thisFunction, 'xRotation', { - get: ExpressionPropertyInterface(transform.rx) - }); - Object.defineProperty(_thisFunction, 'yRotation', { - get: ExpressionPropertyInterface(transform.ry) - }); - Object.defineProperty(_thisFunction, 'scale', { - get: ExpressionPropertyInterface(transform.s) - }); - - var _px; - - var _py; - - var _pz; - - var _transformFactory; - - if (transform.p) { - _transformFactory = ExpressionPropertyInterface(transform.p); - } else { - _px = ExpressionPropertyInterface(transform.px); - _py = ExpressionPropertyInterface(transform.py); - - if (transform.pz) { - _pz = ExpressionPropertyInterface(transform.pz); - } - } - - Object.defineProperty(_thisFunction, 'position', { - get: function get() { - if (transform.p) { - return _transformFactory(); - } - - return [_px(), _py(), _pz ? _pz() : 0]; - } - }); - Object.defineProperty(_thisFunction, 'xPosition', { - get: ExpressionPropertyInterface(transform.px) - }); - Object.defineProperty(_thisFunction, 'yPosition', { - get: ExpressionPropertyInterface(transform.py) - }); - Object.defineProperty(_thisFunction, 'zPosition', { - get: ExpressionPropertyInterface(transform.pz) - }); - Object.defineProperty(_thisFunction, 'anchorPoint', { - get: ExpressionPropertyInterface(transform.a) - }); - Object.defineProperty(_thisFunction, 'opacity', { - get: ExpressionPropertyInterface(transform.o) - }); - Object.defineProperty(_thisFunction, 'skew', { - get: ExpressionPropertyInterface(transform.sk) - }); - Object.defineProperty(_thisFunction, 'skewAxis', { - get: ExpressionPropertyInterface(transform.sa) - }); - Object.defineProperty(_thisFunction, 'orientation', { - get: ExpressionPropertyInterface(transform.or) - }); - return _thisFunction; - }; - }(); - - var LayerExpressionInterface = function () { - function getMatrix(time) { - var toWorldMat = new Matrix(); - - if (time !== undefined) { - var propMatrix = this._elem.finalTransform.mProp.getValueAtTime(time); - - propMatrix.clone(toWorldMat); - } else { - var transformMat = this._elem.finalTransform.mProp; - transformMat.applyToMatrix(toWorldMat); - } - - return toWorldMat; - } - - function toWorldVec(arr, time) { - var toWorldMat = this.getMatrix(time); - toWorldMat.props[12] = 0; - toWorldMat.props[13] = 0; - toWorldMat.props[14] = 0; - return this.applyPoint(toWorldMat, arr); - } - - function toWorld(arr, time) { - var toWorldMat = this.getMatrix(time); - return this.applyPoint(toWorldMat, arr); - } - - function fromWorldVec(arr, time) { - var toWorldMat = this.getMatrix(time); - toWorldMat.props[12] = 0; - toWorldMat.props[13] = 0; - toWorldMat.props[14] = 0; - return this.invertPoint(toWorldMat, arr); - } - - function fromWorld(arr, time) { - var toWorldMat = this.getMatrix(time); - return this.invertPoint(toWorldMat, arr); - } - - function applyPoint(matrix, arr) { - if (this._elem.hierarchy && this._elem.hierarchy.length) { - var i; - var len = this._elem.hierarchy.length; - - for (i = 0; i < len; i += 1) { - this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix); - } - } - - return matrix.applyToPointArray(arr[0], arr[1], arr[2] || 0); - } - - function invertPoint(matrix, arr) { - if (this._elem.hierarchy && this._elem.hierarchy.length) { - var i; - var len = this._elem.hierarchy.length; - - for (i = 0; i < len; i += 1) { - this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(matrix); - } - } - - return matrix.inversePoint(arr); - } - - function fromComp(arr) { - var toWorldMat = new Matrix(); - toWorldMat.reset(); - - this._elem.finalTransform.mProp.applyToMatrix(toWorldMat); - - if (this._elem.hierarchy && this._elem.hierarchy.length) { - var i; - var len = this._elem.hierarchy.length; - - for (i = 0; i < len; i += 1) { - this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(toWorldMat); - } - - return toWorldMat.inversePoint(arr); - } - - return toWorldMat.inversePoint(arr); - } - - function sampleImage() { - return [1, 1, 1, 1]; - } - - return function (elem) { - var transformInterface; - - function _registerMaskInterface(maskManager) { - _thisLayerFunction.mask = new MaskManagerInterface(maskManager, elem); - } - - function _registerEffectsInterface(effects) { - _thisLayerFunction.effect = effects; - } - - function _thisLayerFunction(name) { - switch (name) { - case 'ADBE Root Vectors Group': - case 'Contents': - case 2: - return _thisLayerFunction.shapeInterface; - - case 1: - case 6: - case 'Transform': - case 'transform': - case 'ADBE Transform Group': - return transformInterface; - - case 4: - case 'ADBE Effect Parade': - case 'effects': - case 'Effects': - return _thisLayerFunction.effect; - - case 'ADBE Text Properties': - return _thisLayerFunction.textInterface; - - default: - return null; - } - } - - _thisLayerFunction.getMatrix = getMatrix; - _thisLayerFunction.invertPoint = invertPoint; - _thisLayerFunction.applyPoint = applyPoint; - _thisLayerFunction.toWorld = toWorld; - _thisLayerFunction.toWorldVec = toWorldVec; - _thisLayerFunction.fromWorld = fromWorld; - _thisLayerFunction.fromWorldVec = fromWorldVec; - _thisLayerFunction.toComp = toWorld; - _thisLayerFunction.fromComp = fromComp; - _thisLayerFunction.sampleImage = sampleImage; - _thisLayerFunction.sourceRectAtTime = elem.sourceRectAtTime.bind(elem); - _thisLayerFunction._elem = elem; - transformInterface = TransformExpressionInterface(elem.finalTransform.mProp); - var anchorPointDescriptor = getDescriptor(transformInterface, 'anchorPoint'); - Object.defineProperties(_thisLayerFunction, { - hasParent: { - get: function get() { - return elem.hierarchy.length; - } - }, - parent: { - get: function get() { - return elem.hierarchy[0].layerInterface; - } - }, - rotation: getDescriptor(transformInterface, 'rotation'), - scale: getDescriptor(transformInterface, 'scale'), - position: getDescriptor(transformInterface, 'position'), - opacity: getDescriptor(transformInterface, 'opacity'), - anchorPoint: anchorPointDescriptor, - anchor_point: anchorPointDescriptor, - transform: { - get: function get() { - return transformInterface; - } - }, - active: { - get: function get() { - return elem.isInRange; - } - } - }); - _thisLayerFunction.startTime = elem.data.st; - _thisLayerFunction.index = elem.data.ind; - _thisLayerFunction.source = elem.data.refId; - _thisLayerFunction.height = elem.data.ty === 0 ? elem.data.h : 100; - _thisLayerFunction.width = elem.data.ty === 0 ? elem.data.w : 100; - _thisLayerFunction.inPoint = elem.data.ip / elem.comp.globalData.frameRate; - _thisLayerFunction.outPoint = elem.data.op / elem.comp.globalData.frameRate; - _thisLayerFunction._name = elem.data.nm; - _thisLayerFunction.registerMaskInterface = _registerMaskInterface; - _thisLayerFunction.registerEffectsInterface = _registerEffectsInterface; - return _thisLayerFunction; - }; - }(); - - var propertyGroupFactory = function () { - return function (interfaceFunction, parentPropertyGroup) { - return function (val) { - val = val === undefined ? 1 : val; - - if (val <= 0) { - return interfaceFunction; - } - - return parentPropertyGroup(val - 1); - }; - }; - }(); - - var PropertyInterface = function () { - return function (propertyName, propertyGroup) { - var interfaceFunction = { - _name: propertyName - }; - - function _propertyGroup(val) { - val = val === undefined ? 1 : val; - - if (val <= 0) { - return interfaceFunction; - } - - return propertyGroup(val - 1); - } - - return _propertyGroup; - }; - }(); - - var EffectsExpressionInterface = function () { - var ob = { - createEffectsInterface: createEffectsInterface - }; - - function createEffectsInterface(elem, propertyGroup) { - if (elem.effectsManager) { - var effectElements = []; - var effectsData = elem.data.ef; - var i; - var len = elem.effectsManager.effectElements.length; - - for (i = 0; i < len; i += 1) { - effectElements.push(createGroupInterface(effectsData[i], elem.effectsManager.effectElements[i], propertyGroup, elem)); - } - - var effects = elem.data.ef || []; - - var groupInterface = function groupInterface(name) { - i = 0; - len = effects.length; - - while (i < len) { - if (name === effects[i].nm || name === effects[i].mn || name === effects[i].ix) { - return effectElements[i]; - } - - i += 1; - } - - return null; - }; - - Object.defineProperty(groupInterface, 'numProperties', { - get: function get() { - return effects.length; - } - }); - return groupInterface; - } - - return null; - } - - function createGroupInterface(data, elements, propertyGroup, elem) { - function groupInterface(name) { - var effects = data.ef; - var i = 0; - var len = effects.length; - - while (i < len) { - if (name === effects[i].nm || name === effects[i].mn || name === effects[i].ix) { - if (effects[i].ty === 5) { - return effectElements[i]; - } - - return effectElements[i](); - } - - i += 1; - } - - throw new Error(); - } - - var _propertyGroup = propertyGroupFactory(groupInterface, propertyGroup); - - var effectElements = []; - var i; - var len = data.ef.length; - - for (i = 0; i < len; i += 1) { - if (data.ef[i].ty === 5) { - effectElements.push(createGroupInterface(data.ef[i], elements.effectElements[i], elements.effectElements[i].propertyGroup, elem)); - } else { - effectElements.push(createValueInterface(elements.effectElements[i], data.ef[i].ty, elem, _propertyGroup)); - } - } - - if (data.mn === 'ADBE Color Control') { - Object.defineProperty(groupInterface, 'color', { - get: function get() { - return effectElements[0](); - } - }); - } - - Object.defineProperties(groupInterface, { - numProperties: { - get: function get() { - return data.np; - } - }, - _name: { - value: data.nm - }, - propertyGroup: { - value: _propertyGroup - } - }); - groupInterface.enabled = data.en !== 0; - groupInterface.active = groupInterface.enabled; - return groupInterface; - } - - function createValueInterface(element, type, elem, propertyGroup) { - var expressionProperty = ExpressionPropertyInterface(element.p); - - function interfaceFunction() { - if (type === 10) { - return elem.comp.compInterface(element.p.v); - } - - return expressionProperty(); - } - - if (element.p.setGroupProperty) { - element.p.setGroupProperty(PropertyInterface('', propertyGroup)); - } - - return interfaceFunction; - } - - return ob; - }(); - - var CompExpressionInterface = function () { - return function (comp) { - function _thisLayerFunction(name) { - var i = 0; - var len = comp.layers.length; - - while (i < len) { - if (comp.layers[i].nm === name || comp.layers[i].ind === name) { - return comp.elements[i].layerInterface; - } - - i += 1; - } - - return null; // return {active:false}; - } - - Object.defineProperty(_thisLayerFunction, '_name', { - value: comp.data.nm - }); - _thisLayerFunction.layer = _thisLayerFunction; - _thisLayerFunction.pixelAspect = 1; - _thisLayerFunction.height = comp.data.h || comp.globalData.compSize.h; - _thisLayerFunction.width = comp.data.w || comp.globalData.compSize.w; - _thisLayerFunction.pixelAspect = 1; - _thisLayerFunction.frameDuration = 1 / comp.globalData.frameRate; - _thisLayerFunction.displayStartTime = 0; - _thisLayerFunction.numLayers = comp.layers.length; - return _thisLayerFunction; - }; - }(); - - var ShapePathInterface = function () { - return function pathInterfaceFactory(shape, view, propertyGroup) { - var prop = view.sh; - - function interfaceFunction(val) { - if (val === 'Shape' || val === 'shape' || val === 'Path' || val === 'path' || val === 'ADBE Vector Shape' || val === 2) { - return interfaceFunction.path; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - prop.setGroupProperty(PropertyInterface('Path', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - path: { - get: function get() { - if (prop.k) { - prop.getValue(); - } - - return prop; - } - }, - shape: { - get: function get() { - if (prop.k) { - prop.getValue(); - } - - return prop; - } - }, - _name: { - value: shape.nm - }, - ix: { - value: shape.ix - }, - propertyIndex: { - value: shape.ix - }, - mn: { - value: shape.mn - }, - propertyGroup: { - value: propertyGroup - } - }); - return interfaceFunction; - }; - }(); - - var ShapeExpressionInterface = function () { - function iterateElements(shapes, view, propertyGroup) { - var arr = []; - var i; - var len = shapes ? shapes.length : 0; - - for (i = 0; i < len; i += 1) { - if (shapes[i].ty === 'gr') { - arr.push(groupInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'fl') { - arr.push(fillInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'st') { - arr.push(strokeInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'tm') { - arr.push(trimInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'tr') {// arr.push(transformInterfaceFactory(shapes[i],view[i],propertyGroup)); - } else if (shapes[i].ty === 'el') { - arr.push(ellipseInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'sr') { - arr.push(starInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'sh') { - arr.push(ShapePathInterface(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'rc') { - arr.push(rectInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'rd') { - arr.push(roundedInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'rp') { - arr.push(repeaterInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else if (shapes[i].ty === 'gf') { - arr.push(gradientFillInterfaceFactory(shapes[i], view[i], propertyGroup)); - } else { - arr.push(defaultInterfaceFactory(shapes[i], view[i], propertyGroup)); - } - } - - return arr; - } - - function contentsInterfaceFactory(shape, view, propertyGroup) { - var interfaces; - - var interfaceFunction = function _interfaceFunction(value) { - var i = 0; - var len = interfaces.length; - - while (i < len) { - if (interfaces[i]._name === value || interfaces[i].mn === value || interfaces[i].propertyIndex === value || interfaces[i].ix === value || interfaces[i].ind === value) { - return interfaces[i]; - } - - i += 1; - } - - if (typeof value === 'number') { - return interfaces[value - 1]; - } - - return null; - }; - - interfaceFunction.propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - interfaces = iterateElements(shape.it, view.it, interfaceFunction.propertyGroup); - interfaceFunction.numProperties = interfaces.length; - var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1], view.it[view.it.length - 1], interfaceFunction.propertyGroup); - interfaceFunction.transform = transformInterface; - interfaceFunction.propertyIndex = shape.cix; - interfaceFunction._name = shape.nm; - return interfaceFunction; - } - - function groupInterfaceFactory(shape, view, propertyGroup) { - var interfaceFunction = function _interfaceFunction(value) { - switch (value) { - case 'ADBE Vectors Group': - case 'Contents': - case 2: - return interfaceFunction.content; - // Not necessary for now. Keeping them here in case a new case appears - // case 'ADBE Vector Transform Group': - // case 3: - - default: - return interfaceFunction.transform; - } - }; - - interfaceFunction.propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - var content = contentsInterfaceFactory(shape, view, interfaceFunction.propertyGroup); - var transformInterface = transformInterfaceFactory(shape.it[shape.it.length - 1], view.it[view.it.length - 1], interfaceFunction.propertyGroup); - interfaceFunction.content = content; - interfaceFunction.transform = transformInterface; - Object.defineProperty(interfaceFunction, '_name', { - get: function get() { - return shape.nm; - } - }); // interfaceFunction.content = interfaceFunction; - - interfaceFunction.numProperties = shape.np; - interfaceFunction.propertyIndex = shape.ix; - interfaceFunction.nm = shape.nm; - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function fillInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(val) { - if (val === 'Color' || val === 'color') { - return interfaceFunction.color; - } - - if (val === 'Opacity' || val === 'opacity') { - return interfaceFunction.opacity; - } - - return null; - } - - Object.defineProperties(interfaceFunction, { - color: { - get: ExpressionPropertyInterface(view.c) - }, - opacity: { - get: ExpressionPropertyInterface(view.o) - }, - _name: { - value: shape.nm - }, - mn: { - value: shape.mn - } - }); - view.c.setGroupProperty(PropertyInterface('Color', propertyGroup)); - view.o.setGroupProperty(PropertyInterface('Opacity', propertyGroup)); - return interfaceFunction; - } - - function gradientFillInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(val) { - if (val === 'Start Point' || val === 'start point') { - return interfaceFunction.startPoint; - } - - if (val === 'End Point' || val === 'end point') { - return interfaceFunction.endPoint; - } - - if (val === 'Opacity' || val === 'opacity') { - return interfaceFunction.opacity; - } - - return null; - } - - Object.defineProperties(interfaceFunction, { - startPoint: { - get: ExpressionPropertyInterface(view.s) - }, - endPoint: { - get: ExpressionPropertyInterface(view.e) - }, - opacity: { - get: ExpressionPropertyInterface(view.o) - }, - type: { - get: function get() { - return 'a'; - } - }, - _name: { - value: shape.nm - }, - mn: { - value: shape.mn - } - }); - view.s.setGroupProperty(PropertyInterface('Start Point', propertyGroup)); - view.e.setGroupProperty(PropertyInterface('End Point', propertyGroup)); - view.o.setGroupProperty(PropertyInterface('Opacity', propertyGroup)); - return interfaceFunction; - } - - function defaultInterfaceFactory() { - function interfaceFunction() { - return null; - } - - return interfaceFunction; - } - - function strokeInterfaceFactory(shape, view, propertyGroup) { - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - var _dashPropertyGroup = propertyGroupFactory(dashOb, _propertyGroup); - - function addPropertyToDashOb(i) { - Object.defineProperty(dashOb, shape.d[i].nm, { - get: ExpressionPropertyInterface(view.d.dataProps[i].p) - }); - } - - var i; - var len = shape.d ? shape.d.length : 0; - var dashOb = {}; - - for (i = 0; i < len; i += 1) { - addPropertyToDashOb(i); - view.d.dataProps[i].p.setGroupProperty(_dashPropertyGroup); - } - - function interfaceFunction(val) { - if (val === 'Color' || val === 'color') { - return interfaceFunction.color; - } - - if (val === 'Opacity' || val === 'opacity') { - return interfaceFunction.opacity; - } - - if (val === 'Stroke Width' || val === 'stroke width') { - return interfaceFunction.strokeWidth; - } - - return null; - } - - Object.defineProperties(interfaceFunction, { - color: { - get: ExpressionPropertyInterface(view.c) - }, - opacity: { - get: ExpressionPropertyInterface(view.o) - }, - strokeWidth: { - get: ExpressionPropertyInterface(view.w) - }, - dash: { - get: function get() { - return dashOb; - } - }, - _name: { - value: shape.nm - }, - mn: { - value: shape.mn - } - }); - view.c.setGroupProperty(PropertyInterface('Color', _propertyGroup)); - view.o.setGroupProperty(PropertyInterface('Opacity', _propertyGroup)); - view.w.setGroupProperty(PropertyInterface('Stroke Width', _propertyGroup)); - return interfaceFunction; - } - - function trimInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(val) { - if (val === shape.e.ix || val === 'End' || val === 'end') { - return interfaceFunction.end; - } - - if (val === shape.s.ix) { - return interfaceFunction.start; - } - - if (val === shape.o.ix) { - return interfaceFunction.offset; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - interfaceFunction.propertyIndex = shape.ix; - view.s.setGroupProperty(PropertyInterface('Start', _propertyGroup)); - view.e.setGroupProperty(PropertyInterface('End', _propertyGroup)); - view.o.setGroupProperty(PropertyInterface('Offset', _propertyGroup)); - interfaceFunction.propertyIndex = shape.ix; - interfaceFunction.propertyGroup = propertyGroup; - Object.defineProperties(interfaceFunction, { - start: { - get: ExpressionPropertyInterface(view.s) - }, - end: { - get: ExpressionPropertyInterface(view.e) - }, - offset: { - get: ExpressionPropertyInterface(view.o) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function transformInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.a.ix === value || value === 'Anchor Point') { - return interfaceFunction.anchorPoint; - } - - if (shape.o.ix === value || value === 'Opacity') { - return interfaceFunction.opacity; - } - - if (shape.p.ix === value || value === 'Position') { - return interfaceFunction.position; - } - - if (shape.r.ix === value || value === 'Rotation' || value === 'ADBE Vector Rotation') { - return interfaceFunction.rotation; - } - - if (shape.s.ix === value || value === 'Scale') { - return interfaceFunction.scale; - } - - if (shape.sk && shape.sk.ix === value || value === 'Skew') { - return interfaceFunction.skew; - } - - if (shape.sa && shape.sa.ix === value || value === 'Skew Axis') { - return interfaceFunction.skewAxis; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - view.transform.mProps.o.setGroupProperty(PropertyInterface('Opacity', _propertyGroup)); - view.transform.mProps.p.setGroupProperty(PropertyInterface('Position', _propertyGroup)); - view.transform.mProps.a.setGroupProperty(PropertyInterface('Anchor Point', _propertyGroup)); - view.transform.mProps.s.setGroupProperty(PropertyInterface('Scale', _propertyGroup)); - view.transform.mProps.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup)); - - if (view.transform.mProps.sk) { - view.transform.mProps.sk.setGroupProperty(PropertyInterface('Skew', _propertyGroup)); - view.transform.mProps.sa.setGroupProperty(PropertyInterface('Skew Angle', _propertyGroup)); - } - - view.transform.op.setGroupProperty(PropertyInterface('Opacity', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - opacity: { - get: ExpressionPropertyInterface(view.transform.mProps.o) - }, - position: { - get: ExpressionPropertyInterface(view.transform.mProps.p) - }, - anchorPoint: { - get: ExpressionPropertyInterface(view.transform.mProps.a) - }, - scale: { - get: ExpressionPropertyInterface(view.transform.mProps.s) - }, - rotation: { - get: ExpressionPropertyInterface(view.transform.mProps.r) - }, - skew: { - get: ExpressionPropertyInterface(view.transform.mProps.sk) - }, - skewAxis: { - get: ExpressionPropertyInterface(view.transform.mProps.sa) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.ty = 'tr'; - interfaceFunction.mn = shape.mn; - interfaceFunction.propertyGroup = propertyGroup; - return interfaceFunction; - } - - function ellipseInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.p.ix === value) { - return interfaceFunction.position; - } - - if (shape.s.ix === value) { - return interfaceFunction.size; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - interfaceFunction.propertyIndex = shape.ix; - var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh; - prop.s.setGroupProperty(PropertyInterface('Size', _propertyGroup)); - prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - size: { - get: ExpressionPropertyInterface(prop.s) - }, - position: { - get: ExpressionPropertyInterface(prop.p) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function starInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.p.ix === value) { - return interfaceFunction.position; - } - - if (shape.r.ix === value) { - return interfaceFunction.rotation; - } - - if (shape.pt.ix === value) { - return interfaceFunction.points; - } - - if (shape.or.ix === value || value === 'ADBE Vector Star Outer Radius') { - return interfaceFunction.outerRadius; - } - - if (shape.os.ix === value) { - return interfaceFunction.outerRoundness; - } - - if (shape.ir && (shape.ir.ix === value || value === 'ADBE Vector Star Inner Radius')) { - return interfaceFunction.innerRadius; - } - - if (shape.is && shape.is.ix === value) { - return interfaceFunction.innerRoundness; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh; - interfaceFunction.propertyIndex = shape.ix; - prop.or.setGroupProperty(PropertyInterface('Outer Radius', _propertyGroup)); - prop.os.setGroupProperty(PropertyInterface('Outer Roundness', _propertyGroup)); - prop.pt.setGroupProperty(PropertyInterface('Points', _propertyGroup)); - prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup)); - prop.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup)); - - if (shape.ir) { - prop.ir.setGroupProperty(PropertyInterface('Inner Radius', _propertyGroup)); - prop.is.setGroupProperty(PropertyInterface('Inner Roundness', _propertyGroup)); - } - - Object.defineProperties(interfaceFunction, { - position: { - get: ExpressionPropertyInterface(prop.p) - }, - rotation: { - get: ExpressionPropertyInterface(prop.r) - }, - points: { - get: ExpressionPropertyInterface(prop.pt) - }, - outerRadius: { - get: ExpressionPropertyInterface(prop.or) - }, - outerRoundness: { - get: ExpressionPropertyInterface(prop.os) - }, - innerRadius: { - get: ExpressionPropertyInterface(prop.ir) - }, - innerRoundness: { - get: ExpressionPropertyInterface(prop.is) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function rectInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.p.ix === value) { - return interfaceFunction.position; - } - - if (shape.r.ix === value) { - return interfaceFunction.roundness; - } - - if (shape.s.ix === value || value === 'Size' || value === 'ADBE Vector Rect Size') { - return interfaceFunction.size; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - var prop = view.sh.ty === 'tm' ? view.sh.prop : view.sh; - interfaceFunction.propertyIndex = shape.ix; - prop.p.setGroupProperty(PropertyInterface('Position', _propertyGroup)); - prop.s.setGroupProperty(PropertyInterface('Size', _propertyGroup)); - prop.r.setGroupProperty(PropertyInterface('Rotation', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - position: { - get: ExpressionPropertyInterface(prop.p) - }, - roundness: { - get: ExpressionPropertyInterface(prop.r) - }, - size: { - get: ExpressionPropertyInterface(prop.s) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function roundedInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.r.ix === value || value === 'Round Corners 1') { - return interfaceFunction.radius; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - var prop = view; - interfaceFunction.propertyIndex = shape.ix; - prop.rd.setGroupProperty(PropertyInterface('Radius', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - radius: { - get: ExpressionPropertyInterface(prop.rd) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - function repeaterInterfaceFactory(shape, view, propertyGroup) { - function interfaceFunction(value) { - if (shape.c.ix === value || value === 'Copies') { - return interfaceFunction.copies; - } - - if (shape.o.ix === value || value === 'Offset') { - return interfaceFunction.offset; - } - - return null; - } - - var _propertyGroup = propertyGroupFactory(interfaceFunction, propertyGroup); - - var prop = view; - interfaceFunction.propertyIndex = shape.ix; - prop.c.setGroupProperty(PropertyInterface('Copies', _propertyGroup)); - prop.o.setGroupProperty(PropertyInterface('Offset', _propertyGroup)); - Object.defineProperties(interfaceFunction, { - copies: { - get: ExpressionPropertyInterface(prop.c) - }, - offset: { - get: ExpressionPropertyInterface(prop.o) - }, - _name: { - value: shape.nm - } - }); - interfaceFunction.mn = shape.mn; - return interfaceFunction; - } - - return function (shapes, view, propertyGroup) { - var interfaces; - - function _interfaceFunction(value) { - if (typeof value === 'number') { - value = value === undefined ? 1 : value; - - if (value === 0) { - return propertyGroup; - } - - return interfaces[value - 1]; - } - - var i = 0; - var len = interfaces.length; - - while (i < len) { - if (interfaces[i]._name === value) { - return interfaces[i]; - } - - i += 1; - } - - return null; - } - - function parentGroupWrapper() { - return propertyGroup; - } - - _interfaceFunction.propertyGroup = propertyGroupFactory(_interfaceFunction, parentGroupWrapper); - interfaces = iterateElements(shapes, view, _interfaceFunction.propertyGroup); - _interfaceFunction.numProperties = interfaces.length; - _interfaceFunction._name = 'Contents'; - return _interfaceFunction; - }; - }(); - - var TextExpressionInterface = function () { - return function (elem) { - var _prevValue; - - var _sourceText; - - function _thisLayerFunction(name) { - switch (name) { - case 'ADBE Text Document': - return _thisLayerFunction.sourceText; - - default: - return null; - } - } - - Object.defineProperty(_thisLayerFunction, 'sourceText', { - get: function get() { - elem.textProperty.getValue(); - var stringValue = elem.textProperty.currentData.t; - - if (stringValue !== _prevValue) { - elem.textProperty.currentData.t = _prevValue; - _sourceText = new String(stringValue); // eslint-disable-line no-new-wrappers - // If stringValue is an empty string, eval returns undefined, so it has to be returned as a String primitive - - _sourceText.value = stringValue || new String(stringValue); // eslint-disable-line no-new-wrappers - } - - return _sourceText; - } - }); - return _thisLayerFunction; - }; - }(); - - var getBlendMode = function () { - var blendModeEnums = { - 0: 'source-over', - 1: 'multiply', - 2: 'screen', - 3: 'overlay', - 4: 'darken', - 5: 'lighten', - 6: 'color-dodge', - 7: 'color-burn', - 8: 'hard-light', - 9: 'soft-light', - 10: 'difference', - 11: 'exclusion', - 12: 'hue', - 13: 'saturation', - 14: 'color', - 15: 'luminosity' - }; - return function (mode) { - return blendModeEnums[mode] || ''; - }; - }(); - - function SliderEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container); - } - - function AngleEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container); - } - - function ColorEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 1, 0, container); - } - - function PointEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 1, 0, container); - } - - function LayerIndexEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container); - } - - function MaskIndexEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container); - } - - function CheckboxEffect(data, elem, container) { - this.p = PropertyFactory.getProp(elem, data.v, 0, 0, container); - } - - function NoValueEffect() { - this.p = {}; - } - - function EffectsManager(data, element) { - var effects = data.ef || []; - this.effectElements = []; - var i; - var len = effects.length; - var effectItem; - - for (i = 0; i < len; i += 1) { - effectItem = new GroupEffect(effects[i], element); - this.effectElements.push(effectItem); - } - } - - function GroupEffect(data, element) { - this.init(data, element); - } - - extendPrototype([DynamicPropertyContainer], GroupEffect); - GroupEffect.prototype.getValue = GroupEffect.prototype.iterateDynamicProperties; - - GroupEffect.prototype.init = function (data, element) { - this.data = data; - this.effectElements = []; - this.initDynamicPropertyContainer(element); - var i; - var len = this.data.ef.length; - var eff; - var effects = this.data.ef; - - for (i = 0; i < len; i += 1) { - eff = null; - - switch (effects[i].ty) { - case 0: - eff = new SliderEffect(effects[i], element, this); - break; - - case 1: - eff = new AngleEffect(effects[i], element, this); - break; - - case 2: - eff = new ColorEffect(effects[i], element, this); - break; - - case 3: - eff = new PointEffect(effects[i], element, this); - break; - - case 4: - case 7: - eff = new CheckboxEffect(effects[i], element, this); - break; - - case 10: - eff = new LayerIndexEffect(effects[i], element, this); - break; - - case 11: - eff = new MaskIndexEffect(effects[i], element, this); - break; - - case 5: - eff = new EffectsManager(effects[i], element, this); - break; - // case 6: - - default: - eff = new NoValueEffect(effects[i], element, this); - break; - } - - if (eff) { - this.effectElements.push(eff); - } - } - }; - - function BaseElement() {} - - BaseElement.prototype = { - checkMasks: function checkMasks() { - if (!this.data.hasMask) { - return false; - } - - var i = 0; - var len = this.data.masksProperties.length; - - while (i < len) { - if (this.data.masksProperties[i].mode !== 'n' && this.data.masksProperties[i].cl !== false) { - return true; - } - - i += 1; - } - - return false; - }, - initExpressions: function initExpressions() { - this.layerInterface = LayerExpressionInterface(this); - - if (this.data.hasMask && this.maskManager) { - this.layerInterface.registerMaskInterface(this.maskManager); - } - - var effectsInterface = EffectsExpressionInterface.createEffectsInterface(this, this.layerInterface); - this.layerInterface.registerEffectsInterface(effectsInterface); - - if (this.data.ty === 0 || this.data.xt) { - this.compInterface = CompExpressionInterface(this); - } else if (this.data.ty === 4) { - this.layerInterface.shapeInterface = ShapeExpressionInterface(this.shapesData, this.itemsData, this.layerInterface); - this.layerInterface.content = this.layerInterface.shapeInterface; - } else if (this.data.ty === 5) { - this.layerInterface.textInterface = TextExpressionInterface(this); - this.layerInterface.text = this.layerInterface.textInterface; - } - }, - setBlendMode: function setBlendMode() { - var blendModeValue = getBlendMode(this.data.bm); - var elem = this.baseElement || this.layerElement; - elem.style['mix-blend-mode'] = blendModeValue; - }, - initBaseData: function initBaseData(data, globalData, comp) { - this.globalData = globalData; - this.comp = comp; - this.data = data; - this.layerId = createElementID(); // Stretch factor for old animations missing this property. - - if (!this.data.sr) { - this.data.sr = 1; - } // effects manager - - - this.effectsManager = new EffectsManager(this.data, this, this.dynamicProperties); - }, - getType: function getType() { - return this.type; - }, - sourceRectAtTime: function sourceRectAtTime() {} - }; - - /** - * @file - * Handles element's layer frame update. - * Checks layer in point and out point - * - */ - function FrameElement() {} - - FrameElement.prototype = { - /** - * @function - * Initializes frame related properties. - * - */ - initFrame: function initFrame() { - // set to true when inpoint is rendered - this._isFirstFrame = false; // list of animated properties - - this.dynamicProperties = []; // If layer has been modified in current tick this will be true - - this._mdf = false; - }, - - /** - * @function - * Calculates all dynamic values - * - * @param {number} num - * current frame number in Layer's time - * @param {boolean} isVisible - * if layers is currently in range - * - */ - prepareProperties: function prepareProperties(num, isVisible) { - var i; - var len = this.dynamicProperties.length; - - for (i = 0; i < len; i += 1) { - if (isVisible || this._isParent && this.dynamicProperties[i].propType === 'transform') { - this.dynamicProperties[i].getValue(); - - if (this.dynamicProperties[i]._mdf) { - this.globalData._mdf = true; - this._mdf = true; - } - } - } - }, - addDynamicProperty: function addDynamicProperty(prop) { - if (this.dynamicProperties.indexOf(prop) === -1) { - this.dynamicProperties.push(prop); - } - } - }; - - function _typeof$2(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$2 = function _typeof(obj) { return typeof obj; }; } else { _typeof$2 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$2(obj); } - - var FootageInterface = function () { - var outlineInterfaceFactory = function outlineInterfaceFactory(elem) { - var currentPropertyName = ''; - var currentProperty = elem.getFootageData(); - - function init() { - currentPropertyName = ''; - currentProperty = elem.getFootageData(); - return searchProperty; - } - - function searchProperty(value) { - if (currentProperty[value]) { - currentPropertyName = value; - currentProperty = currentProperty[value]; - - if (_typeof$2(currentProperty) === 'object') { - return searchProperty; - } - - return currentProperty; - } - - var propertyNameIndex = value.indexOf(currentPropertyName); - - if (propertyNameIndex !== -1) { - var index = parseInt(value.substr(propertyNameIndex + currentPropertyName.length), 10); - currentProperty = currentProperty[index]; - - if (_typeof$2(currentProperty) === 'object') { - return searchProperty; - } - - return currentProperty; - } - - return ''; - } - - return init; - }; - - var dataInterfaceFactory = function dataInterfaceFactory(elem) { - function interfaceFunction(value) { - if (value === 'Outline') { - return interfaceFunction.outlineInterface(); - } - - return null; - } - - interfaceFunction._name = 'Outline'; - interfaceFunction.outlineInterface = outlineInterfaceFactory(elem); - return interfaceFunction; - }; - - return function (elem) { - function _interfaceFunction(value) { - if (value === 'Data') { - return _interfaceFunction.dataInterface; - } - - return null; - } - - _interfaceFunction._name = 'Data'; - _interfaceFunction.dataInterface = dataInterfaceFactory(elem); - return _interfaceFunction; - }; - }(); - - function FootageElement(data, globalData, comp) { - this.initFrame(); - this.initRenderable(); - this.assetData = globalData.getAssetData(data.refId); - this.footageData = globalData.imageLoader.getAsset(this.assetData); - this.initBaseData(data, globalData, comp); - } - - FootageElement.prototype.prepareFrame = function () {}; - - extendPrototype([RenderableElement, BaseElement, FrameElement], FootageElement); - - FootageElement.prototype.getBaseElement = function () { - return null; - }; - - FootageElement.prototype.renderFrame = function () {}; - - FootageElement.prototype.destroy = function () {}; - - FootageElement.prototype.initExpressions = function () { - this.layerInterface = FootageInterface(this); - }; - - FootageElement.prototype.getFootageData = function () { - return this.footageData; - }; - - function AudioElement(data, globalData, comp) { - this.initFrame(); - this.initRenderable(); - this.assetData = globalData.getAssetData(data.refId); - this.initBaseData(data, globalData, comp); - this._isPlaying = false; - this._canPlay = false; - var assetPath = this.globalData.getAssetsPath(this.assetData); - this.audio = this.globalData.audioController.createAudio(assetPath); - this._currentTime = 0; - this.globalData.audioController.addAudio(this); - this._volumeMultiplier = 1; - this._volume = 1; - this._previousVolume = null; - this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : { - _placeholder: true - }; - this.lv = PropertyFactory.getProp(this, data.au && data.au.lv ? data.au.lv : { - k: [100] - }, 1, 0.01, this); - } - - AudioElement.prototype.prepareFrame = function (num) { - this.prepareRenderableFrame(num, true); - this.prepareProperties(num, true); - - if (!this.tm._placeholder) { - var timeRemapped = this.tm.v; - this._currentTime = timeRemapped; - } else { - this._currentTime = num / this.data.sr; - } - - this._volume = this.lv.v[0]; - var totalVolume = this._volume * this._volumeMultiplier; - - if (this._previousVolume !== totalVolume) { - this._previousVolume = totalVolume; - this.audio.volume(totalVolume); - } - }; - - extendPrototype([RenderableElement, BaseElement, FrameElement], AudioElement); - - AudioElement.prototype.renderFrame = function () { - if (this.isInRange && this._canPlay) { - if (!this._isPlaying) { - this.audio.play(); - this.audio.seek(this._currentTime / this.globalData.frameRate); - this._isPlaying = true; - } else if (!this.audio.playing() || Math.abs(this._currentTime / this.globalData.frameRate - this.audio.seek()) > 0.1) { - this.audio.seek(this._currentTime / this.globalData.frameRate); - } - } - }; - - AudioElement.prototype.show = function () {// this.audio.play() - }; - - AudioElement.prototype.hide = function () { - this.audio.pause(); - this._isPlaying = false; - }; - - AudioElement.prototype.pause = function () { - this.audio.pause(); - this._isPlaying = false; - this._canPlay = false; - }; - - AudioElement.prototype.resume = function () { - this._canPlay = true; - }; - - AudioElement.prototype.setRate = function (rateValue) { - this.audio.rate(rateValue); - }; - - AudioElement.prototype.volume = function (volumeValue) { - this._volumeMultiplier = volumeValue; - this._previousVolume = volumeValue * this._volume; - this.audio.volume(this._previousVolume); - }; - - AudioElement.prototype.getBaseElement = function () { - return null; - }; - - AudioElement.prototype.destroy = function () {}; - - AudioElement.prototype.sourceRectAtTime = function () {}; - - AudioElement.prototype.initExpressions = function () {}; - - function BaseRenderer() {} - - BaseRenderer.prototype.checkLayers = function (num) { - var i; - var len = this.layers.length; - var data; - this.completeLayers = true; - - for (i = len - 1; i >= 0; i -= 1) { - if (!this.elements[i]) { - data = this.layers[i]; - - if (data.ip - data.st <= num - this.layers[i].st && data.op - data.st > num - this.layers[i].st) { - this.buildItem(i); - } - } - - this.completeLayers = this.elements[i] ? this.completeLayers : false; - } - - this.checkPendingElements(); - }; - - BaseRenderer.prototype.createItem = function (layer) { - switch (layer.ty) { - case 2: - return this.createImage(layer); - - case 0: - return this.createComp(layer); - - case 1: - return this.createSolid(layer); - - case 3: - return this.createNull(layer); - - case 4: - return this.createShape(layer); - - case 5: - return this.createText(layer); - - case 6: - return this.createAudio(layer); - - case 13: - return this.createCamera(layer); - - case 15: - return this.createFootage(layer); - - default: - return this.createNull(layer); - } - }; - - BaseRenderer.prototype.createCamera = function () { - throw new Error('You\'re using a 3d camera. Try the html renderer.'); - }; - - BaseRenderer.prototype.createAudio = function (data) { - return new AudioElement(data, this.globalData, this); - }; - - BaseRenderer.prototype.createFootage = function (data) { - return new FootageElement(data, this.globalData, this); - }; - - BaseRenderer.prototype.buildAllItems = function () { - var i; - var len = this.layers.length; - - for (i = 0; i < len; i += 1) { - this.buildItem(i); - } - - this.checkPendingElements(); - }; - - BaseRenderer.prototype.includeLayers = function (newLayers) { - this.completeLayers = false; - var i; - var len = newLayers.length; - var j; - var jLen = this.layers.length; - - for (i = 0; i < len; i += 1) { - j = 0; - - while (j < jLen) { - if (this.layers[j].id === newLayers[i].id) { - this.layers[j] = newLayers[i]; - break; - } - - j += 1; - } - } - }; - - BaseRenderer.prototype.setProjectInterface = function (pInterface) { - this.globalData.projectInterface = pInterface; - }; - - BaseRenderer.prototype.initItems = function () { - if (!this.globalData.progressiveLoad) { - this.buildAllItems(); - } - }; - - BaseRenderer.prototype.buildElementParenting = function (element, parentName, hierarchy) { - var elements = this.elements; - var layers = this.layers; - var i = 0; - var len = layers.length; - - while (i < len) { - if (layers[i].ind == parentName) { - // eslint-disable-line eqeqeq - if (!elements[i] || elements[i] === true) { - this.buildItem(i); - this.addPendingElement(element); - } else { - hierarchy.push(elements[i]); - elements[i].setAsParent(); - - if (layers[i].parent !== undefined) { - this.buildElementParenting(element, layers[i].parent, hierarchy); - } else { - element.setHierarchy(hierarchy); - } - } - } - - i += 1; - } - }; - - BaseRenderer.prototype.addPendingElement = function (element) { - this.pendingElements.push(element); - }; - - BaseRenderer.prototype.searchExtraCompositions = function (assets) { - var i; - var len = assets.length; - - for (i = 0; i < len; i += 1) { - if (assets[i].xt) { - var comp = this.createComp(assets[i]); - comp.initExpressions(); - this.globalData.projectInterface.registerComposition(comp); - } - } - }; - - BaseRenderer.prototype.getElementByPath = function (path) { - var pathValue = path.shift(); - var element; - - if (typeof pathValue === 'number') { - element = this.elements[pathValue]; - } else { - var i; - var len = this.elements.length; - - for (i = 0; i < len; i += 1) { - if (this.elements[i].data.nm === pathValue) { - element = this.elements[i]; - break; - } - } - } - - if (path.length === 0) { - return element; - } - - return element.getElementByPath(path); - }; - - BaseRenderer.prototype.setupGlobalData = function (animData, fontsContainer) { - this.globalData.fontManager = new FontManager(); - this.globalData.fontManager.addChars(animData.chars); - this.globalData.fontManager.addFonts(animData.fonts, fontsContainer); - this.globalData.getAssetData = this.animationItem.getAssetData.bind(this.animationItem); - this.globalData.getAssetsPath = this.animationItem.getAssetsPath.bind(this.animationItem); - this.globalData.imageLoader = this.animationItem.imagePreloader; - this.globalData.audioController = this.animationItem.audioController; - this.globalData.frameId = 0; - this.globalData.frameRate = animData.fr; - this.globalData.nm = animData.nm; - this.globalData.compSize = { - w: animData.w, - h: animData.h - }; - }; - - function TransformElement() {} - - TransformElement.prototype = { - initTransform: function initTransform() { - this.finalTransform = { - mProp: this.data.ks ? TransformPropertyFactory.getTransformProperty(this, this.data.ks, this) : { - o: 0 - }, - _matMdf: false, - _opMdf: false, - mat: new Matrix() - }; - - if (this.data.ao) { - this.finalTransform.mProp.autoOriented = true; - } // TODO: check TYPE 11: Guided elements - - - if (this.data.ty !== 11) {// this.createElements(); - } - }, - renderTransform: function renderTransform() { - this.finalTransform._opMdf = this.finalTransform.mProp.o._mdf || this._isFirstFrame; - this.finalTransform._matMdf = this.finalTransform.mProp._mdf || this._isFirstFrame; - - if (this.hierarchy) { - var mat; - var finalMat = this.finalTransform.mat; - var i = 0; - var len = this.hierarchy.length; // Checking if any of the transformation matrices in the hierarchy chain has changed. - - if (!this.finalTransform._matMdf) { - while (i < len) { - if (this.hierarchy[i].finalTransform.mProp._mdf) { - this.finalTransform._matMdf = true; - break; - } - - i += 1; - } - } - - if (this.finalTransform._matMdf) { - mat = this.finalTransform.mProp.v.props; - finalMat.cloneFromProps(mat); - - for (i = 0; i < len; i += 1) { - mat = this.hierarchy[i].finalTransform.mProp.v.props; - finalMat.transform(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5], mat[6], mat[7], mat[8], mat[9], mat[10], mat[11], mat[12], mat[13], mat[14], mat[15]); - } - } - } - }, - globalToLocal: function globalToLocal(pt) { - var transforms = []; - transforms.push(this.finalTransform); - var flag = true; - var comp = this.comp; - - while (flag) { - if (comp.finalTransform) { - if (comp.data.hasMask) { - transforms.splice(0, 0, comp.finalTransform); - } - - comp = comp.comp; - } else { - flag = false; - } - } - - var i; - var len = transforms.length; - var ptNew; - - for (i = 0; i < len; i += 1) { - ptNew = transforms[i].mat.applyToPointArray(0, 0, 0); // ptNew = transforms[i].mat.applyToPointArray(pt[0],pt[1],pt[2]); - - pt = [pt[0] - ptNew[0], pt[1] - ptNew[1], 0]; - } - - return pt; - }, - mHelper: new Matrix() - }; - - function MaskElement(data, element, globalData) { - this.data = data; - this.element = element; - this.globalData = globalData; - this.storedData = []; - this.masksProperties = this.data.masksProperties || []; - this.maskElement = null; - var defs = this.globalData.defs; - var i; - var len = this.masksProperties ? this.masksProperties.length : 0; - this.viewData = createSizedArray(len); - this.solidPath = ''; - var path; - var properties = this.masksProperties; - var count = 0; - var currentMasks = []; - var j; - var jLen; - var layerId = createElementID(); - var rect; - var expansor; - var feMorph; - var x; - var maskType = 'clipPath'; - var maskRef = 'clip-path'; - - for (i = 0; i < len; i += 1) { - if (properties[i].mode !== 'a' && properties[i].mode !== 'n' || properties[i].inv || properties[i].o.k !== 100 || properties[i].o.x) { - maskType = 'mask'; - maskRef = 'mask'; - } - - if ((properties[i].mode === 's' || properties[i].mode === 'i') && count === 0) { - rect = createNS('rect'); - rect.setAttribute('fill', '#ffffff'); - rect.setAttribute('width', this.element.comp.data.w || 0); - rect.setAttribute('height', this.element.comp.data.h || 0); - currentMasks.push(rect); - } else { - rect = null; - } - - path = createNS('path'); - - if (properties[i].mode === 'n') { - // TODO move this to a factory or to a constructor - this.viewData[i] = { - op: PropertyFactory.getProp(this.element, properties[i].o, 0, 0.01, this.element), - prop: ShapePropertyFactory.getShapeProp(this.element, properties[i], 3), - elem: path, - lastPath: '' - }; - defs.appendChild(path); - } else { - count += 1; - path.setAttribute('fill', properties[i].mode === 's' ? '#000000' : '#ffffff'); - path.setAttribute('clip-rule', 'nonzero'); - var filterID; - - if (properties[i].x.k !== 0) { - maskType = 'mask'; - maskRef = 'mask'; - x = PropertyFactory.getProp(this.element, properties[i].x, 0, null, this.element); - filterID = createElementID(); - expansor = createNS('filter'); - expansor.setAttribute('id', filterID); - feMorph = createNS('feMorphology'); - feMorph.setAttribute('operator', 'erode'); - feMorph.setAttribute('in', 'SourceGraphic'); - feMorph.setAttribute('radius', '0'); - expansor.appendChild(feMorph); - defs.appendChild(expansor); - path.setAttribute('stroke', properties[i].mode === 's' ? '#000000' : '#ffffff'); - } else { - feMorph = null; - x = null; - } // TODO move this to a factory or to a constructor - - - this.storedData[i] = { - elem: path, - x: x, - expan: feMorph, - lastPath: '', - lastOperator: '', - filterId: filterID, - lastRadius: 0 - }; - - if (properties[i].mode === 'i') { - jLen = currentMasks.length; - var g = createNS('g'); - - for (j = 0; j < jLen; j += 1) { - g.appendChild(currentMasks[j]); - } - - var mask = createNS('mask'); - mask.setAttribute('mask-type', 'alpha'); - mask.setAttribute('id', layerId + '_' + count); - mask.appendChild(path); - defs.appendChild(mask); - g.setAttribute('mask', 'url(' + getLocationHref() + '#' + layerId + '_' + count + ')'); - currentMasks.length = 0; - currentMasks.push(g); - } else { - currentMasks.push(path); - } - - if (properties[i].inv && !this.solidPath) { - this.solidPath = this.createLayerSolidPath(); - } // TODO move this to a factory or to a constructor - - - this.viewData[i] = { - elem: path, - lastPath: '', - op: PropertyFactory.getProp(this.element, properties[i].o, 0, 0.01, this.element), - prop: ShapePropertyFactory.getShapeProp(this.element, properties[i], 3), - invRect: rect - }; - - if (!this.viewData[i].prop.k) { - this.drawPath(properties[i], this.viewData[i].prop.v, this.viewData[i]); - } - } - } - - this.maskElement = createNS(maskType); - len = currentMasks.length; - - for (i = 0; i < len; i += 1) { - this.maskElement.appendChild(currentMasks[i]); - } - - if (count > 0) { - this.maskElement.setAttribute('id', layerId); - this.element.maskedElement.setAttribute(maskRef, 'url(' + getLocationHref() + '#' + layerId + ')'); - defs.appendChild(this.maskElement); - } - - if (this.viewData.length) { - this.element.addRenderableComponent(this); - } - } - - MaskElement.prototype.getMaskProperty = function (pos) { - return this.viewData[pos].prop; - }; - - MaskElement.prototype.renderFrame = function (isFirstFrame) { - var finalMat = this.element.finalTransform.mat; - var i; - var len = this.masksProperties.length; - - for (i = 0; i < len; i += 1) { - if (this.viewData[i].prop._mdf || isFirstFrame) { - this.drawPath(this.masksProperties[i], this.viewData[i].prop.v, this.viewData[i]); - } - - if (this.viewData[i].op._mdf || isFirstFrame) { - this.viewData[i].elem.setAttribute('fill-opacity', this.viewData[i].op.v); - } - - if (this.masksProperties[i].mode !== 'n') { - if (this.viewData[i].invRect && (this.element.finalTransform.mProp._mdf || isFirstFrame)) { - this.viewData[i].invRect.setAttribute('transform', finalMat.getInverseMatrix().to2dCSS()); - } - - if (this.storedData[i].x && (this.storedData[i].x._mdf || isFirstFrame)) { - var feMorph = this.storedData[i].expan; - - if (this.storedData[i].x.v < 0) { - if (this.storedData[i].lastOperator !== 'erode') { - this.storedData[i].lastOperator = 'erode'; - this.storedData[i].elem.setAttribute('filter', 'url(' + getLocationHref() + '#' + this.storedData[i].filterId + ')'); - } - - feMorph.setAttribute('radius', -this.storedData[i].x.v); - } else { - if (this.storedData[i].lastOperator !== 'dilate') { - this.storedData[i].lastOperator = 'dilate'; - this.storedData[i].elem.setAttribute('filter', null); - } - - this.storedData[i].elem.setAttribute('stroke-width', this.storedData[i].x.v * 2); - } - } - } - } - }; - - MaskElement.prototype.getMaskelement = function () { - return this.maskElement; - }; - - MaskElement.prototype.createLayerSolidPath = function () { - var path = 'M0,0 '; - path += ' h' + this.globalData.compSize.w; - path += ' v' + this.globalData.compSize.h; - path += ' h-' + this.globalData.compSize.w; - path += ' v-' + this.globalData.compSize.h + ' '; - return path; - }; - - MaskElement.prototype.drawPath = function (pathData, pathNodes, viewData) { - var pathString = ' M' + pathNodes.v[0][0] + ',' + pathNodes.v[0][1]; - var i; - var len; - len = pathNodes._length; - - for (i = 1; i < len; i += 1) { - // pathString += " C"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + " "+pathNodes.i[i][0]+','+pathNodes.i[i][1] + " "+pathNodes.v[i][0]+','+pathNodes.v[i][1]; - pathString += ' C' + pathNodes.o[i - 1][0] + ',' + pathNodes.o[i - 1][1] + ' ' + pathNodes.i[i][0] + ',' + pathNodes.i[i][1] + ' ' + pathNodes.v[i][0] + ',' + pathNodes.v[i][1]; - } // pathString += " C"+pathNodes.o[i-1][0]+','+pathNodes.o[i-1][1] + " "+pathNodes.i[0][0]+','+pathNodes.i[0][1] + " "+pathNodes.v[0][0]+','+pathNodes.v[0][1]; - - - if (pathNodes.c && len > 1) { - pathString += ' C' + pathNodes.o[i - 1][0] + ',' + pathNodes.o[i - 1][1] + ' ' + pathNodes.i[0][0] + ',' + pathNodes.i[0][1] + ' ' + pathNodes.v[0][0] + ',' + pathNodes.v[0][1]; - } // pathNodes.__renderedString = pathString; - - - if (viewData.lastPath !== pathString) { - var pathShapeValue = ''; - - if (viewData.elem) { - if (pathNodes.c) { - pathShapeValue = pathData.inv ? this.solidPath + pathString : pathString; - } - - viewData.elem.setAttribute('d', pathShapeValue); - } - - viewData.lastPath = pathString; - } - }; - - MaskElement.prototype.destroy = function () { - this.element = null; - this.globalData = null; - this.maskElement = null; - this.data = null; - this.masksProperties = null; - }; - - var filtersFactory = function () { - var ob = {}; - ob.createFilter = createFilter; - ob.createAlphaToLuminanceFilter = createAlphaToLuminanceFilter; - - function createFilter(filId, skipCoordinates) { - var fil = createNS('filter'); - fil.setAttribute('id', filId); - - if (skipCoordinates !== true) { - fil.setAttribute('filterUnits', 'objectBoundingBox'); - fil.setAttribute('x', '0%'); - fil.setAttribute('y', '0%'); - fil.setAttribute('width', '100%'); - fil.setAttribute('height', '100%'); - } - - return fil; - } - - function createAlphaToLuminanceFilter() { - var feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB'); - feColorMatrix.setAttribute('values', '0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 1'); - return feColorMatrix; - } - - return ob; - }(); - - var featureSupport = function () { - var ob = { - maskType: true - }; - - if (/MSIE 10/i.test(navigator.userAgent) || /MSIE 9/i.test(navigator.userAgent) || /rv:11.0/i.test(navigator.userAgent) || /Edge\/\d./i.test(navigator.userAgent)) { - ob.maskType = false; - } - - return ob; - }(); - - var registeredEffects = {}; - var idPrefix = 'filter_result_'; - - function SVGEffects(elem) { - var i; - var source = 'SourceGraphic'; - var len = elem.data.ef ? elem.data.ef.length : 0; - var filId = createElementID(); - var fil = filtersFactory.createFilter(filId, true); - var count = 0; - this.filters = []; - var filterManager; - - for (i = 0; i < len; i += 1) { - filterManager = null; - var type = elem.data.ef[i].ty; - - if (registeredEffects[type]) { - var Effect = registeredEffects[type].effect; - filterManager = new Effect(fil, elem.effectsManager.effectElements[i], elem, idPrefix + count, source); - source = idPrefix + count; - - if (registeredEffects[type].countsAsEffect) { - count += 1; - } - } - - if (filterManager) { - this.filters.push(filterManager); - } - } - - if (count) { - elem.globalData.defs.appendChild(fil); - elem.layerElement.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')'); - } - - if (this.filters.length) { - elem.addRenderableComponent(this); - } - } - - SVGEffects.prototype.renderFrame = function (_isFirstFrame) { - var i; - var len = this.filters.length; - - for (i = 0; i < len; i += 1) { - this.filters[i].renderFrame(_isFirstFrame); - } - }; - - function registerEffect(id, effect, countsAsEffect) { - registeredEffects[id] = { - effect: effect, - countsAsEffect: countsAsEffect - }; - } - - function SVGBaseElement() {} - - SVGBaseElement.prototype = { - initRendererElement: function initRendererElement() { - this.layerElement = createNS('g'); - }, - createContainerElements: function createContainerElements() { - this.matteElement = createNS('g'); - this.transformedElement = this.layerElement; - this.maskedElement = this.layerElement; - this._sizeChanged = false; - var layerElementParent = null; // If this layer acts as a mask for the following layer - - var filId; - var fil; - var gg; - - if (this.data.td) { - if (this.data.td == 3 || this.data.td == 1) { - // eslint-disable-line eqeqeq - var masker = createNS('mask'); - masker.setAttribute('id', this.layerId); - masker.setAttribute('mask-type', this.data.td == 3 ? 'luminance' : 'alpha'); // eslint-disable-line eqeqeq - - masker.appendChild(this.layerElement); - layerElementParent = masker; - this.globalData.defs.appendChild(masker); // This is only for IE and Edge when mask if of type alpha - - if (!featureSupport.maskType && this.data.td == 1) { - // eslint-disable-line eqeqeq - masker.setAttribute('mask-type', 'luminance'); - filId = createElementID(); - fil = filtersFactory.createFilter(filId); - this.globalData.defs.appendChild(fil); - fil.appendChild(filtersFactory.createAlphaToLuminanceFilter()); - gg = createNS('g'); - gg.appendChild(this.layerElement); - layerElementParent = gg; - masker.appendChild(gg); - gg.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')'); - } - } else if (this.data.td == 2) { - // eslint-disable-line eqeqeq - var maskGroup = createNS('mask'); - maskGroup.setAttribute('id', this.layerId); - maskGroup.setAttribute('mask-type', 'alpha'); - var maskGrouper = createNS('g'); - maskGroup.appendChild(maskGrouper); - filId = createElementID(); - fil = filtersFactory.createFilter(filId); /// / - // This solution doesn't work on Android when meta tag with viewport attribute is set - - /* var feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB'); - feColorMatrix.setAttribute('values','1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 -1 1'); - fil.appendChild(feColorMatrix); */ - /// / - - var feCTr = createNS('feComponentTransfer'); - feCTr.setAttribute('in', 'SourceGraphic'); - fil.appendChild(feCTr); - var feFunc = createNS('feFuncA'); - feFunc.setAttribute('type', 'table'); - feFunc.setAttribute('tableValues', '1.0 0.0'); - feCTr.appendChild(feFunc); /// / - - this.globalData.defs.appendChild(fil); - var alphaRect = createNS('rect'); - alphaRect.setAttribute('width', this.comp.data.w); - alphaRect.setAttribute('height', this.comp.data.h); - alphaRect.setAttribute('x', '0'); - alphaRect.setAttribute('y', '0'); - alphaRect.setAttribute('fill', '#ffffff'); - alphaRect.setAttribute('opacity', '0'); - maskGrouper.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')'); - maskGrouper.appendChild(alphaRect); - maskGrouper.appendChild(this.layerElement); - layerElementParent = maskGrouper; - - if (!featureSupport.maskType) { - maskGroup.setAttribute('mask-type', 'luminance'); - fil.appendChild(filtersFactory.createAlphaToLuminanceFilter()); - gg = createNS('g'); - maskGrouper.appendChild(alphaRect); - gg.appendChild(this.layerElement); - layerElementParent = gg; - maskGrouper.appendChild(gg); - } - - this.globalData.defs.appendChild(maskGroup); - } - } else if (this.data.tt) { - this.matteElement.appendChild(this.layerElement); - layerElementParent = this.matteElement; - this.baseElement = this.matteElement; - } else { - this.baseElement = this.layerElement; - } - - if (this.data.ln) { - this.layerElement.setAttribute('id', this.data.ln); - } - - if (this.data.cl) { - this.layerElement.setAttribute('class', this.data.cl); - } // Clipping compositions to hide content that exceeds boundaries. If collapsed transformations is on, component should not be clipped - - - if (this.data.ty === 0 && !this.data.hd) { - var cp = createNS('clipPath'); - var pt = createNS('path'); - pt.setAttribute('d', 'M0,0 L' + this.data.w + ',0 L' + this.data.w + ',' + this.data.h + ' L0,' + this.data.h + 'z'); - var clipId = createElementID(); - cp.setAttribute('id', clipId); - cp.appendChild(pt); - this.globalData.defs.appendChild(cp); - - if (this.checkMasks()) { - var cpGroup = createNS('g'); - cpGroup.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + clipId + ')'); - cpGroup.appendChild(this.layerElement); - this.transformedElement = cpGroup; - - if (layerElementParent) { - layerElementParent.appendChild(this.transformedElement); - } else { - this.baseElement = this.transformedElement; - } - } else { - this.layerElement.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + clipId + ')'); - } - } - - if (this.data.bm !== 0) { - this.setBlendMode(); - } - }, - renderElement: function renderElement() { - if (this.finalTransform._matMdf) { - this.transformedElement.setAttribute('transform', this.finalTransform.mat.to2dCSS()); - } - - if (this.finalTransform._opMdf) { - this.transformedElement.setAttribute('opacity', this.finalTransform.mProp.o.v); - } - }, - destroyBaseElement: function destroyBaseElement() { - this.layerElement = null; - this.matteElement = null; - this.maskManager.destroy(); - }, - getBaseElement: function getBaseElement() { - if (this.data.hd) { - return null; - } - - return this.baseElement; - }, - createRenderableComponents: function createRenderableComponents() { - this.maskManager = new MaskElement(this.data, this, this.globalData); - this.renderableEffectsManager = new SVGEffects(this); - }, - setMatte: function setMatte(id) { - if (!this.matteElement) { - return; - } - - this.matteElement.setAttribute('mask', 'url(' + getLocationHref() + '#' + id + ')'); - } - }; - - /** - * @file - * Handles AE's layer parenting property. - * - */ - function HierarchyElement() {} - - HierarchyElement.prototype = { - /** - * @function - * Initializes hierarchy properties - * - */ - initHierarchy: function initHierarchy() { - // element's parent list - this.hierarchy = []; // if element is parent of another layer _isParent will be true - - this._isParent = false; - this.checkParenting(); - }, - - /** - * @function - * Sets layer's hierarchy. - * @param {array} hierarch - * layer's parent list - * - */ - setHierarchy: function setHierarchy(hierarchy) { - this.hierarchy = hierarchy; - }, - - /** - * @function - * Sets layer as parent. - * - */ - setAsParent: function setAsParent() { - this._isParent = true; - }, - - /** - * @function - * Searches layer's parenting chain - * - */ - checkParenting: function checkParenting() { - if (this.data.parent !== undefined) { - this.comp.buildElementParenting(this, this.data.parent, []); - } - } - }; - - function RenderableDOMElement() {} - - (function () { - var _prototype = { - initElement: function initElement(data, globalData, comp) { - this.initFrame(); - this.initBaseData(data, globalData, comp); - this.initTransform(data, globalData, comp); - this.initHierarchy(); - this.initRenderable(); - this.initRendererElement(); - this.createContainerElements(); - this.createRenderableComponents(); - this.createContent(); - this.hide(); - }, - hide: function hide() { - // console.log('HIDE', this); - if (!this.hidden && (!this.isInRange || this.isTransparent)) { - var elem = this.baseElement || this.layerElement; - elem.style.display = 'none'; - this.hidden = true; - } - }, - show: function show() { - // console.log('SHOW', this); - if (this.isInRange && !this.isTransparent) { - if (!this.data.hd) { - var elem = this.baseElement || this.layerElement; - elem.style.display = 'block'; - } - - this.hidden = false; - this._isFirstFrame = true; - } - }, - renderFrame: function renderFrame() { - // If it is exported as hidden (data.hd === true) no need to render - // If it is not visible no need to render - if (this.data.hd || this.hidden) { - return; - } - - this.renderTransform(); - this.renderRenderable(); - this.renderElement(); - this.renderInnerContent(); - - if (this._isFirstFrame) { - this._isFirstFrame = false; - } - }, - renderInnerContent: function renderInnerContent() {}, - prepareFrame: function prepareFrame(num) { - this._mdf = false; - this.prepareRenderableFrame(num); - this.prepareProperties(num, this.isInRange); - this.checkTransparency(); - }, - destroy: function destroy() { - this.innerElem = null; - this.destroyBaseElement(); - } - }; - extendPrototype([RenderableElement, createProxyFunction(_prototype)], RenderableDOMElement); - })(); - - function IImageElement(data, globalData, comp) { - this.assetData = globalData.getAssetData(data.refId); - this.initElement(data, globalData, comp); - this.sourceRect = { - top: 0, - left: 0, - width: this.assetData.w, - height: this.assetData.h - }; - } - - extendPrototype([BaseElement, TransformElement, SVGBaseElement, HierarchyElement, FrameElement, RenderableDOMElement], IImageElement); - - IImageElement.prototype.createContent = function () { - var assetPath = this.globalData.getAssetsPath(this.assetData); - this.innerElem = createNS('image'); - this.innerElem.setAttribute('width', this.assetData.w + 'px'); - this.innerElem.setAttribute('height', this.assetData.h + 'px'); - this.innerElem.setAttribute('preserveAspectRatio', this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio); - this.innerElem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', assetPath); - this.layerElement.appendChild(this.innerElem); - }; - - IImageElement.prototype.sourceRectAtTime = function () { - return this.sourceRect; - }; - - function ProcessedElement(element, position) { - this.elem = element; - this.pos = position; - } - - function IShapeElement() {} - - IShapeElement.prototype = { - addShapeToModifiers: function addShapeToModifiers(data) { - var i; - var len = this.shapeModifiers.length; - - for (i = 0; i < len; i += 1) { - this.shapeModifiers[i].addShape(data); - } - }, - isShapeInAnimatedModifiers: function isShapeInAnimatedModifiers(data) { - var i = 0; - var len = this.shapeModifiers.length; - - while (i < len) { - if (this.shapeModifiers[i].isAnimatedWithShape(data)) { - return true; - } - } - - return false; - }, - renderModifiers: function renderModifiers() { - if (!this.shapeModifiers.length) { - return; - } - - var i; - var len = this.shapes.length; - - for (i = 0; i < len; i += 1) { - this.shapes[i].sh.reset(); - } - - len = this.shapeModifiers.length; - var shouldBreakProcess; - - for (i = len - 1; i >= 0; i -= 1) { - shouldBreakProcess = this.shapeModifiers[i].processShapes(this._isFirstFrame); // workaround to fix cases where a repeater resets the shape so the following processes get called twice - // TODO: find a better solution for this - - if (shouldBreakProcess) { - break; - } - } - }, - searchProcessedElement: function searchProcessedElement(elem) { - var elements = this.processedElements; - var i = 0; - var len = elements.length; - - while (i < len) { - if (elements[i].elem === elem) { - return elements[i].pos; - } - - i += 1; - } - - return 0; - }, - addProcessedElement: function addProcessedElement(elem, pos) { - var elements = this.processedElements; - var i = elements.length; - - while (i) { - i -= 1; - - if (elements[i].elem === elem) { - elements[i].pos = pos; - return; - } - } - - elements.push(new ProcessedElement(elem, pos)); - }, - prepareFrame: function prepareFrame(num) { - this.prepareRenderableFrame(num); - this.prepareProperties(num, this.isInRange); - } - }; - - var lineCapEnum = { - 1: 'butt', - 2: 'round', - 3: 'square' - }; - var lineJoinEnum = { - 1: 'miter', - 2: 'round', - 3: 'bevel' - }; - - function SVGShapeData(transformers, level, shape) { - this.caches = []; - this.styles = []; - this.transformers = transformers; - this.lStr = ''; - this.sh = shape; - this.lvl = level; // TODO find if there are some cases where _isAnimated can be false. - // For now, since shapes add up with other shapes. They have to be calculated every time. - // One way of finding out is checking if all styles associated to this shape depend only of this shape - - this._isAnimated = !!shape.k; // TODO: commenting this for now since all shapes are animated - - var i = 0; - var len = transformers.length; - - while (i < len) { - if (transformers[i].mProps.dynamicProperties.length) { - this._isAnimated = true; - break; - } - - i += 1; - } - } - - SVGShapeData.prototype.setAsAnimated = function () { - this._isAnimated = true; - }; - - function SVGStyleData(data, level) { - this.data = data; - this.type = data.ty; - this.d = ''; - this.lvl = level; - this._mdf = false; - this.closed = data.hd === true; - this.pElem = createNS('path'); - this.msElem = null; - } - - SVGStyleData.prototype.reset = function () { - this.d = ''; - this._mdf = false; - }; - - function DashProperty(elem, data, renderer, container) { - this.elem = elem; - this.frameId = -1; - this.dataProps = createSizedArray(data.length); - this.renderer = renderer; - this.k = false; - this.dashStr = ''; - this.dashArray = createTypedArray('float32', data.length ? data.length - 1 : 0); - this.dashoffset = createTypedArray('float32', 1); - this.initDynamicPropertyContainer(container); - var i; - var len = data.length || 0; - var prop; - - for (i = 0; i < len; i += 1) { - prop = PropertyFactory.getProp(elem, data[i].v, 0, 0, this); - this.k = prop.k || this.k; - this.dataProps[i] = { - n: data[i].n, - p: prop - }; - } - - if (!this.k) { - this.getValue(true); - } - - this._isAnimated = this.k; - } - - DashProperty.prototype.getValue = function (forceRender) { - if (this.elem.globalData.frameId === this.frameId && !forceRender) { - return; - } - - this.frameId = this.elem.globalData.frameId; - this.iterateDynamicProperties(); - this._mdf = this._mdf || forceRender; - - if (this._mdf) { - var i = 0; - var len = this.dataProps.length; - - if (this.renderer === 'svg') { - this.dashStr = ''; - } - - for (i = 0; i < len; i += 1) { - if (this.dataProps[i].n !== 'o') { - if (this.renderer === 'svg') { - this.dashStr += ' ' + this.dataProps[i].p.v; - } else { - this.dashArray[i] = this.dataProps[i].p.v; - } - } else { - this.dashoffset[0] = this.dataProps[i].p.v; - } - } - } - }; - - extendPrototype([DynamicPropertyContainer], DashProperty); - - function SVGStrokeStyleData(elem, data, styleOb) { - this.initDynamicPropertyContainer(elem); - this.getValue = this.iterateDynamicProperties; - this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this); - this.w = PropertyFactory.getProp(elem, data.w, 0, null, this); - this.d = new DashProperty(elem, data.d || {}, 'svg', this); - this.c = PropertyFactory.getProp(elem, data.c, 1, 255, this); - this.style = styleOb; - this._isAnimated = !!this._isAnimated; - } - - extendPrototype([DynamicPropertyContainer], SVGStrokeStyleData); - - function SVGFillStyleData(elem, data, styleOb) { - this.initDynamicPropertyContainer(elem); - this.getValue = this.iterateDynamicProperties; - this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this); - this.c = PropertyFactory.getProp(elem, data.c, 1, 255, this); - this.style = styleOb; - } - - extendPrototype([DynamicPropertyContainer], SVGFillStyleData); - - function SVGNoStyleData(elem, data, styleOb) { - this.initDynamicPropertyContainer(elem); - this.getValue = this.iterateDynamicProperties; - this.style = styleOb; - } - - extendPrototype([DynamicPropertyContainer], SVGNoStyleData); - - function GradientProperty(elem, data, container) { - this.data = data; - this.c = createTypedArray('uint8c', data.p * 4); - var cLength = data.k.k[0].s ? data.k.k[0].s.length - data.p * 4 : data.k.k.length - data.p * 4; - this.o = createTypedArray('float32', cLength); - this._cmdf = false; - this._omdf = false; - this._collapsable = this.checkCollapsable(); - this._hasOpacity = cLength; - this.initDynamicPropertyContainer(container); - this.prop = PropertyFactory.getProp(elem, data.k, 1, null, this); - this.k = this.prop.k; - this.getValue(true); - } - - GradientProperty.prototype.comparePoints = function (values, points) { - var i = 0; - var len = this.o.length / 2; - var diff; - - while (i < len) { - diff = Math.abs(values[i * 4] - values[points * 4 + i * 2]); - - if (diff > 0.01) { - return false; - } - - i += 1; - } - - return true; - }; - - GradientProperty.prototype.checkCollapsable = function () { - if (this.o.length / 2 !== this.c.length / 4) { - return false; - } - - if (this.data.k.k[0].s) { - var i = 0; - var len = this.data.k.k.length; - - while (i < len) { - if (!this.comparePoints(this.data.k.k[i].s, this.data.p)) { - return false; - } - - i += 1; - } - } else if (!this.comparePoints(this.data.k.k, this.data.p)) { - return false; - } - - return true; - }; - - GradientProperty.prototype.getValue = function (forceRender) { - this.prop.getValue(); - this._mdf = false; - this._cmdf = false; - this._omdf = false; - - if (this.prop._mdf || forceRender) { - var i; - var len = this.data.p * 4; - var mult; - var val; - - for (i = 0; i < len; i += 1) { - mult = i % 4 === 0 ? 100 : 255; - val = Math.round(this.prop.v[i] * mult); - - if (this.c[i] !== val) { - this.c[i] = val; - this._cmdf = !forceRender; - } - } - - if (this.o.length) { - len = this.prop.v.length; - - for (i = this.data.p * 4; i < len; i += 1) { - mult = i % 2 === 0 ? 100 : 1; - val = i % 2 === 0 ? Math.round(this.prop.v[i] * 100) : this.prop.v[i]; - - if (this.o[i - this.data.p * 4] !== val) { - this.o[i - this.data.p * 4] = val; - this._omdf = !forceRender; - } - } - } - - this._mdf = !forceRender; - } - }; - - extendPrototype([DynamicPropertyContainer], GradientProperty); - - function SVGGradientFillStyleData(elem, data, styleOb) { - this.initDynamicPropertyContainer(elem); - this.getValue = this.iterateDynamicProperties; - this.initGradientData(elem, data, styleOb); - } - - SVGGradientFillStyleData.prototype.initGradientData = function (elem, data, styleOb) { - this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this); - this.s = PropertyFactory.getProp(elem, data.s, 1, null, this); - this.e = PropertyFactory.getProp(elem, data.e, 1, null, this); - this.h = PropertyFactory.getProp(elem, data.h || { - k: 0 - }, 0, 0.01, this); - this.a = PropertyFactory.getProp(elem, data.a || { - k: 0 - }, 0, degToRads, this); - this.g = new GradientProperty(elem, data.g, this); - this.style = styleOb; - this.stops = []; - this.setGradientData(styleOb.pElem, data); - this.setGradientOpacity(data, styleOb); - this._isAnimated = !!this._isAnimated; - }; - - SVGGradientFillStyleData.prototype.setGradientData = function (pathElement, data) { - var gradientId = createElementID(); - var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient'); - gfill.setAttribute('id', gradientId); - gfill.setAttribute('spreadMethod', 'pad'); - gfill.setAttribute('gradientUnits', 'userSpaceOnUse'); - var stops = []; - var stop; - var j; - var jLen; - jLen = data.g.p * 4; - - for (j = 0; j < jLen; j += 4) { - stop = createNS('stop'); - gfill.appendChild(stop); - stops.push(stop); - } - - pathElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + gradientId + ')'); - this.gf = gfill; - this.cst = stops; - }; - - SVGGradientFillStyleData.prototype.setGradientOpacity = function (data, styleOb) { - if (this.g._hasOpacity && !this.g._collapsable) { - var stop; - var j; - var jLen; - var mask = createNS('mask'); - var maskElement = createNS('path'); - mask.appendChild(maskElement); - var opacityId = createElementID(); - var maskId = createElementID(); - mask.setAttribute('id', maskId); - var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient'); - opFill.setAttribute('id', opacityId); - opFill.setAttribute('spreadMethod', 'pad'); - opFill.setAttribute('gradientUnits', 'userSpaceOnUse'); - jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length; - var stops = this.stops; - - for (j = data.g.p * 4; j < jLen; j += 2) { - stop = createNS('stop'); - stop.setAttribute('stop-color', 'rgb(255,255,255)'); - opFill.appendChild(stop); - stops.push(stop); - } - - maskElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + opacityId + ')'); - - if (data.ty === 'gs') { - maskElement.setAttribute('stroke-linecap', lineCapEnum[data.lc || 2]); - maskElement.setAttribute('stroke-linejoin', lineJoinEnum[data.lj || 2]); - - if (data.lj === 1) { - maskElement.setAttribute('stroke-miterlimit', data.ml); - } - } - - this.of = opFill; - this.ms = mask; - this.ost = stops; - this.maskId = maskId; - styleOb.msElem = maskElement; - } - }; - - extendPrototype([DynamicPropertyContainer], SVGGradientFillStyleData); - - function SVGGradientStrokeStyleData(elem, data, styleOb) { - this.initDynamicPropertyContainer(elem); - this.getValue = this.iterateDynamicProperties; - this.w = PropertyFactory.getProp(elem, data.w, 0, null, this); - this.d = new DashProperty(elem, data.d || {}, 'svg', this); - this.initGradientData(elem, data, styleOb); - this._isAnimated = !!this._isAnimated; - } - - extendPrototype([SVGGradientFillStyleData, DynamicPropertyContainer], SVGGradientStrokeStyleData); - - function ShapeGroupData() { - this.it = []; - this.prevViewData = []; - this.gr = createNS('g'); - } - - function SVGTransformData(mProps, op, container) { - this.transform = { - mProps: mProps, - op: op, - container: container - }; - this.elements = []; - this._isAnimated = this.transform.mProps.dynamicProperties.length || this.transform.op.effectsSequence.length; - } - - var buildShapeString = function buildShapeString(pathNodes, length, closed, mat) { - if (length === 0) { - return ''; - } - - var _o = pathNodes.o; - var _i = pathNodes.i; - var _v = pathNodes.v; - var i; - var shapeString = ' M' + mat.applyToPointStringified(_v[0][0], _v[0][1]); - - for (i = 1; i < length; i += 1) { - shapeString += ' C' + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + ' ' + mat.applyToPointStringified(_i[i][0], _i[i][1]) + ' ' + mat.applyToPointStringified(_v[i][0], _v[i][1]); - } - - if (closed && length) { - shapeString += ' C' + mat.applyToPointStringified(_o[i - 1][0], _o[i - 1][1]) + ' ' + mat.applyToPointStringified(_i[0][0], _i[0][1]) + ' ' + mat.applyToPointStringified(_v[0][0], _v[0][1]); - shapeString += 'z'; - } - - return shapeString; - }; - - var SVGElementsRenderer = function () { - var _identityMatrix = new Matrix(); - - var _matrixHelper = new Matrix(); - - var ob = { - createRenderFunction: createRenderFunction - }; - - function createRenderFunction(data) { - switch (data.ty) { - case 'fl': - return renderFill; - - case 'gf': - return renderGradient; - - case 'gs': - return renderGradientStroke; - - case 'st': - return renderStroke; - - case 'sh': - case 'el': - case 'rc': - case 'sr': - return renderPath; - - case 'tr': - return renderContentTransform; - - case 'no': - return renderNoop; - - default: - return null; - } - } - - function renderContentTransform(styleData, itemData, isFirstFrame) { - if (isFirstFrame || itemData.transform.op._mdf) { - itemData.transform.container.setAttribute('opacity', itemData.transform.op.v); - } - - if (isFirstFrame || itemData.transform.mProps._mdf) { - itemData.transform.container.setAttribute('transform', itemData.transform.mProps.v.to2dCSS()); - } - } - - function renderNoop() {} - - function renderPath(styleData, itemData, isFirstFrame) { - var j; - var jLen; - var pathStringTransformed; - var redraw; - var pathNodes; - var l; - var lLen = itemData.styles.length; - var lvl = itemData.lvl; - var paths; - var mat; - var props; - var iterations; - var k; - - for (l = 0; l < lLen; l += 1) { - redraw = itemData.sh._mdf || isFirstFrame; - - if (itemData.styles[l].lvl < lvl) { - mat = _matrixHelper.reset(); - iterations = lvl - itemData.styles[l].lvl; - k = itemData.transformers.length - 1; - - while (!redraw && iterations > 0) { - redraw = itemData.transformers[k].mProps._mdf || redraw; - iterations -= 1; - k -= 1; - } - - if (redraw) { - iterations = lvl - itemData.styles[l].lvl; - k = itemData.transformers.length - 1; - - while (iterations > 0) { - props = itemData.transformers[k].mProps.v.props; - mat.transform(props[0], props[1], props[2], props[3], props[4], props[5], props[6], props[7], props[8], props[9], props[10], props[11], props[12], props[13], props[14], props[15]); - iterations -= 1; - k -= 1; - } - } - } else { - mat = _identityMatrix; - } - - paths = itemData.sh.paths; - jLen = paths._length; - - if (redraw) { - pathStringTransformed = ''; - - for (j = 0; j < jLen; j += 1) { - pathNodes = paths.shapes[j]; - - if (pathNodes && pathNodes._length) { - pathStringTransformed += buildShapeString(pathNodes, pathNodes._length, pathNodes.c, mat); - } - } - - itemData.caches[l] = pathStringTransformed; - } else { - pathStringTransformed = itemData.caches[l]; - } - - itemData.styles[l].d += styleData.hd === true ? '' : pathStringTransformed; - itemData.styles[l]._mdf = redraw || itemData.styles[l]._mdf; - } - } - - function renderFill(styleData, itemData, isFirstFrame) { - var styleElem = itemData.style; - - if (itemData.c._mdf || isFirstFrame) { - styleElem.pElem.setAttribute('fill', 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')'); - } - - if (itemData.o._mdf || isFirstFrame) { - styleElem.pElem.setAttribute('fill-opacity', itemData.o.v); - } - } - - function renderGradientStroke(styleData, itemData, isFirstFrame) { - renderGradient(styleData, itemData, isFirstFrame); - renderStroke(styleData, itemData, isFirstFrame); - } - - function renderGradient(styleData, itemData, isFirstFrame) { - var gfill = itemData.gf; - var hasOpacity = itemData.g._hasOpacity; - var pt1 = itemData.s.v; - var pt2 = itemData.e.v; - - if (itemData.o._mdf || isFirstFrame) { - var attr = styleData.ty === 'gf' ? 'fill-opacity' : 'stroke-opacity'; - itemData.style.pElem.setAttribute(attr, itemData.o.v); - } - - if (itemData.s._mdf || isFirstFrame) { - var attr1 = styleData.t === 1 ? 'x1' : 'cx'; - var attr2 = attr1 === 'x1' ? 'y1' : 'cy'; - gfill.setAttribute(attr1, pt1[0]); - gfill.setAttribute(attr2, pt1[1]); - - if (hasOpacity && !itemData.g._collapsable) { - itemData.of.setAttribute(attr1, pt1[0]); - itemData.of.setAttribute(attr2, pt1[1]); - } - } - - var stops; - var i; - var len; - var stop; - - if (itemData.g._cmdf || isFirstFrame) { - stops = itemData.cst; - var cValues = itemData.g.c; - len = stops.length; - - for (i = 0; i < len; i += 1) { - stop = stops[i]; - stop.setAttribute('offset', cValues[i * 4] + '%'); - stop.setAttribute('stop-color', 'rgb(' + cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ',' + cValues[i * 4 + 3] + ')'); - } - } - - if (hasOpacity && (itemData.g._omdf || isFirstFrame)) { - var oValues = itemData.g.o; - - if (itemData.g._collapsable) { - stops = itemData.cst; - } else { - stops = itemData.ost; - } - - len = stops.length; - - for (i = 0; i < len; i += 1) { - stop = stops[i]; - - if (!itemData.g._collapsable) { - stop.setAttribute('offset', oValues[i * 2] + '%'); - } - - stop.setAttribute('stop-opacity', oValues[i * 2 + 1]); - } - } - - if (styleData.t === 1) { - if (itemData.e._mdf || isFirstFrame) { - gfill.setAttribute('x2', pt2[0]); - gfill.setAttribute('y2', pt2[1]); - - if (hasOpacity && !itemData.g._collapsable) { - itemData.of.setAttribute('x2', pt2[0]); - itemData.of.setAttribute('y2', pt2[1]); - } - } - } else { - var rad; - - if (itemData.s._mdf || itemData.e._mdf || isFirstFrame) { - rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2)); - gfill.setAttribute('r', rad); - - if (hasOpacity && !itemData.g._collapsable) { - itemData.of.setAttribute('r', rad); - } - } - - if (itemData.e._mdf || itemData.h._mdf || itemData.a._mdf || isFirstFrame) { - if (!rad) { - rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2)); - } - - var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]); - var percent = itemData.h.v; - - if (percent >= 1) { - percent = 0.99; - } else if (percent <= -1) { - percent = -0.99; - } - - var dist = rad * percent; - var x = Math.cos(ang + itemData.a.v) * dist + pt1[0]; - var y = Math.sin(ang + itemData.a.v) * dist + pt1[1]; - gfill.setAttribute('fx', x); - gfill.setAttribute('fy', y); - - if (hasOpacity && !itemData.g._collapsable) { - itemData.of.setAttribute('fx', x); - itemData.of.setAttribute('fy', y); - } - } // gfill.setAttribute('fy','200'); - - } - } - - function renderStroke(styleData, itemData, isFirstFrame) { - var styleElem = itemData.style; - var d = itemData.d; - - if (d && (d._mdf || isFirstFrame) && d.dashStr) { - styleElem.pElem.setAttribute('stroke-dasharray', d.dashStr); - styleElem.pElem.setAttribute('stroke-dashoffset', d.dashoffset[0]); - } - - if (itemData.c && (itemData.c._mdf || isFirstFrame)) { - styleElem.pElem.setAttribute('stroke', 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')'); - } - - if (itemData.o._mdf || isFirstFrame) { - styleElem.pElem.setAttribute('stroke-opacity', itemData.o.v); - } - - if (itemData.w._mdf || isFirstFrame) { - styleElem.pElem.setAttribute('stroke-width', itemData.w.v); - - if (styleElem.msElem) { - styleElem.msElem.setAttribute('stroke-width', itemData.w.v); - } - } - } - - return ob; - }(); - - function SVGShapeElement(data, globalData, comp) { - // List of drawable elements - this.shapes = []; // Full shape data - - this.shapesData = data.shapes; // List of styles that will be applied to shapes - - this.stylesList = []; // List of modifiers that will be applied to shapes - - this.shapeModifiers = []; // List of items in shape tree - - this.itemsData = []; // List of items in previous shape tree - - this.processedElements = []; // List of animated components - - this.animatedContents = []; - this.initElement(data, globalData, comp); // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties. - // List of elements that have been created - - this.prevViewData = []; // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties. - } - - extendPrototype([BaseElement, TransformElement, SVGBaseElement, IShapeElement, HierarchyElement, FrameElement, RenderableDOMElement], SVGShapeElement); - - SVGShapeElement.prototype.initSecondaryElement = function () {}; - - SVGShapeElement.prototype.identityMatrix = new Matrix(); - - SVGShapeElement.prototype.buildExpressionInterface = function () {}; - - SVGShapeElement.prototype.createContent = function () { - this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.layerElement, 0, [], true); - this.filterUniqueShapes(); - }; - /* - This method searches for multiple shapes that affect a single element and one of them is animated - */ - - - SVGShapeElement.prototype.filterUniqueShapes = function () { - var i; - var len = this.shapes.length; - var shape; - var j; - var jLen = this.stylesList.length; - var style; - var tempShapes = []; - var areAnimated = false; - - for (j = 0; j < jLen; j += 1) { - style = this.stylesList[j]; - areAnimated = false; - tempShapes.length = 0; - - for (i = 0; i < len; i += 1) { - shape = this.shapes[i]; - - if (shape.styles.indexOf(style) !== -1) { - tempShapes.push(shape); - areAnimated = shape._isAnimated || areAnimated; - } - } - - if (tempShapes.length > 1 && areAnimated) { - this.setShapesAsAnimated(tempShapes); - } - } - }; - - SVGShapeElement.prototype.setShapesAsAnimated = function (shapes) { - var i; - var len = shapes.length; - - for (i = 0; i < len; i += 1) { - shapes[i].setAsAnimated(); - } - }; - - SVGShapeElement.prototype.createStyleElement = function (data, level) { - // TODO: prevent drawing of hidden styles - var elementData; - var styleOb = new SVGStyleData(data, level); - var pathElement = styleOb.pElem; - - if (data.ty === 'st') { - elementData = new SVGStrokeStyleData(this, data, styleOb); - } else if (data.ty === 'fl') { - elementData = new SVGFillStyleData(this, data, styleOb); - } else if (data.ty === 'gf' || data.ty === 'gs') { - var GradientConstructor = data.ty === 'gf' ? SVGGradientFillStyleData : SVGGradientStrokeStyleData; - elementData = new GradientConstructor(this, data, styleOb); - this.globalData.defs.appendChild(elementData.gf); - - if (elementData.maskId) { - this.globalData.defs.appendChild(elementData.ms); - this.globalData.defs.appendChild(elementData.of); - pathElement.setAttribute('mask', 'url(' + getLocationHref() + '#' + elementData.maskId + ')'); - } - } else if (data.ty === 'no') { - elementData = new SVGNoStyleData(this, data, styleOb); - } - - if (data.ty === 'st' || data.ty === 'gs') { - pathElement.setAttribute('stroke-linecap', lineCapEnum[data.lc || 2]); - pathElement.setAttribute('stroke-linejoin', lineJoinEnum[data.lj || 2]); - pathElement.setAttribute('fill-opacity', '0'); - - if (data.lj === 1) { - pathElement.setAttribute('stroke-miterlimit', data.ml); - } - } - - if (data.r === 2) { - pathElement.setAttribute('fill-rule', 'evenodd'); - } - - if (data.ln) { - pathElement.setAttribute('id', data.ln); - } - - if (data.cl) { - pathElement.setAttribute('class', data.cl); - } - - if (data.bm) { - pathElement.style['mix-blend-mode'] = getBlendMode(data.bm); - } - - this.stylesList.push(styleOb); - this.addToAnimatedContents(data, elementData); - return elementData; - }; - - SVGShapeElement.prototype.createGroupElement = function (data) { - var elementData = new ShapeGroupData(); - - if (data.ln) { - elementData.gr.setAttribute('id', data.ln); - } - - if (data.cl) { - elementData.gr.setAttribute('class', data.cl); - } - - if (data.bm) { - elementData.gr.style['mix-blend-mode'] = getBlendMode(data.bm); - } - - return elementData; - }; - - SVGShapeElement.prototype.createTransformElement = function (data, container) { - var transformProperty = TransformPropertyFactory.getTransformProperty(this, data, this); - var elementData = new SVGTransformData(transformProperty, transformProperty.o, container); - this.addToAnimatedContents(data, elementData); - return elementData; - }; - - SVGShapeElement.prototype.createShapeElement = function (data, ownTransformers, level) { - var ty = 4; - - if (data.ty === 'rc') { - ty = 5; - } else if (data.ty === 'el') { - ty = 6; - } else if (data.ty === 'sr') { - ty = 7; - } - - var shapeProperty = ShapePropertyFactory.getShapeProp(this, data, ty, this); - var elementData = new SVGShapeData(ownTransformers, level, shapeProperty); - this.shapes.push(elementData); - this.addShapeToModifiers(elementData); - this.addToAnimatedContents(data, elementData); - return elementData; - }; - - SVGShapeElement.prototype.addToAnimatedContents = function (data, element) { - var i = 0; - var len = this.animatedContents.length; - - while (i < len) { - if (this.animatedContents[i].element === element) { - return; - } - - i += 1; - } - - this.animatedContents.push({ - fn: SVGElementsRenderer.createRenderFunction(data), - element: element, - data: data - }); - }; - - SVGShapeElement.prototype.setElementStyles = function (elementData) { - var arr = elementData.styles; - var j; - var jLen = this.stylesList.length; - - for (j = 0; j < jLen; j += 1) { - if (!this.stylesList[j].closed) { - arr.push(this.stylesList[j]); - } - } - }; - - SVGShapeElement.prototype.reloadShapes = function () { - this._isFirstFrame = true; - var i; - var len = this.itemsData.length; - - for (i = 0; i < len; i += 1) { - this.prevViewData[i] = this.itemsData[i]; - } - - this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.layerElement, 0, [], true); - this.filterUniqueShapes(); - len = this.dynamicProperties.length; - - for (i = 0; i < len; i += 1) { - this.dynamicProperties[i].getValue(); - } - - this.renderModifiers(); - }; - - SVGShapeElement.prototype.searchShapes = function (arr, itemsData, prevViewData, container, level, transformers, render) { - var ownTransformers = [].concat(transformers); - var i; - var len = arr.length - 1; - var j; - var jLen; - var ownStyles = []; - var ownModifiers = []; - var currentTransform; - var modifier; - var processedPos; - - for (i = len; i >= 0; i -= 1) { - processedPos = this.searchProcessedElement(arr[i]); - - if (!processedPos) { - arr[i]._render = render; - } else { - itemsData[i] = prevViewData[processedPos - 1]; - } - - if (arr[i].ty === 'fl' || arr[i].ty === 'st' || arr[i].ty === 'gf' || arr[i].ty === 'gs' || arr[i].ty === 'no') { - if (!processedPos) { - itemsData[i] = this.createStyleElement(arr[i], level); - } else { - itemsData[i].style.closed = false; - } - - if (arr[i]._render) { - if (itemsData[i].style.pElem.parentNode !== container) { - container.appendChild(itemsData[i].style.pElem); - } - } - - ownStyles.push(itemsData[i].style); - } else if (arr[i].ty === 'gr') { - if (!processedPos) { - itemsData[i] = this.createGroupElement(arr[i]); - } else { - jLen = itemsData[i].it.length; - - for (j = 0; j < jLen; j += 1) { - itemsData[i].prevViewData[j] = itemsData[i].it[j]; - } - } - - this.searchShapes(arr[i].it, itemsData[i].it, itemsData[i].prevViewData, itemsData[i].gr, level + 1, ownTransformers, render); - - if (arr[i]._render) { - if (itemsData[i].gr.parentNode !== container) { - container.appendChild(itemsData[i].gr); - } - } - } else if (arr[i].ty === 'tr') { - if (!processedPos) { - itemsData[i] = this.createTransformElement(arr[i], container); - } - - currentTransform = itemsData[i].transform; - ownTransformers.push(currentTransform); - } else if (arr[i].ty === 'sh' || arr[i].ty === 'rc' || arr[i].ty === 'el' || arr[i].ty === 'sr') { - if (!processedPos) { - itemsData[i] = this.createShapeElement(arr[i], ownTransformers, level); - } - - this.setElementStyles(itemsData[i]); - } else if (arr[i].ty === 'tm' || arr[i].ty === 'rd' || arr[i].ty === 'ms' || arr[i].ty === 'pb') { - if (!processedPos) { - modifier = ShapeModifiers.getModifier(arr[i].ty); - modifier.init(this, arr[i]); - itemsData[i] = modifier; - this.shapeModifiers.push(modifier); - } else { - modifier = itemsData[i]; - modifier.closed = false; - } - - ownModifiers.push(modifier); - } else if (arr[i].ty === 'rp') { - if (!processedPos) { - modifier = ShapeModifiers.getModifier(arr[i].ty); - itemsData[i] = modifier; - modifier.init(this, arr, i, itemsData); - this.shapeModifiers.push(modifier); - render = false; - } else { - modifier = itemsData[i]; - modifier.closed = true; - } - - ownModifiers.push(modifier); - } - - this.addProcessedElement(arr[i], i + 1); - } - - len = ownStyles.length; - - for (i = 0; i < len; i += 1) { - ownStyles[i].closed = true; - } - - len = ownModifiers.length; - - for (i = 0; i < len; i += 1) { - ownModifiers[i].closed = true; - } - }; - - SVGShapeElement.prototype.renderInnerContent = function () { - this.renderModifiers(); - var i; - var len = this.stylesList.length; - - for (i = 0; i < len; i += 1) { - this.stylesList[i].reset(); - } - - this.renderShape(); - - for (i = 0; i < len; i += 1) { - if (this.stylesList[i]._mdf || this._isFirstFrame) { - if (this.stylesList[i].msElem) { - this.stylesList[i].msElem.setAttribute('d', this.stylesList[i].d); // Adding M0 0 fixes same mask bug on all browsers - - this.stylesList[i].d = 'M0 0' + this.stylesList[i].d; - } - - this.stylesList[i].pElem.setAttribute('d', this.stylesList[i].d || 'M0 0'); - } - } - }; - - SVGShapeElement.prototype.renderShape = function () { - var i; - var len = this.animatedContents.length; - var animatedContent; - - for (i = 0; i < len; i += 1) { - animatedContent = this.animatedContents[i]; - - if ((this._isFirstFrame || animatedContent.element._isAnimated) && animatedContent.data !== true) { - animatedContent.fn(animatedContent.data, animatedContent.element, this._isFirstFrame); - } - } - }; - - SVGShapeElement.prototype.destroy = function () { - this.destroyBaseElement(); - this.shapesData = null; - this.itemsData = null; - }; - - function LetterProps(o, sw, sc, fc, m, p) { - this.o = o; - this.sw = sw; - this.sc = sc; - this.fc = fc; - this.m = m; - this.p = p; - this._mdf = { - o: true, - sw: !!sw, - sc: !!sc, - fc: !!fc, - m: true, - p: true - }; - } - - LetterProps.prototype.update = function (o, sw, sc, fc, m, p) { - this._mdf.o = false; - this._mdf.sw = false; - this._mdf.sc = false; - this._mdf.fc = false; - this._mdf.m = false; - this._mdf.p = false; - var updated = false; - - if (this.o !== o) { - this.o = o; - this._mdf.o = true; - updated = true; - } - - if (this.sw !== sw) { - this.sw = sw; - this._mdf.sw = true; - updated = true; - } - - if (this.sc !== sc) { - this.sc = sc; - this._mdf.sc = true; - updated = true; - } - - if (this.fc !== fc) { - this.fc = fc; - this._mdf.fc = true; - updated = true; - } - - if (this.m !== m) { - this.m = m; - this._mdf.m = true; - updated = true; - } - - if (p.length && (this.p[0] !== p[0] || this.p[1] !== p[1] || this.p[4] !== p[4] || this.p[5] !== p[5] || this.p[12] !== p[12] || this.p[13] !== p[13])) { - this.p = p; - this._mdf.p = true; - updated = true; - } - - return updated; - }; - - function TextProperty(elem, data) { - this._frameId = initialDefaultFrame; - this.pv = ''; - this.v = ''; - this.kf = false; - this._isFirstFrame = true; - this._mdf = false; - this.data = data; - this.elem = elem; - this.comp = this.elem.comp; - this.keysIndex = 0; - this.canResize = false; - this.minimumFontSize = 1; - this.effectsSequence = []; - this.currentData = { - ascent: 0, - boxWidth: this.defaultBoxWidth, - f: '', - fStyle: '', - fWeight: '', - fc: '', - j: '', - justifyOffset: '', - l: [], - lh: 0, - lineWidths: [], - ls: '', - of: '', - s: '', - sc: '', - sw: 0, - t: 0, - tr: 0, - sz: 0, - ps: null, - fillColorAnim: false, - strokeColorAnim: false, - strokeWidthAnim: false, - yOffset: 0, - finalSize: 0, - finalText: [], - finalLineHeight: 0, - __complete: false - }; - this.copyData(this.currentData, this.data.d.k[0].s); - - if (!this.searchProperty()) { - this.completeTextData(this.currentData); - } - } - - TextProperty.prototype.defaultBoxWidth = [0, 0]; - - TextProperty.prototype.copyData = function (obj, data) { - for (var s in data) { - if (Object.prototype.hasOwnProperty.call(data, s)) { - obj[s] = data[s]; - } - } - - return obj; - }; - - TextProperty.prototype.setCurrentData = function (data) { - if (!data.__complete) { - this.completeTextData(data); - } - - this.currentData = data; - this.currentData.boxWidth = this.currentData.boxWidth || this.defaultBoxWidth; - this._mdf = true; - }; - - TextProperty.prototype.searchProperty = function () { - return this.searchKeyframes(); - }; - - TextProperty.prototype.searchKeyframes = function () { - this.kf = this.data.d.k.length > 1; - - if (this.kf) { - this.addEffect(this.getKeyframeValue.bind(this)); - } - - return this.kf; - }; - - TextProperty.prototype.addEffect = function (effectFunction) { - this.effectsSequence.push(effectFunction); - this.elem.addDynamicProperty(this); - }; - - TextProperty.prototype.getValue = function (_finalValue) { - if ((this.elem.globalData.frameId === this.frameId || !this.effectsSequence.length) && !_finalValue) { - return; - } - - this.currentData.t = this.data.d.k[this.keysIndex].s.t; - var currentValue = this.currentData; - var currentIndex = this.keysIndex; - - if (this.lock) { - this.setCurrentData(this.currentData); - return; - } - - this.lock = true; - this._mdf = false; - var i; - var len = this.effectsSequence.length; - var finalValue = _finalValue || this.data.d.k[this.keysIndex].s; - - for (i = 0; i < len; i += 1) { - // Checking if index changed to prevent creating a new object every time the expression updates. - if (currentIndex !== this.keysIndex) { - finalValue = this.effectsSequence[i](finalValue, finalValue.t); - } else { - finalValue = this.effectsSequence[i](this.currentData, finalValue.t); - } - } - - if (currentValue !== finalValue) { - this.setCurrentData(finalValue); - } - - this.v = this.currentData; - this.pv = this.v; - this.lock = false; - this.frameId = this.elem.globalData.frameId; - }; - - TextProperty.prototype.getKeyframeValue = function () { - var textKeys = this.data.d.k; - var frameNum = this.elem.comp.renderedFrame; - var i = 0; - var len = textKeys.length; - - while (i <= len - 1) { - if (i === len - 1 || textKeys[i + 1].t > frameNum) { - break; - } - - i += 1; - } - - if (this.keysIndex !== i) { - this.keysIndex = i; - } - - return this.data.d.k[this.keysIndex].s; - }; - - TextProperty.prototype.buildFinalText = function (text) { - var charactersArray = []; - var i = 0; - var len = text.length; - var charCode; - var secondCharCode; - var shouldCombine = false; - - while (i < len) { - charCode = text.charCodeAt(i); - - if (FontManager.isCombinedCharacter(charCode)) { - charactersArray[charactersArray.length - 1] += text.charAt(i); - } else if (charCode >= 0xD800 && charCode <= 0xDBFF) { - secondCharCode = text.charCodeAt(i + 1); - - if (secondCharCode >= 0xDC00 && secondCharCode <= 0xDFFF) { - if (shouldCombine || FontManager.isModifier(charCode, secondCharCode)) { - charactersArray[charactersArray.length - 1] += text.substr(i, 2); - shouldCombine = false; - } else { - charactersArray.push(text.substr(i, 2)); - } - - i += 1; - } else { - charactersArray.push(text.charAt(i)); - } - } else if (charCode > 0xDBFF) { - secondCharCode = text.charCodeAt(i + 1); - - if (FontManager.isZeroWidthJoiner(charCode, secondCharCode)) { - shouldCombine = true; - charactersArray[charactersArray.length - 1] += text.substr(i, 2); - i += 1; - } else { - charactersArray.push(text.charAt(i)); - } - } else if (FontManager.isZeroWidthJoiner(charCode)) { - charactersArray[charactersArray.length - 1] += text.charAt(i); - shouldCombine = true; - } else { - charactersArray.push(text.charAt(i)); - } - - i += 1; - } - - return charactersArray; - }; - - TextProperty.prototype.completeTextData = function (documentData) { - documentData.__complete = true; - var fontManager = this.elem.globalData.fontManager; - var data = this.data; - var letters = []; - var i; - var len; - var newLineFlag; - var index = 0; - var val; - var anchorGrouping = data.m.g; - var currentSize = 0; - var currentPos = 0; - var currentLine = 0; - var lineWidths = []; - var lineWidth = 0; - var maxLineWidth = 0; - var j; - var jLen; - var fontData = fontManager.getFontByName(documentData.f); - var charData; - var cLength = 0; - var fontProps = getFontProperties(fontData); - documentData.fWeight = fontProps.weight; - documentData.fStyle = fontProps.style; - documentData.finalSize = documentData.s; - documentData.finalText = this.buildFinalText(documentData.t); - len = documentData.finalText.length; - documentData.finalLineHeight = documentData.lh; - var trackingOffset = documentData.tr / 1000 * documentData.finalSize; - var charCode; - - if (documentData.sz) { - var flag = true; - var boxWidth = documentData.sz[0]; - var boxHeight = documentData.sz[1]; - var currentHeight; - var finalText; - - while (flag) { - finalText = this.buildFinalText(documentData.t); - currentHeight = 0; - lineWidth = 0; - len = finalText.length; - trackingOffset = documentData.tr / 1000 * documentData.finalSize; - var lastSpaceIndex = -1; - - for (i = 0; i < len; i += 1) { - charCode = finalText[i].charCodeAt(0); - newLineFlag = false; - - if (finalText[i] === ' ') { - lastSpaceIndex = i; - } else if (charCode === 13 || charCode === 3) { - lineWidth = 0; - newLineFlag = true; - currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2; - } - - if (fontManager.chars) { - charData = fontManager.getCharData(finalText[i], fontData.fStyle, fontData.fFamily); - cLength = newLineFlag ? 0 : charData.w * documentData.finalSize / 100; - } else { - // tCanvasHelper.font = documentData.s + 'px '+ fontData.fFamily; - cLength = fontManager.measureText(finalText[i], documentData.f, documentData.finalSize); - } - - if (lineWidth + cLength > boxWidth && finalText[i] !== ' ') { - if (lastSpaceIndex === -1) { - len += 1; - } else { - i = lastSpaceIndex; - } - - currentHeight += documentData.finalLineHeight || documentData.finalSize * 1.2; - finalText.splice(i, lastSpaceIndex === i ? 1 : 0, '\r'); // finalText = finalText.substr(0,i) + "\r" + finalText.substr(i === lastSpaceIndex ? i + 1 : i); - - lastSpaceIndex = -1; - lineWidth = 0; - } else { - lineWidth += cLength; - lineWidth += trackingOffset; - } - } - - currentHeight += fontData.ascent * documentData.finalSize / 100; - - if (this.canResize && documentData.finalSize > this.minimumFontSize && boxHeight < currentHeight) { - documentData.finalSize -= 1; - documentData.finalLineHeight = documentData.finalSize * documentData.lh / documentData.s; - } else { - documentData.finalText = finalText; - len = documentData.finalText.length; - flag = false; - } - } - } - - lineWidth = -trackingOffset; - cLength = 0; - var uncollapsedSpaces = 0; - var currentChar; - - for (i = 0; i < len; i += 1) { - newLineFlag = false; - currentChar = documentData.finalText[i]; - charCode = currentChar.charCodeAt(0); - - if (charCode === 13 || charCode === 3) { - uncollapsedSpaces = 0; - lineWidths.push(lineWidth); - maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth; - lineWidth = -2 * trackingOffset; - val = ''; - newLineFlag = true; - currentLine += 1; - } else { - val = currentChar; - } - - if (fontManager.chars) { - charData = fontManager.getCharData(currentChar, fontData.fStyle, fontManager.getFontByName(documentData.f).fFamily); - cLength = newLineFlag ? 0 : charData.w * documentData.finalSize / 100; - } else { - // var charWidth = fontManager.measureText(val, documentData.f, documentData.finalSize); - // tCanvasHelper.font = documentData.finalSize + 'px '+ fontManager.getFontByName(documentData.f).fFamily; - cLength = fontManager.measureText(val, documentData.f, documentData.finalSize); - } // - - - if (currentChar === ' ') { - uncollapsedSpaces += cLength + trackingOffset; - } else { - lineWidth += cLength + trackingOffset + uncollapsedSpaces; - uncollapsedSpaces = 0; - } - - letters.push({ - l: cLength, - an: cLength, - add: currentSize, - n: newLineFlag, - anIndexes: [], - val: val, - line: currentLine, - animatorJustifyOffset: 0 - }); - - if (anchorGrouping == 2) { - // eslint-disable-line eqeqeq - currentSize += cLength; - - if (val === '' || val === ' ' || i === len - 1) { - if (val === '' || val === ' ') { - currentSize -= cLength; - } - - while (currentPos <= i) { - letters[currentPos].an = currentSize; - letters[currentPos].ind = index; - letters[currentPos].extra = cLength; - currentPos += 1; - } - - index += 1; - currentSize = 0; - } - } else if (anchorGrouping == 3) { - // eslint-disable-line eqeqeq - currentSize += cLength; - - if (val === '' || i === len - 1) { - if (val === '') { - currentSize -= cLength; - } - - while (currentPos <= i) { - letters[currentPos].an = currentSize; - letters[currentPos].ind = index; - letters[currentPos].extra = cLength; - currentPos += 1; - } - - currentSize = 0; - index += 1; - } - } else { - letters[index].ind = index; - letters[index].extra = 0; - index += 1; - } - } - - documentData.l = letters; - maxLineWidth = lineWidth > maxLineWidth ? lineWidth : maxLineWidth; - lineWidths.push(lineWidth); - - if (documentData.sz) { - documentData.boxWidth = documentData.sz[0]; - documentData.justifyOffset = 0; - } else { - documentData.boxWidth = maxLineWidth; - - switch (documentData.j) { - case 1: - documentData.justifyOffset = -documentData.boxWidth; - break; - - case 2: - documentData.justifyOffset = -documentData.boxWidth / 2; - break; - - default: - documentData.justifyOffset = 0; - } - } - - documentData.lineWidths = lineWidths; - var animators = data.a; - var animatorData; - var letterData; - jLen = animators.length; - var based; - var ind; - var indexes = []; - - for (j = 0; j < jLen; j += 1) { - animatorData = animators[j]; - - if (animatorData.a.sc) { - documentData.strokeColorAnim = true; - } - - if (animatorData.a.sw) { - documentData.strokeWidthAnim = true; - } - - if (animatorData.a.fc || animatorData.a.fh || animatorData.a.fs || animatorData.a.fb) { - documentData.fillColorAnim = true; - } - - ind = 0; - based = animatorData.s.b; - - for (i = 0; i < len; i += 1) { - letterData = letters[i]; - letterData.anIndexes[j] = ind; - - if (based == 1 && letterData.val !== '' || based == 2 && letterData.val !== '' && letterData.val !== ' ' || based == 3 && (letterData.n || letterData.val == ' ' || i == len - 1) || based == 4 && (letterData.n || i == len - 1)) { - // eslint-disable-line eqeqeq - if (animatorData.s.rn === 1) { - indexes.push(ind); - } - - ind += 1; - } - } - - data.a[j].s.totalChars = ind; - var currentInd = -1; - var newInd; - - if (animatorData.s.rn === 1) { - for (i = 0; i < len; i += 1) { - letterData = letters[i]; - - if (currentInd != letterData.anIndexes[j]) { - // eslint-disable-line eqeqeq - currentInd = letterData.anIndexes[j]; - newInd = indexes.splice(Math.floor(Math.random() * indexes.length), 1)[0]; - } - - letterData.anIndexes[j] = newInd; - } - } - } - - documentData.yOffset = documentData.finalLineHeight || documentData.finalSize * 1.2; - documentData.ls = documentData.ls || 0; - documentData.ascent = fontData.ascent * documentData.finalSize / 100; - }; - - TextProperty.prototype.updateDocumentData = function (newData, index) { - index = index === undefined ? this.keysIndex : index; - var dData = this.copyData({}, this.data.d.k[index].s); - dData = this.copyData(dData, newData); - this.data.d.k[index].s = dData; - this.recalculate(index); - this.elem.addDynamicProperty(this); - }; - - TextProperty.prototype.recalculate = function (index) { - var dData = this.data.d.k[index].s; - dData.__complete = false; - this.keysIndex = 0; - this._isFirstFrame = true; - this.getValue(dData); - }; - - TextProperty.prototype.canResizeFont = function (_canResize) { - this.canResize = _canResize; - this.recalculate(this.keysIndex); - this.elem.addDynamicProperty(this); - }; - - TextProperty.prototype.setMinimumFontSize = function (_fontValue) { - this.minimumFontSize = Math.floor(_fontValue) || 1; - this.recalculate(this.keysIndex); - this.elem.addDynamicProperty(this); - }; - - var TextSelectorProp = function () { - var max = Math.max; - var min = Math.min; - var floor = Math.floor; - - function TextSelectorPropFactory(elem, data) { - this._currentTextLength = -1; - this.k = false; - this.data = data; - this.elem = elem; - this.comp = elem.comp; - this.finalS = 0; - this.finalE = 0; - this.initDynamicPropertyContainer(elem); - this.s = PropertyFactory.getProp(elem, data.s || { - k: 0 - }, 0, 0, this); - - if ('e' in data) { - this.e = PropertyFactory.getProp(elem, data.e, 0, 0, this); - } else { - this.e = { - v: 100 - }; - } - - this.o = PropertyFactory.getProp(elem, data.o || { - k: 0 - }, 0, 0, this); - this.xe = PropertyFactory.getProp(elem, data.xe || { - k: 0 - }, 0, 0, this); - this.ne = PropertyFactory.getProp(elem, data.ne || { - k: 0 - }, 0, 0, this); - this.sm = PropertyFactory.getProp(elem, data.sm || { - k: 100 - }, 0, 0, this); - this.a = PropertyFactory.getProp(elem, data.a, 0, 0.01, this); - - if (!this.dynamicProperties.length) { - this.getValue(); - } - } - - TextSelectorPropFactory.prototype = { - getMult: function getMult(ind) { - if (this._currentTextLength !== this.elem.textProperty.currentData.l.length) { - this.getValue(); - } - - var x1 = 0; - var y1 = 0; - var x2 = 1; - var y2 = 1; - - if (this.ne.v > 0) { - x1 = this.ne.v / 100.0; - } else { - y1 = -this.ne.v / 100.0; - } - - if (this.xe.v > 0) { - x2 = 1.0 - this.xe.v / 100.0; - } else { - y2 = 1.0 + this.xe.v / 100.0; - } - - var easer = BezierFactory.getBezierEasing(x1, y1, x2, y2).get; - var mult = 0; - var s = this.finalS; - var e = this.finalE; - var type = this.data.sh; - - if (type === 2) { - if (e === s) { - mult = ind >= e ? 1 : 0; - } else { - mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1)); - } - - mult = easer(mult); - } else if (type === 3) { - if (e === s) { - mult = ind >= e ? 0 : 1; - } else { - mult = 1 - max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1)); - } - - mult = easer(mult); - } else if (type === 4) { - if (e === s) { - mult = 0; - } else { - mult = max(0, min(0.5 / (e - s) + (ind - s) / (e - s), 1)); - - if (mult < 0.5) { - mult *= 2; - } else { - mult = 1 - 2 * (mult - 0.5); - } - } - - mult = easer(mult); - } else if (type === 5) { - if (e === s) { - mult = 0; - } else { - var tot = e - s; - /* ind += 0.5; - mult = -4/(tot*tot)*(ind*ind)+(4/tot)*ind; */ - - ind = min(max(0, ind + 0.5 - s), e - s); - var x = -tot / 2 + ind; - var a = tot / 2; - mult = Math.sqrt(1 - x * x / (a * a)); - } - - mult = easer(mult); - } else if (type === 6) { - if (e === s) { - mult = 0; - } else { - ind = min(max(0, ind + 0.5 - s), e - s); - mult = (1 + Math.cos(Math.PI + Math.PI * 2 * ind / (e - s))) / 2; // eslint-disable-line - } - - mult = easer(mult); - } else { - if (ind >= floor(s)) { - if (ind - s < 0) { - mult = max(0, min(min(e, 1) - (s - ind), 1)); - } else { - mult = max(0, min(e - ind, 1)); - } - } - - mult = easer(mult); - } // Smoothness implementation. - // The smoothness represents a reduced range of the original [0; 1] range. - // if smoothness is 25%, the new range will be [0.375; 0.625] - // Steps are: - // - find the lower value of the new range (threshold) - // - if multiplier is smaller than that value, floor it to 0 - // - if it is larger, - // - subtract the threshold - // - divide it by the smoothness (this will return the range to [0; 1]) - // Note: If it doesn't work on some scenarios, consider applying it before the easer. - - - if (this.sm.v !== 100) { - var smoothness = this.sm.v * 0.01; - - if (smoothness === 0) { - smoothness = 0.00000001; - } - - var threshold = 0.5 - smoothness * 0.5; - - if (mult < threshold) { - mult = 0; - } else { - mult = (mult - threshold) / smoothness; - - if (mult > 1) { - mult = 1; - } - } - } - - return mult * this.a.v; - }, - getValue: function getValue(newCharsFlag) { - this.iterateDynamicProperties(); - this._mdf = newCharsFlag || this._mdf; - this._currentTextLength = this.elem.textProperty.currentData.l.length || 0; - - if (newCharsFlag && this.data.r === 2) { - this.e.v = this._currentTextLength; - } - - var divisor = this.data.r === 2 ? 1 : 100 / this.data.totalChars; - var o = this.o.v / divisor; - var s = this.s.v / divisor + o; - var e = this.e.v / divisor + o; - - if (s > e) { - var _s = s; - s = e; - e = _s; - } - - this.finalS = s; - this.finalE = e; - } - }; - extendPrototype([DynamicPropertyContainer], TextSelectorPropFactory); - - function getTextSelectorProp(elem, data, arr) { - return new TextSelectorPropFactory(elem, data, arr); - } - - return { - getTextSelectorProp: getTextSelectorProp - }; - }(); - - function TextAnimatorDataProperty(elem, animatorProps, container) { - var defaultData = { - propType: false - }; - var getProp = PropertyFactory.getProp; - var textAnimatorAnimatables = animatorProps.a; - this.a = { - r: textAnimatorAnimatables.r ? getProp(elem, textAnimatorAnimatables.r, 0, degToRads, container) : defaultData, - rx: textAnimatorAnimatables.rx ? getProp(elem, textAnimatorAnimatables.rx, 0, degToRads, container) : defaultData, - ry: textAnimatorAnimatables.ry ? getProp(elem, textAnimatorAnimatables.ry, 0, degToRads, container) : defaultData, - sk: textAnimatorAnimatables.sk ? getProp(elem, textAnimatorAnimatables.sk, 0, degToRads, container) : defaultData, - sa: textAnimatorAnimatables.sa ? getProp(elem, textAnimatorAnimatables.sa, 0, degToRads, container) : defaultData, - s: textAnimatorAnimatables.s ? getProp(elem, textAnimatorAnimatables.s, 1, 0.01, container) : defaultData, - a: textAnimatorAnimatables.a ? getProp(elem, textAnimatorAnimatables.a, 1, 0, container) : defaultData, - o: textAnimatorAnimatables.o ? getProp(elem, textAnimatorAnimatables.o, 0, 0.01, container) : defaultData, - p: textAnimatorAnimatables.p ? getProp(elem, textAnimatorAnimatables.p, 1, 0, container) : defaultData, - sw: textAnimatorAnimatables.sw ? getProp(elem, textAnimatorAnimatables.sw, 0, 0, container) : defaultData, - sc: textAnimatorAnimatables.sc ? getProp(elem, textAnimatorAnimatables.sc, 1, 0, container) : defaultData, - fc: textAnimatorAnimatables.fc ? getProp(elem, textAnimatorAnimatables.fc, 1, 0, container) : defaultData, - fh: textAnimatorAnimatables.fh ? getProp(elem, textAnimatorAnimatables.fh, 0, 0, container) : defaultData, - fs: textAnimatorAnimatables.fs ? getProp(elem, textAnimatorAnimatables.fs, 0, 0.01, container) : defaultData, - fb: textAnimatorAnimatables.fb ? getProp(elem, textAnimatorAnimatables.fb, 0, 0.01, container) : defaultData, - t: textAnimatorAnimatables.t ? getProp(elem, textAnimatorAnimatables.t, 0, 0, container) : defaultData - }; - this.s = TextSelectorProp.getTextSelectorProp(elem, animatorProps.s, container); - this.s.t = animatorProps.s.t; - } - - function TextAnimatorProperty(textData, renderType, elem) { - this._isFirstFrame = true; - this._hasMaskedPath = false; - this._frameId = -1; - this._textData = textData; - this._renderType = renderType; - this._elem = elem; - this._animatorsData = createSizedArray(this._textData.a.length); - this._pathData = {}; - this._moreOptions = { - alignment: {} - }; - this.renderedLetters = []; - this.lettersChangedFlag = false; - this.initDynamicPropertyContainer(elem); - } - - TextAnimatorProperty.prototype.searchProperties = function () { - var i; - var len = this._textData.a.length; - var animatorProps; - var getProp = PropertyFactory.getProp; - - for (i = 0; i < len; i += 1) { - animatorProps = this._textData.a[i]; - this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this); - } - - if (this._textData.p && 'm' in this._textData.p) { - this._pathData = { - a: getProp(this._elem, this._textData.p.a, 0, 0, this), - f: getProp(this._elem, this._textData.p.f, 0, 0, this), - l: getProp(this._elem, this._textData.p.l, 0, 0, this), - r: getProp(this._elem, this._textData.p.r, 0, 0, this), - p: getProp(this._elem, this._textData.p.p, 0, 0, this), - m: this._elem.maskManager.getMaskProperty(this._textData.p.m) - }; - this._hasMaskedPath = true; - } else { - this._hasMaskedPath = false; - } - - this._moreOptions.alignment = getProp(this._elem, this._textData.m.a, 1, 0, this); - }; - - TextAnimatorProperty.prototype.getMeasures = function (documentData, lettersChangedFlag) { - this.lettersChangedFlag = lettersChangedFlag; - - if (!this._mdf && !this._isFirstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m._mdf)) { - return; - } - - this._isFirstFrame = false; - var alignment = this._moreOptions.alignment.v; - var animators = this._animatorsData; - var textData = this._textData; - var matrixHelper = this.mHelper; - var renderType = this._renderType; - var renderedLettersCount = this.renderedLetters.length; - var xPos; - var yPos; - var i; - var len; - var letters = documentData.l; - var pathInfo; - var currentLength; - var currentPoint; - var segmentLength; - var flag; - var pointInd; - var segmentInd; - var prevPoint; - var points; - var segments; - var partialLength; - var totalLength; - var perc; - var tanAngle; - var mask; - - if (this._hasMaskedPath) { - mask = this._pathData.m; - - if (!this._pathData.n || this._pathData._mdf) { - var paths = mask.v; - - if (this._pathData.r.v) { - paths = paths.reverse(); - } // TODO: release bezier data cached from previous pathInfo: this._pathData.pi - - - pathInfo = { - tLength: 0, - segments: [] - }; - len = paths._length - 1; - var bezierData; - totalLength = 0; - - for (i = 0; i < len; i += 1) { - bezierData = bez.buildBezierData(paths.v[i], paths.v[i + 1], [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]], [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]); - pathInfo.tLength += bezierData.segmentLength; - pathInfo.segments.push(bezierData); - totalLength += bezierData.segmentLength; - } - - i = len; - - if (mask.v.c) { - bezierData = bez.buildBezierData(paths.v[i], paths.v[0], [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]], [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]); - pathInfo.tLength += bezierData.segmentLength; - pathInfo.segments.push(bezierData); - totalLength += bezierData.segmentLength; - } - - this._pathData.pi = pathInfo; - } - - pathInfo = this._pathData.pi; - currentLength = this._pathData.f.v; - segmentInd = 0; - pointInd = 1; - segmentLength = 0; - flag = true; - segments = pathInfo.segments; - - if (currentLength < 0 && mask.v.c) { - if (pathInfo.tLength < Math.abs(currentLength)) { - currentLength = -Math.abs(currentLength) % pathInfo.tLength; - } - - segmentInd = segments.length - 1; - points = segments[segmentInd].points; - pointInd = points.length - 1; - - while (currentLength < 0) { - currentLength += points[pointInd].partialLength; - pointInd -= 1; - - if (pointInd < 0) { - segmentInd -= 1; - points = segments[segmentInd].points; - pointInd = points.length - 1; - } - } - } - - points = segments[segmentInd].points; - prevPoint = points[pointInd - 1]; - currentPoint = points[pointInd]; - partialLength = currentPoint.partialLength; - } - - len = letters.length; - xPos = 0; - yPos = 0; - var yOff = documentData.finalSize * 1.2 * 0.714; - var firstLine = true; - var animatorProps; - var animatorSelector; - var j; - var jLen; - var letterValue; - jLen = animators.length; - var mult; - var ind = -1; - var offf; - var xPathPos; - var yPathPos; - var initPathPos = currentLength; - var initSegmentInd = segmentInd; - var initPointInd = pointInd; - var currentLine = -1; - var elemOpacity; - var sc; - var sw; - var fc; - var k; - var letterSw; - var letterSc; - var letterFc; - var letterM = ''; - var letterP = this.defaultPropsArray; - var letterO; // - - if (documentData.j === 2 || documentData.j === 1) { - var animatorJustifyOffset = 0; - var animatorFirstCharOffset = 0; - var justifyOffsetMult = documentData.j === 2 ? -0.5 : -1; - var lastIndex = 0; - var isNewLine = true; - - for (i = 0; i < len; i += 1) { - if (letters[i].n) { - if (animatorJustifyOffset) { - animatorJustifyOffset += animatorFirstCharOffset; - } - - while (lastIndex < i) { - letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset; - lastIndex += 1; - } - - animatorJustifyOffset = 0; - isNewLine = true; - } else { - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.t.propType) { - if (isNewLine && documentData.j === 2) { - animatorFirstCharOffset += animatorProps.t.v * justifyOffsetMult; - } - - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (mult.length) { - animatorJustifyOffset += animatorProps.t.v * mult[0] * justifyOffsetMult; - } else { - animatorJustifyOffset += animatorProps.t.v * mult * justifyOffsetMult; - } - } - } - - isNewLine = false; - } - } - - if (animatorJustifyOffset) { - animatorJustifyOffset += animatorFirstCharOffset; - } - - while (lastIndex < i) { - letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset; - lastIndex += 1; - } - } // - - - for (i = 0; i < len; i += 1) { - matrixHelper.reset(); - elemOpacity = 1; - - if (letters[i].n) { - xPos = 0; - yPos += documentData.yOffset; - yPos += firstLine ? 1 : 0; - currentLength = initPathPos; - firstLine = false; - - if (this._hasMaskedPath) { - segmentInd = initSegmentInd; - pointInd = initPointInd; - points = segments[segmentInd].points; - prevPoint = points[pointInd - 1]; - currentPoint = points[pointInd]; - partialLength = currentPoint.partialLength; - segmentLength = 0; - } - - letterM = ''; - letterFc = ''; - letterSw = ''; - letterO = ''; - letterP = this.defaultPropsArray; - } else { - if (this._hasMaskedPath) { - if (currentLine !== letters[i].line) { - switch (documentData.j) { - case 1: - currentLength += totalLength - documentData.lineWidths[letters[i].line]; - break; - - case 2: - currentLength += (totalLength - documentData.lineWidths[letters[i].line]) / 2; - break; - - default: - break; - } - - currentLine = letters[i].line; - } - - if (ind !== letters[i].ind) { - if (letters[ind]) { - currentLength += letters[ind].extra; - } - - currentLength += letters[i].an / 2; - ind = letters[i].ind; - } - - currentLength += alignment[0] * letters[i].an * 0.005; - var animatorOffset = 0; - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.p.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (mult.length) { - animatorOffset += animatorProps.p.v[0] * mult[0]; - } else { - animatorOffset += animatorProps.p.v[0] * mult; - } - } - - if (animatorProps.a.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (mult.length) { - animatorOffset += animatorProps.a.v[0] * mult[0]; - } else { - animatorOffset += animatorProps.a.v[0] * mult; - } - } - } - - flag = true; // Force alignment only works with a single line for now - - if (this._pathData.a.v) { - currentLength = letters[0].an * 0.5 + (totalLength - this._pathData.f.v - letters[0].an * 0.5 - letters[letters.length - 1].an * 0.5) * ind / (len - 1); - currentLength += this._pathData.f.v; - } - - while (flag) { - if (segmentLength + partialLength >= currentLength + animatorOffset || !points) { - perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength; - xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc; - yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc; - matrixHelper.translate(-alignment[0] * letters[i].an * 0.005, -(alignment[1] * yOff) * 0.01); - flag = false; - } else if (points) { - segmentLength += currentPoint.partialLength; - pointInd += 1; - - if (pointInd >= points.length) { - pointInd = 0; - segmentInd += 1; - - if (!segments[segmentInd]) { - if (mask.v.c) { - pointInd = 0; - segmentInd = 0; - points = segments[segmentInd].points; - } else { - segmentLength -= currentPoint.partialLength; - points = null; - } - } else { - points = segments[segmentInd].points; - } - } - - if (points) { - prevPoint = currentPoint; - currentPoint = points[pointInd]; - partialLength = currentPoint.partialLength; - } - } - } - - offf = letters[i].an / 2 - letters[i].add; - matrixHelper.translate(-offf, 0, 0); - } else { - offf = letters[i].an / 2 - letters[i].add; - matrixHelper.translate(-offf, 0, 0); // Grouping alignment - - matrixHelper.translate(-alignment[0] * letters[i].an * 0.005, -alignment[1] * yOff * 0.01, 0); - } - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.t.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); // This condition is to prevent applying tracking to first character in each line. Might be better to use a boolean "isNewLine" - - if (xPos !== 0 || documentData.j !== 0) { - if (this._hasMaskedPath) { - if (mult.length) { - currentLength += animatorProps.t.v * mult[0]; - } else { - currentLength += animatorProps.t.v * mult; - } - } else if (mult.length) { - xPos += animatorProps.t.v * mult[0]; - } else { - xPos += animatorProps.t.v * mult; - } - } - } - } - - if (documentData.strokeWidthAnim) { - sw = documentData.sw || 0; - } - - if (documentData.strokeColorAnim) { - if (documentData.sc) { - sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]]; - } else { - sc = [0, 0, 0]; - } - } - - if (documentData.fillColorAnim && documentData.fc) { - fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]]; - } - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.a.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (mult.length) { - matrixHelper.translate(-animatorProps.a.v[0] * mult[0], -animatorProps.a.v[1] * mult[1], animatorProps.a.v[2] * mult[2]); - } else { - matrixHelper.translate(-animatorProps.a.v[0] * mult, -animatorProps.a.v[1] * mult, animatorProps.a.v[2] * mult); - } - } - } - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.s.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (mult.length) { - matrixHelper.scale(1 + (animatorProps.s.v[0] - 1) * mult[0], 1 + (animatorProps.s.v[1] - 1) * mult[1], 1); - } else { - matrixHelper.scale(1 + (animatorProps.s.v[0] - 1) * mult, 1 + (animatorProps.s.v[1] - 1) * mult, 1); - } - } - } - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (animatorProps.sk.propType) { - if (mult.length) { - matrixHelper.skewFromAxis(-animatorProps.sk.v * mult[0], animatorProps.sa.v * mult[1]); - } else { - matrixHelper.skewFromAxis(-animatorProps.sk.v * mult, animatorProps.sa.v * mult); - } - } - - if (animatorProps.r.propType) { - if (mult.length) { - matrixHelper.rotateZ(-animatorProps.r.v * mult[2]); - } else { - matrixHelper.rotateZ(-animatorProps.r.v * mult); - } - } - - if (animatorProps.ry.propType) { - if (mult.length) { - matrixHelper.rotateY(animatorProps.ry.v * mult[1]); - } else { - matrixHelper.rotateY(animatorProps.ry.v * mult); - } - } - - if (animatorProps.rx.propType) { - if (mult.length) { - matrixHelper.rotateX(animatorProps.rx.v * mult[0]); - } else { - matrixHelper.rotateX(animatorProps.rx.v * mult); - } - } - - if (animatorProps.o.propType) { - if (mult.length) { - elemOpacity += (animatorProps.o.v * mult[0] - elemOpacity) * mult[0]; - } else { - elemOpacity += (animatorProps.o.v * mult - elemOpacity) * mult; - } - } - - if (documentData.strokeWidthAnim && animatorProps.sw.propType) { - if (mult.length) { - sw += animatorProps.sw.v * mult[0]; - } else { - sw += animatorProps.sw.v * mult; - } - } - - if (documentData.strokeColorAnim && animatorProps.sc.propType) { - for (k = 0; k < 3; k += 1) { - if (mult.length) { - sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult[0]; - } else { - sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult; - } - } - } - - if (documentData.fillColorAnim && documentData.fc) { - if (animatorProps.fc.propType) { - for (k = 0; k < 3; k += 1) { - if (mult.length) { - fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult[0]; - } else { - fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult; - } - } - } - - if (animatorProps.fh.propType) { - if (mult.length) { - fc = addHueToRGB(fc, animatorProps.fh.v * mult[0]); - } else { - fc = addHueToRGB(fc, animatorProps.fh.v * mult); - } - } - - if (animatorProps.fs.propType) { - if (mult.length) { - fc = addSaturationToRGB(fc, animatorProps.fs.v * mult[0]); - } else { - fc = addSaturationToRGB(fc, animatorProps.fs.v * mult); - } - } - - if (animatorProps.fb.propType) { - if (mult.length) { - fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult[0]); - } else { - fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult); - } - } - } - } - - for (j = 0; j < jLen; j += 1) { - animatorProps = animators[j].a; - - if (animatorProps.p.propType) { - animatorSelector = animators[j].s; - mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars); - - if (this._hasMaskedPath) { - if (mult.length) { - matrixHelper.translate(0, animatorProps.p.v[1] * mult[0], -animatorProps.p.v[2] * mult[1]); - } else { - matrixHelper.translate(0, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult); - } - } else if (mult.length) { - matrixHelper.translate(animatorProps.p.v[0] * mult[0], animatorProps.p.v[1] * mult[1], -animatorProps.p.v[2] * mult[2]); - } else { - matrixHelper.translate(animatorProps.p.v[0] * mult, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult); - } - } - } - - if (documentData.strokeWidthAnim) { - letterSw = sw < 0 ? 0 : sw; - } - - if (documentData.strokeColorAnim) { - letterSc = 'rgb(' + Math.round(sc[0] * 255) + ',' + Math.round(sc[1] * 255) + ',' + Math.round(sc[2] * 255) + ')'; - } - - if (documentData.fillColorAnim && documentData.fc) { - letterFc = 'rgb(' + Math.round(fc[0] * 255) + ',' + Math.round(fc[1] * 255) + ',' + Math.round(fc[2] * 255) + ')'; - } - - if (this._hasMaskedPath) { - matrixHelper.translate(0, -documentData.ls); - matrixHelper.translate(0, alignment[1] * yOff * 0.01 + yPos, 0); - - if (this._pathData.p.v) { - tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]); - var rot = Math.atan(tanAngle) * 180 / Math.PI; - - if (currentPoint.point[0] < prevPoint.point[0]) { - rot += 180; - } - - matrixHelper.rotate(-rot * Math.PI / 180); - } - - matrixHelper.translate(xPathPos, yPathPos, 0); - currentLength -= alignment[0] * letters[i].an * 0.005; - - if (letters[i + 1] && ind !== letters[i + 1].ind) { - currentLength += letters[i].an / 2; - currentLength += documentData.tr * 0.001 * documentData.finalSize; - } - } else { - matrixHelper.translate(xPos, yPos, 0); - - if (documentData.ps) { - // matrixHelper.translate(documentData.ps[0],documentData.ps[1],0); - matrixHelper.translate(documentData.ps[0], documentData.ps[1] + documentData.ascent, 0); - } - - switch (documentData.j) { - case 1: - matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]), 0, 0); - break; - - case 2: - matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]) / 2, 0, 0); - break; - - default: - break; - } - - matrixHelper.translate(0, -documentData.ls); - matrixHelper.translate(offf, 0, 0); - matrixHelper.translate(alignment[0] * letters[i].an * 0.005, alignment[1] * yOff * 0.01, 0); - xPos += letters[i].l + documentData.tr * 0.001 * documentData.finalSize; - } - - if (renderType === 'html') { - letterM = matrixHelper.toCSS(); - } else if (renderType === 'svg') { - letterM = matrixHelper.to2dCSS(); - } else { - letterP = [matrixHelper.props[0], matrixHelper.props[1], matrixHelper.props[2], matrixHelper.props[3], matrixHelper.props[4], matrixHelper.props[5], matrixHelper.props[6], matrixHelper.props[7], matrixHelper.props[8], matrixHelper.props[9], matrixHelper.props[10], matrixHelper.props[11], matrixHelper.props[12], matrixHelper.props[13], matrixHelper.props[14], matrixHelper.props[15]]; - } - - letterO = elemOpacity; - } - - if (renderedLettersCount <= i) { - letterValue = new LetterProps(letterO, letterSw, letterSc, letterFc, letterM, letterP); - this.renderedLetters.push(letterValue); - renderedLettersCount += 1; - this.lettersChangedFlag = true; - } else { - letterValue = this.renderedLetters[i]; - this.lettersChangedFlag = letterValue.update(letterO, letterSw, letterSc, letterFc, letterM, letterP) || this.lettersChangedFlag; - } - } - }; - - TextAnimatorProperty.prototype.getValue = function () { - if (this._elem.globalData.frameId === this._frameId) { - return; - } - - this._frameId = this._elem.globalData.frameId; - this.iterateDynamicProperties(); - }; - - TextAnimatorProperty.prototype.mHelper = new Matrix(); - TextAnimatorProperty.prototype.defaultPropsArray = []; - extendPrototype([DynamicPropertyContainer], TextAnimatorProperty); - - function ITextElement() {} - - ITextElement.prototype.initElement = function (data, globalData, comp) { - this.lettersChangedFlag = true; - this.initFrame(); - this.initBaseData(data, globalData, comp); - this.textProperty = new TextProperty(this, data.t, this.dynamicProperties); - this.textAnimator = new TextAnimatorProperty(data.t, this.renderType, this); - this.initTransform(data, globalData, comp); - this.initHierarchy(); - this.initRenderable(); - this.initRendererElement(); - this.createContainerElements(); - this.createRenderableComponents(); - this.createContent(); - this.hide(); - this.textAnimator.searchProperties(this.dynamicProperties); - }; - - ITextElement.prototype.prepareFrame = function (num) { - this._mdf = false; - this.prepareRenderableFrame(num); - this.prepareProperties(num, this.isInRange); - - if (this.textProperty._mdf || this.textProperty._isFirstFrame) { - this.buildNewText(); - this.textProperty._isFirstFrame = false; - this.textProperty._mdf = false; - } - }; - - ITextElement.prototype.createPathShape = function (matrixHelper, shapes) { - var j; - var jLen = shapes.length; - var pathNodes; - var shapeStr = ''; - - for (j = 0; j < jLen; j += 1) { - if (shapes[j].ty === 'sh') { - pathNodes = shapes[j].ks.k; - shapeStr += buildShapeString(pathNodes, pathNodes.i.length, true, matrixHelper); - } - } - - return shapeStr; - }; - - ITextElement.prototype.updateDocumentData = function (newData, index) { - this.textProperty.updateDocumentData(newData, index); - }; - - ITextElement.prototype.canResizeFont = function (_canResize) { - this.textProperty.canResizeFont(_canResize); - }; - - ITextElement.prototype.setMinimumFontSize = function (_fontSize) { - this.textProperty.setMinimumFontSize(_fontSize); - }; - - ITextElement.prototype.applyTextPropertiesToMatrix = function (documentData, matrixHelper, lineNumber, xPos, yPos) { - if (documentData.ps) { - matrixHelper.translate(documentData.ps[0], documentData.ps[1] + documentData.ascent, 0); - } - - matrixHelper.translate(0, -documentData.ls, 0); - - switch (documentData.j) { - case 1: - matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]), 0, 0); - break; - - case 2: - matrixHelper.translate(documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[lineNumber]) / 2, 0, 0); - break; - - default: - break; - } - - matrixHelper.translate(xPos, yPos, 0); - }; - - ITextElement.prototype.buildColor = function (colorData) { - return 'rgb(' + Math.round(colorData[0] * 255) + ',' + Math.round(colorData[1] * 255) + ',' + Math.round(colorData[2] * 255) + ')'; - }; - - ITextElement.prototype.emptyProp = new LetterProps(); - - ITextElement.prototype.destroy = function () {}; - - var emptyShapeData = { - shapes: [] - }; - - function SVGTextLottieElement(data, globalData, comp) { - this.textSpans = []; - this.renderType = 'svg'; - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, SVGBaseElement, HierarchyElement, FrameElement, RenderableDOMElement, ITextElement], SVGTextLottieElement); - - SVGTextLottieElement.prototype.createContent = function () { - if (this.data.singleShape && !this.globalData.fontManager.chars) { - this.textContainer = createNS('text'); - } - }; - - SVGTextLottieElement.prototype.buildTextContents = function (textArray) { - var i = 0; - var len = textArray.length; - var textContents = []; - var currentTextContent = ''; - - while (i < len) { - if (textArray[i] === String.fromCharCode(13) || textArray[i] === String.fromCharCode(3)) { - textContents.push(currentTextContent); - currentTextContent = ''; - } else { - currentTextContent += textArray[i]; - } - - i += 1; - } - - textContents.push(currentTextContent); - return textContents; - }; - - SVGTextLottieElement.prototype.buildShapeData = function (data, scale) { - // data should probably be cloned to apply scale separately to each instance of a text on different layers - // but since text internal content gets only rendered once and then it's never rerendered, - // it's probably safe not to clone data and reuse always the same instance even if the object is mutated. - // Avoiding cloning is preferred since cloning each character shape data is expensive - if (data.shapes && data.shapes.length) { - var shape = data.shapes[0]; - - if (shape.it) { - var shapeItem = shape.it[shape.it.length - 1]; - - if (shapeItem.s) { - shapeItem.s.k[0] = scale; - shapeItem.s.k[1] = scale; - } - } - } - - return data; - }; - - SVGTextLottieElement.prototype.buildNewText = function () { - this.addDynamicProperty(this); - var i; - var len; - var documentData = this.textProperty.currentData; - this.renderedLetters = createSizedArray(documentData ? documentData.l.length : 0); - - if (documentData.fc) { - this.layerElement.setAttribute('fill', this.buildColor(documentData.fc)); - } else { - this.layerElement.setAttribute('fill', 'rgba(0,0,0,0)'); - } - - if (documentData.sc) { - this.layerElement.setAttribute('stroke', this.buildColor(documentData.sc)); - this.layerElement.setAttribute('stroke-width', documentData.sw); - } - - this.layerElement.setAttribute('font-size', documentData.finalSize); - var fontData = this.globalData.fontManager.getFontByName(documentData.f); - - if (fontData.fClass) { - this.layerElement.setAttribute('class', fontData.fClass); - } else { - this.layerElement.setAttribute('font-family', fontData.fFamily); - var fWeight = documentData.fWeight; - var fStyle = documentData.fStyle; - this.layerElement.setAttribute('font-style', fStyle); - this.layerElement.setAttribute('font-weight', fWeight); - } - - this.layerElement.setAttribute('aria-label', documentData.t); - var letters = documentData.l || []; - var usesGlyphs = !!this.globalData.fontManager.chars; - len = letters.length; - var tSpan; - var matrixHelper = this.mHelper; - var shapeStr = ''; - var singleShape = this.data.singleShape; - var xPos = 0; - var yPos = 0; - var firstLine = true; - var trackingOffset = documentData.tr * 0.001 * documentData.finalSize; - - if (singleShape && !usesGlyphs && !documentData.sz) { - var tElement = this.textContainer; - var justify = 'start'; - - switch (documentData.j) { - case 1: - justify = 'end'; - break; - - case 2: - justify = 'middle'; - break; - - default: - justify = 'start'; - break; - } - - tElement.setAttribute('text-anchor', justify); - tElement.setAttribute('letter-spacing', trackingOffset); - var textContent = this.buildTextContents(documentData.finalText); - len = textContent.length; - yPos = documentData.ps ? documentData.ps[1] + documentData.ascent : 0; - - for (i = 0; i < len; i += 1) { - tSpan = this.textSpans[i].span || createNS('tspan'); - tSpan.textContent = textContent[i]; - tSpan.setAttribute('x', 0); - tSpan.setAttribute('y', yPos); - tSpan.style.display = 'inherit'; - tElement.appendChild(tSpan); - - if (!this.textSpans[i]) { - this.textSpans[i] = { - span: null, - glyph: null - }; - } - - this.textSpans[i].span = tSpan; - yPos += documentData.finalLineHeight; - } - - this.layerElement.appendChild(tElement); - } else { - var cachedSpansLength = this.textSpans.length; - var charData; - - for (i = 0; i < len; i += 1) { - if (!this.textSpans[i]) { - this.textSpans[i] = { - span: null, - childSpan: null, - glyph: null - }; - } - - if (!usesGlyphs || !singleShape || i === 0) { - tSpan = cachedSpansLength > i ? this.textSpans[i].span : createNS(usesGlyphs ? 'g' : 'text'); - - if (cachedSpansLength <= i) { - tSpan.setAttribute('stroke-linecap', 'butt'); - tSpan.setAttribute('stroke-linejoin', 'round'); - tSpan.setAttribute('stroke-miterlimit', '4'); - this.textSpans[i].span = tSpan; - - if (usesGlyphs) { - var childSpan = createNS('g'); - tSpan.appendChild(childSpan); - this.textSpans[i].childSpan = childSpan; - } - - this.textSpans[i].span = tSpan; - this.layerElement.appendChild(tSpan); - } - - tSpan.style.display = 'inherit'; - } - - matrixHelper.reset(); - - if (singleShape) { - if (letters[i].n) { - xPos = -trackingOffset; - yPos += documentData.yOffset; - yPos += firstLine ? 1 : 0; - firstLine = false; - } - - this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos); - xPos += letters[i].l || 0; // xPos += letters[i].val === ' ' ? 0 : trackingOffset; - - xPos += trackingOffset; - } - - if (usesGlyphs) { - charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily); - var glyphElement; // t === 1 means the character has been replaced with an animated shaped - - if (charData.t === 1) { - glyphElement = new SVGCompElement(charData.data, this.globalData, this); - } else { - var data = emptyShapeData; - - if (charData.data && charData.data.shapes) { - data = this.buildShapeData(charData.data, documentData.finalSize); - } - - glyphElement = new SVGShapeElement(data, this.globalData, this); - } - - if (this.textSpans[i].glyph) { - var glyph = this.textSpans[i].glyph; - this.textSpans[i].childSpan.removeChild(glyph.layerElement); - glyph.destroy(); - } - - this.textSpans[i].glyph = glyphElement; - glyphElement._debug = true; - glyphElement.prepareFrame(0); - glyphElement.renderFrame(); - this.textSpans[i].childSpan.appendChild(glyphElement.layerElement); // when using animated shapes, the layer will be scaled instead of replacing the internal scale - // this might have issues with strokes and might need a different solution - - if (charData.t === 1) { - this.textSpans[i].childSpan.setAttribute('transform', 'scale(' + documentData.finalSize / 100 + ',' + documentData.finalSize / 100 + ')'); - } - } else { - if (singleShape) { - tSpan.setAttribute('transform', 'translate(' + matrixHelper.props[12] + ',' + matrixHelper.props[13] + ')'); - } - - tSpan.textContent = letters[i].val; - tSpan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve'); - } // - - } - - if (singleShape && tSpan) { - tSpan.setAttribute('d', shapeStr); - } - } - - while (i < this.textSpans.length) { - this.textSpans[i].span.style.display = 'none'; - i += 1; - } - - this._sizeChanged = true; - }; - - SVGTextLottieElement.prototype.sourceRectAtTime = function () { - this.prepareFrame(this.comp.renderedFrame - this.data.st); - this.renderInnerContent(); - - if (this._sizeChanged) { - this._sizeChanged = false; - var textBox = this.layerElement.getBBox(); - this.bbox = { - top: textBox.y, - left: textBox.x, - width: textBox.width, - height: textBox.height - }; - } - - return this.bbox; - }; - - SVGTextLottieElement.prototype.getValue = function () { - var i; - var len = this.textSpans.length; - var glyphElement; - this.renderedFrame = this.comp.renderedFrame; - - for (i = 0; i < len; i += 1) { - glyphElement = this.textSpans[i].glyph; - - if (glyphElement) { - glyphElement.prepareFrame(this.comp.renderedFrame - this.data.st); - - if (glyphElement._mdf) { - this._mdf = true; - } - } - } - }; - - SVGTextLottieElement.prototype.renderInnerContent = function () { - if (!this.data.singleShape || this._mdf) { - this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag); - - if (this.lettersChangedFlag || this.textAnimator.lettersChangedFlag) { - this._sizeChanged = true; - var i; - var len; - var renderedLetters = this.textAnimator.renderedLetters; - var letters = this.textProperty.currentData.l; - len = letters.length; - var renderedLetter; - var textSpan; - var glyphElement; - - for (i = 0; i < len; i += 1) { - if (!letters[i].n) { - renderedLetter = renderedLetters[i]; - textSpan = this.textSpans[i].span; - glyphElement = this.textSpans[i].glyph; - - if (glyphElement) { - glyphElement.renderFrame(); - } - - if (renderedLetter._mdf.m) { - textSpan.setAttribute('transform', renderedLetter.m); - } - - if (renderedLetter._mdf.o) { - textSpan.setAttribute('opacity', renderedLetter.o); - } - - if (renderedLetter._mdf.sw) { - textSpan.setAttribute('stroke-width', renderedLetter.sw); - } - - if (renderedLetter._mdf.sc) { - textSpan.setAttribute('stroke', renderedLetter.sc); - } - - if (renderedLetter._mdf.fc) { - textSpan.setAttribute('fill', renderedLetter.fc); - } - } - } - } - } - }; - - function ISolidElement(data, globalData, comp) { - this.initElement(data, globalData, comp); - } - - extendPrototype([IImageElement], ISolidElement); - - ISolidElement.prototype.createContent = function () { - var rect = createNS('rect'); /// /rect.style.width = this.data.sw; - /// /rect.style.height = this.data.sh; - /// /rect.style.fill = this.data.sc; - - rect.setAttribute('width', this.data.sw); - rect.setAttribute('height', this.data.sh); - rect.setAttribute('fill', this.data.sc); - this.layerElement.appendChild(rect); - }; - - function NullElement(data, globalData, comp) { - this.initFrame(); - this.initBaseData(data, globalData, comp); - this.initFrame(); - this.initTransform(data, globalData, comp); - this.initHierarchy(); - } - - NullElement.prototype.prepareFrame = function (num) { - this.prepareProperties(num, true); - }; - - NullElement.prototype.renderFrame = function () {}; - - NullElement.prototype.getBaseElement = function () { - return null; - }; - - NullElement.prototype.destroy = function () {}; - - NullElement.prototype.sourceRectAtTime = function () {}; - - NullElement.prototype.hide = function () {}; - - extendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement], NullElement); - - function SVGRendererBase() {} - - extendPrototype([BaseRenderer], SVGRendererBase); - - SVGRendererBase.prototype.createNull = function (data) { - return new NullElement(data, this.globalData, this); - }; - - SVGRendererBase.prototype.createShape = function (data) { - return new SVGShapeElement(data, this.globalData, this); - }; - - SVGRendererBase.prototype.createText = function (data) { - return new SVGTextLottieElement(data, this.globalData, this); - }; - - SVGRendererBase.prototype.createImage = function (data) { - return new IImageElement(data, this.globalData, this); - }; - - SVGRendererBase.prototype.createSolid = function (data) { - return new ISolidElement(data, this.globalData, this); - }; - - SVGRendererBase.prototype.configAnimation = function (animData) { - this.svgElement.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); - - if (this.renderConfig.viewBoxSize) { - this.svgElement.setAttribute('viewBox', this.renderConfig.viewBoxSize); - } else { - this.svgElement.setAttribute('viewBox', '0 0 ' + animData.w + ' ' + animData.h); - } - - if (!this.renderConfig.viewBoxOnly) { - this.svgElement.setAttribute('width', animData.w); - this.svgElement.setAttribute('height', animData.h); - this.svgElement.style.width = '100%'; - this.svgElement.style.height = '100%'; - this.svgElement.style.transform = 'translate3d(0,0,0)'; - this.svgElement.style.contentVisibility = this.renderConfig.contentVisibility; - } - - if (this.renderConfig.width) { - this.svgElement.setAttribute('width', this.renderConfig.width); - } - - if (this.renderConfig.height) { - this.svgElement.setAttribute('height', this.renderConfig.height); - } - - if (this.renderConfig.className) { - this.svgElement.setAttribute('class', this.renderConfig.className); - } - - if (this.renderConfig.id) { - this.svgElement.setAttribute('id', this.renderConfig.id); - } - - if (this.renderConfig.focusable !== undefined) { - this.svgElement.setAttribute('focusable', this.renderConfig.focusable); - } - - this.svgElement.setAttribute('preserveAspectRatio', this.renderConfig.preserveAspectRatio); // this.layerElement.style.transform = 'translate3d(0,0,0)'; - // this.layerElement.style.transformOrigin = this.layerElement.style.mozTransformOrigin = this.layerElement.style.webkitTransformOrigin = this.layerElement.style['-webkit-transform'] = "0px 0px 0px"; - - this.animationItem.wrapper.appendChild(this.svgElement); // Mask animation - - var defs = this.globalData.defs; - this.setupGlobalData(animData, defs); - this.globalData.progressiveLoad = this.renderConfig.progressiveLoad; - this.data = animData; - var maskElement = createNS('clipPath'); - var rect = createNS('rect'); - rect.setAttribute('width', animData.w); - rect.setAttribute('height', animData.h); - rect.setAttribute('x', 0); - rect.setAttribute('y', 0); - var maskId = createElementID(); - maskElement.setAttribute('id', maskId); - maskElement.appendChild(rect); - this.layerElement.setAttribute('clip-path', 'url(' + getLocationHref() + '#' + maskId + ')'); - defs.appendChild(maskElement); - this.layers = animData.layers; - this.elements = createSizedArray(animData.layers.length); - }; - - SVGRendererBase.prototype.destroy = function () { - if (this.animationItem.wrapper) { - this.animationItem.wrapper.innerText = ''; - } - - this.layerElement = null; - this.globalData.defs = null; - var i; - var len = this.layers ? this.layers.length : 0; - - for (i = 0; i < len; i += 1) { - if (this.elements[i]) { - this.elements[i].destroy(); - } - } - - this.elements.length = 0; - this.destroyed = true; - this.animationItem = null; - }; - - SVGRendererBase.prototype.updateContainerSize = function () {}; - - SVGRendererBase.prototype.buildItem = function (pos) { - var elements = this.elements; - - if (elements[pos] || this.layers[pos].ty === 99) { - return; - } - - elements[pos] = true; - var element = this.createItem(this.layers[pos]); - elements[pos] = element; - - if (getExpressionsPlugin()) { - if (this.layers[pos].ty === 0) { - this.globalData.projectInterface.registerComposition(element); - } - - element.initExpressions(); - } - - this.appendElementInPos(element, pos); - - if (this.layers[pos].tt) { - if (!this.elements[pos - 1] || this.elements[pos - 1] === true) { - this.buildItem(pos - 1); - this.addPendingElement(element); - } else { - element.setMatte(elements[pos - 1].layerId); - } - } - }; - - SVGRendererBase.prototype.checkPendingElements = function () { - while (this.pendingElements.length) { - var element = this.pendingElements.pop(); - element.checkParenting(); - - if (element.data.tt) { - var i = 0; - var len = this.elements.length; - - while (i < len) { - if (this.elements[i] === element) { - element.setMatte(this.elements[i - 1].layerId); - break; - } - - i += 1; - } - } - } - }; - - SVGRendererBase.prototype.renderFrame = function (num) { - if (this.renderedFrame === num || this.destroyed) { - return; - } - - if (num === null) { - num = this.renderedFrame; - } else { - this.renderedFrame = num; - } // console.log('-------'); - // console.log('FRAME ',num); - - - this.globalData.frameNum = num; - this.globalData.frameId += 1; - this.globalData.projectInterface.currentFrame = num; - this.globalData._mdf = false; - var i; - var len = this.layers.length; - - if (!this.completeLayers) { - this.checkLayers(num); - } - - for (i = len - 1; i >= 0; i -= 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].prepareFrame(num - this.layers[i].st); - } - } - - if (this.globalData._mdf) { - for (i = 0; i < len; i += 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].renderFrame(); - } - } - } - }; - - SVGRendererBase.prototype.appendElementInPos = function (element, pos) { - var newElement = element.getBaseElement(); - - if (!newElement) { - return; - } - - var i = 0; - var nextElement; - - while (i < pos) { - if (this.elements[i] && this.elements[i] !== true && this.elements[i].getBaseElement()) { - nextElement = this.elements[i].getBaseElement(); - } - - i += 1; - } - - if (nextElement) { - this.layerElement.insertBefore(newElement, nextElement); - } else { - this.layerElement.appendChild(newElement); - } - }; - - SVGRendererBase.prototype.hide = function () { - this.layerElement.style.display = 'none'; - }; - - SVGRendererBase.prototype.show = function () { - this.layerElement.style.display = 'block'; - }; - - function ICompElement() {} - - extendPrototype([BaseElement, TransformElement, HierarchyElement, FrameElement, RenderableDOMElement], ICompElement); - - ICompElement.prototype.initElement = function (data, globalData, comp) { - this.initFrame(); - this.initBaseData(data, globalData, comp); - this.initTransform(data, globalData, comp); - this.initRenderable(); - this.initHierarchy(); - this.initRendererElement(); - this.createContainerElements(); - this.createRenderableComponents(); - - if (this.data.xt || !globalData.progressiveLoad) { - this.buildAllItems(); - } - - this.hide(); - }; - /* ICompElement.prototype.hide = function(){ - if(!this.hidden){ - this.hideElement(); - var i,len = this.elements.length; - for( i = 0; i < len; i+=1 ){ - if(this.elements[i]){ - this.elements[i].hide(); - } - } - } - }; */ - - - ICompElement.prototype.prepareFrame = function (num) { - this._mdf = false; - this.prepareRenderableFrame(num); - this.prepareProperties(num, this.isInRange); - - if (!this.isInRange && !this.data.xt) { - return; - } - - if (!this.tm._placeholder) { - var timeRemapped = this.tm.v; - - if (timeRemapped === this.data.op) { - timeRemapped = this.data.op - 1; - } - - this.renderedFrame = timeRemapped; - } else { - this.renderedFrame = num / this.data.sr; - } - - var i; - var len = this.elements.length; - - if (!this.completeLayers) { - this.checkLayers(this.renderedFrame); - } // This iteration needs to be backwards because of how expressions connect between each other - - - for (i = len - 1; i >= 0; i -= 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].prepareFrame(this.renderedFrame - this.layers[i].st); - - if (this.elements[i]._mdf) { - this._mdf = true; - } - } - } - }; - - ICompElement.prototype.renderInnerContent = function () { - var i; - var len = this.layers.length; - - for (i = 0; i < len; i += 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].renderFrame(); - } - } - }; - - ICompElement.prototype.setElements = function (elems) { - this.elements = elems; - }; - - ICompElement.prototype.getElements = function () { - return this.elements; - }; - - ICompElement.prototype.destroyElements = function () { - var i; - var len = this.layers.length; - - for (i = 0; i < len; i += 1) { - if (this.elements[i]) { - this.elements[i].destroy(); - } - } - }; - - ICompElement.prototype.destroy = function () { - this.destroyElements(); - this.destroyBaseElement(); - }; - - function SVGCompElement(data, globalData, comp) { - this.layers = data.layers; - this.supports3d = true; - this.completeLayers = false; - this.pendingElements = []; - this.elements = this.layers ? createSizedArray(this.layers.length) : []; - this.initElement(data, globalData, comp); - this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : { - _placeholder: true - }; - } - - extendPrototype([SVGRendererBase, ICompElement, SVGBaseElement], SVGCompElement); - - SVGCompElement.prototype.createComp = function (data) { - return new SVGCompElement(data, this.globalData, this); - }; - - function SVGRenderer(animationItem, config) { - this.animationItem = animationItem; - this.layers = null; - this.renderedFrame = -1; - this.svgElement = createNS('svg'); - var ariaLabel = ''; - - if (config && config.title) { - var titleElement = createNS('title'); - var titleId = createElementID(); - titleElement.setAttribute('id', titleId); - titleElement.textContent = config.title; - this.svgElement.appendChild(titleElement); - ariaLabel += titleId; - } - - if (config && config.description) { - var descElement = createNS('desc'); - var descId = createElementID(); - descElement.setAttribute('id', descId); - descElement.textContent = config.description; - this.svgElement.appendChild(descElement); - ariaLabel += ' ' + descId; - } - - if (ariaLabel) { - this.svgElement.setAttribute('aria-labelledby', ariaLabel); - } - - var defs = createNS('defs'); - this.svgElement.appendChild(defs); - var maskElement = createNS('g'); - this.svgElement.appendChild(maskElement); - this.layerElement = maskElement; - this.renderConfig = { - preserveAspectRatio: config && config.preserveAspectRatio || 'xMidYMid meet', - imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice', - contentVisibility: config && config.contentVisibility || 'visible', - progressiveLoad: config && config.progressiveLoad || false, - hideOnTransparent: !(config && config.hideOnTransparent === false), - viewBoxOnly: config && config.viewBoxOnly || false, - viewBoxSize: config && config.viewBoxSize || false, - className: config && config.className || '', - id: config && config.id || '', - focusable: config && config.focusable, - filterSize: { - width: config && config.filterSize && config.filterSize.width || '100%', - height: config && config.filterSize && config.filterSize.height || '100%', - x: config && config.filterSize && config.filterSize.x || '0%', - y: config && config.filterSize && config.filterSize.y || '0%' - }, - width: config && config.width, - height: config && config.height - }; - this.globalData = { - _mdf: false, - frameNum: -1, - defs: defs, - renderConfig: this.renderConfig - }; - this.elements = []; - this.pendingElements = []; - this.destroyed = false; - this.rendererType = 'svg'; - } - - extendPrototype([SVGRendererBase], SVGRenderer); - - SVGRenderer.prototype.createComp = function (data) { - return new SVGCompElement(data, this.globalData, this); - }; - - function CVContextData() { - this.saved = []; - this.cArrPos = 0; - this.cTr = new Matrix(); - this.cO = 1; - var i; - var len = 15; - this.savedOp = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - this.saved[i] = createTypedArray('float32', 16); - } - - this._length = len; - } - - CVContextData.prototype.duplicate = function () { - var newLength = this._length * 2; - var currentSavedOp = this.savedOp; - this.savedOp = createTypedArray('float32', newLength); - this.savedOp.set(currentSavedOp); - var i = 0; - - for (i = this._length; i < newLength; i += 1) { - this.saved[i] = createTypedArray('float32', 16); - } - - this._length = newLength; - }; - - CVContextData.prototype.reset = function () { - this.cArrPos = 0; - this.cTr.reset(); - this.cO = 1; - }; - - function ShapeTransformManager() { - this.sequences = {}; - this.sequenceList = []; - this.transform_key_count = 0; - } - - ShapeTransformManager.prototype = { - addTransformSequence: function addTransformSequence(transforms) { - var i; - var len = transforms.length; - var key = '_'; - - for (i = 0; i < len; i += 1) { - key += transforms[i].transform.key + '_'; - } - - var sequence = this.sequences[key]; - - if (!sequence) { - sequence = { - transforms: [].concat(transforms), - finalTransform: new Matrix(), - _mdf: false - }; - this.sequences[key] = sequence; - this.sequenceList.push(sequence); - } - - return sequence; - }, - processSequence: function processSequence(sequence, isFirstFrame) { - var i = 0; - var len = sequence.transforms.length; - var _mdf = isFirstFrame; - - while (i < len && !isFirstFrame) { - if (sequence.transforms[i].transform.mProps._mdf) { - _mdf = true; - break; - } - - i += 1; - } - - if (_mdf) { - var props; - sequence.finalTransform.reset(); - - for (i = len - 1; i >= 0; i -= 1) { - props = sequence.transforms[i].transform.mProps.v.props; - sequence.finalTransform.transform(props[0], props[1], props[2], props[3], props[4], props[5], props[6], props[7], props[8], props[9], props[10], props[11], props[12], props[13], props[14], props[15]); - } - } - - sequence._mdf = _mdf; - }, - processSequences: function processSequences(isFirstFrame) { - var i; - var len = this.sequenceList.length; - - for (i = 0; i < len; i += 1) { - this.processSequence(this.sequenceList[i], isFirstFrame); - } - }, - getNewKey: function getNewKey() { - this.transform_key_count += 1; - return '_' + this.transform_key_count; - } - }; - - function CVEffects() {} - - CVEffects.prototype.renderFrame = function () {}; - - function CVMaskElement(data, element) { - this.data = data; - this.element = element; - this.masksProperties = this.data.masksProperties || []; - this.viewData = createSizedArray(this.masksProperties.length); - var i; - var len = this.masksProperties.length; - var hasMasks = false; - - for (i = 0; i < len; i += 1) { - if (this.masksProperties[i].mode !== 'n') { - hasMasks = true; - } - - this.viewData[i] = ShapePropertyFactory.getShapeProp(this.element, this.masksProperties[i], 3); - } - - this.hasMasks = hasMasks; - - if (hasMasks) { - this.element.addRenderableComponent(this); - } - } - - CVMaskElement.prototype.renderFrame = function () { - if (!this.hasMasks) { - return; - } - - var transform = this.element.finalTransform.mat; - var ctx = this.element.canvasContext; - var i; - var len = this.masksProperties.length; - var pt; - var pts; - var data; - ctx.beginPath(); - - for (i = 0; i < len; i += 1) { - if (this.masksProperties[i].mode !== 'n') { - if (this.masksProperties[i].inv) { - ctx.moveTo(0, 0); - ctx.lineTo(this.element.globalData.compSize.w, 0); - ctx.lineTo(this.element.globalData.compSize.w, this.element.globalData.compSize.h); - ctx.lineTo(0, this.element.globalData.compSize.h); - ctx.lineTo(0, 0); - } - - data = this.viewData[i].v; - pt = transform.applyToPointArray(data.v[0][0], data.v[0][1], 0); - ctx.moveTo(pt[0], pt[1]); - var j; - var jLen = data._length; - - for (j = 1; j < jLen; j += 1) { - pts = transform.applyToTriplePoints(data.o[j - 1], data.i[j], data.v[j]); - ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]); - } - - pts = transform.applyToTriplePoints(data.o[j - 1], data.i[0], data.v[0]); - ctx.bezierCurveTo(pts[0], pts[1], pts[2], pts[3], pts[4], pts[5]); - } - } - - this.element.globalData.renderer.save(true); - ctx.clip(); - }; - - CVMaskElement.prototype.getMaskProperty = MaskElement.prototype.getMaskProperty; - - CVMaskElement.prototype.destroy = function () { - this.element = null; - }; - - function CVBaseElement() {} - - CVBaseElement.prototype = { - createElements: function createElements() {}, - initRendererElement: function initRendererElement() {}, - createContainerElements: function createContainerElements() { - this.canvasContext = this.globalData.canvasContext; - this.renderableEffectsManager = new CVEffects(this); - }, - createContent: function createContent() {}, - setBlendMode: function setBlendMode() { - var globalData = this.globalData; - - if (globalData.blendMode !== this.data.bm) { - globalData.blendMode = this.data.bm; - var blendModeValue = getBlendMode(this.data.bm); - globalData.canvasContext.globalCompositeOperation = blendModeValue; - } - }, - createRenderableComponents: function createRenderableComponents() { - this.maskManager = new CVMaskElement(this.data, this); - }, - hideElement: function hideElement() { - if (!this.hidden && (!this.isInRange || this.isTransparent)) { - this.hidden = true; - } - }, - showElement: function showElement() { - if (this.isInRange && !this.isTransparent) { - this.hidden = false; - this._isFirstFrame = true; - this.maskManager._isFirstFrame = true; - } - }, - renderFrame: function renderFrame() { - if (this.hidden || this.data.hd) { - return; - } - - this.renderTransform(); - this.renderRenderable(); - this.setBlendMode(); - var forceRealStack = this.data.ty === 0; - this.globalData.renderer.save(forceRealStack); - this.globalData.renderer.ctxTransform(this.finalTransform.mat.props); - this.globalData.renderer.ctxOpacity(this.finalTransform.mProp.o.v); - this.renderInnerContent(); - this.globalData.renderer.restore(forceRealStack); - - if (this.maskManager.hasMasks) { - this.globalData.renderer.restore(true); - } - - if (this._isFirstFrame) { - this._isFirstFrame = false; - } - }, - destroy: function destroy() { - this.canvasContext = null; - this.data = null; - this.globalData = null; - this.maskManager.destroy(); - }, - mHelper: new Matrix() - }; - CVBaseElement.prototype.hide = CVBaseElement.prototype.hideElement; - CVBaseElement.prototype.show = CVBaseElement.prototype.showElement; - - function CVShapeData(element, data, styles, transformsManager) { - this.styledShapes = []; - this.tr = [0, 0, 0, 0, 0, 0]; - var ty = 4; - - if (data.ty === 'rc') { - ty = 5; - } else if (data.ty === 'el') { - ty = 6; - } else if (data.ty === 'sr') { - ty = 7; - } - - this.sh = ShapePropertyFactory.getShapeProp(element, data, ty, element); - var i; - var len = styles.length; - var styledShape; - - for (i = 0; i < len; i += 1) { - if (!styles[i].closed) { - styledShape = { - transforms: transformsManager.addTransformSequence(styles[i].transforms), - trNodes: [] - }; - this.styledShapes.push(styledShape); - styles[i].elements.push(styledShape); - } - } - } - - CVShapeData.prototype.setAsAnimated = SVGShapeData.prototype.setAsAnimated; - - function CVShapeElement(data, globalData, comp) { - this.shapes = []; - this.shapesData = data.shapes; - this.stylesList = []; - this.itemsData = []; - this.prevViewData = []; - this.shapeModifiers = []; - this.processedElements = []; - this.transformsManager = new ShapeTransformManager(); - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, CVBaseElement, IShapeElement, HierarchyElement, FrameElement, RenderableElement], CVShapeElement); - CVShapeElement.prototype.initElement = RenderableDOMElement.prototype.initElement; - CVShapeElement.prototype.transformHelper = { - opacity: 1, - _opMdf: false - }; - CVShapeElement.prototype.dashResetter = []; - - CVShapeElement.prototype.createContent = function () { - this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, true, []); - }; - - CVShapeElement.prototype.createStyleElement = function (data, transforms) { - var styleElem = { - data: data, - type: data.ty, - preTransforms: this.transformsManager.addTransformSequence(transforms), - transforms: [], - elements: [], - closed: data.hd === true - }; - var elementData = {}; - - if (data.ty === 'fl' || data.ty === 'st') { - elementData.c = PropertyFactory.getProp(this, data.c, 1, 255, this); - - if (!elementData.c.k) { - styleElem.co = 'rgb(' + bmFloor(elementData.c.v[0]) + ',' + bmFloor(elementData.c.v[1]) + ',' + bmFloor(elementData.c.v[2]) + ')'; - } - } else if (data.ty === 'gf' || data.ty === 'gs') { - elementData.s = PropertyFactory.getProp(this, data.s, 1, null, this); - elementData.e = PropertyFactory.getProp(this, data.e, 1, null, this); - elementData.h = PropertyFactory.getProp(this, data.h || { - k: 0 - }, 0, 0.01, this); - elementData.a = PropertyFactory.getProp(this, data.a || { - k: 0 - }, 0, degToRads, this); - elementData.g = new GradientProperty(this, data.g, this); - } - - elementData.o = PropertyFactory.getProp(this, data.o, 0, 0.01, this); - - if (data.ty === 'st' || data.ty === 'gs') { - styleElem.lc = lineCapEnum[data.lc || 2]; - styleElem.lj = lineJoinEnum[data.lj || 2]; - - if (data.lj == 1) { - // eslint-disable-line eqeqeq - styleElem.ml = data.ml; - } - - elementData.w = PropertyFactory.getProp(this, data.w, 0, null, this); - - if (!elementData.w.k) { - styleElem.wi = elementData.w.v; - } - - if (data.d) { - var d = new DashProperty(this, data.d, 'canvas', this); - elementData.d = d; - - if (!elementData.d.k) { - styleElem.da = elementData.d.dashArray; - styleElem["do"] = elementData.d.dashoffset[0]; - } - } - } else { - styleElem.r = data.r === 2 ? 'evenodd' : 'nonzero'; - } - - this.stylesList.push(styleElem); - elementData.style = styleElem; - return elementData; - }; - - CVShapeElement.prototype.createGroupElement = function () { - var elementData = { - it: [], - prevViewData: [] - }; - return elementData; - }; - - CVShapeElement.prototype.createTransformElement = function (data) { - var elementData = { - transform: { - opacity: 1, - _opMdf: false, - key: this.transformsManager.getNewKey(), - op: PropertyFactory.getProp(this, data.o, 0, 0.01, this), - mProps: TransformPropertyFactory.getTransformProperty(this, data, this) - } - }; - return elementData; - }; - - CVShapeElement.prototype.createShapeElement = function (data) { - var elementData = new CVShapeData(this, data, this.stylesList, this.transformsManager); - this.shapes.push(elementData); - this.addShapeToModifiers(elementData); - return elementData; - }; - - CVShapeElement.prototype.reloadShapes = function () { - this._isFirstFrame = true; - var i; - var len = this.itemsData.length; - - for (i = 0; i < len; i += 1) { - this.prevViewData[i] = this.itemsData[i]; - } - - this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, true, []); - len = this.dynamicProperties.length; - - for (i = 0; i < len; i += 1) { - this.dynamicProperties[i].getValue(); - } - - this.renderModifiers(); - this.transformsManager.processSequences(this._isFirstFrame); - }; - - CVShapeElement.prototype.addTransformToStyleList = function (transform) { - var i; - var len = this.stylesList.length; - - for (i = 0; i < len; i += 1) { - if (!this.stylesList[i].closed) { - this.stylesList[i].transforms.push(transform); - } - } - }; - - CVShapeElement.prototype.removeTransformFromStyleList = function () { - var i; - var len = this.stylesList.length; - - for (i = 0; i < len; i += 1) { - if (!this.stylesList[i].closed) { - this.stylesList[i].transforms.pop(); - } - } - }; - - CVShapeElement.prototype.closeStyles = function (styles) { - var i; - var len = styles.length; - - for (i = 0; i < len; i += 1) { - styles[i].closed = true; - } - }; - - CVShapeElement.prototype.searchShapes = function (arr, itemsData, prevViewData, shouldRender, transforms) { - var i; - var len = arr.length - 1; - var j; - var jLen; - var ownStyles = []; - var ownModifiers = []; - var processedPos; - var modifier; - var currentTransform; - var ownTransforms = [].concat(transforms); - - for (i = len; i >= 0; i -= 1) { - processedPos = this.searchProcessedElement(arr[i]); - - if (!processedPos) { - arr[i]._shouldRender = shouldRender; - } else { - itemsData[i] = prevViewData[processedPos - 1]; - } - - if (arr[i].ty === 'fl' || arr[i].ty === 'st' || arr[i].ty === 'gf' || arr[i].ty === 'gs') { - if (!processedPos) { - itemsData[i] = this.createStyleElement(arr[i], ownTransforms); - } else { - itemsData[i].style.closed = false; - } - - ownStyles.push(itemsData[i].style); - } else if (arr[i].ty === 'gr') { - if (!processedPos) { - itemsData[i] = this.createGroupElement(arr[i]); - } else { - jLen = itemsData[i].it.length; - - for (j = 0; j < jLen; j += 1) { - itemsData[i].prevViewData[j] = itemsData[i].it[j]; - } - } - - this.searchShapes(arr[i].it, itemsData[i].it, itemsData[i].prevViewData, shouldRender, ownTransforms); - } else if (arr[i].ty === 'tr') { - if (!processedPos) { - currentTransform = this.createTransformElement(arr[i]); - itemsData[i] = currentTransform; - } - - ownTransforms.push(itemsData[i]); - this.addTransformToStyleList(itemsData[i]); - } else if (arr[i].ty === 'sh' || arr[i].ty === 'rc' || arr[i].ty === 'el' || arr[i].ty === 'sr') { - if (!processedPos) { - itemsData[i] = this.createShapeElement(arr[i]); - } - } else if (arr[i].ty === 'tm' || arr[i].ty === 'rd' || arr[i].ty === 'pb') { - if (!processedPos) { - modifier = ShapeModifiers.getModifier(arr[i].ty); - modifier.init(this, arr[i]); - itemsData[i] = modifier; - this.shapeModifiers.push(modifier); - } else { - modifier = itemsData[i]; - modifier.closed = false; - } - - ownModifiers.push(modifier); - } else if (arr[i].ty === 'rp') { - if (!processedPos) { - modifier = ShapeModifiers.getModifier(arr[i].ty); - itemsData[i] = modifier; - modifier.init(this, arr, i, itemsData); - this.shapeModifiers.push(modifier); - shouldRender = false; - } else { - modifier = itemsData[i]; - modifier.closed = true; - } - - ownModifiers.push(modifier); - } - - this.addProcessedElement(arr[i], i + 1); - } - - this.removeTransformFromStyleList(); - this.closeStyles(ownStyles); - len = ownModifiers.length; - - for (i = 0; i < len; i += 1) { - ownModifiers[i].closed = true; - } - }; - - CVShapeElement.prototype.renderInnerContent = function () { - this.transformHelper.opacity = 1; - this.transformHelper._opMdf = false; - this.renderModifiers(); - this.transformsManager.processSequences(this._isFirstFrame); - this.renderShape(this.transformHelper, this.shapesData, this.itemsData, true); - }; - - CVShapeElement.prototype.renderShapeTransform = function (parentTransform, groupTransform) { - if (parentTransform._opMdf || groupTransform.op._mdf || this._isFirstFrame) { - groupTransform.opacity = parentTransform.opacity; - groupTransform.opacity *= groupTransform.op.v; - groupTransform._opMdf = true; - } - }; - - CVShapeElement.prototype.drawLayer = function () { - var i; - var len = this.stylesList.length; - var j; - var jLen; - var k; - var kLen; - var elems; - var nodes; - var renderer = this.globalData.renderer; - var ctx = this.globalData.canvasContext; - var type; - var currentStyle; - - for (i = 0; i < len; i += 1) { - currentStyle = this.stylesList[i]; - type = currentStyle.type; // Skipping style when - // Stroke width equals 0 - // style should not be rendered (extra unused repeaters) - // current opacity equals 0 - // global opacity equals 0 - - if (!((type === 'st' || type === 'gs') && currentStyle.wi === 0 || !currentStyle.data._shouldRender || currentStyle.coOp === 0 || this.globalData.currentGlobalAlpha === 0)) { - renderer.save(); - elems = currentStyle.elements; - - if (type === 'st' || type === 'gs') { - ctx.strokeStyle = type === 'st' ? currentStyle.co : currentStyle.grd; - ctx.lineWidth = currentStyle.wi; - ctx.lineCap = currentStyle.lc; - ctx.lineJoin = currentStyle.lj; - ctx.miterLimit = currentStyle.ml || 0; - } else { - ctx.fillStyle = type === 'fl' ? currentStyle.co : currentStyle.grd; - } - - renderer.ctxOpacity(currentStyle.coOp); - - if (type !== 'st' && type !== 'gs') { - ctx.beginPath(); - } - - renderer.ctxTransform(currentStyle.preTransforms.finalTransform.props); - jLen = elems.length; - - for (j = 0; j < jLen; j += 1) { - if (type === 'st' || type === 'gs') { - ctx.beginPath(); - - if (currentStyle.da) { - ctx.setLineDash(currentStyle.da); - ctx.lineDashOffset = currentStyle["do"]; - } - } - - nodes = elems[j].trNodes; - kLen = nodes.length; - - for (k = 0; k < kLen; k += 1) { - if (nodes[k].t === 'm') { - ctx.moveTo(nodes[k].p[0], nodes[k].p[1]); - } else if (nodes[k].t === 'c') { - ctx.bezierCurveTo(nodes[k].pts[0], nodes[k].pts[1], nodes[k].pts[2], nodes[k].pts[3], nodes[k].pts[4], nodes[k].pts[5]); - } else { - ctx.closePath(); - } - } - - if (type === 'st' || type === 'gs') { - ctx.stroke(); - - if (currentStyle.da) { - ctx.setLineDash(this.dashResetter); - } - } - } - - if (type !== 'st' && type !== 'gs') { - ctx.fill(currentStyle.r); - } - - renderer.restore(); - } - } - }; - - CVShapeElement.prototype.renderShape = function (parentTransform, items, data, isMain) { - var i; - var len = items.length - 1; - var groupTransform; - groupTransform = parentTransform; - - for (i = len; i >= 0; i -= 1) { - if (items[i].ty === 'tr') { - groupTransform = data[i].transform; - this.renderShapeTransform(parentTransform, groupTransform); - } else if (items[i].ty === 'sh' || items[i].ty === 'el' || items[i].ty === 'rc' || items[i].ty === 'sr') { - this.renderPath(items[i], data[i]); - } else if (items[i].ty === 'fl') { - this.renderFill(items[i], data[i], groupTransform); - } else if (items[i].ty === 'st') { - this.renderStroke(items[i], data[i], groupTransform); - } else if (items[i].ty === 'gf' || items[i].ty === 'gs') { - this.renderGradientFill(items[i], data[i], groupTransform); - } else if (items[i].ty === 'gr') { - this.renderShape(groupTransform, items[i].it, data[i].it); - } else if (items[i].ty === 'tm') {// - } - } - - if (isMain) { - this.drawLayer(); - } - }; - - CVShapeElement.prototype.renderStyledShape = function (styledShape, shape) { - if (this._isFirstFrame || shape._mdf || styledShape.transforms._mdf) { - var shapeNodes = styledShape.trNodes; - var paths = shape.paths; - var i; - var len; - var j; - var jLen = paths._length; - shapeNodes.length = 0; - var groupTransformMat = styledShape.transforms.finalTransform; - - for (j = 0; j < jLen; j += 1) { - var pathNodes = paths.shapes[j]; - - if (pathNodes && pathNodes.v) { - len = pathNodes._length; - - for (i = 1; i < len; i += 1) { - if (i === 1) { - shapeNodes.push({ - t: 'm', - p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0) - }); - } - - shapeNodes.push({ - t: 'c', - pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[i], pathNodes.v[i]) - }); - } - - if (len === 1) { - shapeNodes.push({ - t: 'm', - p: groupTransformMat.applyToPointArray(pathNodes.v[0][0], pathNodes.v[0][1], 0) - }); - } - - if (pathNodes.c && len) { - shapeNodes.push({ - t: 'c', - pts: groupTransformMat.applyToTriplePoints(pathNodes.o[i - 1], pathNodes.i[0], pathNodes.v[0]) - }); - shapeNodes.push({ - t: 'z' - }); - } - } - } - - styledShape.trNodes = shapeNodes; - } - }; - - CVShapeElement.prototype.renderPath = function (pathData, itemData) { - if (pathData.hd !== true && pathData._shouldRender) { - var i; - var len = itemData.styledShapes.length; - - for (i = 0; i < len; i += 1) { - this.renderStyledShape(itemData.styledShapes[i], itemData.sh); - } - } - }; - - CVShapeElement.prototype.renderFill = function (styleData, itemData, groupTransform) { - var styleElem = itemData.style; - - if (itemData.c._mdf || this._isFirstFrame) { - styleElem.co = 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')'; - } - - if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) { - styleElem.coOp = itemData.o.v * groupTransform.opacity; - } - }; - - CVShapeElement.prototype.renderGradientFill = function (styleData, itemData, groupTransform) { - var styleElem = itemData.style; - var grd; - - if (!styleElem.grd || itemData.g._mdf || itemData.s._mdf || itemData.e._mdf || styleData.t !== 1 && (itemData.h._mdf || itemData.a._mdf)) { - var ctx = this.globalData.canvasContext; - var pt1 = itemData.s.v; - var pt2 = itemData.e.v; - - if (styleData.t === 1) { - grd = ctx.createLinearGradient(pt1[0], pt1[1], pt2[0], pt2[1]); - } else { - var rad = Math.sqrt(Math.pow(pt1[0] - pt2[0], 2) + Math.pow(pt1[1] - pt2[1], 2)); - var ang = Math.atan2(pt2[1] - pt1[1], pt2[0] - pt1[0]); - var percent = itemData.h.v; - - if (percent >= 1) { - percent = 0.99; - } else if (percent <= -1) { - percent = -0.99; - } - - var dist = rad * percent; - var x = Math.cos(ang + itemData.a.v) * dist + pt1[0]; - var y = Math.sin(ang + itemData.a.v) * dist + pt1[1]; - grd = ctx.createRadialGradient(x, y, 0, pt1[0], pt1[1], rad); - } - - var i; - var len = styleData.g.p; - var cValues = itemData.g.c; - var opacity = 1; - - for (i = 0; i < len; i += 1) { - if (itemData.g._hasOpacity && itemData.g._collapsable) { - opacity = itemData.g.o[i * 2 + 1]; - } - - grd.addColorStop(cValues[i * 4] / 100, 'rgba(' + cValues[i * 4 + 1] + ',' + cValues[i * 4 + 2] + ',' + cValues[i * 4 + 3] + ',' + opacity + ')'); - } - - styleElem.grd = grd; - } - - styleElem.coOp = itemData.o.v * groupTransform.opacity; - }; - - CVShapeElement.prototype.renderStroke = function (styleData, itemData, groupTransform) { - var styleElem = itemData.style; - var d = itemData.d; - - if (d && (d._mdf || this._isFirstFrame)) { - styleElem.da = d.dashArray; - styleElem["do"] = d.dashoffset[0]; - } - - if (itemData.c._mdf || this._isFirstFrame) { - styleElem.co = 'rgb(' + bmFloor(itemData.c.v[0]) + ',' + bmFloor(itemData.c.v[1]) + ',' + bmFloor(itemData.c.v[2]) + ')'; - } - - if (itemData.o._mdf || groupTransform._opMdf || this._isFirstFrame) { - styleElem.coOp = itemData.o.v * groupTransform.opacity; - } - - if (itemData.w._mdf || this._isFirstFrame) { - styleElem.wi = itemData.w.v; - } - }; - - CVShapeElement.prototype.destroy = function () { - this.shapesData = null; - this.globalData = null; - this.canvasContext = null; - this.stylesList.length = 0; - this.itemsData.length = 0; - }; - - function CVTextElement(data, globalData, comp) { - this.textSpans = []; - this.yOffset = 0; - this.fillColorAnim = false; - this.strokeColorAnim = false; - this.strokeWidthAnim = false; - this.stroke = false; - this.fill = false; - this.justifyOffset = 0; - this.currentRender = null; - this.renderType = 'canvas'; - this.values = { - fill: 'rgba(0,0,0,0)', - stroke: 'rgba(0,0,0,0)', - sWidth: 0, - fValue: '' - }; - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement, ITextElement], CVTextElement); - CVTextElement.prototype.tHelper = createTag('canvas').getContext('2d'); - - CVTextElement.prototype.buildNewText = function () { - var documentData = this.textProperty.currentData; - this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0); - var hasFill = false; - - if (documentData.fc) { - hasFill = true; - this.values.fill = this.buildColor(documentData.fc); - } else { - this.values.fill = 'rgba(0,0,0,0)'; - } - - this.fill = hasFill; - var hasStroke = false; - - if (documentData.sc) { - hasStroke = true; - this.values.stroke = this.buildColor(documentData.sc); - this.values.sWidth = documentData.sw; - } - - var fontData = this.globalData.fontManager.getFontByName(documentData.f); - var i; - var len; - var letters = documentData.l; - var matrixHelper = this.mHelper; - this.stroke = hasStroke; - this.values.fValue = documentData.finalSize + 'px ' + this.globalData.fontManager.getFontByName(documentData.f).fFamily; - len = documentData.finalText.length; // this.tHelper.font = this.values.fValue; - - var charData; - var shapeData; - var k; - var kLen; - var shapes; - var j; - var jLen; - var pathNodes; - var commands; - var pathArr; - var singleShape = this.data.singleShape; - var trackingOffset = documentData.tr * 0.001 * documentData.finalSize; - var xPos = 0; - var yPos = 0; - var firstLine = true; - var cnt = 0; - - for (i = 0; i < len; i += 1) { - charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily); - shapeData = charData && charData.data || {}; - matrixHelper.reset(); - - if (singleShape && letters[i].n) { - xPos = -trackingOffset; - yPos += documentData.yOffset; - yPos += firstLine ? 1 : 0; - firstLine = false; - } - - shapes = shapeData.shapes ? shapeData.shapes[0].it : []; - jLen = shapes.length; - matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100); - - if (singleShape) { - this.applyTextPropertiesToMatrix(documentData, matrixHelper, letters[i].line, xPos, yPos); - } - - commands = createSizedArray(jLen - 1); - var commandsCounter = 0; - - for (j = 0; j < jLen; j += 1) { - if (shapes[j].ty === 'sh') { - kLen = shapes[j].ks.k.i.length; - pathNodes = shapes[j].ks.k; - pathArr = []; - - for (k = 1; k < kLen; k += 1) { - if (k === 1) { - pathArr.push(matrixHelper.applyToX(pathNodes.v[0][0], pathNodes.v[0][1], 0), matrixHelper.applyToY(pathNodes.v[0][0], pathNodes.v[0][1], 0)); - } - - pathArr.push(matrixHelper.applyToX(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToY(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToX(pathNodes.i[k][0], pathNodes.i[k][1], 0), matrixHelper.applyToY(pathNodes.i[k][0], pathNodes.i[k][1], 0), matrixHelper.applyToX(pathNodes.v[k][0], pathNodes.v[k][1], 0), matrixHelper.applyToY(pathNodes.v[k][0], pathNodes.v[k][1], 0)); - } - - pathArr.push(matrixHelper.applyToX(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToY(pathNodes.o[k - 1][0], pathNodes.o[k - 1][1], 0), matrixHelper.applyToX(pathNodes.i[0][0], pathNodes.i[0][1], 0), matrixHelper.applyToY(pathNodes.i[0][0], pathNodes.i[0][1], 0), matrixHelper.applyToX(pathNodes.v[0][0], pathNodes.v[0][1], 0), matrixHelper.applyToY(pathNodes.v[0][0], pathNodes.v[0][1], 0)); - commands[commandsCounter] = pathArr; - commandsCounter += 1; - } - } - - if (singleShape) { - xPos += letters[i].l; - xPos += trackingOffset; - } - - if (this.textSpans[cnt]) { - this.textSpans[cnt].elem = commands; - } else { - this.textSpans[cnt] = { - elem: commands - }; - } - - cnt += 1; - } - }; - - CVTextElement.prototype.renderInnerContent = function () { - var ctx = this.canvasContext; - ctx.font = this.values.fValue; - ctx.lineCap = 'butt'; - ctx.lineJoin = 'miter'; - ctx.miterLimit = 4; - - if (!this.data.singleShape) { - this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag); - } - - var i; - var len; - var j; - var jLen; - var k; - var kLen; - var renderedLetters = this.textAnimator.renderedLetters; - var letters = this.textProperty.currentData.l; - len = letters.length; - var renderedLetter; - var lastFill = null; - var lastStroke = null; - var lastStrokeW = null; - var commands; - var pathArr; - - for (i = 0; i < len; i += 1) { - if (!letters[i].n) { - renderedLetter = renderedLetters[i]; - - if (renderedLetter) { - this.globalData.renderer.save(); - this.globalData.renderer.ctxTransform(renderedLetter.p); - this.globalData.renderer.ctxOpacity(renderedLetter.o); - } - - if (this.fill) { - if (renderedLetter && renderedLetter.fc) { - if (lastFill !== renderedLetter.fc) { - lastFill = renderedLetter.fc; - ctx.fillStyle = renderedLetter.fc; - } - } else if (lastFill !== this.values.fill) { - lastFill = this.values.fill; - ctx.fillStyle = this.values.fill; - } - - commands = this.textSpans[i].elem; - jLen = commands.length; - this.globalData.canvasContext.beginPath(); - - for (j = 0; j < jLen; j += 1) { - pathArr = commands[j]; - kLen = pathArr.length; - this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]); - - for (k = 2; k < kLen; k += 6) { - this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]); - } - } - - this.globalData.canvasContext.closePath(); - this.globalData.canvasContext.fill(); /// ctx.fillText(this.textSpans[i].val,0,0); - } - - if (this.stroke) { - if (renderedLetter && renderedLetter.sw) { - if (lastStrokeW !== renderedLetter.sw) { - lastStrokeW = renderedLetter.sw; - ctx.lineWidth = renderedLetter.sw; - } - } else if (lastStrokeW !== this.values.sWidth) { - lastStrokeW = this.values.sWidth; - ctx.lineWidth = this.values.sWidth; - } - - if (renderedLetter && renderedLetter.sc) { - if (lastStroke !== renderedLetter.sc) { - lastStroke = renderedLetter.sc; - ctx.strokeStyle = renderedLetter.sc; - } - } else if (lastStroke !== this.values.stroke) { - lastStroke = this.values.stroke; - ctx.strokeStyle = this.values.stroke; - } - - commands = this.textSpans[i].elem; - jLen = commands.length; - this.globalData.canvasContext.beginPath(); - - for (j = 0; j < jLen; j += 1) { - pathArr = commands[j]; - kLen = pathArr.length; - this.globalData.canvasContext.moveTo(pathArr[0], pathArr[1]); - - for (k = 2; k < kLen; k += 6) { - this.globalData.canvasContext.bezierCurveTo(pathArr[k], pathArr[k + 1], pathArr[k + 2], pathArr[k + 3], pathArr[k + 4], pathArr[k + 5]); - } - } - - this.globalData.canvasContext.closePath(); - this.globalData.canvasContext.stroke(); /// ctx.strokeText(letters[i].val,0,0); - } - - if (renderedLetter) { - this.globalData.renderer.restore(); - } - } - } - }; - - function CVImageElement(data, globalData, comp) { - this.assetData = globalData.getAssetData(data.refId); - this.img = globalData.imageLoader.getAsset(this.assetData); - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVImageElement); - CVImageElement.prototype.initElement = SVGShapeElement.prototype.initElement; - CVImageElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame; - - CVImageElement.prototype.createContent = function () { - if (this.img.width && (this.assetData.w !== this.img.width || this.assetData.h !== this.img.height)) { - var canvas = createTag('canvas'); - canvas.width = this.assetData.w; - canvas.height = this.assetData.h; - var ctx = canvas.getContext('2d'); - var imgW = this.img.width; - var imgH = this.img.height; - var imgRel = imgW / imgH; - var canvasRel = this.assetData.w / this.assetData.h; - var widthCrop; - var heightCrop; - var par = this.assetData.pr || this.globalData.renderConfig.imagePreserveAspectRatio; - - if (imgRel > canvasRel && par === 'xMidYMid slice' || imgRel < canvasRel && par !== 'xMidYMid slice') { - heightCrop = imgH; - widthCrop = heightCrop * canvasRel; - } else { - widthCrop = imgW; - heightCrop = widthCrop / canvasRel; - } - - ctx.drawImage(this.img, (imgW - widthCrop) / 2, (imgH - heightCrop) / 2, widthCrop, heightCrop, 0, 0, this.assetData.w, this.assetData.h); - this.img = canvas; - } - }; - - CVImageElement.prototype.renderInnerContent = function () { - this.canvasContext.drawImage(this.img, 0, 0); - }; - - CVImageElement.prototype.destroy = function () { - this.img = null; - }; - - function CVSolidElement(data, globalData, comp) { - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, CVBaseElement, HierarchyElement, FrameElement, RenderableElement], CVSolidElement); - CVSolidElement.prototype.initElement = SVGShapeElement.prototype.initElement; - CVSolidElement.prototype.prepareFrame = IImageElement.prototype.prepareFrame; - - CVSolidElement.prototype.renderInnerContent = function () { - var ctx = this.canvasContext; - ctx.fillStyle = this.data.sc; - ctx.fillRect(0, 0, this.data.sw, this.data.sh); // - }; - - function CanvasRendererBase(animationItem, config) { - this.animationItem = animationItem; - this.renderConfig = { - clearCanvas: config && config.clearCanvas !== undefined ? config.clearCanvas : true, - context: config && config.context || null, - progressiveLoad: config && config.progressiveLoad || false, - preserveAspectRatio: config && config.preserveAspectRatio || 'xMidYMid meet', - imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice', - contentVisibility: config && config.contentVisibility || 'visible', - className: config && config.className || '', - id: config && config.id || '' - }; - this.renderConfig.dpr = config && config.dpr || 1; - - if (this.animationItem.wrapper) { - this.renderConfig.dpr = config && config.dpr || window.devicePixelRatio || 1; - } - - this.renderedFrame = -1; - this.globalData = { - frameNum: -1, - _mdf: false, - renderConfig: this.renderConfig, - currentGlobalAlpha: -1 - }; - this.contextData = new CVContextData(); - this.elements = []; - this.pendingElements = []; - this.transformMat = new Matrix(); - this.completeLayers = false; - this.rendererType = 'canvas'; - } - - extendPrototype([BaseRenderer], CanvasRendererBase); - - CanvasRendererBase.prototype.createShape = function (data) { - return new CVShapeElement(data, this.globalData, this); - }; - - CanvasRendererBase.prototype.createText = function (data) { - return new CVTextElement(data, this.globalData, this); - }; - - CanvasRendererBase.prototype.createImage = function (data) { - return new CVImageElement(data, this.globalData, this); - }; - - CanvasRendererBase.prototype.createSolid = function (data) { - return new CVSolidElement(data, this.globalData, this); - }; - - CanvasRendererBase.prototype.createNull = SVGRenderer.prototype.createNull; - - CanvasRendererBase.prototype.ctxTransform = function (props) { - if (props[0] === 1 && props[1] === 0 && props[4] === 0 && props[5] === 1 && props[12] === 0 && props[13] === 0) { - return; - } - - if (!this.renderConfig.clearCanvas) { - this.canvasContext.transform(props[0], props[1], props[4], props[5], props[12], props[13]); - return; - } - - this.transformMat.cloneFromProps(props); - var cProps = this.contextData.cTr.props; - this.transformMat.transform(cProps[0], cProps[1], cProps[2], cProps[3], cProps[4], cProps[5], cProps[6], cProps[7], cProps[8], cProps[9], cProps[10], cProps[11], cProps[12], cProps[13], cProps[14], cProps[15]); // this.contextData.cTr.transform(props[0],props[1],props[2],props[3],props[4],props[5],props[6],props[7],props[8],props[9],props[10],props[11],props[12],props[13],props[14],props[15]); - - this.contextData.cTr.cloneFromProps(this.transformMat.props); - var trProps = this.contextData.cTr.props; - this.canvasContext.setTransform(trProps[0], trProps[1], trProps[4], trProps[5], trProps[12], trProps[13]); - }; - - CanvasRendererBase.prototype.ctxOpacity = function (op) { - /* if(op === 1){ - return; - } */ - if (!this.renderConfig.clearCanvas) { - this.canvasContext.globalAlpha *= op < 0 ? 0 : op; - this.globalData.currentGlobalAlpha = this.contextData.cO; - return; - } - - this.contextData.cO *= op < 0 ? 0 : op; - - if (this.globalData.currentGlobalAlpha !== this.contextData.cO) { - this.canvasContext.globalAlpha = this.contextData.cO; - this.globalData.currentGlobalAlpha = this.contextData.cO; - } - }; - - CanvasRendererBase.prototype.reset = function () { - if (!this.renderConfig.clearCanvas) { - this.canvasContext.restore(); - return; - } - - this.contextData.reset(); - }; - - CanvasRendererBase.prototype.save = function (actionFlag) { - if (!this.renderConfig.clearCanvas) { - this.canvasContext.save(); - return; - } - - if (actionFlag) { - this.canvasContext.save(); - } - - var props = this.contextData.cTr.props; - - if (this.contextData._length <= this.contextData.cArrPos) { - this.contextData.duplicate(); - } - - var i; - var arr = this.contextData.saved[this.contextData.cArrPos]; - - for (i = 0; i < 16; i += 1) { - arr[i] = props[i]; - } - - this.contextData.savedOp[this.contextData.cArrPos] = this.contextData.cO; - this.contextData.cArrPos += 1; - }; - - CanvasRendererBase.prototype.restore = function (actionFlag) { - if (!this.renderConfig.clearCanvas) { - this.canvasContext.restore(); - return; - } - - if (actionFlag) { - this.canvasContext.restore(); - this.globalData.blendMode = 'source-over'; - } - - this.contextData.cArrPos -= 1; - var popped = this.contextData.saved[this.contextData.cArrPos]; - var i; - var arr = this.contextData.cTr.props; - - for (i = 0; i < 16; i += 1) { - arr[i] = popped[i]; - } - - this.canvasContext.setTransform(popped[0], popped[1], popped[4], popped[5], popped[12], popped[13]); - popped = this.contextData.savedOp[this.contextData.cArrPos]; - this.contextData.cO = popped; - - if (this.globalData.currentGlobalAlpha !== popped) { - this.canvasContext.globalAlpha = popped; - this.globalData.currentGlobalAlpha = popped; - } - }; - - CanvasRendererBase.prototype.configAnimation = function (animData) { - if (this.animationItem.wrapper) { - this.animationItem.container = createTag('canvas'); - var containerStyle = this.animationItem.container.style; - containerStyle.width = '100%'; - containerStyle.height = '100%'; - var origin = '0px 0px 0px'; - containerStyle.transformOrigin = origin; - containerStyle.mozTransformOrigin = origin; - containerStyle.webkitTransformOrigin = origin; - containerStyle['-webkit-transform'] = origin; - containerStyle.contentVisibility = this.renderConfig.contentVisibility; - this.animationItem.wrapper.appendChild(this.animationItem.container); - this.canvasContext = this.animationItem.container.getContext('2d'); - - if (this.renderConfig.className) { - this.animationItem.container.setAttribute('class', this.renderConfig.className); - } - - if (this.renderConfig.id) { - this.animationItem.container.setAttribute('id', this.renderConfig.id); - } - } else { - this.canvasContext = this.renderConfig.context; - } - - this.data = animData; - this.layers = animData.layers; - this.transformCanvas = { - w: animData.w, - h: animData.h, - sx: 0, - sy: 0, - tx: 0, - ty: 0 - }; - this.setupGlobalData(animData, document.body); - this.globalData.canvasContext = this.canvasContext; - this.globalData.renderer = this; - this.globalData.isDashed = false; - this.globalData.progressiveLoad = this.renderConfig.progressiveLoad; - this.globalData.transformCanvas = this.transformCanvas; - this.elements = createSizedArray(animData.layers.length); - this.updateContainerSize(); - }; - - CanvasRendererBase.prototype.updateContainerSize = function () { - this.reset(); - var elementWidth; - var elementHeight; - - if (this.animationItem.wrapper && this.animationItem.container) { - elementWidth = this.animationItem.wrapper.offsetWidth; - elementHeight = this.animationItem.wrapper.offsetHeight; - this.animationItem.container.setAttribute('width', elementWidth * this.renderConfig.dpr); - this.animationItem.container.setAttribute('height', elementHeight * this.renderConfig.dpr); - } else { - elementWidth = this.canvasContext.canvas.width * this.renderConfig.dpr; - elementHeight = this.canvasContext.canvas.height * this.renderConfig.dpr; - } - - var elementRel; - var animationRel; - - if (this.renderConfig.preserveAspectRatio.indexOf('meet') !== -1 || this.renderConfig.preserveAspectRatio.indexOf('slice') !== -1) { - var par = this.renderConfig.preserveAspectRatio.split(' '); - var fillType = par[1] || 'meet'; - var pos = par[0] || 'xMidYMid'; - var xPos = pos.substr(0, 4); - var yPos = pos.substr(4); - elementRel = elementWidth / elementHeight; - animationRel = this.transformCanvas.w / this.transformCanvas.h; - - if (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice') { - this.transformCanvas.sx = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr); - this.transformCanvas.sy = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr); - } else { - this.transformCanvas.sx = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr); - this.transformCanvas.sy = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr); - } - - if (xPos === 'xMid' && (animationRel < elementRel && fillType === 'meet' || animationRel > elementRel && fillType === 'slice')) { - this.transformCanvas.tx = (elementWidth - this.transformCanvas.w * (elementHeight / this.transformCanvas.h)) / 2 * this.renderConfig.dpr; - } else if (xPos === 'xMax' && (animationRel < elementRel && fillType === 'meet' || animationRel > elementRel && fillType === 'slice')) { - this.transformCanvas.tx = (elementWidth - this.transformCanvas.w * (elementHeight / this.transformCanvas.h)) * this.renderConfig.dpr; - } else { - this.transformCanvas.tx = 0; - } - - if (yPos === 'YMid' && (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice')) { - this.transformCanvas.ty = (elementHeight - this.transformCanvas.h * (elementWidth / this.transformCanvas.w)) / 2 * this.renderConfig.dpr; - } else if (yPos === 'YMax' && (animationRel > elementRel && fillType === 'meet' || animationRel < elementRel && fillType === 'slice')) { - this.transformCanvas.ty = (elementHeight - this.transformCanvas.h * (elementWidth / this.transformCanvas.w)) * this.renderConfig.dpr; - } else { - this.transformCanvas.ty = 0; - } - } else if (this.renderConfig.preserveAspectRatio === 'none') { - this.transformCanvas.sx = elementWidth / (this.transformCanvas.w / this.renderConfig.dpr); - this.transformCanvas.sy = elementHeight / (this.transformCanvas.h / this.renderConfig.dpr); - this.transformCanvas.tx = 0; - this.transformCanvas.ty = 0; - } else { - this.transformCanvas.sx = this.renderConfig.dpr; - this.transformCanvas.sy = this.renderConfig.dpr; - this.transformCanvas.tx = 0; - this.transformCanvas.ty = 0; - } - - this.transformCanvas.props = [this.transformCanvas.sx, 0, 0, 0, 0, this.transformCanvas.sy, 0, 0, 0, 0, 1, 0, this.transformCanvas.tx, this.transformCanvas.ty, 0, 1]; - /* var i, len = this.elements.length; - for(i=0;i<len;i+=1){ - if(this.elements[i] && this.elements[i].data.ty === 0){ - this.elements[i].resize(this.globalData.transformCanvas); - } - } */ - - this.ctxTransform(this.transformCanvas.props); - this.canvasContext.beginPath(); - this.canvasContext.rect(0, 0, this.transformCanvas.w, this.transformCanvas.h); - this.canvasContext.closePath(); - this.canvasContext.clip(); - this.renderFrame(this.renderedFrame, true); - }; - - CanvasRendererBase.prototype.destroy = function () { - if (this.renderConfig.clearCanvas && this.animationItem.wrapper) { - this.animationItem.wrapper.innerText = ''; - } - - var i; - var len = this.layers ? this.layers.length : 0; - - for (i = len - 1; i >= 0; i -= 1) { - if (this.elements[i]) { - this.elements[i].destroy(); - } - } - - this.elements.length = 0; - this.globalData.canvasContext = null; - this.animationItem.container = null; - this.destroyed = true; - }; - - CanvasRendererBase.prototype.renderFrame = function (num, forceRender) { - if (this.renderedFrame === num && this.renderConfig.clearCanvas === true && !forceRender || this.destroyed || num === -1) { - return; - } - - this.renderedFrame = num; - this.globalData.frameNum = num - this.animationItem._isFirstFrame; - this.globalData.frameId += 1; - this.globalData._mdf = !this.renderConfig.clearCanvas || forceRender; - this.globalData.projectInterface.currentFrame = num; // console.log('--------'); - // console.log('NEW: ',num); - - var i; - var len = this.layers.length; - - if (!this.completeLayers) { - this.checkLayers(num); - } - - for (i = 0; i < len; i += 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].prepareFrame(num - this.layers[i].st); - } - } - - if (this.globalData._mdf) { - if (this.renderConfig.clearCanvas === true) { - this.canvasContext.clearRect(0, 0, this.transformCanvas.w, this.transformCanvas.h); - } else { - this.save(); - } - - for (i = len - 1; i >= 0; i -= 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].renderFrame(); - } - } - - if (this.renderConfig.clearCanvas !== true) { - this.restore(); - } - } - }; - - CanvasRendererBase.prototype.buildItem = function (pos) { - var elements = this.elements; - - if (elements[pos] || this.layers[pos].ty === 99) { - return; - } - - var element = this.createItem(this.layers[pos], this, this.globalData); - elements[pos] = element; - element.initExpressions(); - /* if(this.layers[pos].ty === 0){ - element.resize(this.globalData.transformCanvas); - } */ - }; - - CanvasRendererBase.prototype.checkPendingElements = function () { - while (this.pendingElements.length) { - var element = this.pendingElements.pop(); - element.checkParenting(); - } - }; - - CanvasRendererBase.prototype.hide = function () { - this.animationItem.container.style.display = 'none'; - }; - - CanvasRendererBase.prototype.show = function () { - this.animationItem.container.style.display = 'block'; - }; - - function CVCompElement(data, globalData, comp) { - this.completeLayers = false; - this.layers = data.layers; - this.pendingElements = []; - this.elements = createSizedArray(this.layers.length); - this.initElement(data, globalData, comp); - this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : { - _placeholder: true - }; - } - - extendPrototype([CanvasRendererBase, ICompElement, CVBaseElement], CVCompElement); - - CVCompElement.prototype.renderInnerContent = function () { - var ctx = this.canvasContext; - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(this.data.w, 0); - ctx.lineTo(this.data.w, this.data.h); - ctx.lineTo(0, this.data.h); - ctx.lineTo(0, 0); - ctx.clip(); - var i; - var len = this.layers.length; - - for (i = len - 1; i >= 0; i -= 1) { - if (this.completeLayers || this.elements[i]) { - this.elements[i].renderFrame(); - } - } - }; - - CVCompElement.prototype.destroy = function () { - var i; - var len = this.layers.length; - - for (i = len - 1; i >= 0; i -= 1) { - if (this.elements[i]) { - this.elements[i].destroy(); - } - } - - this.layers = null; - this.elements = null; - }; - - CVCompElement.prototype.createComp = function (data) { - return new CVCompElement(data, this.globalData, this); - }; - - function CanvasRenderer(animationItem, config) { - this.animationItem = animationItem; - this.renderConfig = { - clearCanvas: config && config.clearCanvas !== undefined ? config.clearCanvas : true, - context: config && config.context || null, - progressiveLoad: config && config.progressiveLoad || false, - preserveAspectRatio: config && config.preserveAspectRatio || 'xMidYMid meet', - imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice', - contentVisibility: config && config.contentVisibility || 'visible', - className: config && config.className || '', - id: config && config.id || '' - }; - this.renderConfig.dpr = config && config.dpr || 1; - - if (this.animationItem.wrapper) { - this.renderConfig.dpr = config && config.dpr || window.devicePixelRatio || 1; - } - - this.renderedFrame = -1; - this.globalData = { - frameNum: -1, - _mdf: false, - renderConfig: this.renderConfig, - currentGlobalAlpha: -1 - }; - this.contextData = new CVContextData(); - this.elements = []; - this.pendingElements = []; - this.transformMat = new Matrix(); - this.completeLayers = false; - this.rendererType = 'canvas'; - } - - extendPrototype([CanvasRendererBase], CanvasRenderer); - - CanvasRenderer.prototype.createComp = function (data) { - return new CVCompElement(data, this.globalData, this); - }; - - function HBaseElement() {} - - HBaseElement.prototype = { - checkBlendMode: function checkBlendMode() {}, - initRendererElement: function initRendererElement() { - this.baseElement = createTag(this.data.tg || 'div'); - - if (this.data.hasMask) { - this.svgElement = createNS('svg'); - this.layerElement = createNS('g'); - this.maskedElement = this.layerElement; - this.svgElement.appendChild(this.layerElement); - this.baseElement.appendChild(this.svgElement); - } else { - this.layerElement = this.baseElement; - } - - styleDiv(this.baseElement); - }, - createContainerElements: function createContainerElements() { - this.renderableEffectsManager = new CVEffects(this); - this.transformedElement = this.baseElement; - this.maskedElement = this.layerElement; - - if (this.data.ln) { - this.layerElement.setAttribute('id', this.data.ln); - } - - if (this.data.cl) { - this.layerElement.setAttribute('class', this.data.cl); - } - - if (this.data.bm !== 0) { - this.setBlendMode(); - } - }, - renderElement: function renderElement() { - var transformedElementStyle = this.transformedElement ? this.transformedElement.style : {}; - - if (this.finalTransform._matMdf) { - var matrixValue = this.finalTransform.mat.toCSS(); - transformedElementStyle.transform = matrixValue; - transformedElementStyle.webkitTransform = matrixValue; - } - - if (this.finalTransform._opMdf) { - transformedElementStyle.opacity = this.finalTransform.mProp.o.v; - } - }, - renderFrame: function renderFrame() { - // If it is exported as hidden (data.hd === true) no need to render - // If it is not visible no need to render - if (this.data.hd || this.hidden) { - return; - } - - this.renderTransform(); - this.renderRenderable(); - this.renderElement(); - this.renderInnerContent(); - - if (this._isFirstFrame) { - this._isFirstFrame = false; - } - }, - destroy: function destroy() { - this.layerElement = null; - this.transformedElement = null; - - if (this.matteElement) { - this.matteElement = null; - } - - if (this.maskManager) { - this.maskManager.destroy(); - this.maskManager = null; - } - }, - createRenderableComponents: function createRenderableComponents() { - this.maskManager = new MaskElement(this.data, this, this.globalData); - }, - addEffects: function addEffects() {}, - setMatte: function setMatte() {} - }; - HBaseElement.prototype.getBaseElement = SVGBaseElement.prototype.getBaseElement; - HBaseElement.prototype.destroyBaseElement = HBaseElement.prototype.destroy; - HBaseElement.prototype.buildElementParenting = BaseRenderer.prototype.buildElementParenting; - - function HSolidElement(data, globalData, comp) { - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, HBaseElement, HierarchyElement, FrameElement, RenderableDOMElement], HSolidElement); - - HSolidElement.prototype.createContent = function () { - var rect; - - if (this.data.hasMask) { - rect = createNS('rect'); - rect.setAttribute('width', this.data.sw); - rect.setAttribute('height', this.data.sh); - rect.setAttribute('fill', this.data.sc); - this.svgElement.setAttribute('width', this.data.sw); - this.svgElement.setAttribute('height', this.data.sh); - } else { - rect = createTag('div'); - rect.style.width = this.data.sw + 'px'; - rect.style.height = this.data.sh + 'px'; - rect.style.backgroundColor = this.data.sc; - } - - this.layerElement.appendChild(rect); - }; - - function HShapeElement(data, globalData, comp) { - // List of drawable elements - this.shapes = []; // Full shape data - - this.shapesData = data.shapes; // List of styles that will be applied to shapes - - this.stylesList = []; // List of modifiers that will be applied to shapes - - this.shapeModifiers = []; // List of items in shape tree - - this.itemsData = []; // List of items in previous shape tree - - this.processedElements = []; // List of animated components - - this.animatedContents = []; - this.shapesContainer = createNS('g'); - this.initElement(data, globalData, comp); // Moving any property that doesn't get too much access after initialization because of v8 way of handling more than 10 properties. - // List of elements that have been created - - this.prevViewData = []; - this.currentBBox = { - x: 999999, - y: -999999, - h: 0, - w: 0 - }; - } - - extendPrototype([BaseElement, TransformElement, HSolidElement, SVGShapeElement, HBaseElement, HierarchyElement, FrameElement, RenderableElement], HShapeElement); - HShapeElement.prototype._renderShapeFrame = HShapeElement.prototype.renderInnerContent; - - HShapeElement.prototype.createContent = function () { - var cont; - this.baseElement.style.fontSize = 0; - - if (this.data.hasMask) { - this.layerElement.appendChild(this.shapesContainer); - cont = this.svgElement; - } else { - cont = createNS('svg'); - var size = this.comp.data ? this.comp.data : this.globalData.compSize; - cont.setAttribute('width', size.w); - cont.setAttribute('height', size.h); - cont.appendChild(this.shapesContainer); - this.layerElement.appendChild(cont); - } - - this.searchShapes(this.shapesData, this.itemsData, this.prevViewData, this.shapesContainer, 0, [], true); - this.filterUniqueShapes(); - this.shapeCont = cont; - }; - - HShapeElement.prototype.getTransformedPoint = function (transformers, point) { - var i; - var len = transformers.length; - - for (i = 0; i < len; i += 1) { - point = transformers[i].mProps.v.applyToPointArray(point[0], point[1], 0); - } - - return point; - }; - - HShapeElement.prototype.calculateShapeBoundingBox = function (item, boundingBox) { - var shape = item.sh.v; - var transformers = item.transformers; - var i; - var len = shape._length; - var vPoint; - var oPoint; - var nextIPoint; - var nextVPoint; - - if (len <= 1) { - return; - } - - for (i = 0; i < len - 1; i += 1) { - vPoint = this.getTransformedPoint(transformers, shape.v[i]); - oPoint = this.getTransformedPoint(transformers, shape.o[i]); - nextIPoint = this.getTransformedPoint(transformers, shape.i[i + 1]); - nextVPoint = this.getTransformedPoint(transformers, shape.v[i + 1]); - this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox); - } - - if (shape.c) { - vPoint = this.getTransformedPoint(transformers, shape.v[i]); - oPoint = this.getTransformedPoint(transformers, shape.o[i]); - nextIPoint = this.getTransformedPoint(transformers, shape.i[0]); - nextVPoint = this.getTransformedPoint(transformers, shape.v[0]); - this.checkBounds(vPoint, oPoint, nextIPoint, nextVPoint, boundingBox); - } - }; - - HShapeElement.prototype.checkBounds = function (vPoint, oPoint, nextIPoint, nextVPoint, boundingBox) { - this.getBoundsOfCurve(vPoint, oPoint, nextIPoint, nextVPoint); - var bounds = this.shapeBoundingBox; - boundingBox.x = bmMin(bounds.left, boundingBox.x); - boundingBox.xMax = bmMax(bounds.right, boundingBox.xMax); - boundingBox.y = bmMin(bounds.top, boundingBox.y); - boundingBox.yMax = bmMax(bounds.bottom, boundingBox.yMax); - }; - - HShapeElement.prototype.shapeBoundingBox = { - left: 0, - right: 0, - top: 0, - bottom: 0 - }; - HShapeElement.prototype.tempBoundingBox = { - x: 0, - xMax: 0, - y: 0, - yMax: 0, - width: 0, - height: 0 - }; - - HShapeElement.prototype.getBoundsOfCurve = function (p0, p1, p2, p3) { - var bounds = [[p0[0], p3[0]], [p0[1], p3[1]]]; - - for (var a, b, c, t, b2ac, t1, t2, i = 0; i < 2; ++i) { - // eslint-disable-line no-plusplus - b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; - a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; - c = 3 * p1[i] - 3 * p0[i]; - b |= 0; // eslint-disable-line no-bitwise - - a |= 0; // eslint-disable-line no-bitwise - - c |= 0; // eslint-disable-line no-bitwise - - if (a === 0 && b === 0) {// - } else if (a === 0) { - t = -c / b; - - if (t > 0 && t < 1) { - bounds[i].push(this.calculateF(t, p0, p1, p2, p3, i)); - } - } else { - b2ac = b * b - 4 * c * a; - - if (b2ac >= 0) { - t1 = (-b + bmSqrt(b2ac)) / (2 * a); - if (t1 > 0 && t1 < 1) bounds[i].push(this.calculateF(t1, p0, p1, p2, p3, i)); - t2 = (-b - bmSqrt(b2ac)) / (2 * a); - if (t2 > 0 && t2 < 1) bounds[i].push(this.calculateF(t2, p0, p1, p2, p3, i)); - } - } - } - - this.shapeBoundingBox.left = bmMin.apply(null, bounds[0]); - this.shapeBoundingBox.top = bmMin.apply(null, bounds[1]); - this.shapeBoundingBox.right = bmMax.apply(null, bounds[0]); - this.shapeBoundingBox.bottom = bmMax.apply(null, bounds[1]); - }; - - HShapeElement.prototype.calculateF = function (t, p0, p1, p2, p3, i) { - return bmPow(1 - t, 3) * p0[i] + 3 * bmPow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * bmPow(t, 2) * p2[i] + bmPow(t, 3) * p3[i]; - }; - - HShapeElement.prototype.calculateBoundingBox = function (itemsData, boundingBox) { - var i; - var len = itemsData.length; - - for (i = 0; i < len; i += 1) { - if (itemsData[i] && itemsData[i].sh) { - this.calculateShapeBoundingBox(itemsData[i], boundingBox); - } else if (itemsData[i] && itemsData[i].it) { - this.calculateBoundingBox(itemsData[i].it, boundingBox); - } else if (itemsData[i] && itemsData[i].style && itemsData[i].w) { - this.expandStrokeBoundingBox(itemsData[i].w, boundingBox); - } - } - }; - - HShapeElement.prototype.expandStrokeBoundingBox = function (widthProperty, boundingBox) { - var width = 0; - - if (widthProperty.keyframes) { - for (var i = 0; i < widthProperty.keyframes.length; i += 1) { - var kfw = widthProperty.keyframes[i].s; - - if (kfw > width) { - width = kfw; - } - } - - width *= widthProperty.mult; - } else { - width = widthProperty.v * widthProperty.mult; - } - - boundingBox.x -= width; - boundingBox.xMax += width; - boundingBox.y -= width; - boundingBox.yMax += width; - }; - - HShapeElement.prototype.currentBoxContains = function (box) { - return this.currentBBox.x <= box.x && this.currentBBox.y <= box.y && this.currentBBox.width + this.currentBBox.x >= box.x + box.width && this.currentBBox.height + this.currentBBox.y >= box.y + box.height; - }; - - HShapeElement.prototype.renderInnerContent = function () { - this._renderShapeFrame(); - - if (!this.hidden && (this._isFirstFrame || this._mdf)) { - var tempBoundingBox = this.tempBoundingBox; - var max = 999999; - tempBoundingBox.x = max; - tempBoundingBox.xMax = -max; - tempBoundingBox.y = max; - tempBoundingBox.yMax = -max; - this.calculateBoundingBox(this.itemsData, tempBoundingBox); - tempBoundingBox.width = tempBoundingBox.xMax < tempBoundingBox.x ? 0 : tempBoundingBox.xMax - tempBoundingBox.x; - tempBoundingBox.height = tempBoundingBox.yMax < tempBoundingBox.y ? 0 : tempBoundingBox.yMax - tempBoundingBox.y; // var tempBoundingBox = this.shapeCont.getBBox(); - - if (this.currentBoxContains(tempBoundingBox)) { - return; - } - - var changed = false; - - if (this.currentBBox.w !== tempBoundingBox.width) { - this.currentBBox.w = tempBoundingBox.width; - this.shapeCont.setAttribute('width', tempBoundingBox.width); - changed = true; - } - - if (this.currentBBox.h !== tempBoundingBox.height) { - this.currentBBox.h = tempBoundingBox.height; - this.shapeCont.setAttribute('height', tempBoundingBox.height); - changed = true; - } - - if (changed || this.currentBBox.x !== tempBoundingBox.x || this.currentBBox.y !== tempBoundingBox.y) { - this.currentBBox.w = tempBoundingBox.width; - this.currentBBox.h = tempBoundingBox.height; - this.currentBBox.x = tempBoundingBox.x; - this.currentBBox.y = tempBoundingBox.y; - this.shapeCont.setAttribute('viewBox', this.currentBBox.x + ' ' + this.currentBBox.y + ' ' + this.currentBBox.w + ' ' + this.currentBBox.h); - var shapeStyle = this.shapeCont.style; - var shapeTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)'; - shapeStyle.transform = shapeTransform; - shapeStyle.webkitTransform = shapeTransform; - } - } - }; - - function HTextElement(data, globalData, comp) { - this.textSpans = []; - this.textPaths = []; - this.currentBBox = { - x: 999999, - y: -999999, - h: 0, - w: 0 - }; - this.renderType = 'svg'; - this.isMasked = false; - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, HBaseElement, HierarchyElement, FrameElement, RenderableDOMElement, ITextElement], HTextElement); - - HTextElement.prototype.createContent = function () { - this.isMasked = this.checkMasks(); - - if (this.isMasked) { - this.renderType = 'svg'; - this.compW = this.comp.data.w; - this.compH = this.comp.data.h; - this.svgElement.setAttribute('width', this.compW); - this.svgElement.setAttribute('height', this.compH); - var g = createNS('g'); - this.maskedElement.appendChild(g); - this.innerElem = g; - } else { - this.renderType = 'html'; - this.innerElem = this.layerElement; - } - - this.checkParenting(); - }; - - HTextElement.prototype.buildNewText = function () { - var documentData = this.textProperty.currentData; - this.renderedLetters = createSizedArray(documentData.l ? documentData.l.length : 0); - var innerElemStyle = this.innerElem.style; - var textColor = documentData.fc ? this.buildColor(documentData.fc) : 'rgba(0,0,0,0)'; - innerElemStyle.fill = textColor; - innerElemStyle.color = textColor; - - if (documentData.sc) { - innerElemStyle.stroke = this.buildColor(documentData.sc); - innerElemStyle.strokeWidth = documentData.sw + 'px'; - } - - var fontData = this.globalData.fontManager.getFontByName(documentData.f); - - if (!this.globalData.fontManager.chars) { - innerElemStyle.fontSize = documentData.finalSize + 'px'; - innerElemStyle.lineHeight = documentData.finalSize + 'px'; - - if (fontData.fClass) { - this.innerElem.className = fontData.fClass; - } else { - innerElemStyle.fontFamily = fontData.fFamily; - var fWeight = documentData.fWeight; - var fStyle = documentData.fStyle; - innerElemStyle.fontStyle = fStyle; - innerElemStyle.fontWeight = fWeight; - } - } - - var i; - var len; - var letters = documentData.l; - len = letters.length; - var tSpan; - var tParent; - var tCont; - var matrixHelper = this.mHelper; - var shapes; - var shapeStr = ''; - var cnt = 0; - - for (i = 0; i < len; i += 1) { - if (this.globalData.fontManager.chars) { - if (!this.textPaths[cnt]) { - tSpan = createNS('path'); - tSpan.setAttribute('stroke-linecap', lineCapEnum[1]); - tSpan.setAttribute('stroke-linejoin', lineJoinEnum[2]); - tSpan.setAttribute('stroke-miterlimit', '4'); - } else { - tSpan = this.textPaths[cnt]; - } - - if (!this.isMasked) { - if (this.textSpans[cnt]) { - tParent = this.textSpans[cnt]; - tCont = tParent.children[0]; - } else { - tParent = createTag('div'); - tParent.style.lineHeight = 0; - tCont = createNS('svg'); - tCont.appendChild(tSpan); - styleDiv(tParent); - } - } - } else if (!this.isMasked) { - if (this.textSpans[cnt]) { - tParent = this.textSpans[cnt]; - tSpan = this.textPaths[cnt]; - } else { - tParent = createTag('span'); - styleDiv(tParent); - tSpan = createTag('span'); - styleDiv(tSpan); - tParent.appendChild(tSpan); - } - } else { - tSpan = this.textPaths[cnt] ? this.textPaths[cnt] : createNS('text'); - } // tSpan.setAttribute('visibility', 'hidden'); - - - if (this.globalData.fontManager.chars) { - var charData = this.globalData.fontManager.getCharData(documentData.finalText[i], fontData.fStyle, this.globalData.fontManager.getFontByName(documentData.f).fFamily); - var shapeData; - - if (charData) { - shapeData = charData.data; - } else { - shapeData = null; - } - - matrixHelper.reset(); - - if (shapeData && shapeData.shapes && shapeData.shapes.length) { - shapes = shapeData.shapes[0].it; - matrixHelper.scale(documentData.finalSize / 100, documentData.finalSize / 100); - shapeStr = this.createPathShape(matrixHelper, shapes); - tSpan.setAttribute('d', shapeStr); - } - - if (!this.isMasked) { - this.innerElem.appendChild(tParent); - - if (shapeData && shapeData.shapes) { - // document.body.appendChild is needed to get exact measure of shape - document.body.appendChild(tCont); - var boundingBox = tCont.getBBox(); - tCont.setAttribute('width', boundingBox.width + 2); - tCont.setAttribute('height', boundingBox.height + 2); - tCont.setAttribute('viewBox', boundingBox.x - 1 + ' ' + (boundingBox.y - 1) + ' ' + (boundingBox.width + 2) + ' ' + (boundingBox.height + 2)); - var tContStyle = tCont.style; - var tContTranslation = 'translate(' + (boundingBox.x - 1) + 'px,' + (boundingBox.y - 1) + 'px)'; - tContStyle.transform = tContTranslation; - tContStyle.webkitTransform = tContTranslation; - letters[i].yOffset = boundingBox.y - 1; - } else { - tCont.setAttribute('width', 1); - tCont.setAttribute('height', 1); - } - - tParent.appendChild(tCont); - } else { - this.innerElem.appendChild(tSpan); - } - } else { - tSpan.textContent = letters[i].val; - tSpan.setAttributeNS('http://www.w3.org/XML/1998/namespace', 'xml:space', 'preserve'); - - if (!this.isMasked) { - this.innerElem.appendChild(tParent); // - - var tStyle = tSpan.style; - var tSpanTranslation = 'translate3d(0,' + -documentData.finalSize / 1.2 + 'px,0)'; - tStyle.transform = tSpanTranslation; - tStyle.webkitTransform = tSpanTranslation; - } else { - this.innerElem.appendChild(tSpan); - } - } // - - - if (!this.isMasked) { - this.textSpans[cnt] = tParent; - } else { - this.textSpans[cnt] = tSpan; - } - - this.textSpans[cnt].style.display = 'block'; - this.textPaths[cnt] = tSpan; - cnt += 1; - } - - while (cnt < this.textSpans.length) { - this.textSpans[cnt].style.display = 'none'; - cnt += 1; - } - }; - - HTextElement.prototype.renderInnerContent = function () { - var svgStyle; - - if (this.data.singleShape) { - if (!this._isFirstFrame && !this.lettersChangedFlag) { - return; - } - - if (this.isMasked && this.finalTransform._matMdf) { - // Todo Benchmark if using this is better than getBBox - this.svgElement.setAttribute('viewBox', -this.finalTransform.mProp.p.v[0] + ' ' + -this.finalTransform.mProp.p.v[1] + ' ' + this.compW + ' ' + this.compH); - svgStyle = this.svgElement.style; - var translation = 'translate(' + -this.finalTransform.mProp.p.v[0] + 'px,' + -this.finalTransform.mProp.p.v[1] + 'px)'; - svgStyle.transform = translation; - svgStyle.webkitTransform = translation; - } - } - - this.textAnimator.getMeasures(this.textProperty.currentData, this.lettersChangedFlag); - - if (!this.lettersChangedFlag && !this.textAnimator.lettersChangedFlag) { - return; - } - - var i; - var len; - var count = 0; - var renderedLetters = this.textAnimator.renderedLetters; - var letters = this.textProperty.currentData.l; - len = letters.length; - var renderedLetter; - var textSpan; - var textPath; - - for (i = 0; i < len; i += 1) { - if (letters[i].n) { - count += 1; - } else { - textSpan = this.textSpans[i]; - textPath = this.textPaths[i]; - renderedLetter = renderedLetters[count]; - count += 1; - - if (renderedLetter._mdf.m) { - if (!this.isMasked) { - textSpan.style.webkitTransform = renderedLetter.m; - textSpan.style.transform = renderedLetter.m; - } else { - textSpan.setAttribute('transform', renderedLetter.m); - } - } /// /textSpan.setAttribute('opacity',renderedLetter.o); - - - textSpan.style.opacity = renderedLetter.o; - - if (renderedLetter.sw && renderedLetter._mdf.sw) { - textPath.setAttribute('stroke-width', renderedLetter.sw); - } - - if (renderedLetter.sc && renderedLetter._mdf.sc) { - textPath.setAttribute('stroke', renderedLetter.sc); - } - - if (renderedLetter.fc && renderedLetter._mdf.fc) { - textPath.setAttribute('fill', renderedLetter.fc); - textPath.style.color = renderedLetter.fc; - } - } - } - - if (this.innerElem.getBBox && !this.hidden && (this._isFirstFrame || this._mdf)) { - var boundingBox = this.innerElem.getBBox(); - - if (this.currentBBox.w !== boundingBox.width) { - this.currentBBox.w = boundingBox.width; - this.svgElement.setAttribute('width', boundingBox.width); - } - - if (this.currentBBox.h !== boundingBox.height) { - this.currentBBox.h = boundingBox.height; - this.svgElement.setAttribute('height', boundingBox.height); - } - - var margin = 1; - - if (this.currentBBox.w !== boundingBox.width + margin * 2 || this.currentBBox.h !== boundingBox.height + margin * 2 || this.currentBBox.x !== boundingBox.x - margin || this.currentBBox.y !== boundingBox.y - margin) { - this.currentBBox.w = boundingBox.width + margin * 2; - this.currentBBox.h = boundingBox.height + margin * 2; - this.currentBBox.x = boundingBox.x - margin; - this.currentBBox.y = boundingBox.y - margin; - this.svgElement.setAttribute('viewBox', this.currentBBox.x + ' ' + this.currentBBox.y + ' ' + this.currentBBox.w + ' ' + this.currentBBox.h); - svgStyle = this.svgElement.style; - var svgTransform = 'translate(' + this.currentBBox.x + 'px,' + this.currentBBox.y + 'px)'; - svgStyle.transform = svgTransform; - svgStyle.webkitTransform = svgTransform; - } - } - }; - - function HCameraElement(data, globalData, comp) { - this.initFrame(); - this.initBaseData(data, globalData, comp); - this.initHierarchy(); - var getProp = PropertyFactory.getProp; - this.pe = getProp(this, data.pe, 0, 0, this); - - if (data.ks.p.s) { - this.px = getProp(this, data.ks.p.x, 1, 0, this); - this.py = getProp(this, data.ks.p.y, 1, 0, this); - this.pz = getProp(this, data.ks.p.z, 1, 0, this); - } else { - this.p = getProp(this, data.ks.p, 1, 0, this); - } - - if (data.ks.a) { - this.a = getProp(this, data.ks.a, 1, 0, this); - } - - if (data.ks.or.k.length && data.ks.or.k[0].to) { - var i; - var len = data.ks.or.k.length; - - for (i = 0; i < len; i += 1) { - data.ks.or.k[i].to = null; - data.ks.or.k[i].ti = null; - } - } - - this.or = getProp(this, data.ks.or, 1, degToRads, this); - this.or.sh = true; - this.rx = getProp(this, data.ks.rx, 0, degToRads, this); - this.ry = getProp(this, data.ks.ry, 0, degToRads, this); - this.rz = getProp(this, data.ks.rz, 0, degToRads, this); - this.mat = new Matrix(); - this._prevMat = new Matrix(); - this._isFirstFrame = true; // TODO: find a better way to make the HCamera element to be compatible with the LayerInterface and TransformInterface. - - this.finalTransform = { - mProp: this - }; - } - - extendPrototype([BaseElement, FrameElement, HierarchyElement], HCameraElement); - - HCameraElement.prototype.setup = function () { - var i; - var len = this.comp.threeDElements.length; - var comp; - var perspectiveStyle; - var containerStyle; - - for (i = 0; i < len; i += 1) { - // [perspectiveElem,container] - comp = this.comp.threeDElements[i]; - - if (comp.type === '3d') { - perspectiveStyle = comp.perspectiveElem.style; - containerStyle = comp.container.style; - var perspective = this.pe.v + 'px'; - var origin = '0px 0px 0px'; - var matrix = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)'; - perspectiveStyle.perspective = perspective; - perspectiveStyle.webkitPerspective = perspective; - containerStyle.transformOrigin = origin; - containerStyle.mozTransformOrigin = origin; - containerStyle.webkitTransformOrigin = origin; - perspectiveStyle.transform = matrix; - perspectiveStyle.webkitTransform = matrix; - } - } - }; - - HCameraElement.prototype.createElements = function () {}; - - HCameraElement.prototype.hide = function () {}; - - HCameraElement.prototype.renderFrame = function () { - var _mdf = this._isFirstFrame; - var i; - var len; - - if (this.hierarchy) { - len = this.hierarchy.length; - - for (i = 0; i < len; i += 1) { - _mdf = this.hierarchy[i].finalTransform.mProp._mdf || _mdf; - } - } - - if (_mdf || this.pe._mdf || this.p && this.p._mdf || this.px && (this.px._mdf || this.py._mdf || this.pz._mdf) || this.rx._mdf || this.ry._mdf || this.rz._mdf || this.or._mdf || this.a && this.a._mdf) { - this.mat.reset(); - - if (this.hierarchy) { - len = this.hierarchy.length - 1; - - for (i = len; i >= 0; i -= 1) { - var mTransf = this.hierarchy[i].finalTransform.mProp; - this.mat.translate(-mTransf.p.v[0], -mTransf.p.v[1], mTransf.p.v[2]); - this.mat.rotateX(-mTransf.or.v[0]).rotateY(-mTransf.or.v[1]).rotateZ(mTransf.or.v[2]); - this.mat.rotateX(-mTransf.rx.v).rotateY(-mTransf.ry.v).rotateZ(mTransf.rz.v); - this.mat.scale(1 / mTransf.s.v[0], 1 / mTransf.s.v[1], 1 / mTransf.s.v[2]); - this.mat.translate(mTransf.a.v[0], mTransf.a.v[1], mTransf.a.v[2]); - } - } - - if (this.p) { - this.mat.translate(-this.p.v[0], -this.p.v[1], this.p.v[2]); - } else { - this.mat.translate(-this.px.v, -this.py.v, this.pz.v); - } - - if (this.a) { - var diffVector; - - if (this.p) { - diffVector = [this.p.v[0] - this.a.v[0], this.p.v[1] - this.a.v[1], this.p.v[2] - this.a.v[2]]; - } else { - diffVector = [this.px.v - this.a.v[0], this.py.v - this.a.v[1], this.pz.v - this.a.v[2]]; - } - - var mag = Math.sqrt(Math.pow(diffVector[0], 2) + Math.pow(diffVector[1], 2) + Math.pow(diffVector[2], 2)); // var lookDir = getNormalizedPoint(getDiffVector(this.a.v,this.p.v)); - - var lookDir = [diffVector[0] / mag, diffVector[1] / mag, diffVector[2] / mag]; - var lookLengthOnXZ = Math.sqrt(lookDir[2] * lookDir[2] + lookDir[0] * lookDir[0]); - var mRotationX = Math.atan2(lookDir[1], lookLengthOnXZ); - var mRotationY = Math.atan2(lookDir[0], -lookDir[2]); - this.mat.rotateY(mRotationY).rotateX(-mRotationX); - } - - this.mat.rotateX(-this.rx.v).rotateY(-this.ry.v).rotateZ(this.rz.v); - this.mat.rotateX(-this.or.v[0]).rotateY(-this.or.v[1]).rotateZ(this.or.v[2]); - this.mat.translate(this.globalData.compSize.w / 2, this.globalData.compSize.h / 2, 0); - this.mat.translate(0, 0, this.pe.v); - var hasMatrixChanged = !this._prevMat.equals(this.mat); - - if ((hasMatrixChanged || this.pe._mdf) && this.comp.threeDElements) { - len = this.comp.threeDElements.length; - var comp; - var perspectiveStyle; - var containerStyle; - - for (i = 0; i < len; i += 1) { - comp = this.comp.threeDElements[i]; - - if (comp.type === '3d') { - if (hasMatrixChanged) { - var matValue = this.mat.toCSS(); - containerStyle = comp.container.style; - containerStyle.transform = matValue; - containerStyle.webkitTransform = matValue; - } - - if (this.pe._mdf) { - perspectiveStyle = comp.perspectiveElem.style; - perspectiveStyle.perspective = this.pe.v + 'px'; - perspectiveStyle.webkitPerspective = this.pe.v + 'px'; - } - } - } - - this.mat.clone(this._prevMat); - } - } - - this._isFirstFrame = false; - }; - - HCameraElement.prototype.prepareFrame = function (num) { - this.prepareProperties(num, true); - }; - - HCameraElement.prototype.destroy = function () {}; - - HCameraElement.prototype.getBaseElement = function () { - return null; - }; - - function HImageElement(data, globalData, comp) { - this.assetData = globalData.getAssetData(data.refId); - this.initElement(data, globalData, comp); - } - - extendPrototype([BaseElement, TransformElement, HBaseElement, HSolidElement, HierarchyElement, FrameElement, RenderableElement], HImageElement); - - HImageElement.prototype.createContent = function () { - var assetPath = this.globalData.getAssetsPath(this.assetData); - var img = new Image(); - - if (this.data.hasMask) { - this.imageElem = createNS('image'); - this.imageElem.setAttribute('width', this.assetData.w + 'px'); - this.imageElem.setAttribute('height', this.assetData.h + 'px'); - this.imageElem.setAttributeNS('http://www.w3.org/1999/xlink', 'href', assetPath); - this.layerElement.appendChild(this.imageElem); - this.baseElement.setAttribute('width', this.assetData.w); - this.baseElement.setAttribute('height', this.assetData.h); - } else { - this.layerElement.appendChild(img); - } - - img.crossOrigin = 'anonymous'; - img.src = assetPath; - - if (this.data.ln) { - this.baseElement.setAttribute('id', this.data.ln); - } - }; - - function HybridRendererBase(animationItem, config) { - this.animationItem = animationItem; - this.layers = null; - this.renderedFrame = -1; - this.renderConfig = { - className: config && config.className || '', - imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice', - hideOnTransparent: !(config && config.hideOnTransparent === false), - filterSize: { - width: config && config.filterSize && config.filterSize.width || '400%', - height: config && config.filterSize && config.filterSize.height || '400%', - x: config && config.filterSize && config.filterSize.x || '-100%', - y: config && config.filterSize && config.filterSize.y || '-100%' - } - }; - this.globalData = { - _mdf: false, - frameNum: -1, - renderConfig: this.renderConfig - }; - this.pendingElements = []; - this.elements = []; - this.threeDElements = []; - this.destroyed = false; - this.camera = null; - this.supports3d = true; - this.rendererType = 'html'; - } - - extendPrototype([BaseRenderer], HybridRendererBase); - HybridRendererBase.prototype.buildItem = SVGRenderer.prototype.buildItem; - - HybridRendererBase.prototype.checkPendingElements = function () { - while (this.pendingElements.length) { - var element = this.pendingElements.pop(); - element.checkParenting(); - } - }; - - HybridRendererBase.prototype.appendElementInPos = function (element, pos) { - var newDOMElement = element.getBaseElement(); - - if (!newDOMElement) { - return; - } - - var layer = this.layers[pos]; - - if (!layer.ddd || !this.supports3d) { - if (this.threeDElements) { - this.addTo3dContainer(newDOMElement, pos); - } else { - var i = 0; - var nextDOMElement; - var nextLayer; - var tmpDOMElement; - - while (i < pos) { - if (this.elements[i] && this.elements[i] !== true && this.elements[i].getBaseElement) { - nextLayer = this.elements[i]; - tmpDOMElement = this.layers[i].ddd ? this.getThreeDContainerByPos(i) : nextLayer.getBaseElement(); - nextDOMElement = tmpDOMElement || nextDOMElement; - } - - i += 1; - } - - if (nextDOMElement) { - if (!layer.ddd || !this.supports3d) { - this.layerElement.insertBefore(newDOMElement, nextDOMElement); - } - } else if (!layer.ddd || !this.supports3d) { - this.layerElement.appendChild(newDOMElement); - } - } - } else { - this.addTo3dContainer(newDOMElement, pos); - } - }; - - HybridRendererBase.prototype.createShape = function (data) { - if (!this.supports3d) { - return new SVGShapeElement(data, this.globalData, this); - } - - return new HShapeElement(data, this.globalData, this); - }; - - HybridRendererBase.prototype.createText = function (data) { - if (!this.supports3d) { - return new SVGTextLottieElement(data, this.globalData, this); - } - - return new HTextElement(data, this.globalData, this); - }; - - HybridRendererBase.prototype.createCamera = function (data) { - this.camera = new HCameraElement(data, this.globalData, this); - return this.camera; - }; - - HybridRendererBase.prototype.createImage = function (data) { - if (!this.supports3d) { - return new IImageElement(data, this.globalData, this); - } - - return new HImageElement(data, this.globalData, this); - }; - - HybridRendererBase.prototype.createSolid = function (data) { - if (!this.supports3d) { - return new ISolidElement(data, this.globalData, this); - } - - return new HSolidElement(data, this.globalData, this); - }; - - HybridRendererBase.prototype.createNull = SVGRenderer.prototype.createNull; - - HybridRendererBase.prototype.getThreeDContainerByPos = function (pos) { - var i = 0; - var len = this.threeDElements.length; - - while (i < len) { - if (this.threeDElements[i].startPos <= pos && this.threeDElements[i].endPos >= pos) { - return this.threeDElements[i].perspectiveElem; - } - - i += 1; - } - - return null; - }; - - HybridRendererBase.prototype.createThreeDContainer = function (pos, type) { - var perspectiveElem = createTag('div'); - var style; - var containerStyle; - styleDiv(perspectiveElem); - var container = createTag('div'); - styleDiv(container); - - if (type === '3d') { - style = perspectiveElem.style; - style.width = this.globalData.compSize.w + 'px'; - style.height = this.globalData.compSize.h + 'px'; - var center = '50% 50%'; - style.webkitTransformOrigin = center; - style.mozTransformOrigin = center; - style.transformOrigin = center; - containerStyle = container.style; - var matrix = 'matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)'; - containerStyle.transform = matrix; - containerStyle.webkitTransform = matrix; - } - - perspectiveElem.appendChild(container); // this.resizerElem.appendChild(perspectiveElem); - - var threeDContainerData = { - container: container, - perspectiveElem: perspectiveElem, - startPos: pos, - endPos: pos, - type: type - }; - this.threeDElements.push(threeDContainerData); - return threeDContainerData; - }; - - HybridRendererBase.prototype.build3dContainers = function () { - var i; - var len = this.layers.length; - var lastThreeDContainerData; - var currentContainer = ''; - - for (i = 0; i < len; i += 1) { - if (this.layers[i].ddd && this.layers[i].ty !== 3) { - if (currentContainer !== '3d') { - currentContainer = '3d'; - lastThreeDContainerData = this.createThreeDContainer(i, '3d'); - } - - lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos, i); - } else { - if (currentContainer !== '2d') { - currentContainer = '2d'; - lastThreeDContainerData = this.createThreeDContainer(i, '2d'); - } - - lastThreeDContainerData.endPos = Math.max(lastThreeDContainerData.endPos, i); - } - } - - len = this.threeDElements.length; - - for (i = len - 1; i >= 0; i -= 1) { - this.resizerElem.appendChild(this.threeDElements[i].perspectiveElem); - } - }; - - HybridRendererBase.prototype.addTo3dContainer = function (elem, pos) { - var i = 0; - var len = this.threeDElements.length; - - while (i < len) { - if (pos <= this.threeDElements[i].endPos) { - var j = this.threeDElements[i].startPos; - var nextElement; - - while (j < pos) { - if (this.elements[j] && this.elements[j].getBaseElement) { - nextElement = this.elements[j].getBaseElement(); - } - - j += 1; - } - - if (nextElement) { - this.threeDElements[i].container.insertBefore(elem, nextElement); - } else { - this.threeDElements[i].container.appendChild(elem); - } - - break; - } - - i += 1; - } - }; - - HybridRendererBase.prototype.configAnimation = function (animData) { - var resizerElem = createTag('div'); - var wrapper = this.animationItem.wrapper; - var style = resizerElem.style; - style.width = animData.w + 'px'; - style.height = animData.h + 'px'; - this.resizerElem = resizerElem; - styleDiv(resizerElem); - style.transformStyle = 'flat'; - style.mozTransformStyle = 'flat'; - style.webkitTransformStyle = 'flat'; - - if (this.renderConfig.className) { - resizerElem.setAttribute('class', this.renderConfig.className); - } - - wrapper.appendChild(resizerElem); - style.overflow = 'hidden'; - var svg = createNS('svg'); - svg.setAttribute('width', '1'); - svg.setAttribute('height', '1'); - styleDiv(svg); - this.resizerElem.appendChild(svg); - var defs = createNS('defs'); - svg.appendChild(defs); - this.data = animData; // Mask animation - - this.setupGlobalData(animData, svg); - this.globalData.defs = defs; - this.layers = animData.layers; - this.layerElement = this.resizerElem; - this.build3dContainers(); - this.updateContainerSize(); - }; - - HybridRendererBase.prototype.destroy = function () { - if (this.animationItem.wrapper) { - this.animationItem.wrapper.innerText = ''; - } - - this.animationItem.container = null; - this.globalData.defs = null; - var i; - var len = this.layers ? this.layers.length : 0; - - for (i = 0; i < len; i += 1) { - this.elements[i].destroy(); - } - - this.elements.length = 0; - this.destroyed = true; - this.animationItem = null; - }; - - HybridRendererBase.prototype.updateContainerSize = function () { - var elementWidth = this.animationItem.wrapper.offsetWidth; - var elementHeight = this.animationItem.wrapper.offsetHeight; - var elementRel = elementWidth / elementHeight; - var animationRel = this.globalData.compSize.w / this.globalData.compSize.h; - var sx; - var sy; - var tx; - var ty; - - if (animationRel > elementRel) { - sx = elementWidth / this.globalData.compSize.w; - sy = elementWidth / this.globalData.compSize.w; - tx = 0; - ty = (elementHeight - this.globalData.compSize.h * (elementWidth / this.globalData.compSize.w)) / 2; - } else { - sx = elementHeight / this.globalData.compSize.h; - sy = elementHeight / this.globalData.compSize.h; - tx = (elementWidth - this.globalData.compSize.w * (elementHeight / this.globalData.compSize.h)) / 2; - ty = 0; - } - - var style = this.resizerElem.style; - style.webkitTransform = 'matrix3d(' + sx + ',0,0,0,0,' + sy + ',0,0,0,0,1,0,' + tx + ',' + ty + ',0,1)'; - style.transform = style.webkitTransform; - }; - - HybridRendererBase.prototype.renderFrame = SVGRenderer.prototype.renderFrame; - - HybridRendererBase.prototype.hide = function () { - this.resizerElem.style.display = 'none'; - }; - - HybridRendererBase.prototype.show = function () { - this.resizerElem.style.display = 'block'; - }; - - HybridRendererBase.prototype.initItems = function () { - this.buildAllItems(); - - if (this.camera) { - this.camera.setup(); - } else { - var cWidth = this.globalData.compSize.w; - var cHeight = this.globalData.compSize.h; - var i; - var len = this.threeDElements.length; - - for (i = 0; i < len; i += 1) { - var style = this.threeDElements[i].perspectiveElem.style; - style.webkitPerspective = Math.sqrt(Math.pow(cWidth, 2) + Math.pow(cHeight, 2)) + 'px'; - style.perspective = style.webkitPerspective; - } - } - }; - - HybridRendererBase.prototype.searchExtraCompositions = function (assets) { - var i; - var len = assets.length; - var floatingContainer = createTag('div'); - - for (i = 0; i < len; i += 1) { - if (assets[i].xt) { - var comp = this.createComp(assets[i], floatingContainer, this.globalData.comp, null); - comp.initExpressions(); - this.globalData.projectInterface.registerComposition(comp); - } - } - }; - - function HCompElement(data, globalData, comp) { - this.layers = data.layers; - this.supports3d = !data.hasMask; - this.completeLayers = false; - this.pendingElements = []; - this.elements = this.layers ? createSizedArray(this.layers.length) : []; - this.initElement(data, globalData, comp); - this.tm = data.tm ? PropertyFactory.getProp(this, data.tm, 0, globalData.frameRate, this) : { - _placeholder: true - }; - } - - extendPrototype([HybridRendererBase, ICompElement, HBaseElement], HCompElement); - HCompElement.prototype._createBaseContainerElements = HCompElement.prototype.createContainerElements; - - HCompElement.prototype.createContainerElements = function () { - this._createBaseContainerElements(); // divElement.style.clip = 'rect(0px, '+this.data.w+'px, '+this.data.h+'px, 0px)'; - - - if (this.data.hasMask) { - this.svgElement.setAttribute('width', this.data.w); - this.svgElement.setAttribute('height', this.data.h); - this.transformedElement = this.baseElement; - } else { - this.transformedElement = this.layerElement; - } - }; - - HCompElement.prototype.addTo3dContainer = function (elem, pos) { - var j = 0; - var nextElement; - - while (j < pos) { - if (this.elements[j] && this.elements[j].getBaseElement) { - nextElement = this.elements[j].getBaseElement(); - } - - j += 1; - } - - if (nextElement) { - this.layerElement.insertBefore(elem, nextElement); - } else { - this.layerElement.appendChild(elem); - } - }; - - HCompElement.prototype.createComp = function (data) { - if (!this.supports3d) { - return new SVGCompElement(data, this.globalData, this); - } - - return new HCompElement(data, this.globalData, this); - }; - - function HybridRenderer(animationItem, config) { - this.animationItem = animationItem; - this.layers = null; - this.renderedFrame = -1; - this.renderConfig = { - className: config && config.className || '', - imagePreserveAspectRatio: config && config.imagePreserveAspectRatio || 'xMidYMid slice', - hideOnTransparent: !(config && config.hideOnTransparent === false), - filterSize: { - width: config && config.filterSize && config.filterSize.width || '400%', - height: config && config.filterSize && config.filterSize.height || '400%', - x: config && config.filterSize && config.filterSize.x || '-100%', - y: config && config.filterSize && config.filterSize.y || '-100%' - } - }; - this.globalData = { - _mdf: false, - frameNum: -1, - renderConfig: this.renderConfig - }; - this.pendingElements = []; - this.elements = []; - this.threeDElements = []; - this.destroyed = false; - this.camera = null; - this.supports3d = true; - this.rendererType = 'html'; - } - - extendPrototype([HybridRendererBase], HybridRenderer); - - HybridRenderer.prototype.createComp = function (data) { - if (!this.supports3d) { - return new SVGCompElement(data, this.globalData, this); - } - - return new HCompElement(data, this.globalData, this); - }; - - var Expressions = function () { - var ob = {}; - ob.initExpressions = initExpressions; - - function initExpressions(animation) { - var stackCount = 0; - var registers = []; - - function pushExpression() { - stackCount += 1; - } - - function popExpression() { - stackCount -= 1; - - if (stackCount === 0) { - releaseInstances(); - } - } - - function registerExpressionProperty(expression) { - if (registers.indexOf(expression) === -1) { - registers.push(expression); - } - } - - function releaseInstances() { - var i; - var len = registers.length; - - for (i = 0; i < len; i += 1) { - registers[i].release(); - } - - registers.length = 0; - } - - animation.renderer.compInterface = CompExpressionInterface(animation.renderer); - animation.renderer.globalData.projectInterface.registerComposition(animation.renderer); - animation.renderer.globalData.pushExpression = pushExpression; - animation.renderer.globalData.popExpression = popExpression; - animation.renderer.globalData.registerExpressionProperty = registerExpressionProperty; - } - - return ob; - }(); - - function _typeof$1(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof$1 = function _typeof(obj) { return typeof obj; }; } else { _typeof$1 = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof$1(obj); } - - /* eslint-disable */ - - /* - Copyright 2014 David Bau. - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - */ - function seedRandom(pool, math) { - // - // The following constants are related to IEEE 754 limits. - // - var global = this, - width = 256, - // each RC4 output is 0 <= x < 256 - chunks = 6, - // at least six RC4 outputs for each double - digits = 52, - // there are 52 significant digits in a double - rngname = 'random', - // rngname: name for Math.random and Math.seedrandom - startdenom = math.pow(width, chunks), - significance = math.pow(2, digits), - overflow = significance * 2, - mask = width - 1, - nodecrypto; // node.js crypto module, initialized at the bottom. - // - // seedrandom() - // This is the seedrandom function described above. - // - - function seedrandom(seed, options, callback) { - var key = []; - options = options === true ? { - entropy: true - } : options || {}; // Flatten the seed string or build one from local entropy if needed. - - var shortseed = mixkey(flatten(options.entropy ? [seed, tostring(pool)] : seed === null ? autoseed() : seed, 3), key); // Use the seed to initialize an ARC4 generator. - - var arc4 = new ARC4(key); // This function returns a random double in [0, 1) that contains - // randomness in every bit of the mantissa of the IEEE 754 value. - - var prng = function prng() { - var n = arc4.g(chunks), - // Start with a numerator n < 2 ^ 48 - d = startdenom, - // and denominator d = 2 ^ 48. - x = 0; // and no 'extra last byte'. - - while (n < significance) { - // Fill up all significant digits by - n = (n + x) * width; // shifting numerator and - - d *= width; // denominator and generating a - - x = arc4.g(1); // new least-significant-byte. - } - - while (n >= overflow) { - // To avoid rounding up, before adding - n /= 2; // last byte, shift everything - - d /= 2; // right using integer math until - - x >>>= 1; // we have exactly the desired bits. - } - - return (n + x) / d; // Form the number within [0, 1). - }; - - prng.int32 = function () { - return arc4.g(4) | 0; - }; - - prng.quick = function () { - return arc4.g(4) / 0x100000000; - }; - - prng["double"] = prng; // Mix the randomness into accumulated entropy. - - mixkey(tostring(arc4.S), pool); // Calling convention: what to return as a function of prng, seed, is_math. - - return (options.pass || callback || function (prng, seed, is_math_call, state) { - if (state) { - // Load the arc4 state from the given state if it has an S array. - if (state.S) { - copy(state, arc4); - } // Only provide the .state method if requested via options.state. - - - prng.state = function () { - return copy(arc4, {}); - }; - } // If called as a method of Math (Math.seedrandom()), mutate - // Math.random because that is how seedrandom.js has worked since v1.0. - - - if (is_math_call) { - math[rngname] = prng; - return seed; - } // Otherwise, it is a newer calling convention, so return the - // prng directly. - else return prng; - })(prng, shortseed, 'global' in options ? options.global : this == math, options.state); - } - - math['seed' + rngname] = seedrandom; // - // ARC4 - // - // An ARC4 implementation. The constructor takes a key in the form of - // an array of at most (width) integers that should be 0 <= x < (width). - // - // The g(count) method returns a pseudorandom integer that concatenates - // the next (count) outputs from ARC4. Its return value is a number x - // that is in the range 0 <= x < (width ^ count). - // - - function ARC4(key) { - var t, - keylen = key.length, - me = this, - i = 0, - j = me.i = me.j = 0, - s = me.S = []; // The empty key [] is treated as [0]. - - if (!keylen) { - key = [keylen++]; - } // Set up S using the standard key scheduling algorithm. - - - while (i < width) { - s[i] = i++; - } - - for (i = 0; i < width; i++) { - s[i] = s[j = mask & j + key[i % keylen] + (t = s[i])]; - s[j] = t; - } // The "g" method returns the next (count) outputs as one number. - - - me.g = function (count) { - // Using instance members instead of closure state nearly doubles speed. - var t, - r = 0, - i = me.i, - j = me.j, - s = me.S; - - while (count--) { - t = s[i = mask & i + 1]; - r = r * width + s[mask & (s[i] = s[j = mask & j + t]) + (s[j] = t)]; - } - - me.i = i; - me.j = j; - return r; // For robust unpredictability, the function call below automatically - // discards an initial batch of values. This is called RC4-drop[256]. - // See http://google.com/search?q=rsa+fluhrer+response&btnI - }; - } // - // copy() - // Copies internal state of ARC4 to or from a plain object. - // - - - function copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = f.S.slice(); - return t; - } // - // flatten() - // Converts an object tree to nested arrays of strings. - // - - - function flatten(obj, depth) { - var result = [], - typ = _typeof$1(obj), - prop; - - if (depth && typ == 'object') { - for (prop in obj) { - try { - result.push(flatten(obj[prop], depth - 1)); - } catch (e) {} - } - } - - return result.length ? result : typ == 'string' ? obj : obj + '\0'; - } // - // mixkey() - // Mixes a string seed into a key that is an array of integers, and - // returns a shortened string seed that is equivalent to the result key. - // - - - function mixkey(seed, key) { - var stringseed = seed + '', - smear, - j = 0; - - while (j < stringseed.length) { - key[mask & j] = mask & (smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++); - } - - return tostring(key); - } // - // autoseed() - // Returns an object for autoseeding, using window.crypto and Node crypto - // module if available. - // - - - function autoseed() { - try { - if (nodecrypto) { - return tostring(nodecrypto.randomBytes(width)); - } - - var out = new Uint8Array(width); - (global.crypto || global.msCrypto).getRandomValues(out); - return tostring(out); - } catch (e) { - var browser = global.navigator, - plugins = browser && browser.plugins; - return [+new Date(), global, plugins, global.screen, tostring(pool)]; - } - } // - // tostring() - // Converts an array of charcodes to a string - // - - - function tostring(a) { - return String.fromCharCode.apply(0, a); - } // - // When seedrandom.js is loaded, we immediately mix a few bits - // from the built-in RNG into the entropy pool. Because we do - // not want to interfere with deterministic PRNG state later, - // seedrandom will not call math.random on its own again after - // initialization. - // - - - mixkey(math.random(), pool); // - // Nodejs and AMD support: export the implementation as a module using - // either convention. - // - // End anonymous scope, and pass initial values. - } - - ; - - function initialize$2(BMMath) { - seedRandom([], BMMath); - } - - var propTypes = { - SHAPE: 'shape' - }; - - function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } - - var ExpressionManager = function () { - 'use strict'; - - var ob = {}; - var Math = BMMath; - var window = null; - var document = null; - var XMLHttpRequest = null; - var fetch = null; - var frames = null; - initialize$2(BMMath); - - function $bm_isInstanceOfArray(arr) { - return arr.constructor === Array || arr.constructor === Float32Array; - } - - function isNumerable(tOfV, v) { - return tOfV === 'number' || tOfV === 'boolean' || tOfV === 'string' || v instanceof Number; - } - - function $bm_neg(a) { - var tOfA = _typeof(a); - - if (tOfA === 'number' || tOfA === 'boolean' || a instanceof Number) { - return -a; - } - - if ($bm_isInstanceOfArray(a)) { - var i; - var lenA = a.length; - var retArr = []; - - for (i = 0; i < lenA; i += 1) { - retArr[i] = -a[i]; - } - - return retArr; - } - - if (a.propType) { - return a.v; - } - - return -a; - } - - var easeInBez = BezierFactory.getBezierEasing(0.333, 0, 0.833, 0.833, 'easeIn').get; - var easeOutBez = BezierFactory.getBezierEasing(0.167, 0.167, 0.667, 1, 'easeOut').get; - var easeInOutBez = BezierFactory.getBezierEasing(0.33, 0, 0.667, 1, 'easeInOut').get; - - function sum(a, b) { - var tOfA = _typeof(a); - - var tOfB = _typeof(b); - - if (tOfA === 'string' || tOfB === 'string') { - return a + b; - } - - if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) { - return a + b; - } - - if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) { - a = a.slice(0); - a[0] += b; - return a; - } - - if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) { - b = b.slice(0); - b[0] = a + b[0]; - return b; - } - - if ($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)) { - var i = 0; - var lenA = a.length; - var lenB = b.length; - var retArr = []; - - while (i < lenA || i < lenB) { - if ((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)) { - retArr[i] = a[i] + b[i]; - } else { - retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i]; - } - - i += 1; - } - - return retArr; - } - - return 0; - } - - var add = sum; - - function sub(a, b) { - var tOfA = _typeof(a); - - var tOfB = _typeof(b); - - if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) { - if (tOfA === 'string') { - a = parseInt(a, 10); - } - - if (tOfB === 'string') { - b = parseInt(b, 10); - } - - return a - b; - } - - if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) { - a = a.slice(0); - a[0] -= b; - return a; - } - - if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) { - b = b.slice(0); - b[0] = a - b[0]; - return b; - } - - if ($bm_isInstanceOfArray(a) && $bm_isInstanceOfArray(b)) { - var i = 0; - var lenA = a.length; - var lenB = b.length; - var retArr = []; - - while (i < lenA || i < lenB) { - if ((typeof a[i] === 'number' || a[i] instanceof Number) && (typeof b[i] === 'number' || b[i] instanceof Number)) { - retArr[i] = a[i] - b[i]; - } else { - retArr[i] = b[i] === undefined ? a[i] : a[i] || b[i]; - } - - i += 1; - } - - return retArr; - } - - return 0; - } - - function mul(a, b) { - var tOfA = _typeof(a); - - var tOfB = _typeof(b); - - var arr; - - if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) { - return a * b; - } - - var i; - var len; - - if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) { - len = a.length; - arr = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - arr[i] = a[i] * b; - } - - return arr; - } - - if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) { - len = b.length; - arr = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - arr[i] = a * b[i]; - } - - return arr; - } - - return 0; - } - - function div(a, b) { - var tOfA = _typeof(a); - - var tOfB = _typeof(b); - - var arr; - - if (isNumerable(tOfA, a) && isNumerable(tOfB, b)) { - return a / b; - } - - var i; - var len; - - if ($bm_isInstanceOfArray(a) && isNumerable(tOfB, b)) { - len = a.length; - arr = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - arr[i] = a[i] / b; - } - - return arr; - } - - if (isNumerable(tOfA, a) && $bm_isInstanceOfArray(b)) { - len = b.length; - arr = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - arr[i] = a / b[i]; - } - - return arr; - } - - return 0; - } - - function mod(a, b) { - if (typeof a === 'string') { - a = parseInt(a, 10); - } - - if (typeof b === 'string') { - b = parseInt(b, 10); - } - - return a % b; - } - - var $bm_sum = sum; - var $bm_sub = sub; - var $bm_mul = mul; - var $bm_div = div; - var $bm_mod = mod; - - function clamp(num, min, max) { - if (min > max) { - var mm = max; - max = min; - min = mm; - } - - return Math.min(Math.max(num, min), max); - } - - function radiansToDegrees(val) { - return val / degToRads; - } - - var radians_to_degrees = radiansToDegrees; - - function degreesToRadians(val) { - return val * degToRads; - } - - var degrees_to_radians = radiansToDegrees; - var helperLengthArray = [0, 0, 0, 0, 0, 0]; - - function length(arr1, arr2) { - if (typeof arr1 === 'number' || arr1 instanceof Number) { - arr2 = arr2 || 0; - return Math.abs(arr1 - arr2); - } - - if (!arr2) { - arr2 = helperLengthArray; - } - - var i; - var len = Math.min(arr1.length, arr2.length); - var addedLength = 0; - - for (i = 0; i < len; i += 1) { - addedLength += Math.pow(arr2[i] - arr1[i], 2); - } - - return Math.sqrt(addedLength); - } - - function normalize(vec) { - return div(vec, length(vec)); - } - - function rgbToHsl(val) { - var r = val[0]; - var g = val[1]; - var b = val[2]; - var max = Math.max(r, g, b); - var min = Math.min(r, g, b); - var h; - var s; - var l = (max + min) / 2; - - if (max === min) { - h = 0; // achromatic - - s = 0; // achromatic - } else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - - case g: - h = (b - r) / d + 2; - break; - - case b: - h = (r - g) / d + 4; - break; - - default: - break; - } - - h /= 6; - } - - return [h, s, l, val[3]]; - } - - function hue2rgb(p, q, t) { - if (t < 0) t += 1; - if (t > 1) t -= 1; - if (t < 1 / 6) return p + (q - p) * 6 * t; - if (t < 1 / 2) return q; - if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; - return p; - } - - function hslToRgb(val) { - var h = val[0]; - var s = val[1]; - var l = val[2]; - var r; - var g; - var b; - - if (s === 0) { - r = l; // achromatic - - b = l; // achromatic - - g = l; // achromatic - } else { - var q = l < 0.5 ? l * (1 + s) : l + s - l * s; - var p = 2 * l - q; - r = hue2rgb(p, q, h + 1 / 3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1 / 3); - } - - return [r, g, b, val[3]]; - } - - function linear(t, tMin, tMax, value1, value2) { - if (value1 === undefined || value2 === undefined) { - value1 = tMin; - value2 = tMax; - tMin = 0; - tMax = 1; - } - - if (tMax < tMin) { - var _tMin = tMax; - tMax = tMin; - tMin = _tMin; - } - - if (t <= tMin) { - return value1; - } - - if (t >= tMax) { - return value2; - } - - var perc = tMax === tMin ? 0 : (t - tMin) / (tMax - tMin); - - if (!value1.length) { - return value1 + (value2 - value1) * perc; - } - - var i; - var len = value1.length; - var arr = createTypedArray('float32', len); - - for (i = 0; i < len; i += 1) { - arr[i] = value1[i] + (value2[i] - value1[i]) * perc; - } - - return arr; - } - - function random(min, max) { - if (max === undefined) { - if (min === undefined) { - min = 0; - max = 1; - } else { - max = min; - min = undefined; - } - } - - if (max.length) { - var i; - var len = max.length; - - if (!min) { - min = createTypedArray('float32', len); - } - - var arr = createTypedArray('float32', len); - var rnd = BMMath.random(); - - for (i = 0; i < len; i += 1) { - arr[i] = min[i] + rnd * (max[i] - min[i]); - } - - return arr; - } - - if (min === undefined) { - min = 0; - } - - var rndm = BMMath.random(); - return min + rndm * (max - min); - } - - function createPath(points, inTangents, outTangents, closed) { - var i; - var len = points.length; - var path = shapePool.newElement(); - path.setPathData(!!closed, len); - var arrPlaceholder = [0, 0]; - var inVertexPoint; - var outVertexPoint; - - for (i = 0; i < len; i += 1) { - inVertexPoint = inTangents && inTangents[i] ? inTangents[i] : arrPlaceholder; - outVertexPoint = outTangents && outTangents[i] ? outTangents[i] : arrPlaceholder; - path.setTripleAt(points[i][0], points[i][1], outVertexPoint[0] + points[i][0], outVertexPoint[1] + points[i][1], inVertexPoint[0] + points[i][0], inVertexPoint[1] + points[i][1], i, true); - } - - return path; - } - - function initiateExpression(elem, data, property) { - var val = data.x; - var needsVelocity = /velocity(?![\w\d])/.test(val); - - var _needsRandom = val.indexOf('random') !== -1; - - var elemType = elem.data.ty; - var transform; - var $bm_transform; - var content; - var effect; - var thisProperty = property; - thisProperty.valueAtTime = thisProperty.getValueAtTime; - Object.defineProperty(thisProperty, 'value', { - get: function get() { - return thisProperty.v; - } - }); - elem.comp.frameDuration = 1 / elem.comp.globalData.frameRate; - elem.comp.displayStartTime = 0; - var inPoint = elem.data.ip / elem.comp.globalData.frameRate; - var outPoint = elem.data.op / elem.comp.globalData.frameRate; - var width = elem.data.sw ? elem.data.sw : 0; - var height = elem.data.sh ? elem.data.sh : 0; - var name = elem.data.nm; - var loopIn; - var loop_in; - var loopOut; - var loop_out; - var smooth; - var toWorld; - var fromWorld; - var fromComp; - var toComp; - var fromCompToSurface; - var position; - var rotation; - var anchorPoint; - var scale; - var thisLayer; - var thisComp; - var mask; - var valueAtTime; - var velocityAtTime; - var scoped_bm_rt; // val = val.replace(/(\\?"|')((http)(s)?(:\/))?\/.*?(\\?"|')/g, "\"\""); // deter potential network calls - - var expression_function = eval('[function _expression_function(){' + val + ';scoped_bm_rt=$bm_rt}]')[0]; // eslint-disable-line no-eval - - var numKeys = property.kf ? data.k.length : 0; - var active = !this.data || this.data.hd !== true; - - var wiggle = function wiggle(freq, amp) { - var iWiggle; - var j; - var lenWiggle = this.pv.length ? this.pv.length : 1; - var addedAmps = createTypedArray('float32', lenWiggle); - freq = 5; - var iterations = Math.floor(time * freq); - iWiggle = 0; - j = 0; - - while (iWiggle < iterations) { - // var rnd = BMMath.random(); - for (j = 0; j < lenWiggle; j += 1) { - addedAmps[j] += -amp + amp * 2 * BMMath.random(); // addedAmps[j] += -amp + amp*2*rnd; - } - - iWiggle += 1; - } // var rnd2 = BMMath.random(); - - - var periods = time * freq; - var perc = periods - Math.floor(periods); - var arr = createTypedArray('float32', lenWiggle); - - if (lenWiggle > 1) { - for (j = 0; j < lenWiggle; j += 1) { - arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp * 2 * BMMath.random()) * perc; // arr[j] = this.pv[j] + addedAmps[j] + (-amp + amp*2*rnd)*perc; - // arr[i] = this.pv[i] + addedAmp + amp1*perc + amp2*(1-perc); - } - - return arr; - } - - return this.pv + addedAmps[0] + (-amp + amp * 2 * BMMath.random()) * perc; - }.bind(this); - - if (thisProperty.loopIn) { - loopIn = thisProperty.loopIn.bind(thisProperty); - loop_in = loopIn; - } - - if (thisProperty.loopOut) { - loopOut = thisProperty.loopOut.bind(thisProperty); - loop_out = loopOut; - } - - if (thisProperty.smooth) { - smooth = thisProperty.smooth.bind(thisProperty); - } - - function loopInDuration(type, duration) { - return loopIn(type, duration, true); - } - - function loopOutDuration(type, duration) { - return loopOut(type, duration, true); - } - - if (this.getValueAtTime) { - valueAtTime = this.getValueAtTime.bind(this); - } - - if (this.getVelocityAtTime) { - velocityAtTime = this.getVelocityAtTime.bind(this); - } - - var comp = elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface); - - function lookAt(elem1, elem2) { - var fVec = [elem2[0] - elem1[0], elem2[1] - elem1[1], elem2[2] - elem1[2]]; - var pitch = Math.atan2(fVec[0], Math.sqrt(fVec[1] * fVec[1] + fVec[2] * fVec[2])) / degToRads; - var yaw = -Math.atan2(fVec[1], fVec[2]) / degToRads; - return [yaw, pitch, 0]; - } - - function easeOut(t, tMin, tMax, val1, val2) { - return applyEase(easeOutBez, t, tMin, tMax, val1, val2); - } - - function easeIn(t, tMin, tMax, val1, val2) { - return applyEase(easeInBez, t, tMin, tMax, val1, val2); - } - - function ease(t, tMin, tMax, val1, val2) { - return applyEase(easeInOutBez, t, tMin, tMax, val1, val2); - } - - function applyEase(fn, t, tMin, tMax, val1, val2) { - if (val1 === undefined) { - val1 = tMin; - val2 = tMax; - } else { - t = (t - tMin) / (tMax - tMin); - } - - if (t > 1) { - t = 1; - } else if (t < 0) { - t = 0; - } - - var mult = fn(t); - - if ($bm_isInstanceOfArray(val1)) { - var iKey; - var lenKey = val1.length; - var arr = createTypedArray('float32', lenKey); - - for (iKey = 0; iKey < lenKey; iKey += 1) { - arr[iKey] = (val2[iKey] - val1[iKey]) * mult + val1[iKey]; - } - - return arr; - } - - return (val2 - val1) * mult + val1; - } - - function nearestKey(time) { - var iKey; - var lenKey = data.k.length; - var index; - var keyTime; - - if (!data.k.length || typeof data.k[0] === 'number') { - index = 0; - keyTime = 0; - } else { - index = -1; - time *= elem.comp.globalData.frameRate; - - if (time < data.k[0].t) { - index = 1; - keyTime = data.k[0].t; - } else { - for (iKey = 0; iKey < lenKey - 1; iKey += 1) { - if (time === data.k[iKey].t) { - index = iKey + 1; - keyTime = data.k[iKey].t; - break; - } else if (time > data.k[iKey].t && time < data.k[iKey + 1].t) { - if (time - data.k[iKey].t > data.k[iKey + 1].t - time) { - index = iKey + 2; - keyTime = data.k[iKey + 1].t; - } else { - index = iKey + 1; - keyTime = data.k[iKey].t; - } - - break; - } - } - - if (index === -1) { - index = iKey + 1; - keyTime = data.k[iKey].t; - } - } - } - - var obKey = {}; - obKey.index = index; - obKey.time = keyTime / elem.comp.globalData.frameRate; - return obKey; - } - - function key(ind) { - var obKey; - var iKey; - var lenKey; - - if (!data.k.length || typeof data.k[0] === 'number') { - throw new Error('The property has no keyframe at index ' + ind); - } - - ind -= 1; - obKey = { - time: data.k[ind].t / elem.comp.globalData.frameRate, - value: [] - }; - var arr = Object.prototype.hasOwnProperty.call(data.k[ind], 's') ? data.k[ind].s : data.k[ind - 1].e; - lenKey = arr.length; - - for (iKey = 0; iKey < lenKey; iKey += 1) { - obKey[iKey] = arr[iKey]; - obKey.value[iKey] = arr[iKey]; - } - - return obKey; - } - - function framesToTime(fr, fps) { - if (!fps) { - fps = elem.comp.globalData.frameRate; - } - - return fr / fps; - } - - function timeToFrames(t, fps) { - if (!t && t !== 0) { - t = time; - } - - if (!fps) { - fps = elem.comp.globalData.frameRate; - } - - return t * fps; - } - - function seedRandom(seed) { - BMMath.seedrandom(randSeed + seed); - } - - function sourceRectAtTime() { - return elem.sourceRectAtTime(); - } - - function substring(init, end) { - if (typeof value === 'string') { - if (end === undefined) { - return value.substring(init); - } - - return value.substring(init, end); - } - - return ''; - } - - function substr(init, end) { - if (typeof value === 'string') { - if (end === undefined) { - return value.substr(init); - } - - return value.substr(init, end); - } - - return ''; - } - - function posterizeTime(framesPerSecond) { - time = framesPerSecond === 0 ? 0 : Math.floor(time * framesPerSecond) / framesPerSecond; - value = valueAtTime(time); - } - - var time; - var velocity; - var value; - var text; - var textIndex; - var textTotal; - var selectorValue; - var index = elem.data.ind; - var hasParent = !!(elem.hierarchy && elem.hierarchy.length); - var parent; - var randSeed = Math.floor(Math.random() * 1000000); - var globalData = elem.globalData; - - function executeExpression(_value) { - // globalData.pushExpression(); - value = _value; - - if (this.frameExpressionId === elem.globalData.frameId && this.propType !== 'textSelector') { - return value; - } - - if (this.propType === 'textSelector') { - textIndex = this.textIndex; - textTotal = this.textTotal; - selectorValue = this.selectorValue; - } - - if (!thisLayer) { - text = elem.layerInterface.text; - thisLayer = elem.layerInterface; - thisComp = elem.comp.compInterface; - toWorld = thisLayer.toWorld.bind(thisLayer); - fromWorld = thisLayer.fromWorld.bind(thisLayer); - fromComp = thisLayer.fromComp.bind(thisLayer); - toComp = thisLayer.toComp.bind(thisLayer); - mask = thisLayer.mask ? thisLayer.mask.bind(thisLayer) : null; - fromCompToSurface = fromComp; - } - - if (!transform) { - transform = elem.layerInterface('ADBE Transform Group'); - $bm_transform = transform; - - if (transform) { - anchorPoint = transform.anchorPoint; - /* position = transform.position; - rotation = transform.rotation; - scale = transform.scale; */ - } - } - - if (elemType === 4 && !content) { - content = thisLayer('ADBE Root Vectors Group'); - } - - if (!effect) { - effect = thisLayer(4); - } - - hasParent = !!(elem.hierarchy && elem.hierarchy.length); - - if (hasParent && !parent) { - parent = elem.hierarchy[0].layerInterface; - } - - time = this.comp.renderedFrame / this.comp.globalData.frameRate; - - if (_needsRandom) { - seedRandom(randSeed + time); - } - - if (needsVelocity) { - velocity = velocityAtTime(time); - } - - expression_function(); - this.frameExpressionId = elem.globalData.frameId; // TODO: Check if it's possible to return on ShapeInterface the .v value - // Changed this to a ternary operation because Rollup failed compiling it correctly - - scoped_bm_rt = scoped_bm_rt.propType === propTypes.SHAPE ? scoped_bm_rt.v : scoped_bm_rt; - return scoped_bm_rt; - } // Bundlers will see these as dead code and unless we reference them - - - executeExpression.__preventDeadCodeRemoval = [$bm_transform, anchorPoint, time, velocity, inPoint, outPoint, width, height, name, loop_in, loop_out, smooth, toComp, fromCompToSurface, toWorld, fromWorld, mask, position, rotation, scale, thisComp, numKeys, active, wiggle, loopInDuration, loopOutDuration, comp, lookAt, easeOut, easeIn, ease, nearestKey, key, text, textIndex, textTotal, selectorValue, framesToTime, timeToFrames, sourceRectAtTime, substring, substr, posterizeTime, index, globalData]; - return executeExpression; - } - - ob.initiateExpression = initiateExpression; - ob.__preventDeadCodeRemoval = [window, document, XMLHttpRequest, fetch, frames, $bm_neg, add, $bm_sum, $bm_sub, $bm_mul, $bm_div, $bm_mod, clamp, radians_to_degrees, degreesToRadians, degrees_to_radians, normalize, rgbToHsl, hslToRgb, linear, random, createPath]; - return ob; - }(); - - var expressionHelpers = function () { - function searchExpressions(elem, data, prop) { - if (data.x) { - prop.k = true; - prop.x = true; - prop.initiateExpression = ExpressionManager.initiateExpression; - prop.effectsSequence.push(prop.initiateExpression(elem, data, prop).bind(prop)); - } - } - - function getValueAtTime(frameNum) { - frameNum *= this.elem.globalData.frameRate; - frameNum -= this.offsetTime; - - if (frameNum !== this._cachingAtTime.lastFrame) { - this._cachingAtTime.lastIndex = this._cachingAtTime.lastFrame < frameNum ? this._cachingAtTime.lastIndex : 0; - this._cachingAtTime.value = this.interpolateValue(frameNum, this._cachingAtTime); - this._cachingAtTime.lastFrame = frameNum; - } - - return this._cachingAtTime.value; - } - - function getSpeedAtTime(frameNum) { - var delta = -0.01; - var v1 = this.getValueAtTime(frameNum); - var v2 = this.getValueAtTime(frameNum + delta); - var speed = 0; - - if (v1.length) { - var i; - - for (i = 0; i < v1.length; i += 1) { - speed += Math.pow(v2[i] - v1[i], 2); - } - - speed = Math.sqrt(speed) * 100; - } else { - speed = 0; - } - - return speed; - } - - function getVelocityAtTime(frameNum) { - if (this.vel !== undefined) { - return this.vel; - } - - var delta = -0.001; // frameNum += this.elem.data.st; - - var v1 = this.getValueAtTime(frameNum); - var v2 = this.getValueAtTime(frameNum + delta); - var velocity; - - if (v1.length) { - velocity = createTypedArray('float32', v1.length); - var i; - - for (i = 0; i < v1.length; i += 1) { - // removing frameRate - // if needed, don't add it here - // velocity[i] = this.elem.globalData.frameRate*((v2[i] - v1[i])/delta); - velocity[i] = (v2[i] - v1[i]) / delta; - } - } else { - velocity = (v2 - v1) / delta; - } - - return velocity; - } - - function getStaticValueAtTime() { - return this.pv; - } - - function setGroupProperty(propertyGroup) { - this.propertyGroup = propertyGroup; - } - - return { - searchExpressions: searchExpressions, - getSpeedAtTime: getSpeedAtTime, - getVelocityAtTime: getVelocityAtTime, - getValueAtTime: getValueAtTime, - getStaticValueAtTime: getStaticValueAtTime, - setGroupProperty: setGroupProperty - }; - }(); - - function addPropertyDecorator() { - function loopOut(type, duration, durationFlag) { - if (!this.k || !this.keyframes) { - return this.pv; - } - - type = type ? type.toLowerCase() : ''; - var currentFrame = this.comp.renderedFrame; - var keyframes = this.keyframes; - var lastKeyFrame = keyframes[keyframes.length - 1].t; - - if (currentFrame <= lastKeyFrame) { - return this.pv; - } - - var cycleDuration; - var firstKeyFrame; - - if (!durationFlag) { - if (!duration || duration > keyframes.length - 1) { - duration = keyframes.length - 1; - } - - firstKeyFrame = keyframes[keyframes.length - 1 - duration].t; - cycleDuration = lastKeyFrame - firstKeyFrame; - } else { - if (!duration) { - cycleDuration = Math.max(0, lastKeyFrame - this.elem.data.ip); - } else { - cycleDuration = Math.abs(lastKeyFrame - this.elem.comp.globalData.frameRate * duration); - } - - firstKeyFrame = lastKeyFrame - cycleDuration; - } - - var i; - var len; - var ret; - - if (type === 'pingpong') { - var iterations = Math.floor((currentFrame - firstKeyFrame) / cycleDuration); - - if (iterations % 2 !== 0) { - return this.getValueAtTime((cycleDuration - (currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line - } - } else if (type === 'offset') { - var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0); - var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0); - var current = this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line - - var repeats = Math.floor((currentFrame - firstKeyFrame) / cycleDuration); - - if (this.pv.length) { - ret = new Array(initV.length); - len = ret.length; - - for (i = 0; i < len; i += 1) { - ret[i] = (endV[i] - initV[i]) * repeats + current[i]; - } - - return ret; - } - - return (endV - initV) * repeats + current; - } else if (type === 'continue') { - var lastValue = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0); - var nextLastValue = this.getValueAtTime((lastKeyFrame - 0.001) / this.comp.globalData.frameRate, 0); - - if (this.pv.length) { - ret = new Array(lastValue.length); - len = ret.length; - - for (i = 0; i < len; i += 1) { - ret[i] = lastValue[i] + (lastValue[i] - nextLastValue[i]) * ((currentFrame - lastKeyFrame) / this.comp.globalData.frameRate) / 0.0005; // eslint-disable-line - } - - return ret; - } - - return lastValue + (lastValue - nextLastValue) * ((currentFrame - lastKeyFrame) / 0.001); - } - - return this.getValueAtTime(((currentFrame - firstKeyFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line - } - - function loopIn(type, duration, durationFlag) { - if (!this.k) { - return this.pv; - } - - type = type ? type.toLowerCase() : ''; - var currentFrame = this.comp.renderedFrame; - var keyframes = this.keyframes; - var firstKeyFrame = keyframes[0].t; - - if (currentFrame >= firstKeyFrame) { - return this.pv; - } - - var cycleDuration; - var lastKeyFrame; - - if (!durationFlag) { - if (!duration || duration > keyframes.length - 1) { - duration = keyframes.length - 1; - } - - lastKeyFrame = keyframes[duration].t; - cycleDuration = lastKeyFrame - firstKeyFrame; - } else { - if (!duration) { - cycleDuration = Math.max(0, this.elem.data.op - firstKeyFrame); - } else { - cycleDuration = Math.abs(this.elem.comp.globalData.frameRate * duration); - } - - lastKeyFrame = firstKeyFrame + cycleDuration; - } - - var i; - var len; - var ret; - - if (type === 'pingpong') { - var iterations = Math.floor((firstKeyFrame - currentFrame) / cycleDuration); - - if (iterations % 2 === 0) { - return this.getValueAtTime(((firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); // eslint-disable-line - } - } else if (type === 'offset') { - var initV = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0); - var endV = this.getValueAtTime(lastKeyFrame / this.comp.globalData.frameRate, 0); - var current = this.getValueAtTime((cycleDuration - (firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame) / this.comp.globalData.frameRate, 0); - var repeats = Math.floor((firstKeyFrame - currentFrame) / cycleDuration) + 1; - - if (this.pv.length) { - ret = new Array(initV.length); - len = ret.length; - - for (i = 0; i < len; i += 1) { - ret[i] = current[i] - (endV[i] - initV[i]) * repeats; - } - - return ret; - } - - return current - (endV - initV) * repeats; - } else if (type === 'continue') { - var firstValue = this.getValueAtTime(firstKeyFrame / this.comp.globalData.frameRate, 0); - var nextFirstValue = this.getValueAtTime((firstKeyFrame + 0.001) / this.comp.globalData.frameRate, 0); - - if (this.pv.length) { - ret = new Array(firstValue.length); - len = ret.length; - - for (i = 0; i < len; i += 1) { - ret[i] = firstValue[i] + (firstValue[i] - nextFirstValue[i]) * (firstKeyFrame - currentFrame) / 0.001; - } - - return ret; - } - - return firstValue + (firstValue - nextFirstValue) * (firstKeyFrame - currentFrame) / 0.001; - } - - return this.getValueAtTime((cycleDuration - ((firstKeyFrame - currentFrame) % cycleDuration + firstKeyFrame)) / this.comp.globalData.frameRate, 0); // eslint-disable-line - } - - function smooth(width, samples) { - if (!this.k) { - return this.pv; - } - - width = (width || 0.4) * 0.5; - samples = Math.floor(samples || 5); - - if (samples <= 1) { - return this.pv; - } - - var currentTime = this.comp.renderedFrame / this.comp.globalData.frameRate; - var initFrame = currentTime - width; - var endFrame = currentTime + width; - var sampleFrequency = samples > 1 ? (endFrame - initFrame) / (samples - 1) : 1; - var i = 0; - var j = 0; - var value; - - if (this.pv.length) { - value = createTypedArray('float32', this.pv.length); - } else { - value = 0; - } - - var sampleValue; - - while (i < samples) { - sampleValue = this.getValueAtTime(initFrame + i * sampleFrequency); - - if (this.pv.length) { - for (j = 0; j < this.pv.length; j += 1) { - value[j] += sampleValue[j]; - } - } else { - value += sampleValue; - } - - i += 1; - } - - if (this.pv.length) { - for (j = 0; j < this.pv.length; j += 1) { - value[j] /= samples; - } - } else { - value /= samples; - } - - return value; - } - - function getTransformValueAtTime(time) { - if (!this._transformCachingAtTime) { - this._transformCachingAtTime = { - v: new Matrix() - }; - } /// / - - - var matrix = this._transformCachingAtTime.v; - matrix.cloneFromProps(this.pre.props); - - if (this.appliedTransformations < 1) { - var anchor = this.a.getValueAtTime(time); - matrix.translate(-anchor[0] * this.a.mult, -anchor[1] * this.a.mult, anchor[2] * this.a.mult); - } - - if (this.appliedTransformations < 2) { - var scale = this.s.getValueAtTime(time); - matrix.scale(scale[0] * this.s.mult, scale[1] * this.s.mult, scale[2] * this.s.mult); - } - - if (this.sk && this.appliedTransformations < 3) { - var skew = this.sk.getValueAtTime(time); - var skewAxis = this.sa.getValueAtTime(time); - matrix.skewFromAxis(-skew * this.sk.mult, skewAxis * this.sa.mult); - } - - if (this.r && this.appliedTransformations < 4) { - var rotation = this.r.getValueAtTime(time); - matrix.rotate(-rotation * this.r.mult); - } else if (!this.r && this.appliedTransformations < 4) { - var rotationZ = this.rz.getValueAtTime(time); - var rotationY = this.ry.getValueAtTime(time); - var rotationX = this.rx.getValueAtTime(time); - var orientation = this.or.getValueAtTime(time); - matrix.rotateZ(-rotationZ * this.rz.mult).rotateY(rotationY * this.ry.mult).rotateX(rotationX * this.rx.mult).rotateZ(-orientation[2] * this.or.mult).rotateY(orientation[1] * this.or.mult).rotateX(orientation[0] * this.or.mult); - } - - if (this.data.p && this.data.p.s) { - var positionX = this.px.getValueAtTime(time); - var positionY = this.py.getValueAtTime(time); - - if (this.data.p.z) { - var positionZ = this.pz.getValueAtTime(time); - matrix.translate(positionX * this.px.mult, positionY * this.py.mult, -positionZ * this.pz.mult); - } else { - matrix.translate(positionX * this.px.mult, positionY * this.py.mult, 0); - } - } else { - var position = this.p.getValueAtTime(time); - matrix.translate(position[0] * this.p.mult, position[1] * this.p.mult, -position[2] * this.p.mult); - } - - return matrix; /// / - } - - function getTransformStaticValueAtTime() { - return this.v.clone(new Matrix()); - } - - var getTransformProperty = TransformPropertyFactory.getTransformProperty; - - TransformPropertyFactory.getTransformProperty = function (elem, data, container) { - var prop = getTransformProperty(elem, data, container); - - if (prop.dynamicProperties.length) { - prop.getValueAtTime = getTransformValueAtTime.bind(prop); - } else { - prop.getValueAtTime = getTransformStaticValueAtTime.bind(prop); - } - - prop.setGroupProperty = expressionHelpers.setGroupProperty; - return prop; - }; - - var propertyGetProp = PropertyFactory.getProp; - - PropertyFactory.getProp = function (elem, data, type, mult, container) { - var prop = propertyGetProp(elem, data, type, mult, container); // prop.getVelocityAtTime = getVelocityAtTime; - // prop.loopOut = loopOut; - // prop.loopIn = loopIn; - - if (prop.kf) { - prop.getValueAtTime = expressionHelpers.getValueAtTime.bind(prop); - } else { - prop.getValueAtTime = expressionHelpers.getStaticValueAtTime.bind(prop); + if (bothNotNull && aLastUsed < bLastUsed) { + return 1; } - prop.setGroupProperty = expressionHelpers.setGroupProperty; - prop.loopOut = loopOut; - prop.loopIn = loopIn; - prop.smooth = smooth; - prop.getVelocityAtTime = expressionHelpers.getVelocityAtTime.bind(prop); - prop.getSpeedAtTime = expressionHelpers.getSpeedAtTime.bind(prop); - prop.numKeys = data.a === 1 ? data.k.length : 0; - prop.propertyIndex = data.ix; - var value = 0; - - if (type !== 0) { - value = createTypedArray('float32', data.a === 1 ? data.k[0].s.length : data.k.length); + if (aLastUsed != null && bLastUsed == null) { + return -1; } - prop._cachingAtTime = { - lastFrame: initialDefaultFrame, - lastIndex: 0, - value: value - }; - expressionHelpers.searchExpressions(elem, data, prop); - - if (prop.k) { - container.addDynamicProperty(prop); + if (bothNotNull && aLastUsed > bLastUsed) { + return -1; } - return prop; - }; - - function getShapeValueAtTime(frameNum) { - // For now this caching object is created only when needed instead of creating it when the shape is initialized. - if (!this._cachingAtTime) { - this._cachingAtTime = { - shapeValue: shapePool.clone(this.pv), - lastIndex: 0, - lastTime: initialDefaultFrame - }; + if (bLastUsed != null && aLastUsed == null) { + return 1; } - frameNum *= this.elem.globalData.frameRate; - frameNum -= this.offsetTime; + return 0; + } + }, { + key: "sortCiphersByLastUsedThenName", + value: function sortCiphersByLastUsedThenName(a, b) { + var result = this.sortCiphersByLastUsed(a, b); - if (frameNum !== this._cachingAtTime.lastTime) { - this._cachingAtTime.lastIndex = this._cachingAtTime.lastTime < frameNum ? this._caching.lastIndex : 0; - this._cachingAtTime.lastTime = frameNum; - this.interpolateShape(frameNum, this._cachingAtTime.shapeValue, this._cachingAtTime); + if (result !== 0) { + return result; } - return this._cachingAtTime.shapeValue; + return this.getLocaleSortingFunction()(a, b); } + }, { + key: "getLocaleSortingFunction", + value: function getLocaleSortingFunction() { + var _this5 = this; - var ShapePropertyConstructorFunction = ShapePropertyFactory.getConstructorFunction(); - var KeyframedShapePropertyConstructorFunction = ShapePropertyFactory.getKeyframedConstructorFunction(); - - function ShapeExpressions() {} + return function (a, b) { + var aName = a.name; + var bName = b.name; - ShapeExpressions.prototype = { - vertices: function vertices(prop, time) { - if (this.k) { - this.getValue(); + if (aName == null && bName != null) { + return -1; } - var shapePath = this.v; + if (aName != null && bName == null) { + return 1; + } - if (time !== undefined) { - shapePath = this.getValueAtTime(time, 0); + if (aName == null && bName == null) { + return 0; } - var i; - var len = shapePath._length; - var vertices = shapePath[prop]; - var points = shapePath.v; - var arr = createSizedArray(len); + var result = _this5.i18nService.collator ? _this5.i18nService.collator.compare(aName, bName) : aName.localeCompare(bName); - for (i = 0; i < len; i += 1) { - if (prop === 'i' || prop === 'o') { - arr[i] = [vertices[i][0] - points[i][0], vertices[i][1] - points[i][1]]; - } else { - arr[i] = [vertices[i][0], vertices[i][1]]; - } + if (result !== 0 || a.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login || b.type !== _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login) { + return result; } - return arr; - }, - points: function points(time) { - return this.vertices('v', time); - }, - inTangents: function inTangents(time) { - return this.vertices('i', time); - }, - outTangents: function outTangents(time) { - return this.vertices('o', time); - }, - isClosed: function isClosed() { - return this.v.c; - }, - pointOnPath: function pointOnPath(perc, time) { - var shapePath = this.v; - - if (time !== undefined) { - shapePath = this.getValueAtTime(time, 0); + if (a.login.username != null) { + aName += a.login.username; } - if (!this._segmentsLength) { - this._segmentsLength = bez.getSegmentsLength(shapePath); + if (b.login.username != null) { + bName += b.login.username; } - var segmentsLength = this._segmentsLength; - var lengths = segmentsLength.lengths; - var lengthPos = segmentsLength.totalLength * perc; - var i = 0; - var len = lengths.length; - var accumulatedLength = 0; - var pt; + return _this5.i18nService.collator ? _this5.i18nService.collator.compare(aName, bName) : aName.localeCompare(bName); + }; + } + }, { + key: "softDelete", + value: function softDelete(id) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee36() { + var userId, ciphers, setDeletedDate; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee36$(_context36) { + while (1) { + switch (_context36.prev = _context36.next) { + case 0: + _context36.next = 2; + return this.userService.getUserId(); - while (i < len) { - if (accumulatedLength + lengths[i].addedLength > lengthPos) { - var initIndex = i; - var endIndex = shapePath.c && i === len - 1 ? 0 : i + 1; - var segmentPerc = (lengthPos - accumulatedLength) / lengths[i].addedLength; - pt = bez.getPointInSegment(shapePath.v[initIndex], shapePath.v[endIndex], shapePath.o[initIndex], shapePath.i[endIndex], segmentPerc, lengths[i]); - break; - } else { - accumulatedLength += lengths[i].addedLength; - } + case 2: + userId = _context36.sent; + _context36.next = 5; + return this.storageService.get(Keys.ciphersPrefix + userId); - i += 1; - } + case 5: + ciphers = _context36.sent; - if (!pt) { - pt = shapePath.c ? [shapePath.v[0][0], shapePath.v[0][1]] : [shapePath.v[shapePath._length - 1][0], shapePath.v[shapePath._length - 1][1]]; - } + if (!(ciphers == null)) { + _context36.next = 8; + break; + } - return pt; - }, - vectorOnPath: function vectorOnPath(perc, time, vectorType) { - // perc doesn't use triple equality because it can be a Number object as well as a primitive. - if (perc == 1) { - // eslint-disable-line eqeqeq - perc = this.v.c; - } else if (perc == 0) { - // eslint-disable-line eqeqeq - perc = 0.999; - } + return _context36.abrupt("return"); - var pt1 = this.pointOnPath(perc, time); - var pt2 = this.pointOnPath(perc + 0.001, time); - var xLength = pt2[0] - pt1[0]; - var yLength = pt2[1] - pt1[1]; - var magnitude = Math.sqrt(Math.pow(xLength, 2) + Math.pow(yLength, 2)); + case 8: + setDeletedDate = function setDeletedDate(cipherId) { + if (ciphers[cipherId] == null) { + return; + } - if (magnitude === 0) { - return [0, 0]; - } + ciphers[cipherId].deletedDate = new Date().toISOString(); + }; - var unitVector = vectorType === 'tangent' ? [xLength / magnitude, yLength / magnitude] : [-yLength / magnitude, xLength / magnitude]; - return unitVector; - }, - tangentOnPath: function tangentOnPath(perc, time) { - return this.vectorOnPath(perc, time, 'tangent'); - }, - normalOnPath: function normalOnPath(perc, time) { - return this.vectorOnPath(perc, time, 'normal'); - }, - setGroupProperty: expressionHelpers.setGroupProperty, - getValueAtTime: expressionHelpers.getStaticValueAtTime - }; - extendPrototype([ShapeExpressions], ShapePropertyConstructorFunction); - extendPrototype([ShapeExpressions], KeyframedShapePropertyConstructorFunction); - KeyframedShapePropertyConstructorFunction.prototype.getValueAtTime = getShapeValueAtTime; - KeyframedShapePropertyConstructorFunction.prototype.initiateExpression = ExpressionManager.initiateExpression; - var propertyGetShapeProp = ShapePropertyFactory.getShapeProp; + if (typeof id === 'string') { + setDeletedDate(id); + } else { + id.forEach(setDeletedDate); + } - ShapePropertyFactory.getShapeProp = function (elem, data, type, arr, trims) { - var prop = propertyGetShapeProp(elem, data, type, arr, trims); - prop.propertyIndex = data.ix; - prop.lock = false; + _context36.next = 12; + return this.storageService.save(Keys.ciphersPrefix + userId, ciphers); - if (type === 3) { - expressionHelpers.searchExpressions(elem, data.pt, prop); - } else if (type === 4) { - expressionHelpers.searchExpressions(elem, data.ks, prop); - } + case 12: + this.decryptedCipherCache = null; - if (prop.k) { - elem.addDynamicProperty(prop); - } + case 13: + case "end": + return _context36.stop(); + } + } + }, _callee36, this); + })); + } + }, { + key: "softDeleteWithServer", + value: function softDeleteWithServer(id) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee37() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee37$(_context37) { + while (1) { + switch (_context37.prev = _context37.next) { + case 0: + _context37.next = 2; + return this.apiService.putDeleteCipher(id); - return prop; - }; - } + case 2: + _context37.next = 4; + return this.softDelete(id); - function initialize$1() { - addPropertyDecorator(); - } + case 4: + case "end": + return _context37.stop(); + } + } + }, _callee37, this); + })); + } + }, { + key: "softDeleteManyWithServer", + value: function softDeleteManyWithServer(ids) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee38() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee38$(_context38) { + while (1) { + switch (_context38.prev = _context38.next) { + case 0: + _context38.next = 2; + return this.apiService.putDeleteManyCiphers(new _models_request_cipherBulkDeleteRequest__WEBPACK_IMPORTED_MODULE_16__["CipherBulkDeleteRequest"](ids)); - function addDecorator() { - function searchExpressions() { - if (this.data.d.x) { - this.calculateExpression = ExpressionManager.initiateExpression.bind(this)(this.elem, this.data.d, this); - this.addEffect(this.getExpressionValue.bind(this)); - return true; - } + case 2: + _context38.next = 4; + return this.softDelete(ids); - return null; + case 4: + case "end": + return _context38.stop(); + } + } + }, _callee38, this); + })); } + }, { + key: "restore", + value: function restore(id) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee39() { + var userId, ciphers, clearDeletedDate; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee39$(_context39) { + while (1) { + switch (_context39.prev = _context39.next) { + case 0: + _context39.next = 2; + return this.userService.getUserId(); - TextProperty.prototype.getExpressionValue = function (currentValue, text) { - var newValue = this.calculateExpression(text); + case 2: + userId = _context39.sent; + _context39.next = 5; + return this.storageService.get(Keys.ciphersPrefix + userId); - if (currentValue.t !== newValue) { - var newData = {}; - this.copyData(newData, currentValue); - newData.t = newValue.toString(); - newData.__complete = false; - return newData; - } + case 5: + ciphers = _context39.sent; - return currentValue; - }; + if (!(ciphers == null)) { + _context39.next = 8; + break; + } - TextProperty.prototype.searchProperty = function () { - var isKeyframed = this.searchKeyframes(); - var hasExpressions = this.searchExpressions(); - this.kf = isKeyframed || hasExpressions; - return this.kf; - }; + return _context39.abrupt("return"); - TextProperty.prototype.searchExpressions = searchExpressions; - } + case 8: + clearDeletedDate = function clearDeletedDate(cipherId) { + if (ciphers[cipherId] == null) { + return; + } - function initialize() { - addDecorator(); - } + ciphers[cipherId].deletedDate = null; + }; - function SVGComposableEffect() {} + if (typeof id === 'string') { + clearDeletedDate(id); + } else { + id.forEach(clearDeletedDate); + } - SVGComposableEffect.prototype = { - createMergeNode: function createMergeNode(resultId, ins) { - var feMerge = createNS('feMerge'); - feMerge.setAttribute('result', resultId); - var feMergeNode; - var i; + _context39.next = 12; + return this.storageService.save(Keys.ciphersPrefix + userId, ciphers); - for (i = 0; i < ins.length; i += 1) { - feMergeNode = createNS('feMergeNode'); - feMergeNode.setAttribute('in', ins[i]); - feMerge.appendChild(feMergeNode); - feMerge.appendChild(feMergeNode); - } + case 12: + this.decryptedCipherCache = null; - return feMerge; + case 13: + case "end": + return _context39.stop(); + } + } + }, _callee39, this); + })); } - }; - - function SVGTintFilter(filter, filterManager, elem, id, source) { - this.filterManager = filterManager; - var feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'linearRGB'); - feColorMatrix.setAttribute('values', '0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0'); - feColorMatrix.setAttribute('result', id + '_tint_1'); - filter.appendChild(feColorMatrix); - feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB'); - feColorMatrix.setAttribute('values', '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0'); - feColorMatrix.setAttribute('result', id + '_tint_2'); - filter.appendChild(feColorMatrix); - this.matrixFilter = feColorMatrix; - var feMerge = this.createMergeNode(id, [source, id + '_tint_1', id + '_tint_2']); - filter.appendChild(feMerge); - } + }, { + key: "restoreWithServer", + value: function restoreWithServer(id) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee40() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee40$(_context40) { + while (1) { + switch (_context40.prev = _context40.next) { + case 0: + _context40.next = 2; + return this.apiService.putRestoreCipher(id); - extendPrototype([SVGComposableEffect], SVGTintFilter); + case 2: + _context40.next = 4; + return this.restore(id); - SVGTintFilter.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - var colorBlack = this.filterManager.effectElements[0].p.v; - var colorWhite = this.filterManager.effectElements[1].p.v; - var opacity = this.filterManager.effectElements[2].p.v / 100; - this.matrixFilter.setAttribute('values', colorWhite[0] - colorBlack[0] + ' 0 0 0 ' + colorBlack[0] + ' ' + (colorWhite[1] - colorBlack[1]) + ' 0 0 0 ' + colorBlack[1] + ' ' + (colorWhite[2] - colorBlack[2]) + ' 0 0 0 ' + colorBlack[2] + ' 0 0 0 ' + opacity + ' 0'); + case 4: + case "end": + return _context40.stop(); + } + } + }, _callee40, this); + })); } - }; + }, { + key: "restoreManyWithServer", + value: function restoreManyWithServer(ids) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee41() { + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee41$(_context41) { + while (1) { + switch (_context41.prev = _context41.next) { + case 0: + _context41.next = 2; + return this.apiService.putRestoreManyCiphers(new _models_request_cipherBulkRestoreRequest__WEBPACK_IMPORTED_MODULE_18__["CipherBulkRestoreRequest"](ids)); - function SVGFillFilter(filter, filterManager, elem, id) { - this.filterManager = filterManager; - var feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'sRGB'); - feColorMatrix.setAttribute('values', '1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0'); - feColorMatrix.setAttribute('result', id); - filter.appendChild(feColorMatrix); - this.matrixFilter = feColorMatrix; - } + case 2: + _context41.next = 4; + return this.restore(ids); - SVGFillFilter.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - var color = this.filterManager.effectElements[2].p.v; - var opacity = this.filterManager.effectElements[6].p.v; - this.matrixFilter.setAttribute('values', '0 0 0 0 ' + color[0] + ' 0 0 0 0 ' + color[1] + ' 0 0 0 0 ' + color[2] + ' 0 0 0 ' + opacity + ' 0'); - } - }; + case 4: + case "end": + return _context41.stop(); + } + } + }, _callee41, this); + })); + } // Helpers - function SVGStrokeEffect(fil, filterManager, elem) { - this.initialized = false; - this.filterManager = filterManager; - this.elem = elem; - this.paths = []; - } + }, { + key: "shareAttachmentWithServer", + value: function shareAttachmentWithServer(attachmentView, cipherId, organizationId) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee42() { + var attachmentResponse, buf, decBuf, key, encFileName, dataEncKey, encData, fd, blob; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee42$(_context42) { + while (1) { + switch (_context42.prev = _context42.next) { + case 0: + _context42.next = 2; + return this.apiService.nativeFetch(new Request(attachmentView.url, { + cache: 'no-store' + })); - SVGStrokeEffect.prototype.initialize = function () { - var elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes; - var path; - var groupPath; - var i; - var len; + case 2: + attachmentResponse = _context42.sent; - if (this.filterManager.effectElements[1].p.v === 1) { - len = this.elem.maskManager.masksProperties.length; - i = 0; - } else { - i = this.filterManager.effectElements[0].p.v - 1; - len = i + 1; - } + if (!(attachmentResponse.status !== 200)) { + _context42.next = 5; + break; + } - groupPath = createNS('g'); - groupPath.setAttribute('fill', 'none'); - groupPath.setAttribute('stroke-linecap', 'round'); - groupPath.setAttribute('stroke-dashoffset', 1); + throw Error('Failed to download attachment: ' + attachmentResponse.status.toString()); - for (i; i < len; i += 1) { - path = createNS('path'); - groupPath.appendChild(path); - this.paths.push({ - p: path, - m: i - }); - } + case 5: + _context42.next = 7; + return attachmentResponse.arrayBuffer(); - if (this.filterManager.effectElements[10].p.v === 3) { - var mask = createNS('mask'); - var id = createElementID(); - mask.setAttribute('id', id); - mask.setAttribute('mask-type', 'alpha'); - mask.appendChild(groupPath); - this.elem.globalData.defs.appendChild(mask); - var g = createNS('g'); - g.setAttribute('mask', 'url(' + getLocationHref() + '#' + id + ')'); + case 7: + buf = _context42.sent; + _context42.next = 10; + return this.cryptoService.decryptFromBytes(buf, null); - while (elemChildren[0]) { - g.appendChild(elemChildren[0]); - } + case 10: + decBuf = _context42.sent; + _context42.next = 13; + return this.cryptoService.getOrgKey(organizationId); - this.elem.layerElement.appendChild(g); - this.masker = mask; - groupPath.setAttribute('stroke', '#fff'); - } else if (this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2) { - if (this.filterManager.effectElements[10].p.v === 2) { - elemChildren = this.elem.layerElement.children || this.elem.layerElement.childNodes; + case 13: + key = _context42.sent; + _context42.next = 16; + return this.cryptoService.encrypt(attachmentView.fileName, key); - while (elemChildren.length) { - this.elem.layerElement.removeChild(elemChildren[0]); - } - } + case 16: + encFileName = _context42.sent; + _context42.next = 19; + return this.cryptoService.makeEncKey(key); - this.elem.layerElement.appendChild(groupPath); - this.elem.layerElement.removeAttribute('mask'); - groupPath.setAttribute('stroke', '#fff'); - } + case 19: + dataEncKey = _context42.sent; + _context42.next = 22; + return this.cryptoService.encryptToBytes(decBuf, dataEncKey[0]); - this.initialized = true; - this.pathMasker = groupPath; - }; + case 22: + encData = _context42.sent; + fd = new FormData(); + _context42.prev = 24; + blob = new Blob([encData], { + type: 'application/octet-stream' + }); + fd.append('key', dataEncKey[1].encryptedString); + fd.append('data', blob, encFileName.encryptedString); + _context42.next = 38; + break; - SVGStrokeEffect.prototype.renderFrame = function (forceRender) { - if (!this.initialized) { - this.initialize(); - } + case 30: + _context42.prev = 30; + _context42.t0 = _context42["catch"](24); - var i; - var len = this.paths.length; - var mask; - var path; + if (!(_misc_utils__WEBPACK_IMPORTED_MODULE_28__["Utils"].isNode && !_misc_utils__WEBPACK_IMPORTED_MODULE_28__["Utils"].isBrowser)) { + _context42.next = 37; + break; + } - for (i = 0; i < len; i += 1) { - if (this.paths[i].m !== -1) { - mask = this.elem.maskManager.viewData[this.paths[i].m]; - path = this.paths[i].p; + fd.append('key', dataEncKey[1].encryptedString); + fd.append('data', Buffer.from(encData), { + filepath: encFileName.encryptedString, + contentType: 'application/octet-stream' + }); + _context42.next = 38; + break; - if (forceRender || this.filterManager._mdf || mask.prop._mdf) { - path.setAttribute('d', mask.lastPath); - } + case 37: + throw _context42.t0; - if (forceRender || this.filterManager.effectElements[9].p._mdf || this.filterManager.effectElements[4].p._mdf || this.filterManager.effectElements[7].p._mdf || this.filterManager.effectElements[8].p._mdf || mask.prop._mdf) { - var dasharrayValue; + case 38: + _context42.prev = 38; + _context42.next = 41; + return this.apiService.postShareCipherAttachment(cipherId, attachmentView.id, fd, organizationId); - if (this.filterManager.effectElements[7].p.v !== 0 || this.filterManager.effectElements[8].p.v !== 100) { - var s = Math.min(this.filterManager.effectElements[7].p.v, this.filterManager.effectElements[8].p.v) * 0.01; - var e = Math.max(this.filterManager.effectElements[7].p.v, this.filterManager.effectElements[8].p.v) * 0.01; - var l = path.getTotalLength(); - dasharrayValue = '0 0 0 ' + l * s + ' '; - var lineLength = l * (e - s); - var segment = 1 + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01; - var units = Math.floor(lineLength / segment); - var j; + case 41: + _context42.next = 46; + break; - for (j = 0; j < units; j += 1) { - dasharrayValue += '1 ' + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01 + ' '; - } + case 43: + _context42.prev = 43; + _context42.t1 = _context42["catch"](38); + throw new Error(_context42.t1.getSingleMessage()); - dasharrayValue += '0 ' + l * 10 + ' 0 0'; - } else { - dasharrayValue = '1 ' + this.filterManager.effectElements[4].p.v * 2 * this.filterManager.effectElements[9].p.v * 0.01; + case 46: + case "end": + return _context42.stop(); + } } - - path.setAttribute('stroke-dasharray', dasharrayValue); - } - } + }, _callee42, this, [[24, 30], [38, 43]]); + })); } + }, { + key: "encryptObjProperty", + value: function encryptObjProperty(model, obj, map, key) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee43() { + var promises, self, prop; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee43$(_context43) { + while (1) { + switch (_context43.prev = _context43.next) { + case 0: + promises = []; + self = this; + _context43.t0 = _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.keys(map); - if (forceRender || this.filterManager.effectElements[4].p._mdf) { - this.pathMasker.setAttribute('stroke-width', this.filterManager.effectElements[4].p.v * 2); - } + case 3: + if ((_context43.t1 = _context43.t0()).done) { + _context43.next = 10; + break; + } - if (forceRender || this.filterManager.effectElements[6].p._mdf) { - this.pathMasker.setAttribute('opacity', this.filterManager.effectElements[6].p.v); - } + prop = _context43.t1.value; - if (this.filterManager.effectElements[10].p.v === 1 || this.filterManager.effectElements[10].p.v === 2) { - if (forceRender || this.filterManager.effectElements[3].p._mdf) { - var color = this.filterManager.effectElements[3].p.v; - this.pathMasker.setAttribute('stroke', 'rgb(' + bmFloor(color[0] * 255) + ',' + bmFloor(color[1] * 255) + ',' + bmFloor(color[2] * 255) + ')'); - } - } - }; + if (map.hasOwnProperty(prop)) { + _context43.next = 7; + break; + } - function SVGTritoneFilter(filter, filterManager, elem, id) { - this.filterManager = filterManager; - var feColorMatrix = createNS('feColorMatrix'); - feColorMatrix.setAttribute('type', 'matrix'); - feColorMatrix.setAttribute('color-interpolation-filters', 'linearRGB'); - feColorMatrix.setAttribute('values', '0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0'); - filter.appendChild(feColorMatrix); - var feComponentTransfer = createNS('feComponentTransfer'); - feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB'); - feComponentTransfer.setAttribute('result', id); - this.matrixFilter = feComponentTransfer; - var feFuncR = createNS('feFuncR'); - feFuncR.setAttribute('type', 'table'); - feComponentTransfer.appendChild(feFuncR); - this.feFuncR = feFuncR; - var feFuncG = createNS('feFuncG'); - feFuncG.setAttribute('type', 'table'); - feComponentTransfer.appendChild(feFuncG); - this.feFuncG = feFuncG; - var feFuncB = createNS('feFuncB'); - feFuncB.setAttribute('type', 'table'); - feComponentTransfer.appendChild(feFuncB); - this.feFuncB = feFuncB; - filter.appendChild(feComponentTransfer); - } + return _context43.abrupt("continue", 3); + + case 7: + // tslint:disable-next-line + (function (theProp, theObj) { + var p = Promise.resolve().then(function () { + var modelProp = model[map[theProp] || theProp]; + + if (modelProp && modelProp !== '') { + return self.cryptoService.encrypt(modelProp, key); + } + + return null; + }).then(function (val) { + theObj[theProp] = val; + }); + promises.push(p); + })(prop, obj); + + _context43.next = 3; + break; + + case 10: + _context43.next = 12; + return Promise.all(promises); - SVGTritoneFilter.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - var color1 = this.filterManager.effectElements[0].p.v; - var color2 = this.filterManager.effectElements[1].p.v; - var color3 = this.filterManager.effectElements[2].p.v; - var tableR = color3[0] + ' ' + color2[0] + ' ' + color1[0]; - var tableG = color3[1] + ' ' + color2[1] + ' ' + color1[1]; - var tableB = color3[2] + ' ' + color2[2] + ' ' + color1[2]; - this.feFuncR.setAttribute('tableValues', tableR); - this.feFuncG.setAttribute('tableValues', tableG); - this.feFuncB.setAttribute('tableValues', tableB); + case 12: + case "end": + return _context43.stop(); + } + } + }, _callee43, this); + })); } - }; + }, { + key: "encryptCipherData", + value: function encryptCipherData(cipher, model, key) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee44() { + var i, loginUri; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee44$(_context44) { + while (1) { + switch (_context44.prev = _context44.next) { + case 0: + _context44.t0 = cipher.type; + _context44.next = _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Login ? 3 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].SecureNote ? 20 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Card ? 23 : _context44.t0 === _enums_cipherType__WEBPACK_IMPORTED_MODULE_3__["CipherType"].Identity ? 27 : 31; + break; - function SVGProLevelsFilter(filter, filterManager, elem, id) { - this.filterManager = filterManager; - var effectElements = this.filterManager.effectElements; - var feComponentTransfer = createNS('feComponentTransfer'); // Red + case 3: + cipher.login = new _models_domain_login__WEBPACK_IMPORTED_MODULE_12__["Login"](); + cipher.login.passwordRevisionDate = model.login.passwordRevisionDate; + _context44.next = 7; + return this.encryptObjProperty(model.login, cipher.login, { + username: null, + password: null, + totp: null + }, key); - if (effectElements[10].p.k || effectElements[10].p.v !== 0 || effectElements[11].p.k || effectElements[11].p.v !== 1 || effectElements[12].p.k || effectElements[12].p.v !== 1 || effectElements[13].p.k || effectElements[13].p.v !== 0 || effectElements[14].p.k || effectElements[14].p.v !== 1) { - this.feFuncR = this.createFeFunc('feFuncR', feComponentTransfer); - } // Green + case 7: + if (!(model.login.uris != null)) { + _context44.next = 19; + break; + } + cipher.login.uris = []; + i = 0; - if (effectElements[17].p.k || effectElements[17].p.v !== 0 || effectElements[18].p.k || effectElements[18].p.v !== 1 || effectElements[19].p.k || effectElements[19].p.v !== 1 || effectElements[20].p.k || effectElements[20].p.v !== 0 || effectElements[21].p.k || effectElements[21].p.v !== 1) { - this.feFuncG = this.createFeFunc('feFuncG', feComponentTransfer); - } // Blue + case 10: + if (!(i < model.login.uris.length)) { + _context44.next = 19; + break; + } + loginUri = new _models_domain_loginUri__WEBPACK_IMPORTED_MODULE_13__["LoginUri"](); + loginUri.match = model.login.uris[i].match; + _context44.next = 15; + return this.encryptObjProperty(model.login.uris[i], loginUri, { + uri: null + }, key); - if (effectElements[24].p.k || effectElements[24].p.v !== 0 || effectElements[25].p.k || effectElements[25].p.v !== 1 || effectElements[26].p.k || effectElements[26].p.v !== 1 || effectElements[27].p.k || effectElements[27].p.v !== 0 || effectElements[28].p.k || effectElements[28].p.v !== 1) { - this.feFuncB = this.createFeFunc('feFuncB', feComponentTransfer); - } // Alpha + case 15: + cipher.login.uris.push(loginUri); + case 16: + i++; + _context44.next = 10; + break; - if (effectElements[31].p.k || effectElements[31].p.v !== 0 || effectElements[32].p.k || effectElements[32].p.v !== 1 || effectElements[33].p.k || effectElements[33].p.v !== 1 || effectElements[34].p.k || effectElements[34].p.v !== 0 || effectElements[35].p.k || effectElements[35].p.v !== 1) { - this.feFuncA = this.createFeFunc('feFuncA', feComponentTransfer); - } // RGB + case 19: + return _context44.abrupt("return"); + case 20: + cipher.secureNote = new _models_domain_secureNote__WEBPACK_IMPORTED_MODULE_15__["SecureNote"](); + cipher.secureNote.type = model.secureNote.type; + return _context44.abrupt("return"); - if (this.feFuncR || this.feFuncG || this.feFuncB || this.feFuncA) { - feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB'); - filter.appendChild(feComponentTransfer); - } + case 23: + cipher.card = new _models_domain_card__WEBPACK_IMPORTED_MODULE_8__["Card"](); + _context44.next = 26; + return this.encryptObjProperty(model.card, cipher.card, { + cardholderName: null, + brand: null, + number: null, + expMonth: null, + expYear: null, + code: null + }, key); - if (effectElements[3].p.k || effectElements[3].p.v !== 0 || effectElements[4].p.k || effectElements[4].p.v !== 1 || effectElements[5].p.k || effectElements[5].p.v !== 1 || effectElements[6].p.k || effectElements[6].p.v !== 0 || effectElements[7].p.k || effectElements[7].p.v !== 1) { - feComponentTransfer = createNS('feComponentTransfer'); - feComponentTransfer.setAttribute('color-interpolation-filters', 'sRGB'); - feComponentTransfer.setAttribute('result', id); - filter.appendChild(feComponentTransfer); - this.feFuncRComposed = this.createFeFunc('feFuncR', feComponentTransfer); - this.feFuncGComposed = this.createFeFunc('feFuncG', feComponentTransfer); - this.feFuncBComposed = this.createFeFunc('feFuncB', feComponentTransfer); - } - } + case 26: + return _context44.abrupt("return"); - SVGProLevelsFilter.prototype.createFeFunc = function (type, feComponentTransfer) { - var feFunc = createNS(type); - feFunc.setAttribute('type', 'table'); - feComponentTransfer.appendChild(feFunc); - return feFunc; - }; + case 27: + cipher.identity = new _models_domain_identity__WEBPACK_IMPORTED_MODULE_11__["Identity"](); + _context44.next = 30; + return this.encryptObjProperty(model.identity, cipher.identity, { + title: null, + firstName: null, + middleName: null, + lastName: null, + address1: null, + address2: null, + address3: null, + city: null, + state: null, + postalCode: null, + country: null, + company: null, + email: null, + phone: null, + ssn: null, + username: null, + passportNumber: null, + licenseNumber: null + }, key); - SVGProLevelsFilter.prototype.getTableValue = function (inputBlack, inputWhite, gamma, outputBlack, outputWhite) { - var cnt = 0; - var segments = 256; - var perc; - var min = Math.min(inputBlack, inputWhite); - var max = Math.max(inputBlack, inputWhite); - var table = Array.call(null, { - length: segments - }); - var colorValue; - var pos = 0; - var outputDelta = outputWhite - outputBlack; - var inputDelta = inputWhite - inputBlack; - - while (cnt <= 256) { - perc = cnt / 256; - - if (perc <= min) { - colorValue = inputDelta < 0 ? outputWhite : outputBlack; - } else if (perc >= max) { - colorValue = inputDelta < 0 ? outputBlack : outputWhite; - } else { - colorValue = outputBlack + outputDelta * Math.pow((perc - inputBlack) / inputDelta, 1 / gamma); - } + case 30: + return _context44.abrupt("return"); + + case 31: + throw new Error('Unknown cipher type.'); - table[pos] = colorValue; - pos += 1; - cnt += 256 / (segments - 1); + case 32: + case "end": + return _context44.stop(); + } + } + }, _callee44, this); + })); } + }, { + key: "getCipherForUrl", + value: function getCipherForUrl(url, lastUsed, lastLaunched) { + return __awaiter(this, void 0, void 0, /*#__PURE__*/_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee45() { + var _ciphers; - return table.join(' '); - }; + return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee45$(_context45) { + while (1) { + switch (_context45.prev = _context45.next) { + case 0: + if (this.sortedCiphersCache.isCached(url)) { + _context45.next = 7; + break; + } - SVGProLevelsFilter.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - var val; - var effectElements = this.filterManager.effectElements; + _context45.next = 3; + return this.getAllDecryptedForUrl(url); - if (this.feFuncRComposed && (forceRender || effectElements[3].p._mdf || effectElements[4].p._mdf || effectElements[5].p._mdf || effectElements[6].p._mdf || effectElements[7].p._mdf)) { - val = this.getTableValue(effectElements[3].p.v, effectElements[4].p.v, effectElements[5].p.v, effectElements[6].p.v, effectElements[7].p.v); - this.feFuncRComposed.setAttribute('tableValues', val); - this.feFuncGComposed.setAttribute('tableValues', val); - this.feFuncBComposed.setAttribute('tableValues', val); - } + case 3: + _ciphers = _context45.sent; - if (this.feFuncR && (forceRender || effectElements[10].p._mdf || effectElements[11].p._mdf || effectElements[12].p._mdf || effectElements[13].p._mdf || effectElements[14].p._mdf)) { - val = this.getTableValue(effectElements[10].p.v, effectElements[11].p.v, effectElements[12].p.v, effectElements[13].p.v, effectElements[14].p.v); - this.feFuncR.setAttribute('tableValues', val); - } + if (_ciphers) { + _context45.next = 6; + break; + } - if (this.feFuncG && (forceRender || effectElements[17].p._mdf || effectElements[18].p._mdf || effectElements[19].p._mdf || effectElements[20].p._mdf || effectElements[21].p._mdf)) { - val = this.getTableValue(effectElements[17].p.v, effectElements[18].p.v, effectElements[19].p.v, effectElements[20].p.v, effectElements[21].p.v); - this.feFuncG.setAttribute('tableValues', val); - } + return _context45.abrupt("return", null); - if (this.feFuncB && (forceRender || effectElements[24].p._mdf || effectElements[25].p._mdf || effectElements[26].p._mdf || effectElements[27].p._mdf || effectElements[28].p._mdf)) { - val = this.getTableValue(effectElements[24].p.v, effectElements[25].p.v, effectElements[26].p.v, effectElements[27].p.v, effectElements[28].p.v); - this.feFuncB.setAttribute('tableValues', val); - } + case 6: + this.sortedCiphersCache.addCiphers(url, _ciphers); - if (this.feFuncA && (forceRender || effectElements[31].p._mdf || effectElements[32].p._mdf || effectElements[33].p._mdf || effectElements[34].p._mdf || effectElements[35].p._mdf)) { - val = this.getTableValue(effectElements[31].p.v, effectElements[32].p.v, effectElements[33].p.v, effectElements[34].p.v, effectElements[35].p.v); - this.feFuncA.setAttribute('tableValues', val); - } - } - }; + case 7: + if (!lastLaunched) { + _context45.next = 11; + break; + } - function SVGDropShadowEffect(filter, filterManager, elem, id, source) { - var globalFilterSize = filterManager.container.globalData.renderConfig.filterSize; - var filterSize = filterManager.data.fs || globalFilterSize; - filter.setAttribute('x', filterSize.x || globalFilterSize.x); - filter.setAttribute('y', filterSize.y || globalFilterSize.y); - filter.setAttribute('width', filterSize.width || globalFilterSize.width); - filter.setAttribute('height', filterSize.height || globalFilterSize.height); - this.filterManager = filterManager; - var feGaussianBlur = createNS('feGaussianBlur'); - feGaussianBlur.setAttribute('in', 'SourceAlpha'); - feGaussianBlur.setAttribute('result', id + '_drop_shadow_1'); - feGaussianBlur.setAttribute('stdDeviation', '0'); - this.feGaussianBlur = feGaussianBlur; - filter.appendChild(feGaussianBlur); - var feOffset = createNS('feOffset'); - feOffset.setAttribute('dx', '25'); - feOffset.setAttribute('dy', '0'); - feOffset.setAttribute('in', id + '_drop_shadow_1'); - feOffset.setAttribute('result', id + '_drop_shadow_2'); - this.feOffset = feOffset; - filter.appendChild(feOffset); - var feFlood = createNS('feFlood'); - feFlood.setAttribute('flood-color', '#00ff00'); - feFlood.setAttribute('flood-opacity', '1'); - feFlood.setAttribute('result', id + '_drop_shadow_3'); - this.feFlood = feFlood; - filter.appendChild(feFlood); - var feComposite = createNS('feComposite'); - feComposite.setAttribute('in', id + '_drop_shadow_3'); - feComposite.setAttribute('in2', id + '_drop_shadow_2'); - feComposite.setAttribute('operator', 'in'); - feComposite.setAttribute('result', id + '_drop_shadow_4'); - filter.appendChild(feComposite); - var feMerge = this.createMergeNode(id, [id + '_drop_shadow_4', source]); - filter.appendChild(feMerge); // - } + return _context45.abrupt("return", this.sortedCiphersCache.getLastLaunched(url)); - extendPrototype([SVGComposableEffect], SVGDropShadowEffect); + case 11: + if (!lastUsed) { + _context45.next = 15; + break; + } - SVGDropShadowEffect.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - if (forceRender || this.filterManager.effectElements[4].p._mdf) { - this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4); - } + return _context45.abrupt("return", this.sortedCiphersCache.getLastUsed(url)); - if (forceRender || this.filterManager.effectElements[0].p._mdf) { - var col = this.filterManager.effectElements[0].p.v; - this.feFlood.setAttribute('flood-color', rgbToHex(Math.round(col[0] * 255), Math.round(col[1] * 255), Math.round(col[2] * 255))); - } + case 15: + return _context45.abrupt("return", this.sortedCiphersCache.getNext(url)); - if (forceRender || this.filterManager.effectElements[1].p._mdf) { - this.feFlood.setAttribute('flood-opacity', this.filterManager.effectElements[1].p.v / 255); - } + case 16: + case "end": + return _context45.stop(); + } + } + }, _callee45, this); + })); + } + }, { + key: "decryptedCipherCache", + get: function get() { + return this._decryptedCipherCache; + }, + set: function set(value) { + this._decryptedCipherCache = value; - if (forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf) { - var distance = this.filterManager.effectElements[3].p.v; - var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads; - var x = distance * Math.cos(angle); - var y = distance * Math.sin(angle); - this.feOffset.setAttribute('dx', x); - this.feOffset.setAttribute('dy', y); + if (this.searchService != null) { + if (value == null) { + this.searchService().clearIndex(); + } else { + this.searchService().indexCiphers(); + } } } - }; + }]); - var _svgMatteSymbols = []; + return CipherService; +}(); - function SVGMatte3Effect(filterElem, filterManager, elem) { - this.initialized = false; - this.filterManager = filterManager; - this.filterElem = filterElem; - this.elem = elem; - elem.matteElement = createNS('g'); - elem.matteElement.appendChild(elem.layerElement); - elem.matteElement.appendChild(elem.transformedElement); - elem.baseElement = elem.matteElement; - } +__decorate([Object(_misc_sequentialize__WEBPACK_IMPORTED_MODULE_27__["sequentialize"])(function () { + return 'getAllDecrypted'; +}), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise)], CipherService.prototype, "getAllDecrypted", null); +/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__("tjlA").Buffer)) - SVGMatte3Effect.prototype.findSymbol = function (mask) { - var i = 0; - var len = _svgMatteSymbols.length; +/***/ }), - while (i < len) { - if (_svgMatteSymbols[i] === mask) { - return _svgMatteSymbols[i]; - } +/***/ "lO0E": +/***/ (function(module, __webpack_exports__, __webpack_require__) { - i += 1; - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styles", function() { return styles; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("wx14"); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("Ff2n"); +/* harmony import */ var _babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("rePB"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("q1tI"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("17x9"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_4__); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("iuhU"); +/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("H2TA"); - return null; - }; - SVGMatte3Effect.prototype.replaceInParent = function (mask, symbolId) { - var parentNode = mask.layerElement.parentNode; - if (!parentNode) { - return; - } - var children = parentNode.children; - var i = 0; - var len = children.length; - while (i < len) { - if (children[i] === mask.layerElement) { - break; - } - i += 1; - } - var nextChild; +var styles = function styles(theme) { + return { + /* Styles applied to the root element. */ + root: { + position: 'relative', + display: 'flex', + alignItems: 'center' + }, - if (i <= len - 2) { - nextChild = children[i + 1]; - } + /* Styles applied to the root element if `disableGutters={false}`. */ + gutters: Object(_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_2__["default"])({ + paddingLeft: theme.spacing(2), + paddingRight: theme.spacing(2) + }, theme.breakpoints.up('sm'), { + paddingLeft: theme.spacing(3), + paddingRight: theme.spacing(3) + }), - var useElem = createNS('use'); - useElem.setAttribute('href', '#' + symbolId); + /* Styles applied to the root element if `variant="regular"`. */ + regular: theme.mixins.toolbar, - if (nextChild) { - parentNode.insertBefore(useElem, nextChild); - } else { - parentNode.appendChild(useElem); + /* Styles applied to the root element if `variant="dense"`. */ + dense: { + minHeight: 48 } }; +}; +var Toolbar = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__["forwardRef"](function Toolbar(props, ref) { + var classes = props.classes, + className = props.className, + _props$component = props.component, + Component = _props$component === void 0 ? 'div' : _props$component, + _props$disableGutters = props.disableGutters, + disableGutters = _props$disableGutters === void 0 ? false : _props$disableGutters, + _props$variant = props.variant, + variant = _props$variant === void 0 ? 'regular' : _props$variant, + other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(props, ["classes", "className", "component", "disableGutters", "variant"]); - SVGMatte3Effect.prototype.setElementAsMask = function (elem, mask) { - if (!this.findSymbol(mask)) { - var symbolId = createElementID(); - var masker = createNS('mask'); - masker.setAttribute('id', mask.layerId); - masker.setAttribute('mask-type', 'alpha'); + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_3__["createElement"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + className: Object(clsx__WEBPACK_IMPORTED_MODULE_5__["default"])(classes.root, classes[variant], className, !disableGutters && classes.gutters), + ref: ref + }, other)); +}); + false ? undefined : void 0; +/* harmony default export */ __webpack_exports__["default"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_6__["default"])(styles, { + name: 'MuiToolbar' +})(Toolbar)); - _svgMatteSymbols.push(mask); +/***/ }), - var defs = elem.globalData.defs; - defs.appendChild(masker); - var symbol = createNS('symbol'); - symbol.setAttribute('id', symbolId); - this.replaceInParent(mask, symbolId); - symbol.appendChild(mask.layerElement); - defs.appendChild(symbol); - var useElem = createNS('use'); - useElem.setAttribute('href', '#' + symbolId); - masker.appendChild(useElem); - mask.data.hd = false; - mask.show(); - } +/***/ "lOB1": +/***/ (function(module, exports, __webpack_require__) { - elem.setMatte(mask.layerId); - }; +"use strict"; - SVGMatte3Effect.prototype.initialize = function () { - var ind = this.filterManager.effectElements[0].p.v; - var elements = this.elem.comp.elements; - var i = 0; - var len = elements.length; - while (i < len) { - if (elements[i] && elements[i].data.ind === ind) { - this.setElementAsMask(this.elem, elements[i]); - } +var abs = __webpack_require__("6X7+"); +var floor = __webpack_require__("/Xn7"); +var ToNumber = __webpack_require__("/s5K"); - i += 1; - } +var $isNaN = __webpack_require__("IFfy"); +var $isFinite = __webpack_require__("xhJ2"); +var $sign = __webpack_require__("WXWk"); - this.initialized = true; - }; +// https://262.ecma-international.org/12.0/#sec-tointegerorinfinity - SVGMatte3Effect.prototype.renderFrame = function () { - if (!this.initialized) { - this.initialize(); - } - }; +module.exports = function ToIntegerOrInfinity(value) { + var number = ToNumber(value); + if ($isNaN(number) || number === 0) { return 0; } + if (!$isFinite(number)) { return number; } + return $sign(number) * floor(abs(number)); +}; - function SVGGaussianBlurEffect(filter, filterManager, elem, id) { - // Outset the filter region by 100% on all sides to accommodate blur expansion. - filter.setAttribute('x', '-100%'); - filter.setAttribute('y', '-100%'); - filter.setAttribute('width', '300%'); - filter.setAttribute('height', '300%'); - this.filterManager = filterManager; - var feGaussianBlur = createNS('feGaussianBlur'); - feGaussianBlur.setAttribute('result', id); - filter.appendChild(feGaussianBlur); - this.feGaussianBlur = feGaussianBlur; - } - SVGGaussianBlurEffect.prototype.renderFrame = function (forceRender) { - if (forceRender || this.filterManager._mdf) { - // Empirical value, matching AE's blur appearance. - var kBlurrinessToSigma = 0.3; - var sigma = this.filterManager.effectElements[0].p.v * kBlurrinessToSigma; // Dimensions mapping: - // - // 1 -> horizontal & vertical - // 2 -> horizontal only - // 3 -> vertical only - // +/***/ }), + +/***/ "lOKL": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "styles", function() { return styles; }); +/* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("wx14"); +/* harmony import */ var _babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("Ff2n"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("q1tI"); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("17x9"); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_3__); +/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("iuhU"); +/* harmony import */ var _styles_withStyles__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("KgOg"); +/* harmony import */ var _Typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("YiTZ"); - var dimensions = this.filterManager.effectElements[1].p.v; - var sigmaX = dimensions == 3 ? 0 : sigma; // eslint-disable-line eqeqeq - var sigmaY = dimensions == 2 ? 0 : sigma; // eslint-disable-line eqeqeq - this.feGaussianBlur.setAttribute('stdDeviation', sigmaX + ' ' + sigmaY); // Repeat edges mapping: - // - // 0 -> off -> duplicate - // 1 -> on -> wrap - var edgeMode = this.filterManager.effectElements[2].p.v == 1 ? 'wrap' : 'duplicate'; // eslint-disable-line eqeqeq - this.feGaussianBlur.setAttribute('edgeMode', edgeMode); - } - }; - registerRenderer('canvas', CanvasRenderer); - registerRenderer('html', HybridRenderer); - registerRenderer('svg', SVGRenderer); // Registering shape modifiers - ShapeModifiers.registerModifier('tm', TrimModifier); - ShapeModifiers.registerModifier('pb', PuckerAndBloatModifier); - ShapeModifiers.registerModifier('rp', RepeaterModifier); - ShapeModifiers.registerModifier('rd', RoundCornersModifier); // Registering expression plugin +var styles = { + /* Styles applied to the root element. */ + root: { + display: 'flex', + alignItems: 'center', + padding: 16 + }, - setExpressionsPlugin(Expressions); - initialize$1(); - initialize(); // Registering svg effects + /* Styles applied to the avatar element. */ + avatar: { + flex: '0 0 auto', + marginRight: 16 + }, - registerEffect(20, SVGTintFilter, true); - registerEffect(21, SVGFillFilter, true); - registerEffect(22, SVGStrokeEffect, false); - registerEffect(23, SVGTritoneFilter, true); - registerEffect(24, SVGProLevelsFilter, true); - registerEffect(25, SVGDropShadowEffect, true); - registerEffect(28, SVGMatte3Effect, false); - registerEffect(29, SVGGaussianBlurEffect, true); + /* Styles applied to the action element. */ + action: { + flex: '0 0 auto', + alignSelf: 'flex-start', + marginTop: -8, + marginRight: -8 + }, - return lottie; + /* Styles applied to the content wrapper element. */ + content: { + flex: '1 1 auto' + }, -})); + /* Styles applied to the title Typography element. */ + title: {}, + /* Styles applied to the subheader Typography element. */ + subheader: {} +}; +var CardHeader = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["forwardRef"](function CardHeader(props, ref) { + var action = props.action, + avatar = props.avatar, + classes = props.classes, + className = props.className, + _props$component = props.component, + Component = _props$component === void 0 ? 'div' : _props$component, + _props$disableTypogra = props.disableTypography, + disableTypography = _props$disableTypogra === void 0 ? false : _props$disableTypogra, + subheaderProp = props.subheader, + subheaderTypographyProps = props.subheaderTypographyProps, + titleProp = props.title, + titleTypographyProps = props.titleTypographyProps, + other = Object(_babel_runtime_helpers_esm_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__["default"])(props, ["action", "avatar", "classes", "className", "component", "disableTypography", "subheader", "subheaderTypographyProps", "title", "titleTypographyProps"]); + + var title = titleProp; + + if (title != null && title.type !== _Typography__WEBPACK_IMPORTED_MODULE_6__["default"] && !disableTypography) { + title = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](_Typography__WEBPACK_IMPORTED_MODULE_6__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + variant: avatar ? 'body2' : 'h5', + className: classes.title, + component: "span", + display: "block" + }, titleTypographyProps), title); + } + + var subheader = subheaderProp; + + if (subheader != null && subheader.type !== _Typography__WEBPACK_IMPORTED_MODULE_6__["default"] && !disableTypography) { + subheader = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](_Typography__WEBPACK_IMPORTED_MODULE_6__["default"], Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + variant: avatar ? 'body2' : 'body1', + className: classes.subheader, + color: "textSecondary", + component: "span", + display: "block" + }, subheaderTypographyProps), subheader); + } + + return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"](Component, Object(_babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__["default"])({ + className: Object(clsx__WEBPACK_IMPORTED_MODULE_4__["default"])(classes.root, className), + ref: ref + }, other), avatar && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { + className: classes.avatar + }, avatar), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { + className: classes.content + }, title, subheader), action && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["createElement"]("div", { + className: classes.action + }, action)); +}); + false ? undefined : void 0; +/* harmony default export */ __webpack_exports__["default"] = (Object(_styles_withStyles__WEBPACK_IMPORTED_MODULE_5__["default"])(styles, { + name: 'MuiCardHeader' +})(CardHeader)); /***/ }), @@ -342741,46 +322481,6 @@ module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { }; -/***/ }), - -/***/ "mRg0": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -exports.__esModule = true; - -var _setPrototypeOf = __webpack_require__("s3Ml"); - -var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf); - -var _create = __webpack_require__("AyUB"); - -var _create2 = _interopRequireDefault(_create); - -var _typeof2 = __webpack_require__("EJiy"); - -var _typeof3 = _interopRequireDefault(_typeof2); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -exports.default = function (subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function, not " + (typeof superClass === "undefined" ? "undefined" : (0, _typeof3.default)(superClass))); - } - - subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: false, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass; -}; - /***/ }), /***/ "mRjS": @@ -344079,14 +323779,6 @@ function ecdhesKwDecryptFn(unwrap) { /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__("tjlA").Buffer)) -/***/ }), - -/***/ "mqlF": -/***/ (function(module, exports) { - -exports.f = Object.getOwnPropertySymbols; - - /***/ }), /***/ "mqoM": @@ -355547,17 +335239,6 @@ __webpack_require__.r(__webpack_exports__); -/***/ }), - -/***/ "o8NH": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.3.1 Object.assign(target, source) -var $export = __webpack_require__("Y7ZC"); - -$export($export.S + $export.F, 'Object', { assign: __webpack_require__("kwZ1") }); - - /***/ }), /***/ "o8Rm": @@ -358199,54 +337880,6 @@ __webpack_require__.r(__webpack_exports__); }); -/***/ }), - -/***/ "oVml": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = __webpack_require__("5K7Z"); -var dPs = __webpack_require__("fpC5"); -var enumBugKeys = __webpack_require__("FpHa"); -var IE_PROTO = __webpack_require__("VVlx")('IE_PROTO'); -var Empty = function () { /* empty */ }; -var PROTOTYPE = 'prototype'; - -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function () { - // Thrash, waste and sodomy: IE GC bug - var iframe = __webpack_require__("Hsns")('iframe'); - var i = enumBugKeys.length; - var lt = '<'; - var gt = '>'; - var iframeDocument; - iframe.style.display = 'none'; - __webpack_require__("MvwC").appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; - -module.exports = Object.create || function create(O, Properties) { - var result; - if (O !== null) { - Empty[PROTOTYPE] = anObject(O); - result = new Empty(); - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; - - /***/ }), /***/ "oVo9": @@ -380483,13 +360116,6 @@ function differenceInISOYears (dirtyDateLeft, dirtyDateRight) { module.exports = differenceInISOYears -/***/ }), - -/***/ "s3Ml": -/***/ (function(module, exports, __webpack_require__) { - -module.exports = { "default": __webpack_require__("JbBM"), __esModule: true }; - /***/ }), /***/ "s40b": @@ -388609,19 +368235,6 @@ logger.pipe = function() { }; module.exports = logger; -/***/ }), - -/***/ "tEej": -/***/ (function(module, exports, __webpack_require__) { - -// 7.1.15 ToLength -var toInteger = __webpack_require__("Ojgd"); -var min = Math.min; -module.exports = function (it) { - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; - - /***/ }), /***/ "tEiQ": @@ -396409,14 +376022,6 @@ var TablePagination = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2__["forwardRe name: 'MuiTablePagination' })(TablePagination)); -/***/ }), - -/***/ "uOPS": -/***/ (function(module, exports) { - -module.exports = true; - - /***/ }), /***/ "uPSP": @@ -402782,29 +382387,6 @@ module.exports = function (it, msg) { }; -/***/ }), - -/***/ "vwuL": -/***/ (function(module, exports, __webpack_require__) { - -var pIE = __webpack_require__("NV0k"); -var createDesc = __webpack_require__("rr1i"); -var toIObject = __webpack_require__("NsO/"); -var toPrimitive = __webpack_require__("G8Mo"); -var has = __webpack_require__("B+OT"); -var IE8_DOM_DEFINE = __webpack_require__("eUtF"); -var gOPD = Object.getOwnPropertyDescriptor; - -exports.f = __webpack_require__("jmDH") ? gOPD : function getOwnPropertyDescriptor(O, P) { - O = toIObject(O); - P = toPrimitive(P, true); - if (IE8_DOM_DEFINE) try { - return gOPD(O, P); - } catch (e) { /* empty */ } - if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); -}; - - /***/ }), /***/ "vyyr": @@ -403558,48 +383140,6 @@ module.exports = function (IS_INCLUDES) { }; -/***/ }), - -/***/ "w2d+": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -var addToUnscopables = __webpack_require__("hDam"); -var step = __webpack_require__("UO39"); -var Iterators = __webpack_require__("SBuE"); -var toIObject = __webpack_require__("NsO/"); - -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = __webpack_require__("MPFp")(Array, 'Array', function (iterated, kind) { - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function () { - var O = this._t; - var kind = this._k; - var index = this._i++; - if (!O || index >= O.length) { - this._t = undefined; - return step(1); - } - if (kind == 'keys') return step(0, index); - if (kind == 'values') return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); - -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; - -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); - - /***/ }), /***/ "w4qb": @@ -403721,20 +383261,6 @@ __webpack_require__.r(__webpack_exports__); /* harmony default export */ __webpack_exports__["default"] = (Object(_colors_js__WEBPACK_IMPORTED_MODULE_0__["default"])("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928")); -/***/ }), - -/***/ "w6GO": -/***/ (function(module, exports, __webpack_require__) { - -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = __webpack_require__("5vMV"); -var enumBugKeys = __webpack_require__("FpHa"); - -module.exports = Object.keys || function keys(O) { - return $keys(O, enumBugKeys); -}; - - /***/ }), /***/ "w6HE": @@ -407623,13 +387149,6 @@ var _default = /*#__PURE__*/(0, _react.memo)(RealTimeQueries); exports.default = _default; -/***/ }), - -/***/ "wgeU": -/***/ (function(module, exports) { - - - /***/ }), /***/ "wibz": @@ -421315,14 +400834,6 @@ function _objectWithoutPropertiesLoose(source, excluded) { return target; } -/***/ }), - -/***/ "zLkG": -/***/ (function(module, exports, __webpack_require__) { - -exports.f = __webpack_require__("UWiX"); - - /***/ }), /***/ "zM65": @@ -422260,23 +401771,6 @@ function sequentialSqrt() { } -/***/ }), - -/***/ "zn7N": -/***/ (function(module, exports, __webpack_require__) { - -// most Object methods by ES6 should accept primitives -var $export = __webpack_require__("Y7ZC"); -var core = __webpack_require__("WEpk"); -var fails = __webpack_require__("KUxP"); -module.exports = function (KEY, exec) { - var fn = (core.Object || {})[KEY] || Object[KEY]; - var exp = {}; - exp[KEY] = exec(fn); - $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); -}; - - /***/ }), /***/ "znUM":