diff --git a/3/ecolyo.bbcc51224dcd46292d2d.js b/3/ecolyo.3b121dc87cef737973cb.js
similarity index 97%
rename from 3/ecolyo.bbcc51224dcd46292d2d.js
rename to 3/ecolyo.3b121dc87cef737973cb.js
index 7a5dcd3ee4cc86f17f8f18b53ee4dd34def7960d..e3f9df149c7b960c0032c1a67a267d9a31d19439 100644
--- a/3/ecolyo.bbcc51224dcd46292d2d.js
+++ b/3/ecolyo.3b121dc87cef737973cb.js
@@ -2771,6 +2771,28 @@ exports.default = _default;
 
 /***/ }),
 
+/***/ "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);
+
+/***/ }),
+
 /***/ "HK68":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -4620,6 +4642,119 @@ 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);
+
+  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;
+
+/***/ }),
+
 /***/ "YEuI":
 /***/ (function(module, exports, __webpack_require__) {
 
@@ -6101,39 +6236,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 +6274,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 +6359,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", {
@@ -6712,6 +6833,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__) {
 
diff --git a/5/ecolyo.3a48b3c8783b8b429d7f.js b/5/ecolyo.43cb1dd3cc08d92da963.js
similarity index 97%
rename from 5/ecolyo.3a48b3c8783b8b429d7f.js
rename to 5/ecolyo.43cb1dd3cc08d92da963.js
index 07330c5fd39d5a069e94ebd45deb78d361d55e23..69c006a6aad9e4edc4fd132bef128904e781eaac 100644
--- a/5/ecolyo.3a48b3c8783b8b429d7f.js
+++ b/5/ecolyo.43cb1dd3cc08d92da963.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}\n.date-navigator-format .date-navigator-format-date.timeRange {\n  white-space: normal;\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}", ""]);
 
 
 
@@ -266,11 +266,11 @@ Object.defineProperty(exports, "__esModule", {
 });
 exports.default = void 0;
 
-var _timeStep2 = __webpack_require__("cKQ8");
+var _react = _interopRequireDefault(__webpack_require__("q1tI"));
 
 var _luxon = __webpack_require__("ExVU");
 
-var _react = _interopRequireDefault(__webpack_require__("q1tI"));
+var _timeStep2 = __webpack_require__("cKQ8");
 
 __webpack_require__("NEj4");
 
@@ -303,20 +303,10 @@ var DateNavigatorFormat = function DateNavigatorFormat(_ref) {
         })];
 
       case _timeStep2.TimeStep.HALF_AN_HOUR:
-        /**
-         * Format date to range:
-         * 9:00 - 9:30
-         * Day 0X Month
-         */
-        return ["".concat(date.toLocaleString({
-          hour: 'numeric',
-          minute: 'numeric'
-        }), " -\n         ").concat(date.plus({
-          minutes: 30
-        }).toLocaleString({
+        return [date.toLocaleString({
           hour: 'numeric',
           minute: 'numeric'
-        })), date.toLocaleString({
+        }), date.toLocaleString({
           weekday: 'long',
           day: '2-digit',
           month: 'long'
@@ -333,7 +323,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 timeRange"
+    className: "date-navigator-format-date text-16-bold"
   }, 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.1c8ebb6d6b8e6721ae02.js b/app/ecolyo.2b8117772f04e2879f82.js
similarity index 98%
rename from app/ecolyo.1c8ebb6d6b8e6721ae02.js
rename to app/ecolyo.2b8117772f04e2879f82.js
index 00ecbc0941f57299fc7114756a134665a9e9d749..584906d362363ed96410efb6a4da3972e2c68d09 100644
--- a/app/ecolyo.1c8ebb6d6b8e6721ae02.js
+++ b/app/ecolyo.2b8117772f04e2879f82.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":"3a48b3c8783b8b429d7f","6":"6cfb73bb1a865d05ec39","7":"8e0088481e1baf094fa4","8":"f2b0273a73d7cafbc0a4","9":"5abe5f137bb2c2949192","10":"1823bf23fa5cf052fd8e"}[chunkId] + ".js"
+/******/ 		return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + "/ecolyo." + {"2":"16b441c1d2a28260ae40","3":"3b121dc87cef737973cb","4":"3dce9fe3dee4e77244fa","5":"43cb1dd3cc08d92da963","6":"a113251de3c27963062b","7":"8e0088481e1baf094fa4","8":"260ed9b202a1b7c1d846","9":"c032f05af862fb957661"}[chunkId] + ".js"
 /******/ 	}
 /******/
 /******/ 	// The require function
@@ -1569,16 +1569,14 @@ 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 _cozyClient = __webpack_require__("SH7X");
+
 var _fluid2 = __webpack_require__("5Wkc");
 
 var _usageEvent = __webpack_require__("/fHX");
@@ -1599,6 +1597,10 @@ 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"));
@@ -1635,8 +1637,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 +1661,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 +1671,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 +1704,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 +1719,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);
@@ -1947,7 +1947,7 @@ 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;
                 }
@@ -2011,7 +2011,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 +2035,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);
 };
