Skip to content
Snippets Groups Projects
index.js 8.95 MiB
Newer Older
  • Learn to ignore specific revisions
  •  * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    const onHidden = (cb, once) => {
      const onHiddenOrPageHide = (event) => {
    
        if (event.type === 'pagehide' || _types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document.visibilityState === 'hidden') {
    
          cb(event);
          if (once) {
            removeEventListener('visibilitychange', onHiddenOrPageHide, true);
            removeEventListener('pagehide', onHiddenOrPageHide, true);
          }
        }
      };
      addEventListener('visibilitychange', onHiddenOrPageHide, true);
      // Some browsers have buggy implementations of visibilitychange,
      // so we use pagehide in addition, just to be safe.
      addEventListener('pagehide', onHiddenOrPageHide, true);
    };
    
    
    //# sourceMappingURL=onHidden.js.map
    
    
    /***/ }),
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "onLCP": () => (/* binding */ onLCP)
    /* harmony export */ });
    
    /* harmony import */ var _lib_bindReporter_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1638);
    /* harmony import */ var _lib_getActivationStart_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1636);
    /* harmony import */ var _lib_getVisibilityWatcher_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1641);
    /* harmony import */ var _lib_initMetric_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1634);
    /* harmony import */ var _lib_observe_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1632);
    /* harmony import */ var _lib_onHidden_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1639);
    
    
    
    
    
    
    
    /*
     * Copyright 2020 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    
    const reportedMetricIDs = {};
    
    
     * Calculates the [LCP](https://web.dev/lcp/) value for the current page and
     * calls the `callback` function once the value is ready (along with the
     * relevant `largest-contentful-paint` performance entry used to determine the
     * value). The reported value is a `DOMHighResTimeStamp`.
    
    const onLCP = (onReport) => {
      const visibilityWatcher = (0,_lib_getVisibilityWatcher_js__WEBPACK_IMPORTED_MODULE_0__.getVisibilityWatcher)();
      const metric = (0,_lib_initMetric_js__WEBPACK_IMPORTED_MODULE_1__.initMetric)('LCP');
    
      let report;
    
      const handleEntries = (entries) => {
    
        const lastEntry = entries[entries.length - 1] ;
        if (lastEntry) {
          // The startTime attribute returns the value of the renderTime if it is
          // not 0, and the value of the loadTime otherwise. The activationStart
          // reference is used because LCP should be relative to page activation
          // rather than navigation start if the page was prerendered.
          const value = Math.max(lastEntry.startTime - (0,_lib_getActivationStart_js__WEBPACK_IMPORTED_MODULE_2__.getActivationStart)(), 0);
    
          // Only report if the page wasn't hidden prior to LCP.
          if (value < visibilityWatcher.firstHiddenTime) {
            metric.value = value;
            metric.entries = [lastEntry];
            report();
          }
        }
    
      const po = (0,_lib_observe_js__WEBPACK_IMPORTED_MODULE_3__.observe)('largest-contentful-paint', handleEntries);
    
        report = (0,_lib_bindReporter_js__WEBPACK_IMPORTED_MODULE_4__.bindReporter)(onReport, metric);
    
        const stopListening = () => {
          if (!reportedMetricIDs[metric.id]) {
            handleEntries(po.takeRecords() );
            po.disconnect();
            reportedMetricIDs[metric.id] = true;
            report(true);
          }
        };
    
        // Stop listening after input. Note: while scrolling is an input that
        // stop LCP observation, it's unreliable since it can be programmatically
        // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75
        ['keydown', 'click'].forEach(type => {
          addEventListener(type, stopListening, { once: true, capture: true });
        });
    
        (0,_lib_onHidden_js__WEBPACK_IMPORTED_MODULE_5__.onHidden)(stopListening, true);
    
    //# sourceMappingURL=getLCP.js.map
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "getVisibilityWatcher": () => (/* binding */ getVisibilityWatcher)
    /* harmony export */ });
    
    /* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1629);
    /* harmony import */ var _onHidden_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1639);
    
    
    
    
    /*
     * Copyright 2020 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    let firstHiddenTime = -1;
    
    const initHiddenTime = () => {
      // If the document is hidden and not prerendering, assume it was always
      // hidden and the page was loaded in the background.
    
      return _types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document.visibilityState === 'hidden' && !_types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document.prerendering ? 0 : Infinity;
    
    };
    
    const trackChanges = () => {
      // Update the time if/when the document becomes hidden.
    
      (0,_onHidden_js__WEBPACK_IMPORTED_MODULE_1__.onHidden)(({ timeStamp }) => {
    
        firstHiddenTime = timeStamp;
      }, true);
    };
    
    const getVisibilityWatcher = (
    
    ) => {
      if (firstHiddenTime < 0) {
        // If the document is hidden when this code runs, assume it was hidden
        // since navigation start. This isn't a perfect heuristic, but it's the
        // best we can do until an API is available to support querying past
        // visibilityState.
        firstHiddenTime = initHiddenTime();
        trackChanges();
      }
      return {
        get firstHiddenTime() {
          return firstHiddenTime;
        },
      };
    };
    
    
    //# sourceMappingURL=getVisibilityWatcher.js.map
    
    
    /***/ }),
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "onFID": () => (/* binding */ onFID)
    /* harmony export */ });
    
    /* harmony import */ var _lib_bindReporter_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1638);
    /* harmony import */ var _lib_getVisibilityWatcher_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1641);
    /* harmony import */ var _lib_initMetric_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1634);
    /* harmony import */ var _lib_observe_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1632);
    /* harmony import */ var _lib_onHidden_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1639);
    
    
    
    
    
    
    
    /*
     * Copyright 2020 Google LLC
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *     https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
    
     * Calculates the [FID](https://web.dev/fid/) value for the current page and
     * calls the `callback` function once the value is ready, along with the
     * relevant `first-input` performance entry used to determine the value. The
     * reported value is a `DOMHighResTimeStamp`.
    
     * _**Important:** since FID is only reported after the user interacts with the
     * page, it's possible that it will not be reported for some page loads._
    
    const onFID = (onReport) => {
      const visibilityWatcher = (0,_lib_getVisibilityWatcher_js__WEBPACK_IMPORTED_MODULE_0__.getVisibilityWatcher)();
      const metric = (0,_lib_initMetric_js__WEBPACK_IMPORTED_MODULE_1__.initMetric)('FID');
      // eslint-disable-next-line prefer-const
    
      const handleEntry = (entry) => {
        // Only report if the page wasn't hidden prior to the first input.
        if (entry.startTime < visibilityWatcher.firstHiddenTime) {
          metric.value = entry.processingStart - entry.startTime;
          metric.entries.push(entry);
          report(true);
    
      const handleEntries = (entries) => {
        (entries ).forEach(handleEntry);
      };
    
      const po = (0,_lib_observe_js__WEBPACK_IMPORTED_MODULE_2__.observe)('first-input', handleEntries);
      report = (0,_lib_bindReporter_js__WEBPACK_IMPORTED_MODULE_3__.bindReporter)(onReport, metric);
    
      if (po) {
        (0,_lib_onHidden_js__WEBPACK_IMPORTED_MODULE_4__.onHidden)(() => {
          handleEntries(po.takeRecords() );
          po.disconnect();
        }, true);
    
    //# sourceMappingURL=getFID.js.map
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "_startChild": () => (/* binding */ _startChild),
    /* harmony export */   "isMeasurementValue": () => (/* binding */ isMeasurementValue)
    /* harmony export */ });
    
    /**
     * Checks if a given value is a valid measurement value.
     */
    function isMeasurementValue(value) {
      return typeof value === 'number' && isFinite(value);
    }
    
    /**
     * Helper function to start child on transactions. This function will make sure that the transaction will
     * use the start timestamp of the created child span if it is earlier than the transactions actual
     * start timestamp.
     */
    function _startChild(transaction, { startTimestamp, ...ctx }) {
      if (startTimestamp && transaction.startTimestamp > startTimestamp) {
        transaction.startTimestamp = startTimestamp;
      }
    
      return transaction.startChild({
        startTimestamp,
        ...ctx,
      });
    }
    
    
    //# sourceMappingURL=utils.js.map
    
    
    /***/ }),
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "registerBackgroundTabDetection": () => (/* binding */ registerBackgroundTabDetection)
    /* harmony export */ });
    
    /* harmony import */ var _sentry_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1548);
    /* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1611);
    /* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1629);
    
     * Add a listener that cancels and finishes a transaction when the global
     * document is hidden.
    
    function registerBackgroundTabDetection() {
      if (_types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW && _types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document) {
        _types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document.addEventListener('visibilitychange', () => {
          const activeTransaction = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.getActiveTransaction)() ;
          if (_types_js__WEBPACK_IMPORTED_MODULE_0__.WINDOW.document.hidden && activeTransaction) {
            const statusType = 'cancelled';
    
            (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&
              _sentry_utils__WEBPACK_IMPORTED_MODULE_2__.logger.log(
                `[Tracing] Transaction: ${statusType} -> since tab moved to the background, op: ${activeTransaction.op}`,
              );
            // We should not set status if it is already set, this prevent important statuses like
            // error or data loss from being overwritten on transaction.
            if (!activeTransaction.status) {
              activeTransaction.setStatus(statusType);
    
            activeTransaction.setTag('visibilitychange', 'document.hidden');
            activeTransaction.finish();
    
      } else {
        (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__) &&
          _sentry_utils__WEBPACK_IMPORTED_MODULE_2__.logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');
    
    //# sourceMappingURL=backgroundtab.js.map
    
    /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
    
    
    "use strict";
    __webpack_require__.r(__webpack_exports__);
    
    /* harmony export */ __webpack_require__.d(__webpack_exports__, {
    /* harmony export */   "SpanStatus": () => (/* binding */ SpanStatus)
    /* harmony export */ });
    
    /** The status of an Span.
     *
     * @deprecated Use string literals - if you require type casting, cast to SpanStatusType type
     */
    // eslint-disable-next-line import/export
    var SpanStatus; (function (SpanStatus) {
      /** The operation completed successfully. */
      const Ok = 'ok'; SpanStatus["Ok"] = Ok;
      /** Deadline expired before operation could complete. */
      const DeadlineExceeded = 'deadline_exceeded'; SpanStatus["DeadlineExceeded"] = DeadlineExceeded;
      /** 401 Unauthorized (actually does mean unauthenticated according to RFC 7235) */
      const Unauthenticated = 'unauthenticated'; SpanStatus["Unauthenticated"] = Unauthenticated;
      /** 403 Forbidden */
      const PermissionDenied = 'permission_denied'; SpanStatus["PermissionDenied"] = PermissionDenied;
      /** 404 Not Found. Some requested entity (file or directory) was not found. */
      const NotFound = 'not_found'; SpanStatus["NotFound"] = NotFound;
      /** 429 Too Many Requests */
      const ResourceExhausted = 'resource_exhausted'; SpanStatus["ResourceExhausted"] = ResourceExhausted;
      /** Client specified an invalid argument. 4xx. */
      const InvalidArgument = 'invalid_argument'; SpanStatus["InvalidArgument"] = InvalidArgument;
      /** 501 Not Implemented */
      const Unimplemented = 'unimplemented'; SpanStatus["Unimplemented"] = Unimplemented;
      /** 503 Service Unavailable */
      const Unavailable = 'unavailable'; SpanStatus["Unavailable"] = Unavailable;
      /** Other/generic 5xx. */
      const InternalError = 'internal_error'; SpanStatus["InternalError"] = InternalError;
      /** Unknown. Any non-standard HTTP status code. */
      const UnknownError = 'unknown_error'; SpanStatus["UnknownError"] = UnknownError;
      /** The operation was cancelled (typically by the user). */
      const Cancelled = 'cancelled'; SpanStatus["Cancelled"] = Cancelled;
      /** Already exists (409) */
      const AlreadyExists = 'already_exists'; SpanStatus["AlreadyExists"] = AlreadyExists;
      /** Operation was rejected because the system is not in a state required for the operation's */
      const FailedPrecondition = 'failed_precondition'; SpanStatus["FailedPrecondition"] = FailedPrecondition;
      /** The operation was aborted, typically due to a concurrency issue. */
      const Aborted = 'aborted'; SpanStatus["Aborted"] = Aborted;
      /** Operation was attempted past the valid range. */
      const OutOfRange = 'out_of_range'; SpanStatus["OutOfRange"] = OutOfRange;
      /** Unrecoverable data loss or corruption */
      const DataLoss = 'data_loss'; SpanStatus["DataLoss"] = DataLoss;
    })(SpanStatus || (SpanStatus = {}));
    
    
    //# sourceMappingURL=spanstatus.js.map
    
    
    /***/ }),
    
    /***/ ((module) => {
    
    module.exports = JSON.parse('{"name":"egl","version":"1.2.1","description":"","repository":{"type":"git","url":"git+https://forge.grandlyon.com/web-et-numerique/llle_project/egl-konnector.git"},"keywords":[],"author":"Grand Lyon","license":"AGPL-3.0","main":"./src/index.js","eslintConfig":{"extends":["cozy-app"]},"eslintIgnore":["build"],"husky":{"hooks":{"pre-commit":"yarn lint"}},"scripts":{"start":"node ./src/index.js","dev":"cozy-konnector-dev","standalone":"cozy-konnector-standalone","pretest":"npm run clean","test":"konitor testit .","check":"konitor check .","clean":"rm -rf ./data","build":"webpack","lint":"eslint --fix .","deploy":"git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build}","deploy-dev":"git-directory-deploy --directory build/ --branch ${DEPLOY_BRANCH:-build-dev}","cozyPublish":"cozy-app-publish --token $REGISTRY_TOKEN --build-commit $(git rev-parse ${DEPLOY_BRANCH:-build})","travisDeployKey":"./bin/generate_travis_deploy_key"},"dependencies":{"@sentry/node":"7.30.0","@sentry/tracing":"7.30.0","cozy-konnector-libs":"4.56.4","moment":"^2.24.0","moment-timezone":"^0.5.26","axios":"1.2.2"},"devDependencies":{"@types/moment-timezone":"^0.5.30","copy-webpack-plugin":"6.1.1","cozy-app-publish":"0.25.0","cozy-jobs-cli":"1.20.2","cozy-konnector-build":"1.4.4","eslint":"5.16.0","eslint-config-cozy-app":"1.6.0","eslint-plugin-prettier":"3.0.1","git-directory-deploy":"1.5.1","husky":"4.3.0","konitor":"0.10.2","standard-version":"^9.5.0","svgo":"1.3.2","webpack":"5.75.0","webpack-cli":"5.0.1"}}');
    
    /***/ ((module) => {
    
        process.env.NODE_ENV === 'development' ||
        process.env.NODE_ENV === 'local' ||
        process.env.NODE_ENV === 'standalone'
    
      )
    }
    
    /**
     * Verify if it's an alpha URL
     * @returns {boolean}
     */
    function isDev() {
      return (
        process.env.COZY_URL.includes('alpha') ||
        process.env.COZY_URL.includes('cozy.tools')
      )
    }
    
    module.exports = { isLocal, isDev }
    
    
    
    Romain CREY's avatar
    Romain CREY committed
    /***/ })
    
    /******/ 	]);
    /************************************************************************/
    /******/ 	// The module cache
    /******/ 	var __webpack_module_cache__ = {};
    /******/ 	
    /******/ 	// The require function
    /******/ 	function __webpack_require__(moduleId) {
    /******/ 		// Check if module is in cache
    /******/ 		var cachedModule = __webpack_module_cache__[moduleId];
    /******/ 		if (cachedModule !== undefined) {
    /******/ 			return cachedModule.exports;
    /******/ 		}
    /******/ 		// Create a new module (and put it into the cache)
    /******/ 		var module = __webpack_module_cache__[moduleId] = {
    /******/ 			id: moduleId,
    /******/ 			loaded: false,
    /******/ 			exports: {}
    /******/ 		};
    /******/ 	
    /******/ 		// Execute the module function
    /******/ 		__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
    /******/ 	
    /******/ 		// Flag the module as loaded
    /******/ 		module.loaded = true;
    /******/ 	
    /******/ 		// Return the exports of the module
    /******/ 		return module.exports;
    /******/ 	}
    /******/ 	
    /******/ 	// expose the module cache
    /******/ 	__webpack_require__.c = __webpack_module_cache__;
    /******/ 	
    /************************************************************************/
    /******/ 	/* webpack/runtime/compat get default export */
    /******/ 	(() => {
    /******/ 		// getDefaultExport function for compatibility with non-harmony modules
    /******/ 		__webpack_require__.n = (module) => {
    /******/ 			var getter = module && module.__esModule ?
    /******/ 				() => (module['default']) :
    /******/ 				() => (module);
    /******/ 			__webpack_require__.d(getter, { a: getter });
    /******/ 			return getter;
    /******/ 		};
    /******/ 	})();
    /******/ 	
    /******/ 	/* webpack/runtime/define property getters */
    /******/ 	(() => {
    /******/ 		// define getter functions for harmony exports
    /******/ 		__webpack_require__.d = (exports, definition) => {
    /******/ 			for(var key in definition) {
    /******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
    /******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
    /******/ 				}
    /******/ 			}
    /******/ 		};
    /******/ 	})();
    /******/ 	
    /******/ 	/* webpack/runtime/harmony module decorator */
    /******/ 	(() => {
    /******/ 		__webpack_require__.hmd = (module) => {
    /******/ 			module = Object.create(module);
    /******/ 			if (!module.children) module.children = [];
    /******/ 			Object.defineProperty(module, 'exports', {
    /******/ 				enumerable: true,
    /******/ 				set: () => {
    /******/ 					throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);
    /******/ 				}
    /******/ 			});
    /******/ 			return module;
    /******/ 		};
    /******/ 	})();
    /******/ 	
    /******/ 	/* webpack/runtime/hasOwnProperty shorthand */
    /******/ 	(() => {
    /******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
    /******/ 	})();
    /******/ 	
    /******/ 	/* webpack/runtime/make namespace object */
    /******/ 	(() => {
    /******/ 		// define __esModule on exports
    /******/ 		__webpack_require__.r = (exports) => {
    /******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
    /******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
    /******/ 			}
    /******/ 			Object.defineProperty(exports, '__esModule', { value: true });
    /******/ 		};
    /******/ 	})();
    /******/ 	
    /******/ 	/* webpack/runtime/node module decorator */
    /******/ 	(() => {
    /******/ 		__webpack_require__.nmd = (module) => {
    /******/ 			module.paths = [];
    /******/ 			if (!module.children) module.children = [];
    /******/ 			return module;
    /******/ 		};
    /******/ 	})();
    /******/ 	
    /************************************************************************/
    /******/ 	
    /******/ 	// module cache are used so entry inlining is disabled
    /******/ 	// startup
    /******/ 	// Load entry module and return exports
    /******/ 	var __webpack_exports__ = __webpack_require__(__webpack_require__.s = 0);
    /******/ 	
    /******/ })()
    ;