@@ -4387,7 +4387,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}", ""]);
 
 
 
@@ -6772,30 +6772,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 +6794,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"
@@ -8397,7 +8384,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\"},\"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\":\"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\"}}}");
 
 /***/ }),
 
@@ -8925,10 +8912,9 @@ var ConsumptionDataManager = /*#__PURE__*/function () {
                   };
                 }
 
-                console.log('no hole ?', singleFluidGraphData);
                 return _context5.abrupt("return", singleFluidGraphData);
 
-              case 17:
+              case 16:
               case "end":
                 return _context5.stop();
             }
@@ -8958,110 +8944,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);
       }
 
@@ -9070,108 +9097,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);
       }
 
@@ -9180,37 +9207,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);
       }
 
@@ -9243,12 +9270,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;
@@ -9278,9 +9305,9 @@ var ConsumptionDataManager = /*#__PURE__*/function () {
               }
             }
           } catch (err) {
-            _iterator5.e(err);
+            _iterator6.e(err);
           } finally {
-            _iterator5.f();
+            _iterator6.f();
           }
 
           if (singleFluidCharts.length === noDataCount) agreggatedConvertedValue = -1;
@@ -9328,11 +9355,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: {
@@ -9345,22 +9372,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);
       }
 
@@ -9375,33 +9402,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);
       }
 
@@ -9410,11 +9437,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: {
@@ -9429,22 +9456,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);
       }
 
@@ -9459,30 +9486,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);
       }
 
@@ -9497,30 +9524,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);
       }
 
@@ -13716,10 +13743,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) {
@@ -13729,11 +13756,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;
@@ -15770,7 +15797,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}", ""]);
 
 
 
@@ -16895,7 +16922,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'
@@ -16907,7 +16944,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'
@@ -16964,61 +17011,28 @@ var QueryRunner = /*#__PURE__*/function () {
     value: function filterDataList(data, timePeriod) {
       var _this = this;
 
-      if (timePeriod.endDate.day === timePeriod.startDate.day) {
-        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, entry.hour, entry.minute).setZone('utc', {
-            keepLocalTime: true
-          }), timePeriod);
-        });
-        return filteredResult;
-      } else {
-        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', {
-            keepLocalTime: true
-          }), timePeriod);
-        });
-
-        return _filteredResult;
-      }
+      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', {
+          keepLocalTime: true
+        }), timePeriod);
+      });
+      return filteredResult;
     }
   }, {
     key: "mapDataList",
     value: function mapDataList(data) {
-      if (data.length === 48) {
-        var test = 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', {
-              keepLocalTime: true
-            }).minus({
-              minutes: 30
-            }),
-            value: entry.load,
-            state: _dataload.DataloadState.VALID,
-            price: entry.price,
-            valueDetail: null
-          };
-        });
-        return test;
-      } else {
-        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', {
-              keepLocalTime: true
-            }),
-            value: entry.load,
-            state: _dataload.DataloadState.VALID,
-            price: entry.price,
-            valueDetail: null
-          };
-        });
-        return mappedResult;
-      }
+      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', {
+            keepLocalTime: true
+          }),
+          value: entry.load,
+          state: _dataload.DataloadState.VALID,
+          price: entry.price,
+          valueDetail: null
+        };
+      });
+      return mappedResult;
     }
   }, {
     key: "withinDateBoundaries",
@@ -17072,8 +17086,7 @@ var QueryRunner = /*#__PURE__*/function () {
               $eq: timePeriod.startDate.month
             },
             day: {
-              // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-              $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+              $eq: timePeriod.startDate.day
             }
           };
           break;
@@ -17440,7 +17453,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);
 
@@ -18912,7 +18925,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) === 0;
+          return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
         default:
           throw new Error('TimeStep unknown');
@@ -22769,32 +22782,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;
@@ -31138,13 +31151,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__) {
 
@@ -32517,19 +32523,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));
@@ -34175,7 +34181,6 @@ 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(['enableLinkTracking']);
       }
 
       return {
@@ -35313,20 +35318,9 @@ var ConsumptionFormatterService = /*#__PURE__*/function () {
 
       var filledData = [];
       var parsingDate = timePeriod.startDate;
-      var endDate = timePeriod.endDate;
-
-      if (timeStep === 10) {
-        parsingDate = parsingDate.minus({
-          minutes: 30
-        });
-        endDate = endDate.minus({
-          minutes: 30
-        });
-      }
-
-      var dateChartService = new _dateChart.default(); // TODO KO
+      var dateChartService = new _dateChart.default();
 
-      while (parsingDate <= endDate) {
+      while (parsingDate <= timePeriod.endDate) {
         var filtereddata = data.filter(function (dt) {
           return dateChartService.compareStepDate(timeStep, dt.date, parsingDate);
         });
diff --git a/index.html b/index.html
index 08571f2f7884f5b7d3df5ea54785f3f30b390cc0..098a1469f72d2d259b375f298baf4008d74e0cb5 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.1c8ebb6d6b8e6721ae02.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,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.71f31ccb2e4e3905e912.js"></script><script src="app/ecolyo.2b8117772f04e2879f82.js"></script></div></body></html>
\ No newline at end of file
diff --git a/services/aggregatorUsageEvents/ecolyo.js b/services/aggregatorUsageEvents/ecolyo.js
index 5c6e4def57b0673cc23b171dec6632b63f803963..d0f8cb91bb6367a1af8e4c7b44dc33b4c4e0acf3 100644
--- a/services/aggregatorUsageEvents/ecolyo.js
+++ b/services/aggregatorUsageEvents/ecolyo.js
@@ -94508,7 +94508,6 @@ class ConsumptionDataManager {
       };
     }
 
-    console.log('no hole ?', singleFluidGraphData);
     return singleFluidGraphData;
   }
 
@@ -94526,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;
@@ -94812,20 +94818,9 @@ class ConsumptionFormatterService {
 
     const filledData = [];
     let parsingDate = timePeriod.startDate;
-    let endDate = timePeriod.endDate;
+    const dateChartService = new _dateChart.default();
 
-    if (timeStep === 10) {
-      parsingDate = parsingDate.minus({
-        minutes: 30
-      });
-      endDate = endDate.minus({
-        minutes: 30
-      });
-    }
-
-    const dateChartService = new _dateChart.default(); // TODO KO
-
-    while (parsingDate <= endDate) {
+    while (parsingDate <= timePeriod.endDate) {
       const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate));
       const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : {
         date: parsingDate,
@@ -95234,7 +95229,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) === 0;
+        return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
       default:
         throw new Error('TimeStep unknown');
@@ -95833,7 +95828,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'
@@ -95844,7 +95849,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'
@@ -95868,51 +95883,23 @@ class QueryRunner {
   }
 
   filterDataList(data, timePeriod) {
-    if (timePeriod.endDate.day === timePeriod.startDate.day) {
-      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 === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    } else {
-      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', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    }
+    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', {
+      keepLocalTime: true
+    }), timePeriod));
+    return filteredResult;
   }
 
   mapDataList(data) {
-    if (data.length === 48) {
-      const test = 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', {
-          keepLocalTime: true
-        }).minus({
-          minutes: 30
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return test;
-    } else {
-      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', {
-          keepLocalTime: true
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return mappedResult;
-    }
+    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', {
+        keepLocalTime: true
+      }),
+      value: entry.load,
+      state: _dataload.DataloadState.VALID,
+      price: entry.price,
+      valueDetail: null
+    }));
+    return mappedResult;
   }
 
   withinDateBoundaries(dateTime, timePeriod) {
@@ -95962,8 +95949,7 @@ class QueryRunner {
             $eq: timePeriod.startDate.month
           },
           day: {
-            // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-            $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+            $eq: timePeriod.startDate.day
           }
         };
         break;
@@ -96174,7 +96160,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/consumptionAlert/ecolyo.js b/services/consumptionAlert/ecolyo.js
index 6ff6bab9127a571613f516e63a04ed67d4c6946c..4bf1b108f79a5c15f8889751f744025bda96808f 100644
--- a/services/consumptionAlert/ecolyo.js
+++ b/services/consumptionAlert/ecolyo.js
@@ -93104,7 +93104,6 @@ class ConsumptionDataManager {
       };
     }
 
-    console.log('no hole ?', singleFluidGraphData);
     return singleFluidGraphData;
   }
 
@@ -93122,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;
@@ -93408,20 +93414,9 @@ class ConsumptionFormatterService {
 
     const filledData = [];
     let parsingDate = timePeriod.startDate;
-    let endDate = timePeriod.endDate;
+    const dateChartService = new _dateChart.default();
 
-    if (timeStep === 10) {
-      parsingDate = parsingDate.minus({
-        minutes: 30
-      });
-      endDate = endDate.minus({
-        minutes: 30
-      });
-    }
-
-    const dateChartService = new _dateChart.default(); // TODO KO
-
-    while (parsingDate <= endDate) {
+    while (parsingDate <= timePeriod.endDate) {
       const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate));
       const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : {
         date: parsingDate,
@@ -93830,7 +93825,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) === 0;
+        return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
       default:
         throw new Error('TimeStep unknown');
@@ -94429,7 +94424,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'
@@ -94440,7 +94445,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'
@@ -94464,51 +94479,23 @@ class QueryRunner {
   }
 
   filterDataList(data, timePeriod) {
-    if (timePeriod.endDate.day === timePeriod.startDate.day) {
-      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 === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    } else {
-      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', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    }
+    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', {
+      keepLocalTime: true
+    }), timePeriod));
+    return filteredResult;
   }
 
   mapDataList(data) {
-    if (data.length === 48) {
-      const test = 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', {
-          keepLocalTime: true
-        }).minus({
-          minutes: 30
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return test;
-    } else {
-      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', {
-          keepLocalTime: true
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return mappedResult;
-    }
+    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', {
+        keepLocalTime: true
+      }),
+      value: entry.load,
+      state: _dataload.DataloadState.VALID,
+      price: entry.price,
+      valueDetail: null
+    }));
+    return mappedResult;
   }
 
   withinDateBoundaries(dateTime, timePeriod) {
@@ -94558,8 +94545,7 @@ class QueryRunner {
             $eq: timePeriod.startDate.month
           },
           day: {
-            // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-            $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+            $eq: timePeriod.startDate.day
           }
         };
         break;
@@ -94770,7 +94756,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/enedisHalfHourMonthlyAnalysis/ecolyo.js b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
index faae620a80df7d18a86d4b7ec9b87b7da8f043e4..8825e78175a1d3358ce6afdd025958e0084c4e83 100644
--- a/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
+++ b/services/enedisHalfHourMonthlyAnalysis/ecolyo.js
@@ -93015,7 +93015,6 @@ class ConsumptionDataManager {
       };
     }
 
-    console.log('no hole ?', singleFluidGraphData);
     return singleFluidGraphData;
   }
 
@@ -93033,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;
@@ -93319,20 +93325,9 @@ class ConsumptionFormatterService {
 
     const filledData = [];
     let parsingDate = timePeriod.startDate;
-    let endDate = timePeriod.endDate;
+    const dateChartService = new _dateChart.default();
 
-    if (timeStep === 10) {
-      parsingDate = parsingDate.minus({
-        minutes: 30
-      });
-      endDate = endDate.minus({
-        minutes: 30
-      });
-    }
-
-    const dateChartService = new _dateChart.default(); // TODO KO
-
-    while (parsingDate <= endDate) {
+    while (parsingDate <= timePeriod.endDate) {
       const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate));
       const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : {
         date: parsingDate,
@@ -93741,7 +93736,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) === 0;
+        return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
       default:
         throw new Error('TimeStep unknown');
@@ -94340,7 +94335,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'
@@ -94351,7 +94356,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'
@@ -94375,51 +94390,23 @@ class QueryRunner {
   }
 
   filterDataList(data, timePeriod) {
-    if (timePeriod.endDate.day === timePeriod.startDate.day) {
-      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 === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    } else {
-      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', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    }
+    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', {
+      keepLocalTime: true
+    }), timePeriod));
+    return filteredResult;
   }
 
   mapDataList(data) {
-    if (data.length === 48) {
-      const test = 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', {
-          keepLocalTime: true
-        }).minus({
-          minutes: 30
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return test;
-    } else {
-      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', {
-          keepLocalTime: true
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return mappedResult;
-    }
+    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', {
+        keepLocalTime: true
+      }),
+      value: entry.load,
+      state: _dataload.DataloadState.VALID,
+      price: entry.price,
+      valueDetail: null
+    }));
+    return mappedResult;
   }
 
   withinDateBoundaries(dateTime, timePeriod) {
@@ -94469,8 +94456,7 @@ class QueryRunner {
             $eq: timePeriod.startDate.month
           },
           day: {
-            // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-            $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+            $eq: timePeriod.startDate.day
           }
         };
         break;
@@ -94681,7 +94667,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 0c96d5d45336f1680fb823a8b90c8bb744e902fd..13effa342702df66add50120acc31740116422dc 100644
--- a/services/fluidsPrices/ecolyo.js
+++ b/services/fluidsPrices/ecolyo.js
@@ -93015,7 +93015,6 @@ class ConsumptionDataManager {
       };
     }
 
-    console.log('no hole ?', singleFluidGraphData);
     return singleFluidGraphData;
   }
 
@@ -93033,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;
@@ -93319,20 +93325,9 @@ class ConsumptionFormatterService {
 
     const filledData = [];
     let parsingDate = timePeriod.startDate;
-    let endDate = timePeriod.endDate;
+    const dateChartService = new _dateChart.default();
 
-    if (timeStep === 10) {
-      parsingDate = parsingDate.minus({
-        minutes: 30
-      });
-      endDate = endDate.minus({
-        minutes: 30
-      });
-    }
-
-    const dateChartService = new _dateChart.default(); // TODO KO
-
-    while (parsingDate <= endDate) {
+    while (parsingDate <= timePeriod.endDate) {
       const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate));
       const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : {
         date: parsingDate,
@@ -93741,7 +93736,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) === 0;
+        return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
       default:
         throw new Error('TimeStep unknown');
@@ -94340,7 +94335,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'
@@ -94351,7 +94356,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'
@@ -94375,51 +94390,23 @@ class QueryRunner {
   }
 
   filterDataList(data, timePeriod) {
-    if (timePeriod.endDate.day === timePeriod.startDate.day) {
-      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 === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    } else {
-      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', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    }
+    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', {
+      keepLocalTime: true
+    }), timePeriod));
+    return filteredResult;
   }
 
   mapDataList(data) {
-    if (data.length === 48) {
-      const test = 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', {
-          keepLocalTime: true
-        }).minus({
-          minutes: 30
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return test;
-    } else {
-      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', {
-          keepLocalTime: true
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return mappedResult;
-    }
+    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', {
+        keepLocalTime: true
+      }),
+      value: entry.load,
+      state: _dataload.DataloadState.VALID,
+      price: entry.price,
+      valueDetail: null
+    }));
+    return mappedResult;
   }
 
   withinDateBoundaries(dateTime, timePeriod) {
@@ -94469,8 +94456,7 @@ class QueryRunner {
             $eq: timePeriod.startDate.month
           },
           day: {
-            // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-            $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+            $eq: timePeriod.startDate.day
           }
         };
         break;
@@ -94681,7 +94667,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/monthlyReportNotification/ecolyo.js b/services/monthlyReportNotification/ecolyo.js
index 788975138f6e33dd71ec0f22148f0680517e81d5..fb930b11dda904db207d4917022724ef20db5759 100644
--- a/services/monthlyReportNotification/ecolyo.js
+++ b/services/monthlyReportNotification/ecolyo.js
@@ -93104,7 +93104,6 @@ class ConsumptionDataManager {
       };
     }
 
-    console.log('no hole ?', singleFluidGraphData);
     return singleFluidGraphData;
   }
 
@@ -93122,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;
@@ -93408,20 +93414,9 @@ class ConsumptionFormatterService {
 
     const filledData = [];
     let parsingDate = timePeriod.startDate;
-    let endDate = timePeriod.endDate;
+    const dateChartService = new _dateChart.default();
 
-    if (timeStep === 10) {
-      parsingDate = parsingDate.minus({
-        minutes: 30
-      });
-      endDate = endDate.minus({
-        minutes: 30
-      });
-    }
-
-    const dateChartService = new _dateChart.default(); // TODO KO
-
-    while (parsingDate <= endDate) {
+    while (parsingDate <= timePeriod.endDate) {
       const filtereddata = data.filter(dt => dateChartService.compareStepDate(timeStep, dt.date, parsingDate));
       const newElement = this.defineDataloadState(filtereddata[0] ? filtereddata[0] : {
         date: parsingDate,
@@ -93830,7 +93825,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) === 0;
+        return date1.year === date2.year && date1.month === date2.month && date1.day === date2.day && date1.hour === date2.hour && Math.abs(date1.minute - date2.minute) < 30;
 
       default:
         throw new Error('TimeStep unknown');
@@ -94429,7 +94424,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'
@@ -94440,7 +94445,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'
@@ -94464,51 +94479,23 @@ class QueryRunner {
   }
 
   filterDataList(data, timePeriod) {
-    if (timePeriod.endDate.day === timePeriod.startDate.day) {
-      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 === 0 ? 1 : entry.month, entry.day === 0 ? 1 : entry.day, entry.hour, entry.minute).setZone('utc', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    } else {
-      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', {
-        keepLocalTime: true
-      }), timePeriod));
-      return filteredResult;
-    }
+    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', {
+      keepLocalTime: true
+    }), timePeriod));
+    return filteredResult;
   }
 
   mapDataList(data) {
-    if (data.length === 48) {
-      const test = 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', {
-          keepLocalTime: true
-        }).minus({
-          minutes: 30
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return test;
-    } else {
-      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', {
-          keepLocalTime: true
-        }),
-        value: entry.load,
-        state: _dataload.DataloadState.VALID,
-        price: entry.price,
-        valueDetail: null
-      }));
-      return mappedResult;
-    }
+    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', {
+        keepLocalTime: true
+      }),
+      value: entry.load,
+      state: _dataload.DataloadState.VALID,
+      price: entry.price,
+      valueDetail: null
+    }));
+    return mappedResult;
   }
 
   withinDateBoundaries(dateTime, timePeriod) {
@@ -94558,8 +94545,7 @@ class QueryRunner {
             $eq: timePeriod.startDate.month
           },
           day: {
-            // $eq: timePeriod.startDate.day, // has to cover 2 days since it finished at 00.00
-            $in: [timePeriod.startDate.day, timePeriod.startDate.day + 1]
+            $eq: timePeriod.startDate.day
           }
         };
         break;
@@ -94770,7 +94756,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/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":